From bb858a12baed953aec3dc8db2b50223dc93f82d8 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Wed, 2 Jul 2008 07:49:19 +0000 Subject: [PATCH] gst/mpegstream/gstmpegdemux.c: Bridge gaps in stream by NEWSEGMENT sending. Fixes #540194. Original commit message from CVS: * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_sync_stream_to_time): Bridge gaps in stream by NEWSEGMENT sending. Fixes #540194. --- ChangeLog | 6 ++++++ common | 2 +- gst/mpegstream/gstmpegdemux.c | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 47a5e06e94..97f9a0d622 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-07-02 Mark Nauwelaerts + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer), + (gst_mpeg_demux_sync_stream_to_time): + Bridge gaps in stream by NEWSEGMENT sending. Fixes #540194. + 2008-06-27 Mark Nauwelaerts * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_read), diff --git a/common b/common index d9cd98b46a..593bb114c6 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit d9cd98b46aebaf143dc43d8563a3bff650be6a7e +Subproject commit 593bb114c6f5c32b529aa6443be4c2d60d6484c7 diff --git a/gst/mpegstream/gstmpegdemux.c b/gst/mpegstream/gstmpegdemux.c index 057b9fe0f8..ccabdaa5c9 100644 --- a/gst/mpegstream/gstmpegdemux.c +++ b/gst/mpegstream/gstmpegdemux.c @@ -1041,6 +1041,37 @@ gst_mpeg_demux_send_subbuffer (GstMPEGDemux * mpeg_demux, GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buffer) + offset; + + if (GST_CLOCK_TIME_IS_VALID (timestamp) && + GST_CLOCK_TIME_IS_VALID (mpeg_parse->current_segment.last_stop)) { + GstClockTimeDiff diff; + guint64 update_time; + + update_time = MIN (timestamp, mpeg_parse->current_segment.stop); + update_time = MAX (timestamp, mpeg_parse->current_segment.start); + diff = GST_CLOCK_DIFF (mpeg_parse->current_segment.last_stop, update_time); + if (diff > GST_SECOND * 2) { + GST_DEBUG_OBJECT (mpeg_demux, "Gap of %" GST_TIME_FORMAT " detected in " + "stream %d. Sending updated NEWSEGMENT events", GST_TIME_ARGS (diff), + outstream->number); + PARSE_CLASS (mpeg_parse)->send_event (mpeg_parse, + gst_event_new_new_segment (TRUE, mpeg_parse->current_segment.rate, + GST_FORMAT_TIME, mpeg_parse->current_segment.last_stop, + mpeg_parse->current_segment.last_stop, + mpeg_parse->current_segment.last_stop)); + gst_segment_set_newsegment (&mpeg_parse->current_segment, + FALSE, mpeg_parse->current_segment.rate, GST_FORMAT_TIME, + update_time, mpeg_parse->current_segment.stop, update_time); + PARSE_CLASS (mpeg_parse)->send_event (mpeg_parse, + gst_event_new_new_segment (FALSE, mpeg_parse->current_segment.rate, + GST_FORMAT_TIME, update_time, + mpeg_parse->current_segment.stop, update_time)); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + gst_segment_set_last_stop (&mpeg_parse->current_segment, + GST_FORMAT_TIME, update_time); + } + ret = gst_pad_push (outstream->pad, outbuf); GST_LOG_OBJECT (outstream->pad, "flow: %s", gst_flow_get_name (ret)); ++outstream->buffers_sent; @@ -1135,8 +1166,6 @@ gst_mpeg_demux_sync_stream_to_time (GstMPEGDemux * mpeg_demux, gst_pad_push_event (stream->pad, gst_event_new_new_segment (TRUE, mpeg_parse->current_segment.rate, GST_FORMAT_TIME, update_time, mpeg_parse->current_segment.stop, update_time)); - - mpeg_parse->current_segment.last_stop = update_time; } #if 0