jpegdec: disregard superfluous lines when indirect decoding

This commit is contained in:
Mark Nauwelaerts 2010-04-29 15:38:49 +02:00
parent 78a2b22ed5
commit 761b883f2c

View file

@ -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]))
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 (r_v == 2) {
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 (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 {