# HG changeset patch # User michaelni # Date 1030803471 0 # Node ID f65040bf435720a22bcf1eb751be94a7203ff589 # Parent f596db4aa8713e4b13027f4680f2fd69980f7bbd bitexact hack for the simple mmx idct diff -r f596db4aa871 -r f65040bf4357 i386/dsputil_mmx.c --- 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 } }