summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst-libs/gst/adaptivedemux/gstadaptivedemux.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
index 6e0d88dfd..d43fdc953 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
@@ -151,7 +151,8 @@ static void gst_adaptive_demux_updates_loop (GstAdaptiveDemux * demux);
static void gst_adaptive_demux_stream_download_loop (GstAdaptiveDemuxStream *
stream);
static void gst_adaptive_demux_reset (GstAdaptiveDemux * demux);
-static gboolean gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux);
+static gboolean gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux,
+ gboolean first_and_live);
static gboolean gst_adaptive_demux_is_live (GstAdaptiveDemux * demux);
static GstFlowReturn gst_adaptive_demux_stream_seek (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream, GstClockTime ts);
@@ -510,7 +511,8 @@ gst_adaptive_demux_sink_event (GstPad * pad, GstObject * parent,
}
if (demux->next_streams) {
- gst_adaptive_demux_expose_streams (demux);
+ gst_adaptive_demux_expose_streams (demux,
+ gst_adaptive_demux_is_live (demux));
gst_adaptive_demux_start_tasks (demux);
if (gst_adaptive_demux_is_live (demux)) {
/* Task to periodically update the manifest */
@@ -736,11 +738,12 @@ gst_adaptive_demux_get_period_start_time (GstAdaptiveDemux * demux)
}
static gboolean
-gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux)
+gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux,
+ gboolean first_and_live)
{
GList *iter;
GList *old_streams;
- GstClockTime period_start;
+ GstClockTime period_start, min_pts = GST_CLOCK_TIME_NONE;
g_return_val_if_fail (demux->next_streams != NULL, FALSE);
@@ -756,6 +759,29 @@ gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux)
GST_ADAPTIVE_DEMUX_STREAM_CAST (stream))) {
/* TODO act on error */
}
+
+ if (first_and_live) {
+ /* TODO we only need the first timestamp, maybe create a simple function */
+ gst_adaptive_demux_stream_update_fragment_info (demux, stream);
+
+ if (GST_CLOCK_TIME_IS_VALID (min_pts)) {
+ min_pts = MIN (min_pts, stream->fragment.timestamp);
+ } else {
+ min_pts = stream->fragment.timestamp;
+ }
+ }
+ }
+
+ /* For live streams, the subclass is supposed to seek to the current
+ * fragment and then tell us its timestamp in stream->fragment.timestamp.
+ * We now also have to seek our demuxer segment to reflect this.
+ *
+ * FIXME: This needs some refactoring at some point.
+ */
+ if (first_and_live) {
+ gst_segment_do_seek (&demux->segment, demux->segment.rate, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, min_pts, GST_SEEK_TYPE_NONE, -1,
+ NULL);
}
period_start = gst_adaptive_demux_get_period_start_time (demux);
@@ -1090,7 +1116,7 @@ gst_adaptive_demux_src_event (GstPad * pad, GstObject * parent,
}
if (demux->next_streams) {
- gst_adaptive_demux_expose_streams (demux);
+ gst_adaptive_demux_expose_streams (demux, FALSE);
} else {
GList *iter;
GstClockTime period_start =
@@ -2583,7 +2609,7 @@ gst_adaptive_demux_stream_advance_fragment_unlocked (GstAdaptiveDemux * demux,
/* TODO only allow switching streams if other downloads are not ongoing */
GST_DEBUG_OBJECT (demux, "Subclass wants new pads "
"to do bitrate switching");
- gst_adaptive_demux_expose_streams (demux);
+ gst_adaptive_demux_expose_streams (demux, FALSE);
gst_adaptive_demux_start_tasks (demux);
ret = GST_FLOW_EOS;
}
@@ -2737,7 +2763,7 @@ gst_adaptive_demux_advance_period (GstAdaptiveDemux * demux)
GST_DEBUG_OBJECT (demux, "Advancing to next period");
klass->advance_period (demux);
- gst_adaptive_demux_expose_streams (demux);
+ gst_adaptive_demux_expose_streams (demux, FALSE);
gst_adaptive_demux_start_tasks (demux);
}