changeset 629:f65040bf4357 libavcodec

bitexact hack for the simple mmx idct
author michaelni
date Sat, 31 Aug 2002 14:17:51 +0000
parents f596db4aa871
children b4ee42142ad1
files i386/dsputil_mmx.c
diffstat 1 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/i386/dsputil_mmx.c	Fri Aug 30 18:17:20 2002 +0000
+++ b/i386/dsputil_mmx.c	Sat Aug 31 14:17:51 2002 +0000
@@ -524,6 +524,28 @@
 #endif
 }
 
+void gen_idct_put(UINT8 *dest, int line_size, DCTELEM *block);
+
+/**
+ * this will send coeff matrixes which would have different results for the 16383 type MMX vs C IDCTs to the C IDCT
+ */ 
+void bit_exact_idct_put(UINT8 *dest, int line_size, INT16 *block){
+    if(   block[0]>1022 && block[1]==0 && block[4 ]==0 && block[5 ]==0
+       && block[8]==0   && block[9]==0 && block[12]==0 && block[13]==0){
+        int16_t tmp[64];
+        int i;
+
+        for(i=0; i<64; i++)
+            tmp[i]= block[i];
+        for(i=0; i<64; i++)
+            block[i]= tmp[block_permute_op(i)];
+        
+        simple_idct_put(dest, line_size, block);
+    }
+    else
+        gen_idct_put(dest, line_size, block);
+}
+
 /* remove any non bit exact operation (testing purpose). NOTE that
    this function should be kept as small as possible because it is
    always difficult to test automatically non bit exact cases. */
@@ -546,5 +568,9 @@
             put_no_rnd_pixels_tab[2] = put_no_rnd_pixels_y2_mmx;
             avg_pixels_tab[3] = avg_pixels_xy2_mmx;
         }
+#ifdef SIMPLE_IDCT
+        if(ff_idct_put==gen_idct_put && ff_idct == simple_idct_mmx)
+            ff_idct_put= bit_exact_idct_put;
+#endif
     }
 }