qtdemux: Skip zero-sized boxes instead of stopping to look at further boxes
authorSebastian Dröge <sebastian@centricular.com>
Tue, 24 Sep 2024 06:50:34 +0000 (09:50 +0300)
committerBackport Bot <gitlab-backport-bot@gstreamer-foundation.org>
Tue, 24 Sep 2024 11:23:36 +0000 (13:23 +0200)
A zero-sized box is not really a problem and can be skipped to look at any
possibly following ones.

BMD ATEM devices specifically write a zero-sized bmdc box in the sample
description, followed by the avcC box in case of h264. Previously the avcC box
would simply not be read at all and the file would be unplayable.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7565>

subprojects/gst-plugins-good/gst/isomp4/qtdemux.c

index ee01e280afc19dcfae333f9ce8a01071c10df12b..0d3310e7c8d3a08a2b18decea153d42b28090f41 100644 (file)
@@ -12219,9 +12219,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
               else
                 size = len - 0x8;
 
-              if (size < 1)
-                /* No real data, so break out */
-                break;
+              /* No real data, so skip */
+              if (size < 1) {
+                len -= 8;
+                avc_data += 8;
+                continue;
+              }
 
               switch (QT_FOURCC (avc_data + 0x4)) {
                 case FOURCC_avcC:
@@ -12336,9 +12339,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
               else
                 size = len - 0x8;
 
-              if (size < 1)
-                /* No real data, so break out */
-                break;
+              /* No real data, so skip */
+              if (size < 1) {
+                len -= 8;
+                hevc_data += 8;
+                continue;
+              }
 
               switch (QT_FOURCC (hevc_data + 0x4)) {
                 case FOURCC_hvcC:
@@ -12760,9 +12766,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
               else
                 size = len - 8;
 
-              if (size < 1)
-                /* No real data, so break out */
-                break;
+              /* No real data, so skip */
+              if (size < 1) {
+                len -= 8;
+                vc1_data += 8;
+                continue;
+              }
 
               switch (QT_FOURCC (vc1_data + 0x4)) {
                 case GST_MAKE_FOURCC ('d', 'v', 'c', '1'):
@@ -12802,9 +12811,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
               else
                 size = len - 0x8;
 
-              if (size < 1)
-                /* No real data, so break out */
-                break;
+              /* No real data, so skip */
+              if (size < 1) {
+                len -= 8;
+                av1_data += 8;
+                continue;
+              }
 
               switch (QT_FOURCC (av1_data + 0x4)) {
                 case FOURCC_av1C:
@@ -12912,9 +12924,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
               else
                 size = len - 0x8;
 
-              if (size < 1)
-                /* No real data, so break out */
-                break;
+              /* No real data, so skip */
+              if (size < 1) {
+                len -= 8;
+                vpcc_data += 8;
+                continue;
+              }
 
               switch (QT_FOURCC (vpcc_data + 0x4)) {
                 case FOURCC_vpcC:
@@ -13414,9 +13429,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
             else
               size = len - 8;
 
-            if (size < 1)
-              /* No real data, so break out */
-              break;
+            /* No real data, so skip */
+            if (size < 1) {
+              len -= 8;
+              wfex_data += 8;
+              continue;
+            }
 
             switch (QT_FOURCC (wfex_data + 4)) {
               case GST_MAKE_FOURCC ('w', 'f', 'e', 'x'):