From b54367e211d75c1e8ab1df11af8cf53e17413888 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Mon, 12 May 2014 14:51:00 -0300 Subject: [PATCH] mssdemux: reenable segment tracking for streams Store the latest pushed timestamp so that mssdemux streams know where they are in time --- ext/smoothstreaming/gstmssdemux.c | 57 ++++--------------------------- ext/smoothstreaming/gstmssdemux.h | 1 - 2 files changed, 7 insertions(+), 51 deletions(-) diff --git a/ext/smoothstreaming/gstmssdemux.c b/ext/smoothstreaming/gstmssdemux.c index 0740687b91..e7bd764d23 100644 --- a/ext/smoothstreaming/gstmssdemux.c +++ b/ext/smoothstreaming/gstmssdemux.c @@ -1035,9 +1035,7 @@ _src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) gst_pad_push_event (stream->pad, stream->pending_segment); stream->pending_segment = NULL; } -#if 0 - stream->position = demux->segment.position = GST_BUFFER_PTS (buffer); -#endif + stream->segment.position = GST_BUFFER_PTS (buffer); } else { GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE; @@ -1050,10 +1048,6 @@ _src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT); } -#if 0 - GST_BUFFER_DURATION (buffer) = - gst_mss_stream_get_fragment_gst_duration (stream->manifest_stream); -#endif GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE; @@ -1062,6 +1056,8 @@ _src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) g_get_monotonic_time () - stream->download_start_time; stream->download_total_bytes += gst_buffer_get_size (buffer); + stream->have_data = TRUE; + ret = gst_proxy_pad_chain_default (pad, parent, buffer); stream->download_start_time = g_get_monotonic_time (); GST_LOG_OBJECT (pad, "Chain res: %d %s", ret, gst_flow_get_name (ret)); @@ -1383,8 +1379,7 @@ gst_mss_demux_download_loop (GstMssDemuxStream * stream) GST_DEBUG_OBJECT (stream->pad, "Activating stream due to reconfigure event"); - cur = GST_CLOCK_TIME_IS_VALID (stream->next_timestamp) ? - stream->next_timestamp : 0; + cur = stream->segment.position; if (gst_pad_peer_query_position (stream->pad, GST_FORMAT_TIME, &pos)) { ts = (GstClockTime) pos; @@ -1397,7 +1392,7 @@ gst_mss_demux_download_loop (GstMssDemuxStream * stream) } /* we might have already pushed this data */ - ts = MAX (ts, stream->next_timestamp); + ts = MAX (ts, cur); GST_DEBUG_OBJECT (stream->pad, "Restarting stream at " "position %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); @@ -1438,6 +1433,8 @@ gst_mss_demux_download_loop (GstMssDemuxStream * stream) switch (ret) { case GST_FLOW_OK: stream->download_error_count = 0; + stream->segment.position += + gst_mss_stream_get_fragment_gst_duration (stream->manifest_stream); gst_mss_stream_advance_fragment (stream->manifest_stream); break; /* all is good, let's go */ @@ -1517,46 +1514,6 @@ gst_mss_demux_combine_flows (GstMssDemux * mssdemux) return GST_FLOW_OK; } -#if 0 -static gboolean -gst_mss_demux_stream_push (GstMssDemuxStream * stream, GstBuffer * buf) -{ - GstFlowReturn ret; - - if (G_UNLIKELY (stream->pending_segment)) { - gst_pad_push_event (stream->pad, stream->pending_segment); - stream->pending_segment = NULL; - } - - if (GST_BUFFER_TIMESTAMP (buf) != stream->next_timestamp) { - GST_DEBUG_OBJECT (stream->pad, "Marking buffer %p as discont buffer:%" - GST_TIME_FORMAT " != expected:%" GST_TIME_FORMAT, buf, - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), - GST_TIME_ARGS (stream->next_timestamp)); - GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); - } - - GST_DEBUG_OBJECT (stream->pad, - "Pushing buffer %p %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT - " discont:%d", buf, - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), - GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), - GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)); - - stream->next_timestamp = - GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf); - - stream->have_data = TRUE; - stream->segment.position = GST_BUFFER_TIMESTAMP (buf); - - ret = gst_pad_push (stream->pad, GST_BUFFER_CAST (buf)); - GST_DEBUG_OBJECT (stream->pad, "Pushed. result: %d (%s)", - ret, gst_flow_get_name (ret)); - - return ret; -} -#endif - static gboolean gst_mss_demux_stream_push_event (GstMssDemuxStream * stream, GstEvent * event) { diff --git a/ext/smoothstreaming/gstmssdemux.h b/ext/smoothstreaming/gstmssdemux.h index 4c399ead44..284c59d2e5 100644 --- a/ext/smoothstreaming/gstmssdemux.h +++ b/ext/smoothstreaming/gstmssdemux.h @@ -66,7 +66,6 @@ struct _GstMssDemuxStream { GstEvent *pending_segment; - GstClockTime next_timestamp; GstSegment segment; /* Downloading task */