msdk: check GstMsdkContext instead of mfxSession instance
authorHaihao Xiang <haihao.xiang@intel.com>
Thu, 10 Dec 2020 03:11:04 +0000 (11:11 +0800)
committerHaihao Xiang <haihao.xiang@intel.com>
Thu, 24 Dec 2020 02:53:13 +0000 (02:53 +0000)
When creating a GstMsdkContext instance, it also creates a mfxSession
instance, so we may check GstMsdkContext instead of mfxSession instance
to make sure MSDK is available. In addition, according to MSDK doc [1],
MFXVideoCORE_SetHandle function should be executed before any actual
usage of library including queries, otherwise the behavior is
unexpected, so we should call MFXVideoCORE_QueryPlatform after
MFXVideoCORE_SetHandle on Linux

[1] https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#working-with-va-api-applications

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1867>

sys/msdk/gstmsdkcontext.c
sys/msdk/msdk.c

index c31f73a..d921078 100644 (file)
@@ -178,6 +178,7 @@ static gboolean
 gst_msdk_context_open (GstMsdkContext * context, gboolean hardware,
     GstMsdkContextJobType job_type)
 {
+  mfxU16 codename;
   GstMsdkContextPrivate *priv = context->priv;
 
   priv->job_type = job_type;
@@ -196,6 +197,13 @@ gst_msdk_context_open (GstMsdkContext * context, gboolean hardware,
   }
 #endif
 
+  codename = msdk_get_platform_codename (priv->session);
+
+  if (codename != MFX_PLATFORM_UNKNOWN)
+    GST_INFO ("Detected MFX platform with device code %d", codename);
+  else
+    GST_WARNING ("Unknown MFX platform");
+
   return TRUE;
 
 failed:
@@ -359,7 +367,6 @@ _requested_frame_size_is_equal_or_lower (mfxFrameAllocRequest * _req,
       (!(_req->Type & MFX_MEMTYPE_EXPORT_FRAME) &&
           _req->Info.Width <= cached_resp->request.Info.Width &&
           _req->Info.Height <= cached_resp->request.Info.Height))
-
     return TRUE;
 
   return FALSE;
index 68c2ae2..a4ce2c5 100644 (file)
@@ -192,7 +192,6 @@ msdk_open_session (mfxIMPL impl)
   mfxInitParam init_par = { impl, version };
   mfxIMPL implementation;
   mfxStatus status;
-  mfxU16 codename;
 
   static const gchar *implementation_names[] = {
     "AUTO", "SOFTWARE", "HARDWARE", "AUTO_ANY", "HARDWARE_ANY", "HARDWARE2",
@@ -223,13 +222,6 @@ msdk_open_session (mfxIMPL impl)
     goto failed;
   }
 
-  codename = msdk_get_platform_codename (session);
-
-  if (codename != MFX_PLATFORM_UNKNOWN)
-    GST_INFO ("Detected MFX platform with device code %d", codename);
-  else
-    GST_WARNING ("Unknown MFX platform");
-
   GST_INFO ("MFX implementation: 0x%04x (%s)", implementation,
       implementation_names[MFX_IMPL_BASETYPE (implementation)]);
   GST_INFO ("MFX version: %d.%d", version.Major, version.Minor);
@@ -244,12 +236,14 @@ failed:
 gboolean
 msdk_is_available (void)
 {
-  mfxSession session = msdk_open_session (MFX_IMPL_HARDWARE_ANY);
-  if (!session) {
+  /* Make sure we can create GstMsdkContext instance (the job type is not used actually) */
+  GstMsdkContext *msdk_context = gst_msdk_context_new (1, GST_MSDK_JOB_DECODER);
+
+  if (!msdk_context) {
     return FALSE;
   }
 
-  msdk_close_session (session);
+  gst_object_unref (msdk_context);
   return TRUE;
 }