oggdemux: check for full eos after a pad goes eos in push mode
authorThiago Santos <thiago.sousa.santos@collabora.com>
Fri, 6 Sep 2013 18:36:12 +0000 (15:36 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Tue, 10 Sep 2013 15:14:47 +0000 (12:14 -0300)
After a pad is on EOS, verify if all pads are EOS and return
upstream, avoiding keeping the buffer flow without having more
data to push

ext/ogg/gstoggdemux.c

index 7a68668..2ca3a7b 100644 (file)
@@ -146,6 +146,7 @@ static GstOggPad *gst_ogg_chain_get_stream (GstOggChain * chain,
 static GstFlowReturn gst_ogg_demux_combine_flows (GstOggDemux * ogg,
     GstOggPad * pad, GstFlowReturn ret);
 static void gst_ogg_demux_sync_streams (GstOggDemux * ogg);
+static gboolean gst_ogg_demux_check_eos (GstOggDemux * ogg);
 
 static GstCaps *gst_ogg_demux_set_header_on_caps (GstOggDemux * ogg,
     GstCaps * caps, GList * headers);
@@ -733,11 +734,17 @@ gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet,
       GST_TIME_ARGS (current_time));
 
   /* check stream eos */
-  if ((ogg->segment.rate > 0.0 && ogg->segment.stop != GST_CLOCK_TIME_NONE &&
-          current_time >= ogg->segment.stop) ||
-      (ogg->segment.rate < 0.0 && current_time <= ogg->segment.start)) {
+  if (!delta_unit &&
+      ((ogg->segment.rate > 0.0 &&
+              ogg->segment.stop != GST_CLOCK_TIME_NONE &&
+              current_time >= ogg->segment.stop) ||
+          (ogg->segment.rate < 0.0 && current_time <= ogg->segment.start))) {
     GST_DEBUG_OBJECT (ogg, "marking pad %p EOS", pad);
     pad->is_eos = TRUE;
+
+    if (cret == GST_FLOW_OK && gst_ogg_demux_check_eos (ogg)) {
+      cret = GST_FLOW_EOS;
+    }
   }
 
 done: