msdk: ignore MFX_ERR_UNDEFINED_BEHAVIOR when loading a plugin
authorHaihao Xiang <haihao.xiang@intel.com>
Thu, 7 Nov 2019 07:54:47 +0000 (15:54 +0800)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 10 Dec 2019 17:23:53 +0000 (17:23 +0000)
An issue can be seen when using msdkh265enc with bitrate change in
playing state. The root cause is the corresponding plugin is loaded
again.

Returning MFX_ERR_UNDEFINED_BEHAVIOR from MSDK just means the plugin has
been loaded, so we may ignore this error when doing configuation again
in the sub class, otherwise the pipeline will be interrupted

sys/msdk/gstmsdkh265dec.c
sys/msdk/gstmsdkh265enc.c
sys/msdk/gstmsdkvp8dec.c
sys/msdk/gstmsdkvp9dec.c
sys/msdk/gstmsdkvp9enc.c
sys/msdk/msdk.c
sys/msdk/msdk.h

index 14d7ac7..b43448d 100644 (file)
@@ -33,8 +33,6 @@
 #  include <config.h>
 #endif
 
-#include <mfxplugin.h>
-
 #include "gstmsdkh265dec.h"
 #include "gstmsdkvideomemory.h"
 
@@ -66,7 +64,6 @@ gst_msdkh265dec_configure (GstMsdkDec * decoder)
 {
   GstMsdkH265Dec *h265dec = GST_MSDKH265DEC (decoder);
   mfxSession session;
-  mfxStatus status;
   const mfxPluginUID *uid;
 
   session = gst_msdk_context_get_session (decoder->context);
@@ -76,15 +73,8 @@ gst_msdkh265dec_configure (GstMsdkDec * decoder)
   else
     uid = &MFX_PLUGINID_HEVCD_SW;
 
-  status = MFXVideoUSER_Load (session, uid, 1);
-  if (status < MFX_ERR_NONE) {
-    GST_ERROR_OBJECT (h265dec, "Media SDK Plugin load failed (%s)",
-        msdk_status_to_string (status));
+  if (!gst_msdk_load_plugin (session, uid, 1, "msdkh265dec"))
     return FALSE;
-  } else if (status > MFX_ERR_NONE) {
-    GST_WARNING_OBJECT (h265dec, "Media SDK Plugin load warning: %s",
-        msdk_status_to_string (status));
-  }
 
   decoder->param.mfx.CodecId = MFX_CODEC_HEVC;
 
index 9e720aa..0d15be7 100644 (file)
@@ -33,8 +33,6 @@
 #  include <config.h>
 #endif
 
-#include <mfxplugin.h>
-
 #include <gst/allocators/gstdmabuf.h>
 
 #include "gstmsdkh265enc.h"
@@ -91,7 +89,6 @@ gst_msdkh265enc_configure (GstMsdkEnc * encoder)
 {
   GstMsdkH265Enc *h265enc = GST_MSDKH265ENC (encoder);
   mfxSession session;
-  mfxStatus status;
   const mfxPluginUID *uid;
 
   session = gst_msdk_context_get_session (encoder->context);
@@ -101,15 +98,8 @@ gst_msdkh265enc_configure (GstMsdkEnc * encoder)
   else
     uid = &MFX_PLUGINID_HEVCE_SW;
 
-  status = MFXVideoUSER_Load (session, uid, 1);
-  if (status < MFX_ERR_NONE) {
-    GST_ERROR_OBJECT (h265enc, "Media SDK Plugin load failed (%s)",
-        msdk_status_to_string (status));
+  if (!gst_msdk_load_plugin (session, uid, 1, "msdkh265enc"))
     return FALSE;
-  } else if (status > MFX_ERR_NONE) {
-    GST_WARNING_OBJECT (h265enc, "Media SDK Plugin load warning: %s",
-        msdk_status_to_string (status));
-  }
 
   encoder->param.mfx.CodecId = MFX_CODEC_HEVC;
 
index ba229ce..7c64126 100644 (file)
 #  include <config.h>
 #endif
 
-#include <mfxplugin.h>
-#include <mfxvp8.h>
-
 #include "gstmsdkvp8dec.h"
 
+#include <mfxvp8.h>
+
 GST_DEBUG_CATEGORY_EXTERN (gst_msdkvp8dec_debug);
 #define GST_CAT_DEFAULT gst_msdkvp8dec_debug
 
@@ -56,22 +55,14 @@ gst_msdkvp8dec_configure (GstMsdkDec * decoder)
 {
   GstMsdkVP8Dec *vp8dec = GST_MSDKVP8DEC (decoder);
   mfxSession session;
-  mfxStatus status;
   const mfxPluginUID *uid;
 
   session = gst_msdk_context_get_session (decoder->context);
 
   uid = &MFX_PLUGINID_VP8D_HW;
 
-  status = MFXVideoUSER_Load (session, uid, 1);
-  if (status < MFX_ERR_NONE) {
-    GST_ERROR_OBJECT (vp8dec, "Media SDK Plugin load failed (%s)",
-        msdk_status_to_string (status));
+  if (!gst_msdk_load_plugin (session, uid, 1, "msdkvp8dec"))
     return FALSE;
-  } else if (status > MFX_ERR_NONE) {
-    GST_WARNING_OBJECT (vp8dec, "Media SDK Plugin load warning: %s",
-        msdk_status_to_string (status));
-  }
 
   decoder->param.mfx.CodecId = MFX_CODEC_VP8;
   /* Replaced with width and height rounded up to 16 */
index cb87b52..3abc825 100644 (file)
@@ -35,7 +35,6 @@
 #  include <config.h>
 #endif
 
-#include <mfxplugin.h>
 #include <mfxvp9.h>
 
 #include "gstmsdkvp9dec.h"
@@ -66,22 +65,14 @@ gst_msdkvp9dec_configure (GstMsdkDec * decoder)
 {
   GstMsdkVP9Dec *vp9dec = GST_MSDKVP9DEC (decoder);
   mfxSession session;
-  mfxStatus status;
   const mfxPluginUID *uid;
 
   session = gst_msdk_context_get_session (decoder->context);
 
   uid = &MFX_PLUGINID_VP9D_HW;
 
-  status = MFXVideoUSER_Load (session, uid, 1);
-  if (status < MFX_ERR_NONE) {
-    GST_ERROR_OBJECT (vp9dec, "Media SDK Plugin load failed (%s)",
-        msdk_status_to_string (status));
+  if (!gst_msdk_load_plugin (session, uid, 1, "msdkvp9dec"))
     return FALSE;
-  } else if (status > MFX_ERR_NONE) {
-    GST_WARNING_OBJECT (vp9dec, "Media SDK Plugin load warning: %s",
-        msdk_status_to_string (status));
-  }
 
   decoder->param.mfx.CodecId = MFX_CODEC_VP9;
   /* Replaced with width and height rounded up to 16 */
index 81c4842..8aaa817 100644 (file)
@@ -33,8 +33,6 @@
 #  include <config.h>
 #endif
 
-#include <mfxplugin.h>
-
 #include <gst/allocators/gstdmabuf.h>
 
 #include "gstmsdkvp9enc.h"
@@ -115,20 +113,12 @@ gst_msdkvp9enc_configure (GstMsdkEnc * encoder)
 {
   GstMsdkVP9Enc *thiz = GST_MSDKVP9ENC (encoder);
   mfxSession session;
-  mfxStatus status;
 
   if (encoder->hardware) {
     session = gst_msdk_context_get_session (encoder->context);
-    status = MFXVideoUSER_Load (session, &MFX_PLUGINID_VP9E_HW, 1);
 
-    if (status < MFX_ERR_NONE) {
-      GST_ERROR_OBJECT (thiz, "Media SDK Plugin load failed (%s)",
-          msdk_status_to_string (status));
+    if (!gst_msdk_load_plugin (session, &MFX_PLUGINID_VP9E_HW, 1, "msdkvp9enc"))
       return FALSE;
-    } else if (status > MFX_ERR_NONE) {
-      GST_WARNING_OBJECT (thiz, "Media SDK Plugin load warning: %s",
-          msdk_status_to_string (status));
-    }
   }
 
   encoder->num_extra_frames = encoder->async_depth - 1;
index 83c9a3e..5dde416 100644 (file)
@@ -450,3 +450,25 @@ gst_msdk_get_mfx_video_orientation_from_video_direction (guint value,
       break;
   }
 }
+
+gboolean
+gst_msdk_load_plugin (mfxSession session, const mfxPluginUID * uid,
+    mfxU32 version, const gchar * plugin)
+{
+  mfxStatus status;
+
+  status = MFXVideoUSER_Load (session, uid, version);
+
+  if (status == MFX_ERR_UNDEFINED_BEHAVIOR) {
+    GST_WARNING ("Media SDK Plugin for %s has been loaded", plugin);
+  } else if (status < MFX_ERR_NONE) {
+    GST_ERROR ("Media SDK Plugin for %s load failed (%s)", plugin,
+        msdk_status_to_string (status));
+    return FALSE;
+  } else if (status > MFX_ERR_NONE) {
+    GST_WARNING ("Media SDK Plugin for %s load warning: %s", plugin,
+        msdk_status_to_string (status));
+  }
+
+  return TRUE;
+}
index 61682a5..8483847 100644 (file)
@@ -43,6 +43,7 @@
 #include <gst/allocators/allocators.h>
 
 #include <mfxvideo.h>
+#include <mfxplugin.h>
 
 G_BEGIN_DECLS
 
@@ -99,6 +100,10 @@ void
 gst_msdk_get_mfx_video_orientation_from_video_direction (guint value,
     guint * mfx_mirror, guint * mfx_rotation);
 
+gboolean
+gst_msdk_load_plugin (mfxSession session, const mfxPluginUID * uid,
+    mfxU32 version, const gchar * plugin);
+
 G_END_DECLS
 
 #endif /* __MSDK_H__ */