From 1ce3260a638d97d8a2447140d88e1bce156aa40e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Zanelli?= Date: Tue, 3 Feb 2015 10:59:16 -0300 Subject: tsdemux: don't mark streams as needing a new segment on flush The flush is called on discont and we shouldn't output a new segment each time a discont happens. So this commit remove the mark for a new segment when flushing streams by propagating the 'hard' flag passed on the flusing from the base class. https://bugzilla.gnome.org/show_bug.cgi?id=743363 --- gst/mpegtsdemux/tsdemux.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 9b2debbb9..d97a7d52a 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -288,11 +288,11 @@ static void gst_ts_demux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_ts_demux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static void gst_ts_demux_flush_streams (GstTSDemux * tsdemux); +static void gst_ts_demux_flush_streams (GstTSDemux * tsdemux, gboolean hard); static GstFlowReturn gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream); static void gst_ts_demux_stream_flush (TSDemuxStream * stream, - GstTSDemux * demux); + GstTSDemux * demux, gboolean hard); static gboolean push_event (MpegTSBase * base, GstEvent * event); @@ -1450,7 +1450,7 @@ gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream) stream->pad = NULL; } - gst_ts_demux_stream_flush (stream, GST_TS_DEMUX_CAST (base)); + gst_ts_demux_stream_flush (stream, GST_TS_DEMUX_CAST (base), TRUE); tsdemux_h264_parsing_info_clear (&stream->h264infos); } @@ -1486,7 +1486,8 @@ activate_pad_for_stream (GstTSDemux * tsdemux, TSDemuxStream * stream) } static void -gst_ts_demux_stream_flush (TSDemuxStream * stream, GstTSDemux * tsdemux) +gst_ts_demux_stream_flush (TSDemuxStream * stream, GstTSDemux * tsdemux, + gboolean hard) { GST_DEBUG ("flushing stream %p", stream); @@ -1497,25 +1498,28 @@ gst_ts_demux_stream_flush (TSDemuxStream * stream, GstTSDemux * tsdemux) stream->expected_size = 0; stream->allocated_size = 0; stream->current_size = 0; - stream->need_newsegment = TRUE; stream->discont = TRUE; stream->pts = GST_CLOCK_TIME_NONE; stream->dts = GST_CLOCK_TIME_NONE; - stream->first_dts = GST_CLOCK_TIME_NONE; stream->raw_pts = -1; stream->raw_dts = -1; stream->pending_ts = TRUE; stream->continuity_counter = CONTINUITY_UNSET; + if (hard) { + stream->first_dts = GST_CLOCK_TIME_NONE; + stream->need_newsegment = TRUE; + } } static void -gst_ts_demux_flush_streams (GstTSDemux * demux) +gst_ts_demux_flush_streams (GstTSDemux * demux, gboolean hard) { + GList *walk; if (!demux->program) return; - g_list_foreach (demux->program->stream_list, - (GFunc) gst_ts_demux_stream_flush, demux); + for (walk = demux->program->stream_list; walk; walk = g_list_next (walk)) + gst_ts_demux_stream_flush (walk->data, demux, hard); } static void @@ -2199,7 +2203,7 @@ gst_ts_demux_flush (MpegTSBase * base, gboolean hard) { GstTSDemux *demux = GST_TS_DEMUX_CAST (base); - gst_ts_demux_flush_streams (demux); + gst_ts_demux_flush_streams (demux, hard); if (demux->segment_event) { gst_event_unref (demux->segment_event); -- cgit v1.2.1