Browse code

Add a av_fast_malloc function and replace several uses of av_fast_realloc, thus avoiding potential memleaks and pointless memcpys.

Originally committed as revision 18470 to svn://svn.ffmpeg.org/ffmpeg/trunk

Reimar Döffinger authored on 2009/04/12 22:17:37
Showing 11 changed files
... ...
@@ -378,7 +378,9 @@ static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length){
378 378
         return -1;
379 379
     }
380 380
 
381
-    f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
381
+    av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
382
+    if (!f->bitstream_buffer)
383
+        return AVERROR(ENOMEM);
382 384
     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra), bitstream_size/4);
383 385
     init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size);
384 386
 
... ...
@@ -656,7 +658,9 @@ static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){
656 656
 
657 657
     prestream_size= length + buf - prestream;
658 658
 
659
-    f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
659
+    av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
660
+    if (!f->bitstream_buffer)
661
+        return AVERROR(ENOMEM);
660 662
     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream, prestream_size/4);
661 663
     init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size);
662 664
 
... ...
@@ -408,7 +408,9 @@ static int decode_frame(AVCodecContext *avctx,
408 408
     p->pict_type= FF_I_TYPE;
409 409
     p->key_frame= 1;
410 410
 
411
-    a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
411
+    av_fast_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
412
+    if (!a->bitstream_buffer)
413
+        return AVERROR(ENOMEM);
412 414
 
413 415
     if(avctx->codec_id == CODEC_ID_ASV1)
414 416
         a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (const uint32_t*)buf, buf_size/4);
... ...
@@ -3541,6 +3541,20 @@ AVBitStreamFilter *av_bitstream_filter_next(AVBitStreamFilter *f);
3541 3541
 void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size);
3542 3542
 
3543 3543
 /**
3544
+ * Allocates a buffer, reusing the given one if large enough.
3545
+ *
3546
+ * Contrary to av_fast_realloc the current buffer contents might not be
3547
+ * preserved and on error the old buffer is freed, thus no special
3548
+ * handling to avoid memleaks is necessary.
3549
+ *
3550
+ * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
3551
+ * @param size size of the buffer *ptr points to
3552
+ * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
3553
+ *                 *size 0 if an error occurred.
3554
+ */
3555
+void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size);
3556
+
3557
+/**
3544 3558
  * Copy image 'src' to 'dst'.
3545 3559
  */
3546 3560
 void av_picture_copy(AVPicture *dst, const AVPicture *src,
... ...
@@ -126,7 +126,7 @@ static int tqi_decode_frame(AVCodecContext *avctx,
126 126
         return -1;
127 127
     }
128 128
 
129
-    t->bitstream_buf = av_fast_realloc(t->bitstream_buf, &t->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE);
129
+    av_fast_malloc(&t->bitstream_buf, &t->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE);
130 130
     if (!t->bitstream_buf)
131 131
         return AVERROR(ENOMEM);
132 132
     s->dsp.bswap_buf(t->bitstream_buf, (const uint32_t*)buf, (buf_end-buf)/4);
... ...
@@ -687,10 +687,12 @@ retry:
687 687
         }
688 688
 
689 689
         if(startcode_found){
690
-            s->bitstream_buffer= av_fast_realloc(
691
-                s->bitstream_buffer,
690
+            av_fast_malloc(
691
+                &s->bitstream_buffer,
692 692
                 &s->allocated_bitstream_buffer_size,
693 693
                 buf_size - current_pos + FF_INPUT_BUFFER_PADDING_SIZE);
694
+            if (!s->bitstream_buffer)
695
+                return AVERROR(ENOMEM);
694 696
             memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
695 697
             s->bitstream_buffer_size= buf_size - current_pos;
696 698
         }
... ...
@@ -1411,7 +1411,7 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_l
1411 1411
     }
1412 1412
 
1413 1413
     bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data
1414
-    h->rbsp_buffer[bufidx]= av_fast_realloc(h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE);
1414
+    av_fast_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE);
1415 1415
     dst= h->rbsp_buffer[bufidx];
1416 1416
 
1417 1417
     if (dst == NULL){
... ...
@@ -956,7 +956,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
956 956
 
957 957
     AVFrame *picture = data;
958 958
 
959
-    s->bitstream_buffer= av_fast_realloc(s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
959
+    av_fast_malloc(&s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
960
+    if (!s->bitstream_buffer)
961
+        return AVERROR(ENOMEM);
960 962
 
961 963
     s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (const uint32_t*)buf, buf_size/4);
962 964
 
... ...
@@ -174,7 +174,9 @@ static int decode_frame(AVCodecContext *avctx,
174 174
     p->pict_type= FF_I_TYPE;
175 175
     p->key_frame= 1;
176 176
 
177
-    a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
177
+    av_fast_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
178
+    if (!a->bitstream_buffer)
179
+        return AVERROR(ENOMEM);
178 180
     for(i=0; i<buf_size; i+=2){
179 181
         a->bitstream_buffer[i]  = buf[i+1];
180 182
         a->bitstream_buffer[i+1]= buf[i  ];
... ...
@@ -334,7 +334,7 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data,
334 334
     prepare_avpic(ctx, &ctx->flipped_ptrs[ctx->cur_index],
335 335
                   (AVPicture*) &ctx->buf_ptrs[ctx->cur_index]);
336 336
 
337
-    ctx->swap_buf = av_fast_realloc(ctx->swap_buf, &ctx->swap_buf_size,
337
+    av_fast_malloc(&ctx->swap_buf, &ctx->swap_buf_size,
338 338
                                  swap_buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
339 339
     if(!ctx->swap_buf)
340 340
         return AVERROR(ENOMEM);
... ...
@@ -297,7 +297,9 @@ static int mp_decode_frame(AVCodecContext *avctx,
297 297
     }
298 298
 
299 299
     /* le32 bitstream msb first */
300
-    mp->bswapbuf = av_fast_realloc(mp->bswapbuf, &mp->bswapbuf_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
300
+    av_fast_malloc(&mp->bswapbuf, &mp->bswapbuf_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
301
+    if (!mp->bswapbuf)
302
+        AVERROR(ENOMEM);
301 303
     mp->dsp.bswap_buf((uint32_t *)mp->bswapbuf, (const uint32_t *)buf, buf_size / 4);
302 304
     if (buf_size & 3)
303 305
         memcpy(mp->bswapbuf + (buf_size & ~3), buf + (buf_size & ~3), buf_size & 3);
... ...
@@ -80,6 +80,17 @@ void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size)
80 80
     return ptr;
81 81
 }
82 82
 
83
+void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size)
84
+{
85
+    void **p = ptr;
86
+    if (min_size < *size)
87
+        return;
88
+    *size= FFMAX(17*min_size/16 + 32, min_size);
89
+    av_free(*p);
90
+    *p = av_malloc(*size);
91
+    if (!*p) *size = 0;
92
+}
93
+
83 94
 /* encoder management */
84 95
 static AVCodec *first_avcodec = NULL;
85 96