From 66d3ac8fb745b2a1475018dd0a855e3e45046ab2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 12 Dec 2009 16:55:13 +0100 Subject: [PATCH] videomixer: Dequeue current buffer on FLUSH_STOP and don't unref NULL buffers ... NULL buffers shouldn't really happen anymore when popping the buffer from GstCollectPads but better check for this and print a warning. --- gst/videomixer/videomixer.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/gst/videomixer/videomixer.c b/gst/videomixer/videomixer.c index 48d559f..4599760 100644 --- a/gst/videomixer/videomixer.c +++ b/gst/videomixer/videomixer.c @@ -1136,6 +1136,7 @@ gst_videomixer_fill_queues (GstVideoMixer * mix) GST_LOG_OBJECT (mix, "we need a new buffer"); buf = gst_collect_pads_peek (mix->collect, data); + if (buf) { guint64 duration; @@ -1287,9 +1288,16 @@ gst_videomixer_update_queues (GstVideoMixer * mix) pad->queued -= interval; GST_LOG_OBJECT (pad, "queued now %" G_GINT64_FORMAT, pad->queued); if (pad->queued <= 0) { + GstBuffer *buffer = + gst_collect_pads_pop (mix->collect, &mixcol->collect); + GST_LOG_OBJECT (pad, "unreffing buffer"); - gst_buffer_unref (gst_collect_pads_pop (mix->collect, - &mixcol->collect)); + if (buffer) + gst_buffer_unref (buffer); + else + GST_WARNING_OBJECT (pad, + "Buffer was removed by GstCollectPads in the meantime"); + gst_buffer_unref (mixcol->buffer); mixcol->buffer = NULL; } @@ -1503,6 +1511,7 @@ gst_videomixer_src_event (GstPad * pad, GstEvent * event) static gboolean gst_videomixer_sink_event (GstPad * pad, GstEvent * event) { + GstVideoMixerPad *vpad = GST_VIDEO_MIXER_PAD (pad); GstVideoMixer *videomixer = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); gboolean ret; @@ -1518,6 +1527,12 @@ gst_videomixer_sink_event (GstPad * pad, GstEvent * event) * and downstream (using our source pad, the bastard!). */ videomixer->sendseg = TRUE; + + /* Reset pad state after FLUSH_STOP */ + if (vpad->mixcol->buffer) + gst_buffer_unref (vpad->mixcol->buffer); + vpad->mixcol->buffer = NULL; + vpad->queued = 0; break; case GST_EVENT_NEWSEGMENT: videomixer->sendseg = TRUE; -- 2.7.4