x264_quant_init( h, cpu_ref, &qf_ref );
x264_quant_init( h, cpu_new, &qf_a );
+#define INIT_QUANT8() \
+ { \
+ static const int scale1d[8] = {32,31,24,31,32,31,24,31}; \
+ int x, y; \
+ for( y = 0; y < 8; y++ ) \
+ for( x = 0; x < 8; x++ ) \
+ { \
+ unsigned int scale = (255*scale1d[y]*scale1d[x])/16; \
+ dct1[y*8+x] = dct2[y*8+x] = (rand()%(2*scale+1))-scale; \
+ } \
+ }
+
+#define INIT_QUANT4() \
+ { \
+ static const int scale1d[4] = {4,6,4,6}; \
+ int x, y; \
+ for( y = 0; y < 4; y++ ) \
+ for( x = 0; x < 4; x++ ) \
+ { \
+ unsigned int scale = 255*scale1d[y]*scale1d[x]; \
+ dct1[y*4+x] = dct2[y*4+x] = (rand()%(2*scale+1))-scale; \
+ } \
+ }
+
#define TEST_QUANT( name, cqm ) \
if( qf_a.name != qf_ref.name ) \
{ \
} \
}
- TEST_QUANT( quant_8x8_core, *h->quant8_mf[CQM_8IY] );
- TEST_QUANT( quant_8x8_core, *h->quant8_mf[CQM_8PY] );
- TEST_QUANT( quant_4x4_core, *h->quant4_mf[CQM_4IY] );
- TEST_QUANT( quant_4x4_core, *h->quant4_mf[CQM_4PY] );
+#define TEST_QUANT8( qname, cqm, shift, divider ) \
+ if( qf_a.qname != qf_ref.qname ) \
+ { \
+ int qp; \
+ used_asms[0] = 1; \
+ for( qp = 51; qp > 0; qp-- ) \
+ { \
+ INIT_QUANT8() \
+ qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); \
+ qf_a.qname( (void*)dct2, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); \
+ if( memcmp( dct1, dct2, 64*2 ) ) \
+ { \
+ oks[0] = 0; \
+ fprintf( stderr, #qname "(qp=%d, cqm=%d, intra=%d): [FAILED]\n", qp, i_cqm, divider==3 ); \
+ break; \
+ } \
+ } \
+ }
+
+#define TEST_QUANT4( qname, cqm, shift, divider ) \
+ if( qf_a.qname != qf_ref.qname ) \
+ { \
+ int qp; \
+ used_asms[0] = 1; \
+ for( qp = 51; qp > 0; qp-- ) \
+ { \
+ INIT_QUANT4() \
+ qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); \
+ qf_a.qname( (void*)dct2, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); \
+ if( memcmp( dct1, dct2, 16*2 ) ) \
+ { \
+ oks[0] = 0; \
+ fprintf( stderr, #qname "(qp=%d, cqm=%d, intra=%d): [FAILED]\n", qp, i_cqm, divider==3 ); \
+ break; \
+ } \
+ } \
+ }
+
+ TEST_QUANT8( quant_8x8_core, h->quant8_mf[CQM_8IY], 16, 3 );
+ TEST_QUANT8( quant_8x8_core, h->quant8_mf[CQM_8PY], 16, 6 );
+ TEST_QUANT4( quant_4x4_core, h->quant4_mf[CQM_4IY], 15, 3 );
+ TEST_QUANT4( quant_4x4_core, h->quant4_mf[CQM_4PY], 15, 6 );
TEST_QUANT( quant_4x4_dc_core, ***h->quant4_mf[CQM_4IY] );
TEST_QUANT( quant_2x2_dc_core, ***h->quant4_mf[CQM_4IC] );
-#define TEST_DEQUANT( name, quant, dqm, cqm, shift ) \
- if( qf_a.name != qf_ref.name ) \
+#define TEST_DEQUANT8( qname, dqname, cqm, dqm, shift, divider ) \
+ if( qf_a.dqname != qf_ref.dqname ) \
{ \
int qp; \
used_asms[1] = 1; \
for( qp = 51; qp > 0; qp-- ) \
{ \
- for( i = 0; i < 64; i++ ) \
- dct1[i] = dct2[i] = (rand() & 0x1fff) - 0xfff; \
- qf_c.quant( (void*)dct1, cqm[qp%6], shift+qp/6, 0 ); \
- memcpy( dct2, dct1, sizeof(dct2) ); \
- qf_c.name( (void*)dct1, dqm, qp ); \
- qf_a.name( (void*)dct2, dqm, qp ); \
+ INIT_QUANT8() \
+ qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); \
+ memcpy( dct2, dct1, 64*2 ); \
+ qf_c.dqname( (void*)dct1, dqm, qp ); \
+ qf_a.dqname( (void*)dct2, dqm, qp ); \
if( memcmp( dct1, dct2, 64*2 ) ) \
{ \
oks[1] = 0; \
- fprintf( stderr, #name "(qp=%d, cqm=%d): [FAILED]\n", qp, i_cqm ); \
+ fprintf( stderr, #dqname "(qp=%d, cqm=%d, intra=%d): [FAILED]\n", qp, i_cqm, divider==3 ); \
+ break; \
+ } \
+ } \
+ }
+
+#define TEST_DEQUANT4( qname, dqname, cqm, dqm, shift, divider ) \
+ if( qf_a.dqname != qf_ref.dqname ) \
+ { \
+ int qp; \
+ used_asms[1] = 1; \
+ for( qp = 51; qp > 0; qp-- ) \
+ { \
+ INIT_QUANT4() \
+ qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); \
+ memcpy( dct2, dct1, 16*2 ); \
+ qf_c.dqname( (void*)dct1, dqm, qp ); \
+ qf_a.dqname( (void*)dct2, dqm, qp ); \
+ if( memcmp( dct1, dct2, 16*2 ) ) \
+ { \
+ oks[1] = 0; \
+ fprintf( stderr, #dqname "(qp=%d, cqm=%d, intra=%d): [FAILED]\n", qp, i_cqm, divider==3 ); \
break; \
} \
} \
}
- TEST_DEQUANT( dequant_8x8, quant_8x8_core, h->dequant8_mf[CQM_8PY], h->quant8_mf[CQM_8PY], 16 );
- TEST_DEQUANT( dequant_4x4, quant_4x4_core, h->dequant4_mf[CQM_4PY], h->quant4_mf[CQM_4PY], 15 );
+ TEST_DEQUANT8( quant_8x8_core, dequant_8x8, h->quant8_mf[CQM_8IY], h->dequant8_mf[CQM_8IY], 16, 3 );
+ TEST_DEQUANT8( quant_8x8_core, dequant_8x8, h->quant8_mf[CQM_8PY], h->dequant8_mf[CQM_8PY], 16, 6 );
+ TEST_DEQUANT4( quant_4x4_core, dequant_4x4, h->quant4_mf[CQM_4IY], h->dequant4_mf[CQM_4IY], 15, 3 );
+ TEST_DEQUANT4( quant_4x4_core, dequant_4x4, h->quant4_mf[CQM_4PY], h->dequant4_mf[CQM_4PY], 15, 6 );
}
ok = oks[0]; used_asm = used_asms[0];