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
This commit is contained in:
WeiChungChang 2017-01-17 10:33:03 +08:00 committed by Sebastian Dröge
parent 7bcc44778a
commit c9fbf3459a
2 changed files with 30 additions and 0 deletions

View file

@ -713,6 +713,7 @@ gst_dash_demux_setup_all_streams (GstDashDemux * demux)
(stream), tags); (stream), tags);
stream->index = i; stream->index = i;
stream->pending_seek_ts = GST_CLOCK_TIME_NONE; stream->pending_seek_ts = GST_CLOCK_TIME_NONE;
stream->last_representation_id = NULL;
if (active_stream->cur_adapt_set && if (active_stream->cur_adapt_set &&
active_stream->cur_adapt_set->RepresentationBase && active_stream->cur_adapt_set->RepresentationBase &&
active_stream->cur_adapt_set->RepresentationBase->ContentProtection) { 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, if (gst_mpd_client_get_next_fragment_timestamp (dashdemux->client,
dashstream->index, &ts)) { 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)) { if (GST_ADAPTIVE_DEMUX_STREAM_NEED_HEADER (stream)) {
gst_adaptive_demux_stream_fragment_clear (&stream->fragment); gst_adaptive_demux_stream_fragment_clear (&stream->fragment);
gst_dash_demux_stream_update_headers_info (stream); 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); gst_isoff_moof_box_free (dash_stream->moof);
if (dash_stream->moof_sync_samples) if (dash_stream->moof_sync_samples)
g_array_free (dash_stream->moof_sync_samples, TRUE); g_array_free (dash_stream->moof_sync_samples, TRUE);
g_free (dash_stream->last_representation_id);
} }
static GstDashDemuxClockDrift * static GstDashDemuxClockDrift *

View file

@ -96,6 +96,7 @@ struct _GstDashDemuxStream
guint64 moof_average_size, first_sync_sample_average_size; guint64 moof_average_size, first_sync_sample_average_size;
gboolean first_sync_sample_after_moof, first_sync_sample_always_after_moof; gboolean first_sync_sample_after_moof, first_sync_sample_always_after_moof;
gchar *last_representation_id;
}; };
/** /**