d3d11compositor: Reconfigure resource only when output caps is changed

GstD3D11Converter setup is heavy operation since it requires
shader compile, GPU resource allocation, some math, mutex, etc.
We can avoid it if negotiated caps is not changed.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4440>
This commit is contained in:
Seungha Yang 2023-04-17 23:06:54 +09:00 committed by Tim-Philipp Müller
parent 88353d8cb2
commit 2c7a8739dd

View file

@ -320,6 +320,7 @@ struct _GstD3D11Compositor
GstD3D11Device *device;
GstBuffer *fallback_buf;
GstCaps *negotiated_caps;
GstD3D11CompositorQuad *checker_background;
/* black/white/transparent */
@ -1261,6 +1262,7 @@ gst_d3d11_compositor_stop (GstAggregator * agg)
g_clear_pointer (&self->checker_background, gst_d3d11_compositor_quad_free);
gst_clear_object (&self->device);
gst_clear_caps (&self->negotiated_caps);
return GST_AGGREGATOR_CLASS (parent_class)->stop (agg);
}
@ -1626,6 +1628,11 @@ gst_d3d11_compositor_negotiated_src_caps (GstAggregator * agg, GstCaps * caps)
return FALSE;
}
if (self->negotiated_caps && gst_caps_is_equal (self->negotiated_caps, caps)) {
GST_DEBUG_OBJECT (self, "Negotiated caps is not changed");
goto done;
}
features = gst_caps_get_features (caps, 0);
if (features
&& gst_caps_features_contains (features,
@ -1682,6 +1689,9 @@ gst_d3d11_compositor_negotiated_src_caps (GstAggregator * agg, GstCaps * caps)
gst_object_unref (pool);
}
gst_caps_replace (&self->negotiated_caps, caps);
done:
return GST_AGGREGATOR_CLASS (parent_class)->negotiated_src_caps (agg, caps);
}