From 86fdd39147a9cc19070954fd46d8814cad37f35a Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Thu, 10 Dec 2020 11:11:04 +0800 Subject: [PATCH] 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: --- sys/msdk/gstmsdkcontext.c | 9 ++++++++- sys/msdk/msdk.c | 16 +++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/sys/msdk/gstmsdkcontext.c b/sys/msdk/gstmsdkcontext.c index c31f73a544..d9210780a0 100644 --- a/sys/msdk/gstmsdkcontext.c +++ b/sys/msdk/gstmsdkcontext.c @@ -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; diff --git a/sys/msdk/msdk.c b/sys/msdk/msdk.c index 68c2ae25d9..a4ce2c50df 100644 --- a/sys/msdk/msdk.c +++ b/sys/msdk/msdk.c @@ -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; }