msdk: check GstMsdkContext instead of mfxSession instance

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>
This commit is contained in:
Haihao Xiang 2020-12-10 11:11:04 +08:00
parent 1138c798ff
commit 86fdd39147
2 changed files with 13 additions and 12 deletions

View file

@ -178,6 +178,7 @@ static gboolean
gst_msdk_context_open (GstMsdkContext * context, gboolean hardware, gst_msdk_context_open (GstMsdkContext * context, gboolean hardware,
GstMsdkContextJobType job_type) GstMsdkContextJobType job_type)
{ {
mfxU16 codename;
GstMsdkContextPrivate *priv = context->priv; GstMsdkContextPrivate *priv = context->priv;
priv->job_type = job_type; priv->job_type = job_type;
@ -196,6 +197,13 @@ gst_msdk_context_open (GstMsdkContext * context, gboolean hardware,
} }
#endif #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; return TRUE;
failed: failed:
@ -359,7 +367,6 @@ _requested_frame_size_is_equal_or_lower (mfxFrameAllocRequest * _req,
(!(_req->Type & MFX_MEMTYPE_EXPORT_FRAME) && (!(_req->Type & MFX_MEMTYPE_EXPORT_FRAME) &&
_req->Info.Width <= cached_resp->request.Info.Width && _req->Info.Width <= cached_resp->request.Info.Width &&
_req->Info.Height <= cached_resp->request.Info.Height)) _req->Info.Height <= cached_resp->request.Info.Height))
return TRUE; return TRUE;
return FALSE; return FALSE;

View file

@ -192,7 +192,6 @@ msdk_open_session (mfxIMPL impl)
mfxInitParam init_par = { impl, version }; mfxInitParam init_par = { impl, version };
mfxIMPL implementation; mfxIMPL implementation;
mfxStatus status; mfxStatus status;
mfxU16 codename;
static const gchar *implementation_names[] = { static const gchar *implementation_names[] = {
"AUTO", "SOFTWARE", "HARDWARE", "AUTO_ANY", "HARDWARE_ANY", "HARDWARE2", "AUTO", "SOFTWARE", "HARDWARE", "AUTO_ANY", "HARDWARE_ANY", "HARDWARE2",
@ -223,13 +222,6 @@ msdk_open_session (mfxIMPL impl)
goto failed; 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, GST_INFO ("MFX implementation: 0x%04x (%s)", implementation,
implementation_names[MFX_IMPL_BASETYPE (implementation)]); implementation_names[MFX_IMPL_BASETYPE (implementation)]);
GST_INFO ("MFX version: %d.%d", version.Major, version.Minor); GST_INFO ("MFX version: %d.%d", version.Major, version.Minor);
@ -244,12 +236,14 @@ failed:
gboolean gboolean
msdk_is_available (void) msdk_is_available (void)
{ {
mfxSession session = msdk_open_session (MFX_IMPL_HARDWARE_ANY); /* Make sure we can create GstMsdkContext instance (the job type is not used actually) */
if (!session) { GstMsdkContext *msdk_context = gst_msdk_context_new (1, GST_MSDK_JOB_DECODER);
if (!msdk_context) {
return FALSE; return FALSE;
} }
msdk_close_session (session); gst_object_unref (msdk_context);
return TRUE; return TRUE;
} }