mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-23 07:38:16 +00:00
msdk: use MFXJoinSession() to join the parent and child sessions
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1503>
This commit is contained in:
parent
cd3a3534c4
commit
bda11a3e73
1 changed files with 66 additions and 17 deletions
|
@ -315,17 +315,80 @@ gst_msdk_context_new_with_parent (GstMsdkContext * parent)
|
||||||
GstMsdkContext *obj = g_object_new (GST_TYPE_MSDK_CONTEXT, NULL);
|
GstMsdkContext *obj = g_object_new (GST_TYPE_MSDK_CONTEXT, NULL);
|
||||||
GstMsdkContextPrivate *priv = obj->priv;
|
GstMsdkContextPrivate *priv = obj->priv;
|
||||||
GstMsdkContextPrivate *parent_priv = parent->priv;
|
GstMsdkContextPrivate *parent_priv = parent->priv;
|
||||||
|
mfxVersion version;
|
||||||
|
mfxIMPL impl;
|
||||||
|
MsdkSession child_msdk_session;
|
||||||
|
mfxHandleType handle_type = 0;
|
||||||
|
mfxHDL handle = NULL;
|
||||||
|
|
||||||
|
status = MFXQueryIMPL (parent_priv->session.session, &impl);
|
||||||
|
|
||||||
|
if (status == MFX_ERR_NONE)
|
||||||
|
status = MFXQueryVersion (parent_priv->session.session, &version);
|
||||||
|
|
||||||
status =
|
|
||||||
MFXCloneSession (parent_priv->session.session, &priv->session.session);
|
|
||||||
if (status != MFX_ERR_NONE) {
|
if (status != MFX_ERR_NONE) {
|
||||||
GST_ERROR ("Failed to clone mfx session");
|
GST_ERROR ("Failed to query the session attributes (%s)",
|
||||||
|
msdk_status_to_string (status));
|
||||||
g_object_unref (obj);
|
g_object_unref (obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MFX_IMPL_VIA_VAAPI == (0x0f00 & (impl)))
|
||||||
|
handle_type = MFX_HANDLE_VA_DISPLAY;
|
||||||
|
|
||||||
|
if (handle_type) {
|
||||||
|
status =
|
||||||
|
MFXVideoCORE_GetHandle (parent_priv->session.session, handle_type,
|
||||||
|
&handle);
|
||||||
|
|
||||||
|
if (status != MFX_ERR_NONE || !handle) {
|
||||||
|
GST_ERROR ("Failed to get session handle (%s)",
|
||||||
|
msdk_status_to_string (status));
|
||||||
|
g_object_unref (obj);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
child_msdk_session.loader = parent_priv->session.loader;
|
||||||
|
child_msdk_session.session = NULL;
|
||||||
|
status = msdk_init_msdk_session (impl, &version, &child_msdk_session);
|
||||||
|
|
||||||
|
if (status != MFX_ERR_NONE) {
|
||||||
|
GST_ERROR ("Failed to create a child mfx session (%s)",
|
||||||
|
msdk_status_to_string (status));
|
||||||
|
g_object_unref (obj);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handle) {
|
||||||
|
status =
|
||||||
|
MFXVideoCORE_SetHandle (child_msdk_session.session, handle_type,
|
||||||
|
handle);
|
||||||
|
|
||||||
|
if (status != MFX_ERR_NONE) {
|
||||||
|
GST_ERROR ("Failed to set a HW handle (%s)",
|
||||||
|
msdk_status_to_string (status));
|
||||||
|
MFXClose (child_msdk_session.session);
|
||||||
|
g_object_unref (obj);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if (MFX_VERSION >= 1025)
|
||||||
|
status =
|
||||||
|
MFXJoinSession (parent_priv->session.session, child_msdk_session.session);
|
||||||
|
|
||||||
|
if (status != MFX_ERR_NONE) {
|
||||||
|
GST_ERROR ("Failed to join two sessions (%s)",
|
||||||
|
msdk_status_to_string (status));
|
||||||
|
MFXClose (child_msdk_session.session);
|
||||||
|
g_object_unref (obj);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Set loader to NULL for child session */
|
/* Set loader to NULL for child session */
|
||||||
priv->session.loader = NULL;
|
priv->session.loader = NULL;
|
||||||
|
priv->session.session = child_msdk_session.session;
|
||||||
priv->is_joined = TRUE;
|
priv->is_joined = TRUE;
|
||||||
priv->hardware = parent_priv->hardware;
|
priv->hardware = parent_priv->hardware;
|
||||||
priv->job_type = parent_priv->job_type;
|
priv->job_type = parent_priv->job_type;
|
||||||
|
@ -334,20 +397,6 @@ gst_msdk_context_new_with_parent (GstMsdkContext * parent)
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
priv->dpy = parent_priv->dpy;
|
priv->dpy = parent_priv->dpy;
|
||||||
priv->fd = parent_priv->fd;
|
priv->fd = parent_priv->fd;
|
||||||
|
|
||||||
if (priv->hardware) {
|
|
||||||
status =
|
|
||||||
MFXVideoCORE_SetHandle (priv->session.session, MFX_HANDLE_VA_DISPLAY,
|
|
||||||
(mfxHDL) parent_priv->dpy);
|
|
||||||
|
|
||||||
if (status != MFX_ERR_NONE) {
|
|
||||||
GST_ERROR ("Setting VA handle failed (%s)",
|
|
||||||
msdk_status_to_string (status));
|
|
||||||
g_object_unref (obj);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
|
Loading…
Reference in a new issue