qtdemux: push mode: only parse moov 1 once
[platform/upstream/gst-plugins-good.git] / gst / isomp4 / qtdemux.c
index ffefc61..60349a6 100644 (file)
@@ -4226,22 +4226,30 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf)
         extract_initial_length_and_fourcc (data, demux->neededbytes, NULL,
             &fourcc);
         if (fourcc == FOURCC_moov) {
-          GST_DEBUG_OBJECT (demux, "Parsing [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) {
+            GST_DEBUG_OBJECT (demux,
+                "Skipping moov atom as we have one already");
+          } else {
+            GST_DEBUG_OBJECT (demux, "Parsing [moov]");
 
-          demux->got_moov = TRUE;
+            demux->got_moov = TRUE;
 
-          /* 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);
-          qtdemux_expose_streams (demux);
+            qtdemux_parse_moov (demux, data, demux->neededbytes);
+            qtdemux_node_dump (demux, demux->moov_node);
+            qtdemux_parse_tree (demux);
+            qtdemux_expose_streams (demux);
 
-          g_node_destroy (demux->moov_node);
-          demux->moov_node = NULL;
-          GST_DEBUG_OBJECT (demux, "Finished parsing the header");
+            g_node_destroy (demux->moov_node);
+            demux->moov_node = NULL;
+            GST_DEBUG_OBJECT (demux, "Finished parsing the header");
+          }
         } else if (fourcc == FOURCC_moof) {
           if (demux->got_moov && demux->fragmented) {
             GST_DEBUG_OBJECT (demux, "Parsing [moof]");
@@ -9620,10 +9628,10 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
     case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'):
     default:
     {
-      char *s;
+      char *s, fourstr[5];
 
-      s = g_strdup_printf ("video/x-gst-fourcc-%" GST_FOURCC_FORMAT,
-          GST_FOURCC_ARGS (fourcc));
+      g_snprintf (fourstr, 5, "%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+      s = g_strdup_printf ("video/x-gst-fourcc-%s", g_strstrip (fourstr));
       caps = gst_caps_new_empty_simple (s);
       break;
     }
@@ -9830,10 +9838,10 @@ qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
       /* ? */
     default:
     {
-      char *s;
+      char *s, fourstr[5];
 
-      s = g_strdup_printf ("audio/x-gst-fourcc-%" GST_FOURCC_FORMAT,
-          GST_FOURCC_ARGS (fourcc));
+      g_snprintf (fourstr, 5, "%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+      s = g_strdup_printf ("audio/x-gst-fourcc-%s", g_strstrip (fourstr));
       caps = gst_caps_new_empty_simple (s);
       break;
     }
@@ -9883,10 +9891,10 @@ qtdemux_sub_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
       break;
     default:
     {
-      char *s;
+      char *s, fourstr[5];
 
-      s = g_strdup_printf ("text/x-gst-fourcc-%" GST_FOURCC_FORMAT,
-          GST_FOURCC_ARGS (fourcc));
+      g_snprintf (fourstr, 5, "%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+      s = g_strdup_printf ("text/x-gst-fourcc-%s", g_strstrip (fourstr));
       caps = gst_caps_new_empty_simple (s);
       break;
     }