jpegdec: disregard superfluous lines when indirect decoding
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 29 Apr 2010 13:38:49 +0000 (15:38 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 30 Apr 2010 15:49:15 +0000 (17:49 +0200)
ext/jpeg/gstjpegdec.c

index b4b2979..606f9a2 100644 (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]))
+          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 {