summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2021-03-12 13:50:59 +0100
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-03-15 06:10:27 +0000
commitc74b23057945be8ce3e9787cc16118d76f86a99c (patch)
treebf4bdb60f0d26957c3b2c4360e97675a25868fdf /sys
parent72345875b1ab4c1b2a78a767785ac5e3c0b884a2 (diff)
downloadgstreamer-plugins-bad-c74b23057945be8ce3e9787cc16118d76f86a99c.tar.gz
va: postproc: only drop filters if they change
Currently, at every frame the filters array is recreated. This is not optimal, since it should be only rebuilt if the VA filter's related properties change. This patches does that by using a flag. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2078>
Diffstat (limited to 'sys')
-rw-r--r--sys/va/gstvafilter.c17
-rw-r--r--sys/va/gstvafilter.h1
-rw-r--r--sys/va/gstvavpp.c28
3 files changed, 40 insertions, 6 deletions
diff --git a/sys/va/gstvafilter.c b/sys/va/gstvafilter.c
index 83c14773a..d79fa2bbb 100644
--- a/sys/va/gstvafilter.c
+++ b/sys/va/gstvafilter.c
@@ -1220,6 +1220,19 @@ gst_va_filter_add_filter_buffer (GstVaFilter * self, gpointer data, gsize size,
return TRUE;
}
+gboolean
+gst_va_filter_drop_filter_buffers (GstVaFilter * self)
+{
+ gboolean ret = TRUE;
+
+ GST_OBJECT_LOCK (self);
+ if (self->filters)
+ ret = _destroy_filters_unlocked (self);
+ GST_OBJECT_UNLOCK (self);
+
+ return ret;
+}
+
static gboolean
_create_pipeline_buffer (GstVaFilter * self, VASurfaceID surface,
VARectangle * src_rect, VARectangle * dst_rect, VABufferID * buffer)
@@ -1350,10 +1363,8 @@ gst_va_filter_convert_surface (GstVaFilter * self, VASurfaceID in_surface,
bail:
GST_OBJECT_LOCK (self);
- if (self->filters) {
+ if (self->filters)
g_array_unref (self->filters);
- _destroy_filters_unlocked (self);
- }
gst_va_display_lock (self->display);
status = vaDestroyBuffer (dpy, buffer);
diff --git a/sys/va/gstvafilter.h b/sys/va/gstvafilter.h
index 274ea5d06..e747cc2dd 100644
--- a/sys/va/gstvafilter.h
+++ b/sys/va/gstvafilter.h
@@ -70,6 +70,7 @@ gboolean gst_va_filter_add_filter_buffer (GstVaFilter * self,
gpointer data,
gsize size,
guint num);
+gboolean gst_va_filter_drop_filter_buffers (GstVaFilter * self);
gboolean gst_va_filter_convert_surface (GstVaFilter * self,
VASurfaceID in_surface,
VASurfaceID out_surface);
diff --git a/sys/va/gstvavpp.c b/sys/va/gstvavpp.c
index 76cea8d54..ccd2c5e62 100644
--- a/sys/va/gstvavpp.c
+++ b/sys/va/gstvavpp.c
@@ -112,6 +112,7 @@ struct _GstVaVpp
GstBufferPool *other_pool;
GstVideoInfo srcpad_info;
+ gboolean rebuild_filters;
guint op_flags;
/* filters */
@@ -265,15 +266,18 @@ gst_va_vpp_set_property (GObject * object, guint prop_id,
switch (prop_id) {
case GST_VA_FILTER_PROP_DENOISE:
self->denoise = g_value_get_float (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_SHARPEN:
self->sharpen = g_value_get_float (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_SKINTONE:
if (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN)
self->skintone = (float) g_value_get_boolean (value);
else
self->skintone = g_value_get_float (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_VIDEO_DIR:{
GstVideoOrientationMethod direction = g_value_get_enum (value);
@@ -284,24 +288,31 @@ gst_va_vpp_set_property (GObject * object, guint prop_id,
}
case GST_VA_FILTER_PROP_HUE:
self->hue = g_value_get_float (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_SATURATION:
self->saturation = g_value_get_float (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_BRIGHTNESS:
self->brightness = g_value_get_float (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_CONTRAST:
self->contrast = g_value_get_float (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_AUTO_SATURATION:
self->auto_saturation = g_value_get_boolean (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_AUTO_BRIGHTNESS:
self->auto_brightness = g_value_get_boolean (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
case GST_VA_FILTER_PROP_AUTO_CONTRAST:
self->auto_contrast = g_value_get_boolean (value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -934,9 +945,8 @@ _add_filter_cb_buffer (GstVaVpp * self,
}
static void
-gst_va_vpp_before_transform (GstBaseTransform * trans, GstBuffer * inbuf)
+_build_filters (GstVaVpp * self)
{
- GstVaVpp *self = GST_VA_VPP (trans);
static const VAProcFilterType filter_types[] = { VAProcFilterNoiseReduction,
VAProcFilterSharpening, VAProcFilterSkinToneEnhancement,
VAProcFilterColorBalance,
@@ -974,8 +984,19 @@ gst_va_vpp_before_transform (GstBaseTransform * trans, GstBuffer * inbuf)
else
self->op_flags &= ~VPP_CONVERT_FILTERS;
GST_OBJECT_UNLOCK (self);
+}
- _update_passthrough (self, TRUE);
+static void
+gst_va_vpp_before_transform (GstBaseTransform * trans, GstBuffer * inbuf)
+{
+ GstVaVpp *self = GST_VA_VPP (trans);
+
+ if (g_atomic_int_get (&self->rebuild_filters) == TRUE) {
+ gst_va_filter_drop_filter_buffers (self->filter);
+ _build_filters (self);
+ _update_passthrough (self, TRUE);
+ g_atomic_int_set (&self->rebuild_filters, FALSE);
+ }
}
static inline gsize
@@ -2562,6 +2583,7 @@ _set_cb_val (GstVaVpp * self, const gchar * name,
if (changed) {
GST_INFO_OBJECT (self, "%s: %d / %f", channel->label, value, new_value);
gst_color_balance_value_changed (GST_COLOR_BALANCE (self), channel, value);
+ g_atomic_int_set (&self->rebuild_filters, TRUE);
}
return TRUE;