oggdemux: only EOS when all streams are EOS
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 2 Apr 2010 14:37:21 +0000 (16:37 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 30 Apr 2010 10:51:54 +0000 (12:51 +0200)
ext/ogg/gstoggdemux.c
ext/ogg/gstoggdemux.h

index f8fb72a..a77d2c9 100644 (file)
@@ -375,6 +375,7 @@ gst_ogg_pad_reset (GstOggPad * pad)
   pad->last_stop = GST_CLOCK_TIME_NONE;
   pad->current_granule = -1;
   pad->keyframe_granule = -1;
+  pad->is_eos = FALSE;
 }
 
 /* called when the skeleton fishead is found. Caller ensures the packet is
@@ -679,6 +680,14 @@ gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet,
   GST_DEBUG_OBJECT (ogg, "ogg current time %" GST_TIME_FORMAT,
       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 && ogg->segment.start != GST_CLOCK_TIME_NONE &&
+          current_time < ogg->segment.start)) {
+    pad->is_eos = TRUE;
+  }
+
 done:
   if (buf)
     gst_buffer_unref (buf);
@@ -2936,6 +2945,29 @@ done:
   return ret;
 }
 
+/* returns TRUE if all streams in current chain reached EOS, FALSE otherwise */
+static gboolean
+gst_ogg_demux_check_eos (GstOggDemux * ogg)
+{
+  GstOggChain *chain;
+  gboolean eos = TRUE;
+
+  chain = ogg->current_chain;
+  if (G_LIKELY (chain)) {
+    gint i;
+
+    for (i = 0; i < chain->streams->len; i++) {
+      GstOggPad *opad = g_array_index (chain->streams, GstOggPad *, i);
+
+      eos = eos && opad->is_eos;
+    }
+  } else {
+    eos = FALSE;
+  }
+
+  return eos;
+}
+
 static GstFlowReturn
 gst_ogg_demux_loop_forward (GstOggDemux * ogg)
 {
@@ -2970,11 +3002,9 @@ gst_ogg_demux_loop_forward (GstOggDemux * ogg)
   }
 
   /* check for the end of the segment */
-  if (ogg->segment.stop != -1 && ogg->segment.last_stop != -1) {
-    if (ogg->segment.last_stop > ogg->segment.stop) {
-      ret = GST_FLOW_UNEXPECTED;
-      goto done;
-    }
+  if (gst_ogg_demux_check_eos (ogg)) {
+    ret = GST_FLOW_UNEXPECTED;
+    goto done;
   }
 done:
   return ret;
@@ -3019,11 +3049,9 @@ gst_ogg_demux_loop_reverse (GstOggDemux * ogg)
     goto done;
 
   /* check for the end of the segment */
-  if (ogg->segment.start != -1 && ogg->segment.last_stop != -1) {
-    if (ogg->segment.last_stop <= ogg->segment.start) {
-      ret = GST_FLOW_UNEXPECTED;
-      goto done;
-    }
+  if (gst_ogg_demux_check_eos (ogg)) {
+    ret = GST_FLOW_UNEXPECTED;
+    goto done;
   }
 done:
   return ret;
index 1c69b41..2cee7b6 100644 (file)
@@ -111,6 +111,7 @@ struct _GstOggPad
 
   gboolean discont;
   GstFlowReturn last_ret;       /* last return of _pad_push() */
+  gboolean is_eos;
 
   gboolean added;
 };