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
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:
@ -12343,9 +12346,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:
@ -12767,9 +12773,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'):
@ -12809,9 +12818,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:
@ -12919,9 +12931,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:
@ -13421,9 +13436,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'):