mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-28 20:51:13 +00:00
oggdemux: only EOS when all streams are EOS
This commit is contained in:
parent
e8ae2adef1
commit
e23d6bbda7
2 changed files with 39 additions and 10 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue