encode_video2: shrink packet after encoding.
authorNicolas George <nicolas.george@normalesup.org>
Wed, 29 Feb 2012 13:39:50 +0000 (14:39 +0100)
committerNicolas George <nicolas.george@normalesup.org>
Wed, 29 Feb 2012 16:00:26 +0000 (17:00 +0100)
With the encode2 API, encoders allocate huge packets to be
sure they have enough room (a typical case is mpeg4, which
allocs ~10M for 1280x768 yuv420p) but only actually use a
very small part of the buffer.

libavcodec/utils.c

index 63f7fae..99e36f8 100644 (file)
@@ -1198,6 +1198,7 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
 {
     int ret;
     int user_packet = !!avpkt->data;
+    void *new_data;
 
     *got_packet_ptr = 0;
 
@@ -1218,6 +1219,12 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
             avpkt->size = 0;
         else if (!(avctx->codec->capabilities & CODEC_CAP_DELAY))
             avpkt->pts = avpkt->dts = frame->pts;
+        if (avpkt->data) {
+            new_data = av_realloc(avpkt->data,
+                                  avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
+            if (new_data)
+                avpkt->data = new_data;
+        }
 
         avctx->frame_number++;
     }