117 lines
3.8 KiB
Diff
117 lines
3.8 KiB
Diff
From d4bab55077c6a77bd80cb12a8b0d28020ef412a9 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
|
|
Date: Tue, 24 Sep 2024 09:50:34 +0300
|
|
Subject: [PATCH] qtdemux: Skip zero-sized boxes instead of stopping to look at
|
|
further boxes
|
|
|
|
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/7564>
|
|
---
|
|
.../gst-plugins-good/gst/isomp4/qtdemux.c | 54 ++++++++++++-------
|
|
1 file changed, 36 insertions(+), 18 deletions(-)
|
|
|
|
--- a/gst/isomp4/qtdemux.c
|
|
+++ b/gst/isomp4/qtdemux.c
|
|
@@ -11384,9 +11384,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux
|
|
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:
|
|
@@ -11501,9 +11504,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux
|
|
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:
|
|
@@ -11925,9 +11931,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux
|
|
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'):
|
|
@@ -11967,9 +11976,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux
|
|
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:
|
|
@@ -12049,9 +12061,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux
|
|
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:
|
|
@@ -12541,9 +12556,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux
|
|
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'):
|