diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index 958ce52bce..f5813b7bf9 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -161,7 +161,11 @@ void dct_error(const char *name, int is_idct, fdct_func(block); emms(); /* for ff_mmx_idct */ - if (fdct_func == fdct_ifast) { + if (fdct_func == fdct_ifast +#ifndef FAAN_POSTSCALE + || fdct_func == ff_faandct +#endif + ) { for(i=0; i<64; i++) { scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i]; block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS; diff --git a/libavcodec/faandct.c b/libavcodec/faandct.c index 4dcb9dafa7..a0de180607 100644 --- a/libavcodec/faandct.c +++ b/libavcodec/faandct.c @@ -32,6 +32,11 @@ #include "faandct.h" #define FLOAT float +#ifdef FAAN_POSTSCALE +# define SCALE(x) postscale[x] +#else +# define SCALE(x) 1 +#endif //numbers generated by simple c code (not as accurate as they could be) /* @@ -130,12 +135,12 @@ void ff_faandct(DCTELEM * data) tmp11= tmp1 + tmp2; tmp12= tmp1 - tmp2; - data[8*0 + i]= lrint(postscale[8*0 + i] * (tmp10 + tmp11)); - data[8*4 + i]= lrint(postscale[8*4 + i] * (tmp10 - tmp11)); + data[8*0 + i]= lrint(SCALE(8*0 + i) * (tmp10 + tmp11)); + data[8*4 + i]= lrint(SCALE(8*4 + i) * (tmp10 - tmp11)); z1= (tmp12 + tmp13)* A1; - data[8*2 + i]= lrint(postscale[8*2 + i] * (tmp13 + z1)); - data[8*6 + i]= lrint(postscale[8*6 + i] * (tmp13 - z1)); + data[8*2 + i]= lrint(SCALE(8*2 + i) * (tmp13 + z1)); + data[8*6 + i]= lrint(SCALE(8*6 + i) * (tmp13 - z1)); tmp10= tmp4 + tmp5; tmp11= tmp5 + tmp6; @@ -149,9 +154,9 @@ void ff_faandct(DCTELEM * data) z11= tmp7 + z3; z13= tmp7 - z3; - data[8*5 + i]= lrint(postscale[8*5 + i] * (z13 + z2)); - data[8*3 + i]= lrint(postscale[8*3 + i] * (z13 - z2)); - data[8*1 + i]= lrint(postscale[8*1 + i] * (z11 + z4)); - data[8*7 + i]= lrint(postscale[8*7 + i] * (z11 - z4)); + data[8*5 + i]= lrint(SCALE(8*5 + i) * (z13 + z2)); + data[8*3 + i]= lrint(SCALE(8*3 + i) * (z13 - z2)); + data[8*1 + i]= lrint(SCALE(8*1 + i) * (z11 + z4)); + data[8*7 + i]= lrint(SCALE(8*7 + i) * (z11 - z4)); } } diff --git a/libavcodec/faandct.h b/libavcodec/faandct.h index cf6f128f15..41615857d3 100644 --- a/libavcodec/faandct.h +++ b/libavcodec/faandct.h @@ -25,4 +25,6 @@ * @author Michael Niedermayer */ +#define FAAN_POSTSCALE + void ff_faandct(DCTELEM * data); diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 4e86d71912..35ee649573 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -101,7 +101,11 @@ static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16 for(qscale=qmin; qscale<=qmax; qscale++){ int i; - if (s->dsp.fdct == ff_jpeg_fdct_islow || s->dsp.fdct == ff_faandct) { + if (s->dsp.fdct == ff_jpeg_fdct_islow +#ifdef FAAN_POSTSCALE + || s->dsp.fdct == ff_faandct +#endif + ) { for(i=0;i<64;i++) { const int j= s->dsp.idct_permutation[i]; /* 16 <= qscale * quant_matrix[i] <= 7905 */ @@ -112,7 +116,11 @@ static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j])); } - } else if (s->dsp.fdct == fdct_ifast) { + } else if (s->dsp.fdct == fdct_ifast +#ifndef FAAN_POSTSCALE + || s->dsp.fdct == ff_faandct +#endif + ) { for(i=0;i<64;i++) { const int j= s->dsp.idct_permutation[i]; /* 16 <= qscale * quant_matrix[i] <= 7905 */