aboutsummaryrefslogtreecommitdiff
path: root/ext/ogg/gstoggdemux.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ogg/gstoggdemux.c')
-rw-r--r--ext/ogg/gstoggdemux.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c
index 9d290b7..2ca3a7b 100644
--- a/ext/ogg/gstoggdemux.c
+++ b/ext/ogg/gstoggdemux.c
@@ -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:
@@ -1040,10 +1047,11 @@ gst_ogg_pad_submit_packet (GstOggPad * pad, ogg_packet * packet)
GST_TIME_ARGS (start_time));
segment.rate = ogg->push_seek_rate;
segment.start = ogg->push_seek_time_original_target;
- segment.stop = -1;
+ segment.stop = ogg->push_seek_time_original_stop;
segment.time = ogg->push_seek_time_original_target;
segment.base = ogg->push_seek_time_original_target;
event = gst_event_new_segment (&segment);
+ gst_event_set_seqnum (event, ogg->push_seek_seqnum);
ogg->push_state = PUSH_PLAYING;
} else {
segment.rate = ogg->segment.rate;
@@ -1691,6 +1699,7 @@ gst_ogg_pad_handle_push_mode_state (GstOggPad * pad, ogg_page * page)
gst_event_new_seek (ogg->push_seek_rate, GST_FORMAT_BYTES,
ogg->push_seek_flags, GST_SEEK_TYPE_SET, best,
GST_SEEK_TYPE_NONE, -1);
+ gst_event_set_seqnum (sevent, ogg->push_seek_seqnum);
GST_PUSH_UNLOCK (ogg);
res = gst_pad_push_event (ogg->sinkpad, sevent);
@@ -2130,6 +2139,7 @@ gst_ogg_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
GST_DEBUG_OBJECT (ogg, "got a new segment event");
{
GstSegment segment;
+ gboolean update;
gst_event_copy_segment (event, &segment);
@@ -2137,6 +2147,13 @@ gst_ogg_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
GST_PUSH_LOCK (ogg);
ogg->push_byte_offset = segment.start;
ogg->push_last_seek_offset = segment.start;
+
+ if (gst_event_get_seqnum (event) == ogg->push_seek_seqnum)
+ gst_segment_do_seek (&ogg->segment, ogg->push_seek_rate,
+ GST_FORMAT_TIME, ogg->push_seek_flags, GST_SEEK_TYPE_SET,
+ ogg->push_seek_time_original_target, GST_SEEK_TYPE_SET,
+ ogg->push_seek_time_original_stop, &update);
+
GST_PUSH_UNLOCK (ogg);
} else {
GST_WARNING_OBJECT (ogg, "unexpected segment format: %s",
@@ -3419,7 +3436,7 @@ gst_ogg_demux_perform_seek_push (GstOggDemux * ogg, GstEvent * event)
goto error;
}
- if (start_type != GST_SEEK_TYPE_SET) {
+ if (start_type != GST_SEEK_TYPE_SET || stop_type != GST_SEEK_TYPE_SET) {
GST_DEBUG_OBJECT (ogg, "can only seek to a SET target");
goto error;
}
@@ -3511,9 +3528,11 @@ gst_ogg_demux_perform_seek_push (GstOggDemux * ogg, GstEvent * event)
ogg->push_offset1 = ogg->push_byte_length - 1;
ogg->push_time0 = ogg->push_start_time;
ogg->push_time1 = ogg->push_time_length;
+ ogg->push_seek_seqnum = gst_event_get_seqnum (event);
ogg->push_seek_time_target = start;
ogg->push_prev_seek_time = GST_CLOCK_TIME_NONE;
ogg->push_seek_time_original_target = start;
+ ogg->push_seek_time_original_stop = stop;
ogg->push_state = PUSH_BISECT1;
ogg->seek_secant = FALSE;
ogg->seek_undershot = FALSE;
@@ -3541,6 +3560,7 @@ gst_ogg_demux_perform_seek_push (GstOggDemux * ogg, GstEvent * event)
ogg->push_bisection_steps[1] = 0;
sevent = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
start_type, best, GST_SEEK_TYPE_NONE, -1);
+ gst_event_set_seqnum (sevent, gst_event_get_seqnum (event));
GST_PUSH_UNLOCK (ogg);
res = gst_pad_push_event (ogg->sinkpad, sevent);