summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2021-08-03 19:12:11 +0900
committerTim-Philipp Müller <tim@centricular.com>2021-09-07 13:29:36 +0100
commitc14656a1e09ce3df41636f6abfac68112c8d8c98 (patch)
tree09253d66f41d98244b9e3187b3b65f61aedb37c3
parentd83ead3c9855a5403adacfc0eb5f53a0df121961 (diff)
downloadgstreamer-plugins-good-c14656a1e09ce3df41636f6abfac68112c8d8c98.tar.gz
jpegdec: Fix crash when interlaced field height is not DCT block size aligned
In case of interlaced JPEG file, we are doubling stride. The scratch scan line should take account of it as well. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1042>
-rw-r--r--ext/jpeg/gstjpegdec.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c
index c4bb732a9..cce74afa8 100644
--- a/ext/jpeg/gstjpegdec.c
+++ b/ext/jpeg/gstjpegdec.c
@@ -868,7 +868,7 @@ gst_jpeg_dec_decode_direct (GstJpegDec * dec, GstVideoFrame * frame,
gint lines, v_samp[3];
guchar *base[3], *last[3];
gint stride[3];
- guint height;
+ guint height, field_height;
line[0] = y;
line[1] = u;
@@ -881,7 +881,12 @@ gst_jpeg_dec_decode_direct (GstJpegDec * dec, GstVideoFrame * frame,
if (G_UNLIKELY (v_samp[0] > 2 || v_samp[1] > 2 || v_samp[2] > 2))
goto format_not_supported;
- height = GST_VIDEO_FRAME_HEIGHT (frame);
+ height = field_height = GST_VIDEO_FRAME_HEIGHT (frame);
+
+ /* XXX: division by 2 here might not be a good idea yes. But we are doing this
+ * already in gst_jpeg_dec_handle_frame() for interlaced jpeg */
+ if (num_fields == 2)
+ field_height /= 2;
for (i = 0; i < 3; i++) {
base[i] = GST_VIDEO_FRAME_COMP_DATA (frame, i);
@@ -896,7 +901,7 @@ gst_jpeg_dec_decode_direct (GstJpegDec * dec, GstVideoFrame * frame,
}
}
- if (height % (v_samp[0] * DCTSIZE) && (dec->scratch_size < stride[0])) {
+ if (field_height % (v_samp[0] * DCTSIZE) && (dec->scratch_size < stride[0])) {
g_free (dec->scratch);
dec->scratch = g_malloc (stride[0]);
dec->scratch_size = stride[0];