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>
This commit is contained in:
Víctor Manuel Jáquez Leal 2021-03-12 13:50:59 +01:00 committed by GStreamer Marge Bot
parent 72345875b1
commit c74b230579
3 changed files with 40 additions and 6 deletions

View file

@ -1220,6 +1220,19 @@ gst_va_filter_add_filter_buffer (GstVaFilter * self, gpointer data, gsize size,
return TRUE; 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 static gboolean
_create_pipeline_buffer (GstVaFilter * self, VASurfaceID surface, _create_pipeline_buffer (GstVaFilter * self, VASurfaceID surface,
VARectangle * src_rect, VARectangle * dst_rect, VABufferID * buffer) VARectangle * src_rect, VARectangle * dst_rect, VABufferID * buffer)
@ -1350,10 +1363,8 @@ gst_va_filter_convert_surface (GstVaFilter * self, VASurfaceID in_surface,
bail: bail:
GST_OBJECT_LOCK (self); GST_OBJECT_LOCK (self);
if (self->filters) { if (self->filters)
g_array_unref (self->filters); g_array_unref (self->filters);
_destroy_filters_unlocked (self);
}
gst_va_display_lock (self->display); gst_va_display_lock (self->display);
status = vaDestroyBuffer (dpy, buffer); status = vaDestroyBuffer (dpy, buffer);

View file

@ -70,6 +70,7 @@ gboolean gst_va_filter_add_filter_buffer (GstVaFilter * self,
gpointer data, gpointer data,
gsize size, gsize size,
guint num); guint num);
gboolean gst_va_filter_drop_filter_buffers (GstVaFilter * self);
gboolean gst_va_filter_convert_surface (GstVaFilter * self, gboolean gst_va_filter_convert_surface (GstVaFilter * self,
VASurfaceID in_surface, VASurfaceID in_surface,
VASurfaceID out_surface); VASurfaceID out_surface);

View file

@ -112,6 +112,7 @@ struct _GstVaVpp
GstBufferPool *other_pool; GstBufferPool *other_pool;
GstVideoInfo srcpad_info; GstVideoInfo srcpad_info;
gboolean rebuild_filters;
guint op_flags; guint op_flags;
/* filters */ /* filters */
@ -265,15 +266,18 @@ gst_va_vpp_set_property (GObject * object, guint prop_id,
switch (prop_id) { switch (prop_id) {
case GST_VA_FILTER_PROP_DENOISE: case GST_VA_FILTER_PROP_DENOISE:
self->denoise = g_value_get_float (value); self->denoise = g_value_get_float (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_SHARPEN: case GST_VA_FILTER_PROP_SHARPEN:
self->sharpen = g_value_get_float (value); self->sharpen = g_value_get_float (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_SKINTONE: case GST_VA_FILTER_PROP_SKINTONE:
if (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN) if (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN)
self->skintone = (float) g_value_get_boolean (value); self->skintone = (float) g_value_get_boolean (value);
else else
self->skintone = g_value_get_float (value); self->skintone = g_value_get_float (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_VIDEO_DIR:{ case GST_VA_FILTER_PROP_VIDEO_DIR:{
GstVideoOrientationMethod direction = g_value_get_enum (value); 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: case GST_VA_FILTER_PROP_HUE:
self->hue = g_value_get_float (value); self->hue = g_value_get_float (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_SATURATION: case GST_VA_FILTER_PROP_SATURATION:
self->saturation = g_value_get_float (value); self->saturation = g_value_get_float (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_BRIGHTNESS: case GST_VA_FILTER_PROP_BRIGHTNESS:
self->brightness = g_value_get_float (value); self->brightness = g_value_get_float (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_CONTRAST: case GST_VA_FILTER_PROP_CONTRAST:
self->contrast = g_value_get_float (value); self->contrast = g_value_get_float (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_AUTO_SATURATION: case GST_VA_FILTER_PROP_AUTO_SATURATION:
self->auto_saturation = g_value_get_boolean (value); self->auto_saturation = g_value_get_boolean (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_AUTO_BRIGHTNESS: case GST_VA_FILTER_PROP_AUTO_BRIGHTNESS:
self->auto_brightness = g_value_get_boolean (value); self->auto_brightness = g_value_get_boolean (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
case GST_VA_FILTER_PROP_AUTO_CONTRAST: case GST_VA_FILTER_PROP_AUTO_CONTRAST:
self->auto_contrast = g_value_get_boolean (value); self->auto_contrast = g_value_get_boolean (value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -934,9 +945,8 @@ _add_filter_cb_buffer (GstVaVpp * self,
} }
static void 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, static const VAProcFilterType filter_types[] = { VAProcFilterNoiseReduction,
VAProcFilterSharpening, VAProcFilterSkinToneEnhancement, VAProcFilterSharpening, VAProcFilterSkinToneEnhancement,
VAProcFilterColorBalance, VAProcFilterColorBalance,
@ -974,8 +984,19 @@ gst_va_vpp_before_transform (GstBaseTransform * trans, GstBuffer * inbuf)
else else
self->op_flags &= ~VPP_CONVERT_FILTERS; self->op_flags &= ~VPP_CONVERT_FILTERS;
GST_OBJECT_UNLOCK (self); 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 static inline gsize
@ -2562,6 +2583,7 @@ _set_cb_val (GstVaVpp * self, const gchar * name,
if (changed) { if (changed) {
GST_INFO_OBJECT (self, "%s: %d / %f", channel->label, value, new_value); GST_INFO_OBJECT (self, "%s: %d / %f", channel->label, value, new_value);
gst_color_balance_value_changed (GST_COLOR_BALANCE (self), channel, value); gst_color_balance_value_changed (GST_COLOR_BALANCE (self), channel, value);
g_atomic_int_set (&self->rebuild_filters, TRUE);
} }
return TRUE; return TRUE;