qtdemux: Remove second parsing of fiel box for JPEG

Exactly the same is already done some hundred lines above for all video codecs.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8929>
This commit is contained in:
Sebastian Dröge 2025-05-05 22:20:41 +03:00 committed by GStreamer Marge Bot
parent 8687ef453c
commit 45443603f8

View File

@ -15403,81 +15403,6 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak, guint32 * mvhd_matrix)
break;
}
case FOURCC_jpeg:
{
/* https://developer.apple.com/standards/qtff-2001.pdf,
* page 92, "Video Sample Description", under table 3.1 */
GstByteReader br;
const gint compressor_offset =
16 + 4 + 4 * 3 + 2 * 2 + 2 * 4 + 4 + 2;
const gint min_size = compressor_offset + 32 + 2 + 2;
GNode *jpeg;
guint32 len;
guint16 color_table_id = 0;
gboolean ok;
GST_DEBUG_OBJECT (qtdemux, "found jpeg");
/* recover information on interlaced/progressive */
jpeg = qtdemux_tree_get_child_by_type (stsd, FOURCC_jpeg);
if (!jpeg)
break;
len = QT_UINT32 (jpeg->data);
GST_DEBUG_OBJECT (qtdemux, "Found jpeg: len %u, need %d", len,
min_size);
if (len >= min_size) {
gst_byte_reader_init (&br, jpeg->data, len);
gst_byte_reader_skip (&br, compressor_offset + 32 + 2);
gst_byte_reader_get_uint16_le (&br, &color_table_id);
if (color_table_id != 0) {
/* the spec says there can be concatenated chunks in the data, and we want
* to find one called field. Walk through them. */
gint offset = min_size;
while (offset + 8 < len) {
guint32 size = 0, tag;
ok = gst_byte_reader_get_uint32_le (&br, &size);
ok &= gst_byte_reader_get_uint32_le (&br, &tag);
if (!ok || size < 8) {
GST_WARNING_OBJECT (qtdemux,
"Failed to walk optional chunk list");
break;
}
GST_DEBUG_OBJECT (qtdemux,
"Found optional %4.4s chunk, size %u",
(const char *) &tag, size);
if (tag == FOURCC_fiel) {
guint8 n_fields = 0, ordering = 0;
gst_byte_reader_get_uint8 (&br, &n_fields);
gst_byte_reader_get_uint8 (&br, &ordering);
if (n_fields == 1 || n_fields == 2) {
GST_DEBUG_OBJECT (qtdemux,
"Found fiel tag with %u fields, ordering %u",
n_fields, ordering);
if (n_fields == 2)
gst_caps_set_simple (CUR_STREAM (stream)->caps,
"interlace-mode", G_TYPE_STRING, "interleaved",
NULL);
} else {
GST_WARNING_OBJECT (qtdemux,
"Found fiel tag with invalid fields (%u)", n_fields);
}
}
offset += size;
}
} else {
GST_DEBUG_OBJECT (qtdemux,
"Color table ID is 0, not trying to get interlacedness");
}
} else {
GST_WARNING_OBJECT (qtdemux,
"Length of jpeg chunk is too small, not trying to get interlacedness");
}
break;
}
case FOURCC_rle_:
case FOURCC_WRLE:
{