From 761b883f2c8ccddc3e1f768259a7afe0c218e918 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Thu, 29 Apr 2010 15:38:49 +0200 Subject: jpegdec: disregard superfluous lines when indirect decoding --- ext/jpeg/gstjpegdec.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) (limited to 'ext/jpeg') diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c index b4b2979c2..606f9a295 100644 --- a/ext/jpeg/gstjpegdec.c +++ b/ext/jpeg/gstjpegdec.c @@ -793,29 +793,31 @@ gst_jpeg_dec_decode_indirect (GstJpegDec * dec, guchar * base[3], lines = jpeg_read_raw_data (&dec->cinfo, scanarray, r_v * DCTSIZE); if (G_LIKELY (lines > 0)) { for (j = 0, k = 0; j < (r_v * DCTSIZE); j += r_v, k++) { - memcpy (base[0], y_rows[j], I420_Y_ROWSTRIDE (width)); - if (G_LIKELY (base[0] < last[0])) + if (G_LIKELY (base[0] <= last[0])) { + memcpy (base[0], y_rows[j], I420_Y_ROWSTRIDE (width)); base[0] += I420_Y_ROWSTRIDE (width); + } if (r_v == 2) { - memcpy (base[0], y_rows[j + 1], I420_Y_ROWSTRIDE (width)); - if (G_LIKELY (base[0] < last[0])) + if (G_LIKELY (base[0] <= last[0])) { + memcpy (base[0], y_rows[j + 1], I420_Y_ROWSTRIDE (width)); base[0] += I420_Y_ROWSTRIDE (width); + } } - if (r_h == 2) { - memcpy (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); - memcpy (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); - } else if (r_h == 1) { - hresamplecpy1 (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); - hresamplecpy1 (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); - } else { - /* FIXME: implement (at least we avoid crashing by doing nothing) */ + if (G_LIKELY (base[1] <= last[1] && base[2] <= last[2])) { + if (r_h == 2) { + memcpy (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); + memcpy (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); + } else if (r_h == 1) { + hresamplecpy1 (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); + hresamplecpy1 (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); + } else { + /* FIXME: implement (at least we avoid crashing by doing nothing) */ + } } if (r_v == 2 || (k & 1) != 0) { - if (G_LIKELY (base[1] < last[1] && base[2] < last[2])) { - base[1] += I420_U_ROWSTRIDE (width); - base[2] += I420_V_ROWSTRIDE (width); - } + base[1] += I420_U_ROWSTRIDE (width); + base[2] += I420_V_ROWSTRIDE (width); } } } else { -- cgit v1.2.3