qtdemux: don't send so many segment events
authorWim Taymans <wim.taymans@collabora.co.uk>
Sun, 10 Mar 2013 03:15:06 +0000 (04:15 +0100)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Tue, 7 May 2013 22:29:17 +0000 (19:29 -0300)
Only send one segment event in the beginning of the stream, not
after each moov and moof atom.

Conflicts:
gst/isomp4/qtdemux.c

gst/isomp4/qtdemux.c

index 382c8cc..3363e1c 100644 (file)
@@ -1829,6 +1829,7 @@ gst_qtdemux_handle_sink_event (GstPad * sinkpad, GstObject * parent,
       GST_DEBUG_OBJECT (demux, "received newsegment %" GST_SEGMENT_FORMAT,
           &segment);
 
+      GST_DEBUG_OBJECT (demux, "new pending_newsegment");
       gst_event_replace (&demux->pending_newsegment, event);
       demux->upstream_newsegment = TRUE;
 
@@ -2654,24 +2655,14 @@ qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length,
 
       qtdemux_parse_tfdt (qtdemux, &tfdt_data, &decode_time);
 
+      /* FIXME, we can use decode_time to interpolate timestamps
+       * in case the input timestamps are missing */
       decode_time_ts = gst_util_uint64_scale (decode_time, GST_SECOND,
           stream->timescale);
 
       GST_DEBUG_OBJECT (qtdemux, "decode time %" G_GUINT64_FORMAT
           " (%" GST_TIME_FORMAT ")", decode_time,
           GST_TIME_ARGS (decode_time_ts));
-
-      /* If there is a new segment pending, update the time/position.
-       * Don't replace if the pending newsegment is from upstream */
-      if (qtdemux->pending_newsegment && !qtdemux->upstream_newsegment) {
-        GstSegment segment;
-
-        gst_segment_init (&segment, GST_FORMAT_TIME);
-        gst_event_replace (&qtdemux->pending_newsegment,
-            gst_event_new_segment (&segment));
-        /* ref added when replaced, release the original _new one */
-        gst_event_unref (qtdemux->pending_newsegment);
-      }
     }
 
     if (G_UNLIKELY (!stream)) {
@@ -4553,13 +4544,13 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf)
             if (demux->got_moov && demux->fragmented) {
               GST_DEBUG_OBJECT (demux,
                   "Got a second moov, clean up data from old one");
+            } else {
+              /* prepare newsegment to send when streaming actually starts */
+              if (!demux->pending_newsegment)
+                demux->pending_newsegment =
+                    gst_event_new_segment (&demux->segment);
             }
 
-            /* prepare newsegment to send when streaming actually starts */
-            if (!demux->pending_newsegment)
-              demux->pending_newsegment =
-                  gst_event_new_segment (&demux->segment);
-
             qtdemux_parse_moov (demux, data, demux->neededbytes);
             qtdemux_node_dump (demux, demux->moov_node);
             qtdemux_parse_tree (demux);
@@ -4597,6 +4588,7 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf)
                 if (!demux->pending_newsegment) {
                   GstSegment segment;
                   gst_segment_init (&segment, GST_FORMAT_TIME);
+                  GST_DEBUG_OBJECT (demux, "new pending_newsegment");
                   demux->pending_newsegment = gst_event_new_segment (&segment);
                 }
                 qtdemux_expose_streams (demux);