dashdemux: protect against malformed isombff format
authorThiago Santos <thiagoss@osg.samsung.com>
Mon, 16 Feb 2015 02:16:52 +0000 (23:16 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Wed, 18 Feb 2015 11:19:59 +0000 (08:19 -0300)
Be more careful around malformed mpds that announce using
isombff profile but actually are regular mpds

ext/dash/gstdashdemux.c
ext/dash/gstmpdparser.c

index 300715057490fbf14a79bad624a97693785e0da1..d4692acf12022d0d8178bc3f36a49afc9874b5b9 100644 (file)
@@ -269,7 +269,8 @@ gst_dash_demux_get_live_seek_range (GstAdaptiveDemux * demux, gint64 * start,
   GstDashDemux *self = GST_DASH_DEMUX (demux);
   GDateTime *now = g_date_time_new_now_utc ();
   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;
 
   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 =
       gst_dash_demux_stream_update_fragment_info;
   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
@@ -943,18 +945,24 @@ gst_dash_demux_stream_advance_subfragment (GstAdaptiveDemuxStream * stream)
   GstSidxBox *sidx = SIDX (dashstream);
   gboolean fragment_finished = TRUE;
 
-  if (stream->demux->segment.rate > 0.0) {
-    sidx->entry_index++;
-    if (sidx->entry_index < sidx->entries_count) {
-      fragment_finished = FALSE;
-    }
-  } else {
-    sidx->entry_index--;
-    if (sidx->entry_index >= 0) {
-      fragment_finished = FALSE;
+  if (dashstream->sidx_parser.status == GST_ISOFF_SIDX_PARSER_FINISHED) {
+    if (stream->demux->segment.rate > 0.0) {
+      sidx->entry_index++;
+      if (sidx->entry_index < sidx->entries_count) {
+        fragment_finished = FALSE;
+      }
+    } else {
+      sidx->entry_index--;
+      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) {
     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;
   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_dash_demux_stream_advance_subfragment (stream))
       return GST_FLOW_OK;
@@ -1293,11 +1303,15 @@ gst_dash_demux_stream_fragment_finished (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
 {
   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 */
     return GST_FLOW_OK;
   } else {
+    if (G_UNLIKELY (stream->downloading_header || stream->downloading_index))
+      return GST_FLOW_OK;
     return gst_adaptive_demux_stream_advance_fragment (demux, stream,
         stream->fragment.duration);
   }
index 23ffe8aedb01da462be9458e8ff4b2906cd8b65c..c9ade986b94f59bcafb6ca0d5adc4795beb014d2 100644 (file)
@@ -3699,7 +3699,7 @@ gst_mpd_client_update_segment (GstMpdClient * client, GstActiveStream * stream,
   guint segment_idx;
 
   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);