diff mpeg12.c @ 706:e65798d228ea libavcodec

idct permutation cleanup, idct can be selected per context now fixing some threadunsafe code
author michaelni
date Sun, 29 Sep 2002 22:44:22 +0000
parents 20810b0193ef
children 97377ab86647
line wrap: on
line diff
--- a/mpeg12.c	Sun Sep 29 15:14:28 2002 +0000
+++ b/mpeg12.c	Sun Sep 29 22:44:22 2002 +0000
@@ -542,7 +542,7 @@
     last_non_zero = i - 1;
 
     for(;i<=last_index;i++) {
-        j = zigzag_direct[i];
+        j = s->intra_scantable.permutated[i];
         level = block[j];
     next_coef:
 #if 0
@@ -552,26 +552,11 @@
         /* encode using VLC */
         if (level != 0) {
             run = i - last_non_zero - 1;
-#ifdef ARCH_X86
-            asm volatile(
-		"movl %2, %1		\n\t"
-		"movl %1, %0		\n\t"
-		"addl %1, %1		\n\t"
-		"sbbl %1, %1		\n\t"
-		"xorl %1, %0		\n\t"
-		"subl %1, %0		\n\t"
-		"andl $1, %1		\n\t"
-		: "=&r" (alevel), "=&r" (sign)
-		: "g" (level)
-	    );
-#else
-            sign = 0;
-            alevel = level;
-            if (alevel < 0) {
-		sign = 1;
-                alevel = -alevel;
-	    }
-#endif
+            
+            alevel= level;
+            MASK_ABS(sign, alevel)
+            sign&=1;
+
 //            code = get_rl_index(rl, 0, run, alevel);
             if (alevel > mpeg1_max_level[0][run])
                 code= 111; /*rl->n*/
@@ -1040,6 +1025,7 @@
     int level, dc, diff, i, j, run;
     int code, component;
     RLTable *rl = &rl_mpeg1;
+    UINT8 * const scantable= s->intra_scantable.permutated;
 
     if (s->mb_intra) {
         /* DC coef */
@@ -1099,7 +1085,7 @@
             return -1;
     add_coef:
         dprintf("%d: run=%d level=%d\n", n, run, level);
-	j = zigzag_direct[i];
+	j = scantable[i];
         block[j] = level;
         i++;
     }
@@ -1121,9 +1107,9 @@
     int mismatch;
 
     if (s->alternate_scan)
-        scan_table = ff_alternate_vertical_scan;
+        scan_table = s->intra_v_scantable.permutated;
     else
-        scan_table = zigzag_direct;
+        scan_table = s->intra_scantable.permutated;
     mismatch = 1;
 
     {
@@ -1140,7 +1126,7 @@
         v= SHOW_UBITS(re, &s->gb, 2);
         if (v & 2) {
             run = 0;
-            level = 1 - ((v & 1) << 1);
+            level = 5 - (v << 1);
             SKIP_BITS(re, &s->gb, 2);
             CLOSE_READER(re, &s->gb);
             goto add_coef;
@@ -1191,6 +1177,7 @@
     }
     block[63] ^= (mismatch & 1);
     s->block_last_index[n] = i;
+
     return 0;
 }
 
@@ -1206,9 +1193,9 @@
     int mismatch;
 
     if (s->alternate_scan)
-        scan_table = ff_alternate_vertical_scan;
+        scan_table = s->intra_v_scantable.permutated;
     else
-        scan_table = zigzag_direct;
+        scan_table = s->intra_scantable.permutated;
 
     /* DC coef */
     component = (n <= 3 ? 0 : n - 4 + 1);
@@ -1402,7 +1389,7 @@
     if (get_bits1(&s->gb)) {
         for(i=0;i<64;i++) {
             v = get_bits(&s->gb, 8);
-            j = zigzag_direct[i];
+            j = s->intra_scantable.permutated[i];
             s->intra_matrix[j] = v;
             s->chroma_intra_matrix[j] = v;
         }
@@ -1410,7 +1397,7 @@
     if (get_bits1(&s->gb)) {
         for(i=0;i<64;i++) {
             v = get_bits(&s->gb, 8);
-            j = zigzag_direct[i];
+            j = s->intra_scantable.permutated[i];
             s->inter_matrix[j] = v;
             s->chroma_inter_matrix[j] = v;
         }
@@ -1418,14 +1405,14 @@
     if (get_bits1(&s->gb)) {
         for(i=0;i<64;i++) {
             v = get_bits(&s->gb, 8);
-            j = zigzag_direct[i];
+            j = s->intra_scantable.permutated[i];
             s->chroma_intra_matrix[j] = v;
         }
     }
     if (get_bits1(&s->gb)) {
         for(i=0;i<64;i++) {
             v = get_bits(&s->gb, 8);
-            j = zigzag_direct[i];
+            j = s->intra_scantable.permutated[i];
             s->chroma_inter_matrix[j] = v;
         }
     }
@@ -1636,7 +1623,7 @@
     if (get_bits1(&s->gb)) {
         for(i=0;i<64;i++) {
             v = get_bits(&s->gb, 8);
-            j = zigzag_direct[i];
+            j = s->intra_scantable.permutated[i];
             s->intra_matrix[j] = v;
             s->chroma_intra_matrix[j] = v;
         }
@@ -1648,15 +1635,16 @@
 #endif
     } else {
         for(i=0;i<64;i++) {
+            int j= s->idct_permutation[i];
             v = ff_mpeg1_default_intra_matrix[i];
-            s->intra_matrix[i] = v;
-            s->chroma_intra_matrix[i] = v;
+            s->intra_matrix[j] = v;
+            s->chroma_intra_matrix[j] = v;
         }
     }
     if (get_bits1(&s->gb)) {
         for(i=0;i<64;i++) {
             v = get_bits(&s->gb, 8);
-            j = zigzag_direct[i];
+            j = s->intra_scantable.permutated[i];
             s->inter_matrix[j] = v;
             s->chroma_inter_matrix[j] = v;
         }
@@ -1668,9 +1656,10 @@
 #endif
     } else {
         for(i=0;i<64;i++) {
+            int j= s->idct_permutation[i];
             v = ff_mpeg1_default_non_intra_matrix[i];
-            s->inter_matrix[i] = v;
-            s->chroma_inter_matrix[i] = v;
+            s->inter_matrix[j] = v;
+            s->chroma_inter_matrix[j] = v;
         }
     }