ff_get_buffer(): allocate the frame for max(coded,display) dimensions
authorAnton Khirnov <anton@khirnov.net>
Mon, 18 Feb 2013 15:29:03 +0000 (16:29 +0100)
committerAnton Khirnov <anton@khirnov.net>
Fri, 19 Apr 2013 07:26:53 +0000 (09:26 +0200)
Needed e.g. for h264 cropping to work properly.

libavcodec/utils.c

index dfb2f54..32ca703 100644 (file)
@@ -555,10 +555,8 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 
     switch (avctx->codec_type) {
     case AVMEDIA_TYPE_VIDEO:
-        if (!frame->width)
-            frame->width               = avctx->width;
-        if (!frame->height)
-            frame->height              = avctx->height;
+        frame->width  = FFMAX(avctx->width, avctx->coded_width);
+        frame->height = FFMAX(avctx->height, avctx->coded_height);
         if (frame->format < 0)
             frame->format              = avctx->pix_fmt;
         if (!frame->sample_aspect_ratio.num)
@@ -702,6 +700,9 @@ do {                                                                    \
 
         av_buffer_unref(&dummy_buf);
 
+        frame->width  = avctx->width;
+        frame->height = avctx->height;
+
         return 0;
 
 fail:
@@ -712,7 +713,14 @@ fail:
     }
 #endif
 
-    return avctx->get_buffer2(avctx, frame, flags);
+    ret = avctx->get_buffer2(avctx, frame, flags);
+
+    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+        frame->width  = avctx->width;
+        frame->height = avctx->height;
+    }
+
+    return ret;
 }
 
 int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)