jpegdec: be stricter when detecting interlaced video
authorMichael Olbrich <m.olbrich@pengutronix.de>
Mon, 31 Aug 2020 14:38:48 +0000 (16:38 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 26 May 2023 00:04:02 +0000 (01:04 +0100)
There are broken(?) mjpeg videos that are incorrectly detected as
interlaced. This happens because 'info.height > height' (e.g. 1088 > 1080).

In the interlaced case info.height is approximately 'height * 2' but not
exactly because height is a multiple of DCTSIZE. Make the check more
restrictive but take the rounding effect into account.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4717>

subprojects/gst-plugins-good/ext/jpeg/gstjpegdec.c

index c91844a..34d2eba 100644 (file)
@@ -1406,8 +1406,8 @@ gst_jpeg_dec_handle_frame (GstVideoDecoder * bdec, GstVideoCodecFrame * frame)
   /* is it interlaced MJPEG? (we really don't want to scan the jpeg data
    * to see if there are two SOF markers in the packet to detect this) */
   if (gst_video_decoder_get_packetized (bdec) &&
-      dec->input_state &&
-      dec->input_state->info.height > height &&
+      dec->input_state && height > DCTSIZE &&
+      dec->input_state->info.height > (2 * (height - DCTSIZE)) &&
       dec->input_state->info.height <= (height * 2)
       && dec->input_state->info.width == width) {
     GST_LOG_OBJECT (dec,