Avoid skipping moov atoms for fragmented MP4 files.
authorAlex Ashley <bugzilla@ashley-family.net>
Tue, 11 Jun 2013 14:02:21 +0000 (15:02 +0100)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Wed, 19 Jun 2013 04:44:22 +0000 (01:44 -0300)
bug #700505

Following a representation change that causes a resolution change,
the video decoder fails to decode correctly. Dashdemux detects the
representation change and pushes a new caps event and an
initialization segment (a new moov atom) to the downstream qtdemux,
but it doesn't handle this new moov yet, it will only parse the
first one it receives.

This commit changes qtdemux to accept a new moov in a dash bitstream
switching scenario.

gst/isomp4/qtdemux.c

index e167f3c6b0a14a9e0fadb987eabe9391dae936e2..37fe581cb0a87d946790eb637d7dcf93159d6ca1 100644 (file)
@@ -4582,7 +4582,7 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf)
         if (fourcc == FOURCC_moov) {
           /* in usual fragmented setup we could try to scan for more
            * and end up at the the moov (after mdat) again */
-          if (demux->got_moov && demux->n_streams > 0) {
+          if (demux->got_moov && demux->n_streams > 0 && !demux->fragmented) {
             GST_DEBUG_OBJECT (demux,
                 "Skipping moov atom as we have one already");
           } else {
@@ -4591,6 +4591,10 @@ 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");
+              if (demux->moov_node)
+                g_node_destroy (demux->moov_node);
+              demux->moov_node = NULL;
+              demux->moov_node_compressed = NULL;
             } else {
               /* prepare newsegment to send when streaming actually starts */
               if (!demux->pending_newsegment)