summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorXu Guangxin <guangxin.xu@intel.com>2020-08-04 17:14:44 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2020-08-13 01:43:19 +0000
commit9123b9ba3992d7f9cb8ccec4171e24c68ad6becd (patch)
treeb9fc840f6b2d399145d31ae679e1238de89f38a2 /sys
parentea0aac4c19a065645fb84f3b81eede752384989d (diff)
downloadgstreamer-plugins-bad-9123b9ba3992d7f9cb8ccec4171e24c68ad6becd.tar.gz
msdkvpp: do not hold too many input buffers in locked list
If the surface is locked before vpp, upstream takes the reference. We do not need to take a reference for msdk in vpp. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1490>
Diffstat (limited to 'sys')
-rw-r--r--sys/msdk/gstmsdkvpp.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/msdk/gstmsdkvpp.c b/sys/msdk/gstmsdkvpp.c
index 8d78520a8..764a4ecca 100644
--- a/sys/msdk/gstmsdkvpp.c
+++ b/sys/msdk/gstmsdkvpp.c
@@ -200,9 +200,16 @@ release_msdk_surface (GstMsdkVPP * thiz, MsdkSurface * surface, GList ** list)
}
static void
-release_in_surface (GstMsdkVPP * thiz, MsdkSurface * surface)
+release_in_surface (GstMsdkVPP * thiz, MsdkSurface * surface,
+ gboolean locked_by_others)
{
- release_msdk_surface (thiz, surface, &thiz->locked_in_surfaces);
+ if (locked_by_others) {
+ /* mfxFrameSurface1 locked by others, others will hold the surface->buf reference */
+ /* we are good to release it here */
+ free_msdk_surface (surface);
+ } else {
+ release_msdk_surface (thiz, surface, &thiz->locked_in_surfaces);
+ }
}
static void
@@ -841,6 +848,7 @@ gst_msdkvpp_transform (GstBaseTransform * trans, GstBuffer * inbuf,
mfxFrameInfo *in_info = NULL;
MsdkSurface *in_surface = NULL;
MsdkSurface *out_surface = NULL;
+ gboolean locked_by_others;
timestamp = GST_BUFFER_TIMESTAMP (inbuf);
free_unlocked_msdk_surfaces (thiz);
@@ -854,6 +862,7 @@ gst_msdkvpp_transform (GstBaseTransform * trans, GstBuffer * inbuf,
free_msdk_surface (in_surface);
return GST_FLOW_ERROR;
}
+ locked_by_others = ! !in_surface->surface->Data.Locked;
if (gst_msdk_is_msdk_buffer (outbuf)) {
out_surface = g_slice_new0 (MsdkSurface);
@@ -944,7 +953,7 @@ error_push_buffer:
gst_flow_get_name (ret));
transform_end:
- release_in_surface (thiz, in_surface);
+ release_in_surface (thiz, in_surface, locked_by_others);
release_out_surface (thiz, out_surface);
return ret;