aggregator: Remove the GAP event from the queue before queueing up the GAP buffer
authorSebastian Dröge <sebastian@centricular.com>
Mon, 24 Jul 2017 15:38:57 +0000 (18:38 +0300)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 2 Dec 2017 15:10:27 +0000 (15:10 +0000)
Otherwise check_events() will not remove the GAP event (as the queue
tail is not the event anymore but the GAP buffer), then the GAP buffer
is handled, then the GAP event is handled again, ... forever.

libs/gst/base/gstaggregator.c

index 33752e1..4431cbf 100644 (file)
@@ -1476,6 +1476,10 @@ gst_aggregator_default_sink_event (GstAggregator * self,
       GST_BUFFER_FLAG_SET (gapbuf, GST_BUFFER_FLAG_GAP);
       GST_BUFFER_FLAG_SET (gapbuf, GST_BUFFER_FLAG_DROPPABLE);
 
+      /* Remove GAP event so we can replace it with the buffer */
+      if (g_queue_peek_tail (&aggpad->priv->buffers) == event)
+        gst_event_unref (g_queue_pop_tail (&aggpad->priv->buffers));
+
       if (gst_aggregator_pad_chain_internal (self, aggpad, gapbuf, FALSE) !=
           GST_FLOW_OK) {
         GST_WARNING_OBJECT (self, "Failed to chain gap buffer");