gst/mpegtsmux/mpegtsmux.c: Fix EOS logic by correctly popping the collect pad buffers...
authorvanista <vanista@gmail.com>
Mon, 27 Oct 2008 08:52:50 +0000 (08:52 +0000)
committerSebastian Dröge <slomo@circular-chaos.org>
Mon, 27 Oct 2008 08:52:50 +0000 (08:52 +0000)
Original commit message from CVS:
Patch by: vanista <vanista at gmail dot com>
* 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
gst/mpegtsmux/mpegtsmux.c

index 0d864c0..037379d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-10-27  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
+
+       Patch by: vanista <vanista at gmail dot com>
+
+       * 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  <jan.schmidt@sun.com>
 
        * configure.ac:
index 2b418f3..81757c6 100644 (file)
@@ -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;
 }