msdkdec: fix for resolution change
authorHaihao Xiang <haihao.xiang@intel.com>
Wed, 27 Feb 2019 00:07:29 +0000 (08:07 +0800)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Thu, 28 Feb 2019 11:08:24 +0000 (11:08 +0000)
Returning MFX_ERR_INCOMPATIBLE_VIDEO_PARAM from
MFXVideoDECODE_DecodeFrameAsync means the allocated mfx surface is not
suitable for the current frame, we need a new mfx surface and try
MFXVideoDECODE_DecodeFrameAsync again.

sys/msdk/gstmsdkdec.c

index ac2c4e0..8625e0b 100644 (file)
@@ -1001,12 +1001,24 @@ gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
     /* media-sdk requires complete reset since the surface is inadaquate to
      * do further decoding */
     if (status == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) {
+      /* MFX_ERR_INCOMPATIBLE_VIDEO_PARAM means the current mfx surface is not
+       * suitable for the current frame, call MFXVideoDECODE_DecodeHeader to get
+       * the current frame size then do memory re-allocation, otherwise
+       * MFXVideoDECODE_DecodeFrameAsync still will fail for next call */
+      status = MFXVideoDECODE_DecodeHeader (session, &bitstream, &thiz->param);
+      if (status == MFX_ERR_MORE_DATA) {
+        flow = GST_FLOW_OK;
+        goto done;
+      }
+
       /* Requires memory re-allocation, do a hard reset */
       if (!gst_msdkdec_negotiate (thiz, TRUE))
         goto error;
-      status =
-          MFXVideoDECODE_DecodeFrameAsync (session, &bitstream,
-          surface->surface, &task->surface, &task->sync_point);
+
+      /* The current surface is freed when doing a hard reset, a new surface is
+       * required for the new resolution */
+      surface = NULL;
+      continue;
     }
 
     if (G_LIKELY (status == MFX_ERR_NONE)