mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 00:36:51 +00:00
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:
parent
66f1c9fd13
commit
d4bab55077
1 changed files with 36 additions and 18 deletions
|
@ -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'):
|
||||||
|
|
Loading…
Reference in a new issue