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,
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;

View 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;
}