[FFmpeg-cvslog] r18470 - in trunk/libavcodec: 4xm.c asv1.c avcodec.h eatqi.c h263dec.c h264.c huffyuv.c mdec.c mimic.c motionpixels.c utils.c
reimar
subversion
Sun Apr 12 15:17:37 CEST 2009
Author: reimar
Date: Sun Apr 12 15:17:37 2009
New Revision: 18470
Log:
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
thus avoiding potential memleaks and pointless memcpys.
Modified:
trunk/libavcodec/4xm.c
trunk/libavcodec/asv1.c
trunk/libavcodec/avcodec.h
trunk/libavcodec/eatqi.c
trunk/libavcodec/h263dec.c
trunk/libavcodec/h264.c
trunk/libavcodec/huffyuv.c
trunk/libavcodec/mdec.c
trunk/libavcodec/mimic.c
trunk/libavcodec/motionpixels.c
trunk/libavcodec/utils.c
Modified: trunk/libavcodec/4xm.c
==============================================================================
--- trunk/libavcodec/4xm.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/4xm.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -378,7 +378,9 @@ static int decode_p_frame(FourXContext *
return -1;
}
- f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!f->bitstream_buffer)
+ return AVERROR(ENOMEM);
f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra), bitstream_size/4);
init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size);
@@ -656,7 +658,9 @@ static int decode_i_frame(FourXContext *
prestream_size= length + buf - prestream;
- f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!f->bitstream_buffer)
+ return AVERROR(ENOMEM);
f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream, prestream_size/4);
init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size);
Modified: trunk/libavcodec/asv1.c
==============================================================================
--- trunk/libavcodec/asv1.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/asv1.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -408,7 +408,9 @@ static int decode_frame(AVCodecContext *
p->pict_type= FF_I_TYPE;
p->key_frame= 1;
- a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!a->bitstream_buffer)
+ return AVERROR(ENOMEM);
if(avctx->codec_id == CODEC_ID_ASV1)
a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (const uint32_t*)buf, buf_size/4);
Modified: trunk/libavcodec/avcodec.h
==============================================================================
--- trunk/libavcodec/avcodec.h Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/avcodec.h Sun Apr 12 15:17:37 2009 (r18470)
@@ -3541,6 +3541,20 @@ AVBitStreamFilter *av_bitstream_filter_n
void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size);
/**
+ * Allocates a buffer, reusing the given one if large enough.
+ *
+ * Contrary to av_fast_realloc the current buffer contents might not be
+ * preserved and on error the old buffer is freed, thus no special
+ * handling to avoid memleaks is necessary.
+ *
+ * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
+ * @param size size of the buffer *ptr points to
+ * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
+ * *size 0 if an error occurred.
+ */
+void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size);
+
+/**
* Copy image 'src' to 'dst'.
*/
void av_picture_copy(AVPicture *dst, const AVPicture *src,
Modified: trunk/libavcodec/eatqi.c
==============================================================================
--- trunk/libavcodec/eatqi.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/eatqi.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -126,7 +126,7 @@ static int tqi_decode_frame(AVCodecConte
return -1;
}
- t->bitstream_buf = av_fast_realloc(t->bitstream_buf, &t->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&t->bitstream_buf, &t->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE);
if (!t->bitstream_buf)
return AVERROR(ENOMEM);
s->dsp.bswap_buf(t->bitstream_buf, (const uint32_t*)buf, (buf_end-buf)/4);
Modified: trunk/libavcodec/h263dec.c
==============================================================================
--- trunk/libavcodec/h263dec.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/h263dec.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -687,10 +687,12 @@ retry:
}
if(startcode_found){
- s->bitstream_buffer= av_fast_realloc(
- s->bitstream_buffer,
+ av_fast_malloc(
+ &s->bitstream_buffer,
&s->allocated_bitstream_buffer_size,
buf_size - current_pos + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!s->bitstream_buffer)
+ return AVERROR(ENOMEM);
memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
s->bitstream_buffer_size= buf_size - current_pos;
}
Modified: trunk/libavcodec/h264.c
==============================================================================
--- trunk/libavcodec/h264.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/h264.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -1411,7 +1411,7 @@ const uint8_t *ff_h264_decode_nal(H264Co
}
bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data
- h->rbsp_buffer[bufidx]= av_fast_realloc(h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE);
dst= h->rbsp_buffer[bufidx];
if (dst == NULL){
Modified: trunk/libavcodec/huffyuv.c
==============================================================================
--- trunk/libavcodec/huffyuv.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/huffyuv.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -956,7 +956,9 @@ static int decode_frame(AVCodecContext *
AVFrame *picture = data;
- s->bitstream_buffer= av_fast_realloc(s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!s->bitstream_buffer)
+ return AVERROR(ENOMEM);
s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (const uint32_t*)buf, buf_size/4);
Modified: trunk/libavcodec/mdec.c
==============================================================================
--- trunk/libavcodec/mdec.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/mdec.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -174,7 +174,9 @@ static int decode_frame(AVCodecContext *
p->pict_type= FF_I_TYPE;
p->key_frame= 1;
- a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!a->bitstream_buffer)
+ return AVERROR(ENOMEM);
for(i=0; i<buf_size; i+=2){
a->bitstream_buffer[i] = buf[i+1];
a->bitstream_buffer[i+1]= buf[i ];
Modified: trunk/libavcodec/mimic.c
==============================================================================
--- trunk/libavcodec/mimic.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/mimic.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -334,7 +334,7 @@ static int mimic_decode_frame(AVCodecCon
prepare_avpic(ctx, &ctx->flipped_ptrs[ctx->cur_index],
(AVPicture*) &ctx->buf_ptrs[ctx->cur_index]);
- ctx->swap_buf = av_fast_realloc(ctx->swap_buf, &ctx->swap_buf_size,
+ av_fast_malloc(&ctx->swap_buf, &ctx->swap_buf_size,
swap_buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
if(!ctx->swap_buf)
return AVERROR(ENOMEM);
Modified: trunk/libavcodec/motionpixels.c
==============================================================================
--- trunk/libavcodec/motionpixels.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/motionpixels.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -297,7 +297,9 @@ static int mp_decode_frame(AVCodecContex
}
/* le32 bitstream msb first */
- mp->bswapbuf = av_fast_realloc(mp->bswapbuf, &mp->bswapbuf_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ av_fast_malloc(&mp->bswapbuf, &mp->bswapbuf_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!mp->bswapbuf)
+ AVERROR(ENOMEM);
mp->dsp.bswap_buf((uint32_t *)mp->bswapbuf, (const uint32_t *)buf, buf_size / 4);
if (buf_size & 3)
memcpy(mp->bswapbuf + (buf_size & ~3), buf + (buf_size & ~3), buf_size & 3);
Modified: trunk/libavcodec/utils.c
==============================================================================
--- trunk/libavcodec/utils.c Sun Apr 12 14:25:53 2009 (r18469)
+++ trunk/libavcodec/utils.c Sun Apr 12 15:17:37 2009 (r18470)
@@ -80,6 +80,17 @@ void *av_fast_realloc(void *ptr, unsigne
return ptr;
}
+void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size)
+{
+ void **p = ptr;
+ if (min_size < *size)
+ return;
+ *size= FFMAX(17*min_size/16 + 32, min_size);
+ av_free(*p);
+ *p = av_malloc(*size);
+ if (!*p) *size = 0;
+}
+
/* encoder management */
static AVCodec *first_avcodec = NULL;
More information about the ffmpeg-cvslog
mailing list