qsvdec: when a frames ctx is supplied, use its frame dimensions
authorAnton Khirnov <anton@khirnov.net>
Wed, 22 Jun 2016 09:57:36 +0000 (11:57 +0200)
committerAnton Khirnov <anton@khirnov.net>
Sun, 3 Jul 2016 07:13:29 +0000 (09:13 +0200)
The allocated frame size may be larger than the coded dimensions.

libavcodec/qsvdec.c

index 929b9af..5b36489 100644 (file)
@@ -91,6 +91,8 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
     mfxSession session = NULL;
     int iopattern = 0;
     mfxVideoParam param = { { 0 } };
+    int frame_width  = avctx->coded_width;
+    int frame_height = avctx->coded_height;
     int ret;
 
     desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
@@ -122,6 +124,9 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
             else if (frames_hwctx->frame_type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET)
                 iopattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY;
         }
+
+        frame_width  = frames_hwctx->surfaces[0].Info.Width;
+        frame_height = frames_hwctx->surfaces[0].Info.Height;
     }
 
     if (!iopattern)
@@ -146,8 +151,8 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
     param.mfx.FrameInfo.BitDepthChroma = desc->comp[0].depth;
     param.mfx.FrameInfo.Shift          = desc->comp[0].depth > 8;
     param.mfx.FrameInfo.FourCC         = q->fourcc;
-    param.mfx.FrameInfo.Width          = avctx->coded_width;
-    param.mfx.FrameInfo.Height         = avctx->coded_height;
+    param.mfx.FrameInfo.Width          = frame_width;
+    param.mfx.FrameInfo.Height         = frame_height;
     param.mfx.FrameInfo.ChromaFormat   = MFX_CHROMAFORMAT_YUV420;
 
     param.IOPattern   = q->iopattern;