summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorWeiChungChang <r97922153@gmail.com>2017-01-17 10:33:03 +0800
committerSebastian Dröge <sebastian@centricular.com>2017-01-18 13:13:15 +0200
commitc9fbf3459a719b2c68ba69ddabd373ea9bf804a2 (patch)
tree5e013f7d744930e0caa6722c968e3aba4aee85e3 /ext
parent7bcc44778a183005091e3d57e97ed1ba9c8e825c (diff)
downloadgstreamer-plugins-bad-c9fbf3459a719b2c68ba69ddabd373ea9bf804a2.tar.gz
dashdemux: Fix issue when manifest update sets slow start without passing necessary header & caps changes downstream
https://bugzilla.gnome.org/show_bug.cgi?id=777206
Diffstat (limited to 'ext')
-rw-r--r--ext/dash/gstdashdemux.c29
-rw-r--r--ext/dash/gstdashdemux.h1
2 files changed, 30 insertions, 0 deletions
diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c
index f6f812f6b..2ba32fc54 100644
--- a/ext/dash/gstdashdemux.c
+++ b/ext/dash/gstdashdemux.c
@@ -713,6 +713,7 @@ gst_dash_demux_setup_all_streams (GstDashDemux * demux)
(stream), tags);
stream->index = i;
stream->pending_seek_ts = GST_CLOCK_TIME_NONE;
+ stream->last_representation_id = NULL;
if (active_stream->cur_adapt_set &&
active_stream->cur_adapt_set->RepresentationBase &&
active_stream->cur_adapt_set->RepresentationBase->ContentProtection) {
@@ -1152,6 +1153,33 @@ gst_dash_demux_stream_update_fragment_info (GstAdaptiveDemuxStream * stream)
if (gst_mpd_client_get_next_fragment_timestamp (dashdemux->client,
dashstream->index, &ts)) {
+ if (gst_mpd_client_is_live (dashdemux->client)) {
+ if (!GST_ADAPTIVE_DEMUX_STREAM_NEED_HEADER (stream)) {
+ if (dashstream->active_stream
+ && dashstream->active_stream->cur_representation) {
+ /* id specifies an identifier for this Representation. The
+ * identifier shall be unique within a Period unless the
+ * Representation is functionally identically to another
+ * Representation in the same Period. */
+ if (!g_strcmp0 (dashstream->active_stream->cur_representation->id,
+ dashstream->last_representation_id)) {
+ GstCaps *caps;
+ stream->need_header = TRUE;
+
+ GST_INFO_OBJECT (dashdemux, "Switching bitrate to %d",
+ dashstream->active_stream->cur_representation->bandwidth);
+ caps =
+ gst_dash_demux_get_input_caps (dashdemux,
+ dashstream->active_stream);
+ gst_adaptive_demux_stream_set_caps (stream, caps);
+ }
+ }
+ }
+ g_free (dashstream->last_representation_id);
+ dashstream->last_representation_id =
+ g_strdup (dashstream->active_stream->cur_representation->id);
+ }
+
if (GST_ADAPTIVE_DEMUX_STREAM_NEED_HEADER (stream)) {
gst_adaptive_demux_stream_fragment_clear (&stream->fragment);
gst_dash_demux_stream_update_headers_info (stream);
@@ -2739,6 +2767,7 @@ gst_dash_demux_stream_free (GstAdaptiveDemuxStream * stream)
gst_isoff_moof_box_free (dash_stream->moof);
if (dash_stream->moof_sync_samples)
g_array_free (dash_stream->moof_sync_samples, TRUE);
+ g_free (dash_stream->last_representation_id);
}
static GstDashDemuxClockDrift *
diff --git a/ext/dash/gstdashdemux.h b/ext/dash/gstdashdemux.h
index 0757d76b1..2bbd4f18b 100644
--- a/ext/dash/gstdashdemux.h
+++ b/ext/dash/gstdashdemux.h
@@ -96,6 +96,7 @@ struct _GstDashDemuxStream
guint64 moof_average_size, first_sync_sample_average_size;
gboolean first_sync_sample_after_moof, first_sync_sample_always_after_moof;
+ gchar *last_representation_id;
};
/**