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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4652>
This commit is contained in:
Seungha Yang 2023-05-16 22:56:15 +09:00 committed by GStreamer Marge Bot
parent d0268db7e4
commit d016bf1bed

View file

@ -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;
}
}