From 71043cd0f9cb7a57a820b450846a643b3d978727 Mon Sep 17 00:00:00 2001 From: vanista Date: Mon, 27 Oct 2008 08:52:50 +0000 Subject: gst/mpegtsmux/mpegtsmux.c: Fix EOS logic by correctly popping the collect pad buffers only when we've chosen to use t... Original commit message from CVS: Patch by: vanista * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_choose_best_stream): Fix EOS logic by correctly popping the collect pad buffers only when we've chosen to use them instead of popping them always and storing them in a private queue. Before the pipeline would deadlock if all pads go EOS at the same time. Fixes bug #557763. --- ChangeLog | 12 ++++++++++++ gst/mpegtsmux/mpegtsmux.c | 13 +++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0d864c00..037379dd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-10-27 Sebastian Dröge + + Patch by: vanista + + * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_choose_best_stream): + Fix EOS logic by correctly popping the collect pad buffers only + when we've chosen to use them instead of popping them always and + storing them in a private queue. + + Before the pipeline would deadlock if all pads go EOS at the same + time. Fixes bug #557763. + 2008-10-26 Jan Schmidt * configure.ac: diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c index 2b418f35..81757c63 100644 --- a/gst/mpegtsmux/mpegtsmux.c +++ b/gst/mpegtsmux/mpegtsmux.c @@ -418,6 +418,7 @@ static MpegTsPadData * mpegtsmux_choose_best_stream (MpegTsMux * mux) { MpegTsPadData *best = NULL; + GstCollectData *c_best = NULL; GSList *walk; for (walk = mux->collect->data; walk != NULL; walk = g_slist_next (walk)) { @@ -428,7 +429,8 @@ mpegtsmux_choose_best_stream (MpegTsMux * mux) if (ts_data->queued_buf == NULL) { GstBuffer *buf; - ts_data->queued_buf = buf = gst_collect_pads_pop (mux->collect, c_data); + ts_data->queued_buf = buf = + gst_collect_pads_peek (mux->collect, c_data); if (buf != NULL) { if (ts_data->prepare_func) { @@ -463,8 +465,10 @@ mpegtsmux_choose_best_stream (MpegTsMux * mux) /* Choose a stream we've never seen a timestamp for to ensure * we push enough buffers from it to reach a timestamp */ - if (ts_data->last_ts == GST_CLOCK_TIME_NONE) + if (ts_data->last_ts == GST_CLOCK_TIME_NONE) { best = ts_data; + c_best = c_data; + } } else { ts_data->eos = TRUE; continue; @@ -478,12 +482,17 @@ mpegtsmux_choose_best_stream (MpegTsMux * mux) best->last_ts != GST_CLOCK_TIME_NONE && ts_data->last_ts < best->last_ts) { best = ts_data; + c_best = c_data; } } else { best = ts_data; + c_best = c_data; } } } + if (c_best) { + gst_buffer_unref (gst_collect_pads_pop (mux->collect, c_best)); + } return best; } -- cgit v1.2.1