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>
This commit is contained in:
Sebastian Dröge 2024-09-24 09:50:34 +03:00
parent 66f1c9fd13
commit d4bab55077

View file

@ -12226,9 +12226,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
else else
size = len - 0x8; size = len - 0x8;
if (size < 1) /* No real data, so skip */
/* No real data, so break out */ if (size < 1) {
break; len -= 8;
avc_data += 8;
continue;
}
switch (QT_FOURCC (avc_data + 0x4)) { switch (QT_FOURCC (avc_data + 0x4)) {
case FOURCC_avcC: case FOURCC_avcC:
@ -12343,9 +12346,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
else else
size = len - 0x8; size = len - 0x8;
if (size < 1) /* No real data, so skip */
/* No real data, so break out */ if (size < 1) {
break; len -= 8;
hevc_data += 8;
continue;
}
switch (QT_FOURCC (hevc_data + 0x4)) { switch (QT_FOURCC (hevc_data + 0x4)) {
case FOURCC_hvcC: case FOURCC_hvcC:
@ -12767,9 +12773,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
else else
size = len - 8; size = len - 8;
if (size < 1) /* No real data, so skip */
/* No real data, so break out */ if (size < 1) {
break; len -= 8;
vc1_data += 8;
continue;
}
switch (QT_FOURCC (vc1_data + 0x4)) { switch (QT_FOURCC (vc1_data + 0x4)) {
case GST_MAKE_FOURCC ('d', 'v', 'c', '1'): case GST_MAKE_FOURCC ('d', 'v', 'c', '1'):
@ -12809,9 +12818,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
else else
size = len - 0x8; size = len - 0x8;
if (size < 1) /* No real data, so skip */
/* No real data, so break out */ if (size < 1) {
break; len -= 8;
av1_data += 8;
continue;
}
switch (QT_FOURCC (av1_data + 0x4)) { switch (QT_FOURCC (av1_data + 0x4)) {
case FOURCC_av1C: case FOURCC_av1C:
@ -12919,9 +12931,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
else else
size = len - 0x8; size = len - 0x8;
if (size < 1) /* No real data, so skip */
/* No real data, so break out */ if (size < 1) {
break; len -= 8;
vpcc_data += 8;
continue;
}
switch (QT_FOURCC (vpcc_data + 0x4)) { switch (QT_FOURCC (vpcc_data + 0x4)) {
case FOURCC_vpcC: case FOURCC_vpcC:
@ -13421,9 +13436,12 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
else else
size = len - 8; size = len - 8;
if (size < 1) /* No real data, so skip */
/* No real data, so break out */ if (size < 1) {
break; len -= 8;
wfex_data += 8;
continue;
}
switch (QT_FOURCC (wfex_data + 4)) { switch (QT_FOURCC (wfex_data + 4)) {
case GST_MAKE_FOURCC ('w', 'f', 'e', 'x'): case GST_MAKE_FOURCC ('w', 'f', 'e', 'x'):