msdkdec: avoid infinite loop
authorHaihao Xiang <haihao.xiang@intel.com>
Wed, 6 Mar 2019 05:07:53 +0000 (13:07 +0800)
committerTim-Philipp Müller <tim@centricular.com>
Mon, 25 Mar 2019 09:10:38 +0000 (09:10 +0000)
It is possible MFXVideoDECODE_DecodeFrameAsync returns MFX_ERR_INCOMPATIBLE_VIDEO_PARAM
and this error can't be recovered by retrying MFXVideoDECODE_DecodeFrameAsync
in some cases, so we need to limit the number of retries to avoid infinite loop.

This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/909

sys/msdk/gstmsdkdec.c

index b7c9b4c..53faaf9 100644 (file)
@@ -853,7 +853,7 @@ gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
   mfxSession session;
   mfxStatus status;
   GstMapInfo map_info;
-  guint i;
+  guint i, retry_err_incompatible = 0;
   gsize data_size;
   gboolean hard_reset = FALSE;
 
@@ -1000,7 +1000,8 @@ 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) {
+    if (status == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM &&
+        retry_err_incompatible++ < 1) {
       /* 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
@@ -1021,6 +1022,8 @@ gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
       continue;
     }
 
+    retry_err_incompatible = 0;
+
     if (G_LIKELY (status == MFX_ERR_NONE)
         || (status == MFX_WRN_VIDEO_PARAM_CHANGED)) {
       thiz->next_task = (thiz->next_task + 1) % thiz->tasks->len;