summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Zanelli <aurelien.zanelli@darkosphere.fr>2015-02-03 10:59:16 -0300
committerThiago Santos <thiagoss@osg.samsung.com>2015-02-05 09:45:44 -0300
commit1ce3260a638d97d8a2447140d88e1bce156aa40e (patch)
tree839e4a7ed371caf44cf80452e36d4b37b63a4f4e
parentc3ca2f04fe5131362f46ae3fdd12ebe5b3b55773 (diff)
downloadgstreamer-plugins-bad-1ce3260a638d97d8a2447140d88e1bce156aa40e.tar.gz
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
-rw-r--r--gst/mpegtsdemux/tsdemux.c24
1 files 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);