d3d11compositor: Reconfigure resource only when output caps is changed
authorSeungha Yang <seungha@centricular.com>
Mon, 17 Apr 2023 14:06:54 +0000 (23:06 +0900)
committerTim-Philipp Müller <tim@centricular.com>
Mon, 17 Apr 2023 18:34:17 +0000 (19:34 +0100)
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>

subprojects/gst-plugins-bad/sys/d3d11/gstd3d11compositor.cpp

index 77bca9b..d777aaa 100644 (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);
 }