From acc295c93b248f87652a0217aa7f89b8d7d1005f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 9 Nov 2014 10:32:18 +0100 Subject: [PATCH] basesink: Don't bother the subclass with setting the same caps multiple times --- libs/gst/base/gstbasesink.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index e0d5ac4696..6fff96f161 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -3069,19 +3069,28 @@ gst_base_sink_default_event (GstBaseSink * basesink, GstEvent * event) } case GST_EVENT_CAPS: { - GstCaps *caps; + GstCaps *caps, *current_caps; GST_DEBUG_OBJECT (basesink, "caps %p", event); gst_event_parse_caps (event, &caps); - if (bclass->set_caps) - result = bclass->set_caps (basesink, caps); + current_caps = gst_pad_get_current_caps (GST_BASE_SINK_PAD (basesink)); - if (result) { - GST_OBJECT_LOCK (basesink); - gst_caps_replace (&basesink->priv->caps, caps); - GST_OBJECT_UNLOCK (basesink); + if (current_caps && gst_caps_is_equal (current_caps, caps)) { + GST_DEBUG_OBJECT (basesink, + "New caps equal to old ones: %" GST_PTR_FORMAT, caps); + } else { + if (bclass->set_caps) + result = bclass->set_caps (basesink, caps); + + if (result) { + GST_OBJECT_LOCK (basesink); + gst_caps_replace (&basesink->priv->caps, caps); + GST_OBJECT_UNLOCK (basesink); + } } + if (current_caps) + gst_caps_unref (current_caps); break; } case GST_EVENT_SEGMENT: