aggregator: Don't send multiple caps events with the same caps
authorSebastian Dröge <sebastian@centricular.com>
Thu, 5 May 2022 17:39:52 +0000 (20:39 +0300)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 5 May 2022 17:41:58 +0000 (17:41 +0000)
Every time aggregator is reconfiguring it will try to negotiate new
caps. If these resulting caps are the same as the previously negotiated
caps then don't send a new caps event with the same caps again.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2372>

subprojects/gstreamer/libs/gst/base/gstaggregator.c

index a0fbfb3..a970c51 100644 (file)
@@ -671,7 +671,22 @@ gst_aggregator_push_mandatory_events (GstAggregator * self, gboolean up_to_caps)
 void
 gst_aggregator_set_src_caps (GstAggregator * self, GstCaps * caps)
 {
+  GstCaps *old_caps;
+
   GST_PAD_STREAM_LOCK (self->srcpad);
+
+  if (caps && (old_caps = gst_pad_get_current_caps (self->srcpad))) {
+    if (gst_caps_is_equal (caps, old_caps)) {
+      GST_DEBUG_OBJECT (self,
+          "New caps are the same as the previously set caps %" GST_PTR_FORMAT,
+          old_caps);
+      gst_caps_unref (old_caps);
+      GST_PAD_STREAM_UNLOCK (self->srcpad);
+      return;
+    }
+    gst_caps_unref (old_caps);
+  }
+
   gst_caps_replace (&self->priv->srccaps, caps);
   gst_aggregator_push_mandatory_events (self, TRUE);
   GST_PAD_STREAM_UNLOCK (self->srcpad);