Originally committed as revision 18470 to svn://svn.ffmpeg.org/ffmpeg/trunk
Reimar Döffinger authored on 2009/04/12 22:17:37... | ... |
@@ -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 |
|