From d016bf1bed3ec0723ba39504efafa61094b3b488 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 16 May 2023 22:56:15 +0900 Subject: d3d11convert: Fix for runtime property update Every setup happens in set_caps() method but basetransform will not call the set_caps() if in/out caps were not changed Part-of: --- .../gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp | 105 +++++++++++++++++---- 1 file changed, 87 insertions(+), 18 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp index 64c0d81ada..27997bbecb 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp @@ -71,9 +71,15 @@ struct _GstD3D11BaseConvert /* Updated by subclass */ gboolean add_borders; + gboolean active_add_borders; + guint64 border_color; + GstVideoGammaMode gamma_mode; + GstVideoGammaMode active_gamma_mode; + GstVideoPrimariesMode primaries_mode; + GstVideoPrimariesMode active_primaries_mode; /* orientation */ /* method configured via property */ @@ -117,6 +123,8 @@ gst_d3d11_base_convert_generate_output (GstBaseTransform * trans, GstBuffer ** buffer); static gboolean gst_d3d11_base_convert_transform_meta (GstBaseTransform * trans, GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf); +static void gst_d3d11_base_convert_before_transform (GstBaseTransform * trans, + GstBuffer * buffer); static GstFlowReturn gst_d3d11_base_convert_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); static gboolean gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, @@ -283,6 +291,8 @@ gst_d3d11_base_convert_class_init (GstD3D11BaseConvertClass * klass) GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_generate_output); trans_class->transform_meta = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_transform_meta); + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_before_transform); trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_transform); bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_set_info); @@ -294,10 +304,10 @@ gst_d3d11_base_convert_class_init (GstD3D11BaseConvertClass * klass) static void gst_d3d11_base_convert_init (GstD3D11BaseConvert * self) { - self->add_borders = DEFAULT_ADD_BORDERS; + self->add_borders = self->active_add_borders = DEFAULT_ADD_BORDERS; self->border_color = DEFAULT_BORDER_COLOR; - self->gamma_mode = DEFAULT_GAMMA_MODE; - self->primaries_mode = DEFAULT_PRIMARIES_MODE; + self->gamma_mode = self->active_gamma_mode = DEFAULT_GAMMA_MODE; + self->primaries_mode = self->active_primaries_mode = DEFAULT_PRIMARIES_MODE; } static void @@ -1450,6 +1460,14 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, GstD3D11SRWLockGuard lk (&self->lock); self->active_method = self->selected_method; + self->active_add_borders = self->add_borders; + self->active_gamma_mode = self->gamma_mode; + self->active_primaries_mode = self->primaries_mode; + + GST_DEBUG_OBJECT (self, "method %d, add-borders %d, gamma-mode %d, " + "primaries-mode %d", self->active_method, + self->active_add_borders, self->active_gamma_mode, + self->active_primaries_mode); if (self->active_method != GST_VIDEO_ORIENTATION_IDENTITY) need_flip = TRUE; @@ -1492,7 +1510,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, self->borders_w = self->borders_h = 0; if (to_dar_n != from_dar_n || to_dar_d != from_dar_d) { - if (self->add_borders) { + if (self->active_add_borders) { gint n, d, to_h, to_w; if (from_dar_n != -1 && from_dar_d != -1 @@ -1539,9 +1557,9 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, config = gst_structure_new ("convert-config", GST_D3D11_CONVERTER_OPT_GAMMA_MODE, - GST_TYPE_VIDEO_GAMMA_MODE, self->gamma_mode, + GST_TYPE_VIDEO_GAMMA_MODE, self->active_gamma_mode, GST_D3D11_CONVERTER_OPT_PRIMARIES_MODE, - GST_TYPE_VIDEO_PRIMARIES_MODE, self->primaries_mode, nullptr); + GST_TYPE_VIDEO_PRIMARIES_MODE, self->active_primaries_mode, nullptr); self->converter = gst_d3d11_converter_new (filter->device, in_info, out_info, config); @@ -1844,6 +1862,53 @@ gst_d3d11_base_convert_transform_meta (GstBaseTransform * trans, outbuf, meta, inbuf); } +static void +gst_d3d11_base_convert_before_transform (GstBaseTransform * trans, + GstBuffer * buffer) +{ + GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (trans); + GstCaps *in_caps; + GstCaps *out_caps; + GstBaseTransformClass *klass; + gboolean update = FALSE; + + GST_BASE_TRANSFORM_CLASS (parent_class)->before_transform (trans, buffer); + + AcquireSRWLockExclusive (&self->lock); + if (self->selected_method != self->active_method || + self->add_borders != self->active_add_borders || + self->gamma_mode != self->active_gamma_mode || + self->primaries_mode != self->active_primaries_mode) { + update = TRUE; + } + ReleaseSRWLockExclusive (&self->lock); + + if (!update) + return; + + GST_DEBUG_OBJECT (self, "Updating caps for property change"); + + in_caps = gst_pad_get_current_caps (GST_BASE_TRANSFORM_SINK_PAD (trans)); + if (!in_caps) { + GST_WARNING_OBJECT (trans, "sinkpad has no current caps"); + return; + } + + out_caps = gst_pad_get_current_caps (GST_BASE_TRANSFORM_SRC_PAD (trans)); + if (!out_caps) { + GST_WARNING_OBJECT (trans, "srcpad has no current caps"); + gst_caps_unref (in_caps); + return; + } + + klass = GST_BASE_TRANSFORM_GET_CLASS (trans); + klass->set_caps (trans, in_caps, out_caps); + gst_caps_unref (in_caps); + gst_caps_unref (out_caps); + + gst_base_transform_reconfigure_src (trans); +} + static GstFlowReturn gst_d3d11_base_convert_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf) @@ -1891,10 +1956,9 @@ gst_d3d11_base_convert_set_add_border (GstD3D11BaseConvert * self, { GstD3D11SRWLockGuard lk (&self->lock); - if (add_border != self->add_borders) { - self->add_borders = add_border; + self->add_borders = add_border; + if (self->add_borders != self->active_add_borders) gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM_CAST (self)); - } } static void @@ -1941,9 +2005,11 @@ gst_d3d11_base_convert_set_gamma_mode (GstD3D11BaseConvert * self, GstVideoGammaMode mode) { GstD3D11SRWLockGuard lk (&self->lock); - if (self->gamma_mode != mode) { - GST_DEBUG_OBJECT (self, "Gamma mode %d -> %d", self->gamma_mode, mode); - self->gamma_mode = mode; + GstVideoGammaMode prev_mode = self->gamma_mode; + self->gamma_mode = mode; + + if (self->gamma_mode != self->active_gamma_mode) { + GST_DEBUG_OBJECT (self, "Gamma mode %d -> %d", prev_mode, self->gamma_mode); gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); } } @@ -1953,23 +2019,26 @@ gst_d3d11_base_convert_set_primaries_mode (GstD3D11BaseConvert * self, GstVideoPrimariesMode mode) { GstD3D11SRWLockGuard lk (&self->lock); - if (self->primaries_mode != mode) { + GstVideoPrimariesMode prev_mode = self->primaries_mode; + self->primaries_mode = mode; + + if (self->primaries_mode != self->active_primaries_mode) { gboolean prev_enabled = TRUE; gboolean new_enabled = TRUE; GST_DEBUG_OBJECT (self, "Primaries mode %d -> %d", - self->primaries_mode, mode); + prev_mode, self->primaries_mode); - if (self->primaries_mode == GST_VIDEO_PRIMARIES_MODE_NONE) + if (prev_mode == GST_VIDEO_PRIMARIES_MODE_NONE) prev_enabled = FALSE; - if (mode == GST_VIDEO_PRIMARIES_MODE_NONE) + if (self->primaries_mode == GST_VIDEO_PRIMARIES_MODE_NONE) new_enabled = FALSE; - self->primaries_mode = mode; - if (prev_enabled != new_enabled) gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); + else + self->active_primaries_mode = self->primaries_mode; } } -- cgit v1.2.1