Browse code

- Bug fixes in H.263+ Advanced INTRA Coding decoder. - H.263+ should be able to decode streams with AIC now :)

Originally committed as revision 311 to svn://svn.ffmpeg.org/ffmpeg/trunk

Juanjo authored on 2002/02/20 04:23:34
Showing 4 changed files
... ...
@@ -273,10 +273,11 @@ void h263_encode_mb(MpegEncContext * s,
273 273
     }
274 274
 }
275 275
 
276
-static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
276
+
277
+void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
277 278
 {
278
-    int a, c, x, y, wrap, pred, scale;
279
-    UINT16 *dc_val;
279
+    int x, y, wrap, a, c, pred_dc, scale, i;
280
+    INT16 *dc_val, *ac_val, *ac_val1;
280 281
 
281 282
     /* find prediction */
282 283
     if (n < 4) {
... ...
@@ -284,78 +285,68 @@ static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
284 284
         y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
285 285
         wrap = s->mb_width * 2 + 2;
286 286
         dc_val = s->dc_val[0];
287
+        ac_val = s->ac_val[0][0];
287 288
         scale = s->y_dc_scale;
288 289
     } else {
289 290
         x = s->mb_x + 1;
290 291
         y = s->mb_y + 1;
291 292
         wrap = s->mb_width + 2;
292 293
         dc_val = s->dc_val[n - 4 + 1];
294
+        ac_val = s->ac_val[n - 4 + 1][0];
293 295
         scale = s->c_dc_scale;
294 296
     }
295
-
297
+    
298
+    ac_val += ((y) * wrap + (x)) * 16;
299
+    ac_val1 = ac_val;
300
+    
296 301
     /* B C
297 302
      * A X 
298 303
      */
299 304
     a = dc_val[(x - 1) + (y) * wrap];
300 305
     c = dc_val[(x) + (y - 1) * wrap];
301 306
     
302
-    if (s->ac_pred) {
303
-        if (s->h263_aic_dir)
304
-            pred = a;
305
-        else
306
-            pred = c;
307
-    } else if (a != 1024 && c != 1024)
308
-        pred = (a + c) >> 1;
309
-    else if (a != 1024)
310
-        pred = a;
311
-    else
312
-        pred = c;
313
-        
314
-    
315
-    /* we assume pred is positive */
316
-    pred = (pred) / scale;
317
-
318
-    /* prepare address for prediction update */
319
-    *dc_val_ptr = &dc_val[(x) + (y) * wrap];
320
-
321
-    return pred;
322
-}
323
-
324
-void h263_pred_ac(MpegEncContext * s, INT16 *block, int n)
325
-{
326
-    int x, y, wrap, i;
327
-    INT16 *ac_val, *ac_val1;
328
-
329
-    /* find prediction */
330
-    if (n < 4) {
331
-        x = 2 * s->mb_x + 1 + (n & 1);
332
-        y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
333
-        wrap = s->mb_width * 2 + 2;
334
-        ac_val = s->ac_val[0][0];
335
-    } else {
336
-        x = s->mb_x + 1;
337
-        y = s->mb_y + 1;
338
-        wrap = s->mb_width + 2;
339
-        ac_val = s->ac_val[n - 4 + 1][0];
340
-    }
341
-    ac_val += ((y) * wrap + (x)) * 16;
342
-    ac_val1 = ac_val;
343
-
307
+    pred_dc = 1024;
344 308
     if (s->ac_pred) {
345 309
         if (s->h263_aic_dir) {
346 310
             /* left prediction */
347
-            ac_val -= 16;
348
-            for(i=1;i<8;i++) {
349
-                block[block_permute_op(i*8)] += ac_val[i];
311
+            if (a != 1024) {
312
+                ac_val -= 16;
313
+                for(i=1;i<8;i++) {
314
+                    block[block_permute_op(i*8)] += ac_val[i];
315
+                }
316
+                pred_dc = a;
350 317
             }
351 318
         } else {
352 319
             /* top prediction */
353
-            ac_val -= 16 * wrap;
354
-            for(i=1;i<8;i++) {
355
-                block[block_permute_op(i)] += ac_val[i + 8];
320
+            if (c != 1024) {
321
+                ac_val -= 16 * wrap;
322
+                for(i=1;i<8;i++) {
323
+                    block[block_permute_op(i)] += ac_val[i + 8];
324
+                }
325
+                pred_dc = c;
356 326
             }
357 327
         }
328
+    } else {
329
+        /* just DC prediction */
330
+        if (a != 1024 && c != 1024)
331
+            pred_dc = (a + c) >> 1;
332
+        else if (a != 1024)
333
+            pred_dc = a;
334
+        else
335
+            pred_dc = c;
358 336
     }
337
+    
338
+    /* we assume pred is positive */
339
+    block[0]=block[0]*scale + pred_dc;
340
+    
341
+    if (block[0] < 0)
342
+        block[0] = 0;
343
+    else if (!(block[0] & 1))
344
+        block[0]++;
345
+    
346
+    /* Update AC/DC tables */
347
+    dc_val[(x) + (y) * wrap] = block[0];
348
+    
359 349
     /* left copy */
360 350
     for(i=1;i<8;i++)
361 351
         ac_val1[i] = block[block_permute_op(i * 8)];
... ...
@@ -364,6 +355,7 @@ void h263_pred_ac(MpegEncContext * s, INT16 *block, int n)
364 364
         ac_val1[8 + i] = block[block_permute_op(i)];
365 365
 }
366 366
 
367
+
367 368
 static inline int mid_pred(int a, int b, int c)
368 369
 {
369 370
     int vmin, vmax;
... ...
@@ -1057,6 +1049,10 @@ int h263_decode_mb(MpegEncContext *s,
1057 1057
             if (s->ac_pred && s->h263_aic)
1058 1058
                 s->h263_aic_dir = get_bits1(&s->gb);
1059 1059
         }
1060
+        if (s->h263_aic) {
1061
+            s->y_dc_scale = 2 * s->qscale;
1062
+            s->c_dc_scale = 2 * s->qscale;
1063
+        }
1060 1064
         cbpy = get_vlc(&s->gb, &cbpy_vlc);
1061 1065
         cbp = (cbpc & 3) | (cbpy << 2);
1062 1066
         if (dquant) {
... ...
@@ -1154,11 +1150,10 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
1154 1154
 {
1155 1155
     int code, level, i, j, last, run;
1156 1156
     RLTable *rl = &rl_inter;
1157
-    UINT16 *dc_val;
1158 1157
     const UINT8 *scan_table;
1159 1158
 
1160 1159
     scan_table = zigzag_direct;
1161
-    if (s->h263_aic) {
1160
+    if (s->h263_aic && s->mb_intra) {
1162 1161
         rl = &rl_intra_aic;
1163 1162
         i = 0;
1164 1163
         if (s->ac_pred) {
... ...
@@ -1194,16 +1189,8 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
1194 1194
         i = 0;
1195 1195
     }
1196 1196
     if (!coded) {
1197
-        if (s->mb_intra && s->h263_aic) {
1198
-            level = h263_pred_dc(s, n, &dc_val);
1199
-            if (level < 0)
1200
-                level = 0;
1201
-            *dc_val = level * s->y_dc_scale;  
1202
-            block[0] = level;
1203
-            h263_pred_ac(s, block, n);
1204
-            i = 64;
1205
-            //i = 1;
1206
-        }
1197
+        if (s->mb_intra && s->h263_aic)
1198
+            goto not_coded;
1207 1199
         s->block_last_index[n] = i - 1;
1208 1200
         return 0;
1209 1201
     }
... ...
@@ -1229,15 +1216,6 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
1229 1229
             if (get_bits1(&s->gb))
1230 1230
                 level = -level;
1231 1231
         }
1232
-        if (!i && s->h263_aic) {
1233
-            level += h263_pred_dc(s, n, &dc_val);
1234
-            if (level < 0)
1235
-                level = 0;
1236
-            else if (level & 1)
1237
-                level++;
1238
-            *dc_val = level * s->y_dc_scale;
1239
-            
1240
-        }
1241 1232
         i += run;
1242 1233
         if (i >= 64)
1243 1234
             return -1;
... ...
@@ -1247,9 +1225,9 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
1247 1247
             break;
1248 1248
         i++;
1249 1249
     }
1250
-    
1251
-    if (s->h263_aic) {
1252
-        h263_pred_ac(s, block, n);
1250
+not_coded:    
1251
+    if (s->mb_intra && s->h263_aic) {
1252
+        h263_pred_acdc(s, block, n);
1253 1253
         i = 64;
1254 1254
     }
1255 1255
     s->block_last_index[n] = i;
... ...
@@ -156,9 +156,6 @@ static int h263_decode_frame(AVCodecContext *avctx,
156 156
                 msmpeg4_dc_scale(s);
157 157
             } else if (s->h263_pred) {
158 158
                 h263_dc_scale(s);
159
-            } else if (s->h263_aic) {
160
-                s->y_dc_scale = s->qscale;
161
-                s->c_dc_scale = s->qscale;                
162 159
             } else {
163 160
                 /* default quantization values */
164 161
                 s->y_dc_scale = 8;
... ...
@@ -89,26 +89,27 @@ static void dct_unquantize_h263_mmx(MpegEncContext *s,
89 89
         qadd = (s->qscale - 1) | 1;
90 90
 
91 91
     if (s->mb_intra) {
92
-        if (n < 4)
93
-            block[0] = block[0] * s->y_dc_scale;
94
-        else
95
-            block[0] = block[0] * s->c_dc_scale;
96
-
97
-	for(i=1; i<8; i++) {
98
-		level = block[i];
99
-		if (level) {
100
-			if (level < 0) {
101
-				level = level * qmul - qadd;
102
-			} else {
103
-				level = level * qmul + qadd;
104
-			}
105
-			block[i] = level;
106
-		}
107
-	}
108
-	nCoeffs=64;
92
+        if (!s->h263_aic) {
93
+            if (n < 4)
94
+                block[0] = block[0] * s->y_dc_scale;
95
+            else
96
+                block[0] = block[0] * s->c_dc_scale;
97
+        }
98
+	    for(i=1; i<8; i++) {
99
+		    level = block[i];
100
+		    if (level) {
101
+			    if (level < 0) {
102
+				    level = level * qmul - qadd;
103
+			    } else {
104
+				    level = level * qmul + qadd;
105
+			    }
106
+			    block[i] = level;
107
+		    }
108
+	    }
109
+        nCoeffs=64;
109 110
     } else {
110 111
         i = 0;
111
-	nCoeffs= zigzag_end[ s->block_last_index[n] ];
112
+        nCoeffs= zigzag_end[ s->block_last_index[n] ];
112 113
     }
113 114
 //printf("%d %d  ", qmul, qadd);
114 115
 asm volatile(
... ...
@@ -745,7 +745,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
745 745
 
746 746
     /* update DC predictors for P macroblocks */
747 747
     if (!s->mb_intra) {
748
-        if (s->h263_pred) {
748
+        if (s->h263_pred || s->h263_aic) {
749 749
           if(s->mbintra_table[mb_x + mb_y*s->mb_width])
750 750
           {
751 751
             int wrap, xy, v;
... ...
@@ -754,7 +754,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
754 754
             xy = 2 * mb_x + 1 +  (2 * mb_y + 1) * wrap;
755 755
             v = 1024;
756 756
             
757
-	    s->dc_val[0][xy] = v;
757
+            s->dc_val[0][xy] = v;
758 758
             s->dc_val[0][xy + 1] = v;
759 759
             s->dc_val[0][xy + wrap] = v;
760 760
             s->dc_val[0][xy + 1 + wrap] = v;
... ...
@@ -784,7 +784,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
784 784
             s->last_dc[2] = 128 << s->intra_dc_precision;
785 785
         }
786 786
     }
787
-    else if (s->h263_pred)
787
+    else if (s->h263_pred || s->h263_aic)
788 788
         s->mbintra_table[mb_x + mb_y*s->mb_width]=1;
789 789
 
790 790
     /* update motion predictor */
... ...
@@ -1327,12 +1327,14 @@ static void dct_unquantize_h263_c(MpegEncContext *s,
1327 1327
 {
1328 1328
     int i, level, qmul, qadd;
1329 1329
     int nCoeffs;
1330
-
1330
+    
1331 1331
     if (s->mb_intra) {
1332
-        if (n < 4) 
1333
-            block[0] = block[0] * s->y_dc_scale;
1334
-        else
1335
-            block[0] = block[0] * s->c_dc_scale;
1332
+        if (!s->h263_aic) {
1333
+            if (n < 4) 
1334
+                block[0] = block[0] * s->y_dc_scale;
1335
+            else
1336
+                block[0] = block[0] * s->c_dc_scale;
1337
+        }
1336 1338
         i = 1;
1337 1339
         nCoeffs= 64; //does not allways use zigzag table 
1338 1340
     } else {