From c9fbf3459a719b2c68ba69ddabd373ea9bf804a2 Mon Sep 17 00:00:00 2001 From: WeiChungChang Date: Tue, 17 Jan 2017 10:33:03 +0800 Subject: [PATCH] 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 --- ext/dash/gstdashdemux.c | 29 +++++++++++++++++++++++++++++ ext/dash/gstdashdemux.h | 1 + 2 files changed, 30 insertions(+) diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c index f6f812f6ba..2ba32fc54e 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 0757d76b1b..2bbd4f18b1 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; }; /**