oggdemux: only EOS when all streams are EOS

This commit is contained in:
Mark Nauwelaerts 2010-04-02 16:37:21 +02:00
parent e8ae2adef1
commit e23d6bbda7
2 changed files with 39 additions and 10 deletions

View file

@ -375,6 +375,7 @@ gst_ogg_pad_reset (GstOggPad * pad)
pad->last_stop = GST_CLOCK_TIME_NONE; pad->last_stop = GST_CLOCK_TIME_NONE;
pad->current_granule = -1; pad->current_granule = -1;
pad->keyframe_granule = -1; pad->keyframe_granule = -1;
pad->is_eos = FALSE;
} }
/* called when the skeleton fishead is found. Caller ensures the packet is /* 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_DEBUG_OBJECT (ogg, "ogg current time %" GST_TIME_FORMAT,
GST_TIME_ARGS (current_time)); 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: done:
if (buf) if (buf)
gst_buffer_unref (buf); gst_buffer_unref (buf);
@ -2936,6 +2945,29 @@ done:
return ret; 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 static GstFlowReturn
gst_ogg_demux_loop_forward (GstOggDemux * ogg) gst_ogg_demux_loop_forward (GstOggDemux * ogg)
{ {
@ -2970,12 +3002,10 @@ gst_ogg_demux_loop_forward (GstOggDemux * ogg)
} }
/* check for the end of the segment */ /* check for the end of the segment */
if (ogg->segment.stop != -1 && ogg->segment.last_stop != -1) { if (gst_ogg_demux_check_eos (ogg)) {
if (ogg->segment.last_stop > ogg->segment.stop) {
ret = GST_FLOW_UNEXPECTED; ret = GST_FLOW_UNEXPECTED;
goto done; goto done;
} }
}
done: done:
return ret; return ret;
} }
@ -3019,12 +3049,10 @@ gst_ogg_demux_loop_reverse (GstOggDemux * ogg)
goto done; goto done;
/* check for the end of the segment */ /* check for the end of the segment */
if (ogg->segment.start != -1 && ogg->segment.last_stop != -1) { if (gst_ogg_demux_check_eos (ogg)) {
if (ogg->segment.last_stop <= ogg->segment.start) {
ret = GST_FLOW_UNEXPECTED; ret = GST_FLOW_UNEXPECTED;
goto done; goto done;
} }
}
done: done:
return ret; return ret;
} }

View file

@ -111,6 +111,7 @@ struct _GstOggPad
gboolean discont; gboolean discont;
GstFlowReturn last_ret; /* last return of _pad_push() */ GstFlowReturn last_ret; /* last return of _pad_push() */
gboolean is_eos;
gboolean added; gboolean added;
}; };