qtdemux: update segment when new duration is found
authorThiago Santos <thiagoss@osg.samsung.com>
Wed, 4 May 2016 00:17:01 +0000 (21:17 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Thu, 5 May 2016 12:30:48 +0000 (09:30 -0300)
Otherwise the old segment will have a shorter stop time and would
cause the stream to end too early.

gst/isomp4/qtdemux.c

index 7adda98..3c0d7d7 100644 (file)
@@ -525,6 +525,11 @@ static void gst_qtdemux_remove_stream (GstQTDemux * qtdemux, int index);
 static GstFlowReturn qtdemux_prepare_streams (GstQTDemux * qtdemux);
 static void qtdemux_do_allocation (GstQTDemux * qtdemux,
     QtDemuxStream * stream);
+static gboolean gst_qtdemux_activate_segment (GstQTDemux * qtdemux,
+    QtDemuxStream * stream, guint32 seg_idx, GstClockTime offset);
+static gboolean gst_qtdemux_stream_update_segment (GstQTDemux * qtdemux,
+    QtDemuxStream * stream, gint seg_idx, GstClockTime offset,
+    GstClockTime * _start, GstClockTime * _stop);
 
 static gboolean qtdemux_pull_mfro_mfra (GstQTDemux * qtdemux);
 static void check_update_duration (GstQTDemux * qtdemux, GstClockTime duration);
@@ -2874,6 +2879,20 @@ check_update_duration (GstQTDemux * qtdemux, GstClockTime duration)
           stream->segments[0].stop_time = duration;
           stream->segments[0].duration = duration;
           stream->segments[0].media_stop = duration;
+
+          /* let downstream know we possibly have a new stop time */
+          if (stream->segment_index != -1) {
+            GstClockTime pos;
+
+            if (qtdemux->segment.rate >= 0) {
+              pos = stream->segment.start;
+            } else {
+              pos = stream->segment.stop;
+            }
+
+            gst_qtdemux_stream_update_segment (qtdemux, stream,
+                stream->segment_index, pos, NULL, NULL);
+          }
         }
       }
     }