diff --git a/sys/va/gstvafilter.c b/sys/va/gstvafilter.c index 83c14773af..d79fa2bbb4 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 274ea5d062..e747cc2dd8 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 76cea8d542..ccd2c5e624 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;