dashdemux: protect against malformed isombff format
Be more careful around malformed mpds that announce using isombff profile but actually are regular mpds
This commit is contained in:
parent
d1d31dae6d
commit
81b555838a
@ -269,7 +269,8 @@ gst_dash_demux_get_live_seek_range (GstAdaptiveDemux * demux, gint64 * start,
|
|||||||
GstDashDemux *self = GST_DASH_DEMUX (demux);
|
GstDashDemux *self = GST_DASH_DEMUX (demux);
|
||||||
GDateTime *now = g_date_time_new_now_utc ();
|
GDateTime *now = g_date_time_new_now_utc ();
|
||||||
GDateTime *mstart =
|
GDateTime *mstart =
|
||||||
gst_date_time_to_g_date_time (self->client->mpd_node->availabilityStartTime);
|
gst_date_time_to_g_date_time (self->client->
|
||||||
|
mpd_node->availabilityStartTime);
|
||||||
GTimeSpan stream_now;
|
GTimeSpan stream_now;
|
||||||
|
|
||||||
stream_now = g_date_time_difference (now, mstart);
|
stream_now = g_date_time_difference (now, mstart);
|
||||||
@ -358,7 +359,8 @@ gst_dash_demux_class_init (GstDashDemuxClass * klass)
|
|||||||
gstadaptivedemux_class->stream_update_fragment_info =
|
gstadaptivedemux_class->stream_update_fragment_info =
|
||||||
gst_dash_demux_stream_update_fragment_info;
|
gst_dash_demux_stream_update_fragment_info;
|
||||||
gstadaptivedemux_class->stream_free = gst_dash_demux_stream_free;
|
gstadaptivedemux_class->stream_free = gst_dash_demux_stream_free;
|
||||||
gstadaptivedemux_class->get_live_seek_range = gst_dash_demux_get_live_seek_range;
|
gstadaptivedemux_class->get_live_seek_range =
|
||||||
|
gst_dash_demux_get_live_seek_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -943,18 +945,24 @@ gst_dash_demux_stream_advance_subfragment (GstAdaptiveDemuxStream * stream)
|
|||||||
GstSidxBox *sidx = SIDX (dashstream);
|
GstSidxBox *sidx = SIDX (dashstream);
|
||||||
gboolean fragment_finished = TRUE;
|
gboolean fragment_finished = TRUE;
|
||||||
|
|
||||||
if (stream->demux->segment.rate > 0.0) {
|
if (dashstream->sidx_parser.status == GST_ISOFF_SIDX_PARSER_FINISHED) {
|
||||||
sidx->entry_index++;
|
if (stream->demux->segment.rate > 0.0) {
|
||||||
if (sidx->entry_index < sidx->entries_count) {
|
sidx->entry_index++;
|
||||||
fragment_finished = FALSE;
|
if (sidx->entry_index < sidx->entries_count) {
|
||||||
}
|
fragment_finished = FALSE;
|
||||||
} else {
|
}
|
||||||
sidx->entry_index--;
|
} else {
|
||||||
if (sidx->entry_index >= 0) {
|
sidx->entry_index--;
|
||||||
fragment_finished = FALSE;
|
if (sidx->entry_index >= 0) {
|
||||||
|
fragment_finished = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (stream->pad, "New sidx index: %d / %d. "
|
||||||
|
"Finished fragment: %d", sidx->entry_index, sidx->entries_count,
|
||||||
|
fragment_finished);
|
||||||
|
|
||||||
if (!fragment_finished) {
|
if (!fragment_finished) {
|
||||||
dashstream->sidx_current_remaining = sidx->entries[sidx->entry_index].size;
|
dashstream->sidx_current_remaining = sidx->entries[sidx->entry_index].size;
|
||||||
}
|
}
|
||||||
@ -967,6 +975,8 @@ gst_dash_demux_stream_advance_fragment (GstAdaptiveDemuxStream * stream)
|
|||||||
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
|
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
|
||||||
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (stream->demux);
|
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (stream->demux);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (stream->pad, "Advance fragment");
|
||||||
|
|
||||||
if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)) {
|
if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)) {
|
||||||
if (gst_dash_demux_stream_advance_subfragment (stream))
|
if (gst_dash_demux_stream_advance_subfragment (stream))
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
@ -1293,11 +1303,15 @@ gst_dash_demux_stream_fragment_finished (GstAdaptiveDemux * demux,
|
|||||||
GstAdaptiveDemuxStream * stream)
|
GstAdaptiveDemuxStream * stream)
|
||||||
{
|
{
|
||||||
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (demux);
|
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (demux);
|
||||||
|
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
|
||||||
|
|
||||||
if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)) {
|
if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client) &&
|
||||||
|
dashstream->sidx_parser.status == GST_ISOFF_SIDX_PARSER_FINISHED) {
|
||||||
/* fragment is advanced on data_received when byte limits are reached */
|
/* fragment is advanced on data_received when byte limits are reached */
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
} else {
|
} else {
|
||||||
|
if (G_UNLIKELY (stream->downloading_header || stream->downloading_index))
|
||||||
|
return GST_FLOW_OK;
|
||||||
return gst_adaptive_demux_stream_advance_fragment (demux, stream,
|
return gst_adaptive_demux_stream_advance_fragment (demux, stream,
|
||||||
stream->fragment.duration);
|
stream->fragment.duration);
|
||||||
}
|
}
|
||||||
|
@ -3699,7 +3699,7 @@ gst_mpd_client_update_segment (GstMpdClient * client, GstActiveStream * stream,
|
|||||||
guint segment_idx;
|
guint segment_idx;
|
||||||
|
|
||||||
segment_idx = gst_mpd_client_get_segment_index (stream);
|
segment_idx = gst_mpd_client_get_segment_index (stream);
|
||||||
GST_DEBUG ("Looking for fragment sequence chunk %d", segment_idx);
|
GST_DEBUG ("Looking for fragment sequence chunk %d", segment_idx + update);
|
||||||
|
|
||||||
gst_mpd_client_set_segment_index (stream, segment_idx + update);
|
gst_mpd_client_set_segment_index (stream, segment_idx + update);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user