- Bug fixes in H.263+ Advanced INTRA Coding decoder.
[ffmpeg.git] / libavcodec / h263.c
index e0b234b..9e68549 100644 (file)
@@ -273,10 +273,11 @@ void h263_encode_mb(MpegEncContext * s,
     }
 }
 
-static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
+
+void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
 {
-    int a, c, x, y, wrap, pred, scale;
-    UINT16 *dc_val;
+    int x, y, wrap, a, c, pred_dc, scale, i;
+    INT16 *dc_val, *ac_val, *ac_val1;
 
     /* find prediction */
     if (n < 4) {
@@ -284,78 +285,68 @@ static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
         y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
         wrap = s->mb_width * 2 + 2;
         dc_val = s->dc_val[0];
+        ac_val = s->ac_val[0][0];
         scale = s->y_dc_scale;
     } else {
         x = s->mb_x + 1;
         y = s->mb_y + 1;
         wrap = s->mb_width + 2;
         dc_val = s->dc_val[n - 4 + 1];
+        ac_val = s->ac_val[n - 4 + 1][0];
         scale = s->c_dc_scale;
     }
-
+    
+    ac_val += ((y) * wrap + (x)) * 16;
+    ac_val1 = ac_val;
+    
     /* B C
      * A X 
      */
     a = dc_val[(x - 1) + (y) * wrap];
     c = dc_val[(x) + (y - 1) * wrap];
     
-    if (s->ac_pred) {
-        if (s->h263_aic_dir)
-            pred = a;
-        else
-            pred = c;
-    } else if (a != 1024 && c != 1024)
-        pred = (a + c) >> 1;
-    else if (a != 1024)
-        pred = a;
-    else
-        pred = c;
-        
-    
-    /* we assume pred is positive */
-    pred = (pred) / scale;
-
-    /* prepare address for prediction update */
-    *dc_val_ptr = &dc_val[(x) + (y) * wrap];
-
-    return pred;
-}
-
-void h263_pred_ac(MpegEncContext * s, INT16 *block, int n)
-{
-    int x, y, wrap, i;
-    INT16 *ac_val, *ac_val1;
-
-    /* find prediction */
-    if (n < 4) {
-        x = 2 * s->mb_x + 1 + (n & 1);
-        y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
-        wrap = s->mb_width * 2 + 2;
-        ac_val = s->ac_val[0][0];
-    } else {
-        x = s->mb_x + 1;
-        y = s->mb_y + 1;
-        wrap = s->mb_width + 2;
-        ac_val = s->ac_val[n - 4 + 1][0];
-    }
-    ac_val += ((y) * wrap + (x)) * 16;
-    ac_val1 = ac_val;
-
+    pred_dc = 1024;
     if (s->ac_pred) {
         if (s->h263_aic_dir) {
             /* left prediction */
-            ac_val -= 16;
-            for(i=1;i<8;i++) {
-                block[block_permute_op(i*8)] += ac_val[i];
+            if (a != 1024) {
+                ac_val -= 16;
+                for(i=1;i<8;i++) {
+                    block[block_permute_op(i*8)] += ac_val[i];
+                }
+                pred_dc = a;
             }
         } else {
             /* top prediction */
-            ac_val -= 16 * wrap;
-            for(i=1;i<8;i++) {
-                block[block_permute_op(i)] += ac_val[i + 8];
+            if (c != 1024) {
+                ac_val -= 16 * wrap;
+                for(i=1;i<8;i++) {
+                    block[block_permute_op(i)] += ac_val[i + 8];
+                }
+                pred_dc = c;
             }
         }
+    } else {
+        /* just DC prediction */
+        if (a != 1024 && c != 1024)
+            pred_dc = (a + c) >> 1;
+        else if (a != 1024)
+            pred_dc = a;
+        else
+            pred_dc = c;
     }
+    
+    /* we assume pred is positive */
+    block[0]=block[0]*scale + pred_dc;
+    
+    if (block[0] < 0)
+        block[0] = 0;
+    else if (!(block[0] & 1))
+        block[0]++;
+    
+    /* Update AC/DC tables */
+    dc_val[(x) + (y) * wrap] = block[0];
+    
     /* left copy */
     for(i=1;i<8;i++)
         ac_val1[i] = block[block_permute_op(i * 8)];
@@ -364,6 +355,7 @@ void h263_pred_ac(MpegEncContext * s, INT16 *block, int n)
         ac_val1[8 + i] = block[block_permute_op(i)];
 }
 
+
 static inline int mid_pred(int a, int b, int c)
 {
     int vmin, vmax;
@@ -1057,6 +1049,10 @@ int h263_decode_mb(MpegEncContext *s,
             if (s->ac_pred && s->h263_aic)
                 s->h263_aic_dir = get_bits1(&s->gb);
         }
+        if (s->h263_aic) {
+            s->y_dc_scale = 2 * s->qscale;
+            s->c_dc_scale = 2 * s->qscale;
+        }
         cbpy = get_vlc(&s->gb, &cbpy_vlc);
         cbp = (cbpc & 3) | (cbpy << 2);
         if (dquant) {
@@ -1154,11 +1150,10 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
 {
     int code, level, i, j, last, run;
     RLTable *rl = &rl_inter;
-    UINT16 *dc_val;
     const UINT8 *scan_table;
 
     scan_table = zigzag_direct;
-    if (s->h263_aic) {
+    if (s->h263_aic && s->mb_intra) {
         rl = &rl_intra_aic;
         i = 0;
         if (s->ac_pred) {
@@ -1194,16 +1189,8 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
         i = 0;
     }
     if (!coded) {
-        if (s->mb_intra && s->h263_aic) {
-            level = h263_pred_dc(s, n, &dc_val);
-            if (level < 0)
-                level = 0;
-            *dc_val = level * s->y_dc_scale;  
-            block[0] = level;
-            h263_pred_ac(s, block, n);
-            i = 64;
-            //i = 1;
-        }
+        if (s->mb_intra && s->h263_aic)
+            goto not_coded;
         s->block_last_index[n] = i - 1;
         return 0;
     }
@@ -1229,15 +1216,6 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
             if (get_bits1(&s->gb))
                 level = -level;
         }
-        if (!i && s->h263_aic) {
-            level += h263_pred_dc(s, n, &dc_val);
-            if (level < 0)
-                level = 0;
-            else if (level & 1)
-                level++;
-            *dc_val = level * s->y_dc_scale;
-            
-        }
         i += run;
         if (i >= 64)
             return -1;
@@ -1247,9 +1225,9 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
             break;
         i++;
     }
-    
-    if (s->h263_aic) {
-        h263_pred_ac(s, block, n);
+not_coded:    
+    if (s->mb_intra && s->h263_aic) {
+        h263_pred_acdc(s, block, n);
         i = 64;
     }
     s->block_last_index[n] = i;