diff --git a/sys/msdk/gstmsdkcontextutil.c b/sys/msdk/gstmsdkcontextutil.c index 0e25080efb..6f5c7e41d7 100644 --- a/sys/msdk/gstmsdkcontextutil.c +++ b/sys/msdk/gstmsdkcontextutil.c @@ -161,6 +161,7 @@ gst_msdk_context_find (GstElement * element, GstMsdkContext ** context_ptr) return TRUE; } + /* This may indirectly set *context_ptr, see function body */ _gst_context_query (element, GST_MSDK_CONTEXT_TYPE_NAME); if (*context_ptr) diff --git a/sys/msdk/gstmsdkdec.c b/sys/msdk/gstmsdkdec.c index caa99670de..b50457fafc 100644 --- a/sys/msdk/gstmsdkdec.c +++ b/sys/msdk/gstmsdkdec.c @@ -710,6 +710,12 @@ gst_msdkdec_context_prepare (GstMsdkDec * thiz) if (!gst_msdk_context_find (GST_ELEMENT_CAST (thiz), &thiz->context)) return FALSE; + if (thiz->context == thiz->old_context) { + GST_INFO_OBJECT (thiz, "Found old context %" GST_PTR_FORMAT + ", reusing as-is", thiz->context); + return TRUE; + } + /* TODO: Currently d3d allocator is not implemented. * So decoder uses system memory by default on Windows. */ @@ -765,6 +771,11 @@ gst_msdkdec_start (GstVideoDecoder * decoder) thiz->context); } + /* Save the current context in a separate field so that we know whether it + * has changed between calls to _start() */ + gst_object_replace ((GstObject **) & thiz->old_context, + (GstObject *) thiz->context); + gst_msdk_context_add_shared_async_depth (thiz->context, thiz->async_depth); return TRUE; diff --git a/sys/msdk/gstmsdkdec.h b/sys/msdk/gstmsdkdec.h index 8bb746b858..b15c855c04 100644 --- a/sys/msdk/gstmsdkdec.h +++ b/sys/msdk/gstmsdkdec.h @@ -90,6 +90,7 @@ struct _GstMsdkDec /* MFX context */ GstMsdkContext *context; + GstMsdkContext *old_context; mfxVideoParam param; GArray *tasks; guint next_task; diff --git a/sys/msdk/gstmsdkenc.c b/sys/msdk/gstmsdkenc.c index d5a6e87abd..4a761d0886 100644 --- a/sys/msdk/gstmsdkenc.c +++ b/sys/msdk/gstmsdkenc.c @@ -1605,6 +1605,12 @@ gst_msdkenc_context_prepare (GstMsdkEnc * thiz) if (!gst_msdk_context_find (GST_ELEMENT_CAST (thiz), &thiz->context)) return FALSE; + if (thiz->context == thiz->old_context) { + GST_INFO_OBJECT (thiz, "Found old context %" GST_PTR_FORMAT + ", reusing as-is", thiz->context); + return TRUE; + } + GST_INFO_OBJECT (thiz, "Found context %" GST_PTR_FORMAT " from neighbour", thiz->context); @@ -1656,6 +1662,11 @@ gst_msdkenc_start (GstVideoEncoder * encoder) thiz->context); } + /* Save the current context in a separate field so that we know whether it + * has changed between calls to _start() */ + gst_object_replace ((GstObject **) & thiz->old_context, + (GstObject *) thiz->context); + gst_msdk_context_add_shared_async_depth (thiz->context, thiz->async_depth); /* Set the minimum pts to some huge value (1000 hours). This keeps @@ -1779,6 +1790,7 @@ gst_msdkenc_finalize (GObject * object) gst_clear_object (&thiz->msdk_pool); gst_clear_object (&thiz->msdk_converted_pool); + gst_clear_object (&thiz->old_context); G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/sys/msdk/gstmsdkenc.h b/sys/msdk/gstmsdkenc.h index 9895874497..2703fb188a 100644 --- a/sys/msdk/gstmsdkenc.h +++ b/sys/msdk/gstmsdkenc.h @@ -99,6 +99,7 @@ struct _GstMsdkEnc /* MFX context */ GstMsdkContext *context; + GstMsdkContext *old_context; mfxVideoParam param; guint num_surfaces; guint num_tasks; diff --git a/sys/msdk/gstmsdkvpp.c b/sys/msdk/gstmsdkvpp.c index 05747d9b85..dce4934dfa 100644 --- a/sys/msdk/gstmsdkvpp.c +++ b/sys/msdk/gstmsdkvpp.c @@ -197,6 +197,12 @@ gst_msdkvpp_context_prepare (GstMsdkVPP * thiz) if (!gst_msdk_context_find (GST_ELEMENT_CAST (thiz), &thiz->context)) return FALSE; + if (thiz->context == thiz->old_context) { + GST_INFO_OBJECT (thiz, "Found old context %" GST_PTR_FORMAT + ", reusing as-is", thiz->context); + return TRUE; + } + GST_INFO_OBJECT (thiz, "Found context %" GST_PTR_FORMAT " from neighbour", thiz->context); @@ -247,6 +253,11 @@ ensure_context (GstBaseTransform * trans) thiz->context); } + /* Save the current context in a separate field so that we know whether it + * has changed between calls to _start() */ + gst_object_replace ((GstObject **) & thiz->old_context, + (GstObject *) thiz->context); + gst_msdk_context_add_shared_async_depth (thiz->context, thiz->async_depth); return TRUE; @@ -1476,6 +1487,10 @@ gst_msdkvpp_get_property (GObject * object, guint prop_id, static void gst_msdkvpp_finalize (GObject * object) { + GstMsdkVPP *thiz = GST_MSDKVPP (object); + + gst_clear_object (&thiz->old_context); + G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/sys/msdk/gstmsdkvpp.h b/sys/msdk/gstmsdkvpp.h index c644084d3d..83ff2b7f5c 100644 --- a/sys/msdk/gstmsdkvpp.h +++ b/sys/msdk/gstmsdkvpp.h @@ -89,6 +89,7 @@ struct _GstMsdkVPP /* MFX context */ GstMsdkContext *context; + GstMsdkContext *old_context; mfxVideoParam param; guint in_num_surfaces; guint out_num_surfaces;