aic: use chroma scan tables while decoding luma component in progressive mode
authorKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 3 Jul 2013 18:46:28 +0000 (20:46 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 4 Jul 2013 10:09:45 +0000 (12:09 +0200)
For some unclear reason Apple decided to use the same scan tables for luma and
chroma in the progressive mode while using different ones for luma in the
interlaced mode.

libavcodec/aic.c

index a87176255f67b5267ba2b9d55788423014db4b4b..e46c00349a5b45d0bee94f256fcc0c95a89c5f8c 100644 (file)
@@ -196,11 +196,11 @@ static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
     } while (0)
 
 static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
-                             int band, int slice_width)
+                             int band, int slice_width, int force_chroma)
 {
     int has_skips, coeff_type, coeff_bits, skip_type, skip_bits;
     const int num_coeffs = aic_num_band_coeffs[band];
-    const uint8_t *scan = aic_scan[band];
+    const uint8_t *scan = aic_scan[band | force_chroma];
     int mb, idx, val;
 
     has_skips  = get_bits1(gb);
@@ -319,7 +319,8 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
            sizeof(*ctx->slice_data) * slice_width * AIC_BAND_COEFFS);
     for (i = 0; i < NUM_BANDS; i++)
         if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i],
-                                     i, slice_width)) < 0)
+                                     i, slice_width,
+                                     !ctx->interlaced)) < 0)
             return ret;
 
     for (mb = 0; mb < slice_width; mb++) {
@@ -334,7 +335,7 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
             ctx->dsp.idct(ctx->block);
 
             if (!ctx->interlaced) {
-                dst = Y + (blk & 1) * 8 * ystride + (blk >> 1) * 8;
+                dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
                 ctx->dsp.put_signed_pixels_clamped(ctx->block, dst,
                                                    ystride);
             } else {