Commit 228315bb authored by Justin Ruggles's avatar Justin Ruggles
Browse files

Fix the fixed-point MDCT and FFT tests so that they actually compile and work.

Also, use LFG from libavutil instead of random().

Originally committed as revision 25955 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent a8d2b06b
...@@ -1280,14 +1280,15 @@ static av_cold int AC3_encode_close(AVCodecContext *avctx) ...@@ -1280,14 +1280,15 @@ static av_cold int AC3_encode_close(AVCodecContext *avctx)
return 0; return 0;
} }
#if 0 #ifdef TEST
/*************************************************************************/ /*************************************************************************/
/* TEST */ /* TEST */
#undef random #include "libavutil/lfg.h"
#define FN (N/4)
void fft_test(void) #define FN (MDCT_SAMPLES/4)
static void fft_test(AVLFG *lfg)
{ {
IComplex in[FN], in1[FN]; IComplex in[FN], in1[FN];
int k, n, i; int k, n, i;
...@@ -1296,8 +1297,8 @@ void fft_test(void) ...@@ -1296,8 +1297,8 @@ void fft_test(void)
/* FFT test */ /* FFT test */
for(i=0;i<FN;i++) { for(i=0;i<FN;i++) {
in[i].re = random() % 65535 - 32767; in[i].re = av_lfg_get(lfg) % 65535 - 32767;
in[i].im = random() % 65535 - 32767; in[i].im = av_lfg_get(lfg) % 65535 - 32767;
in1[i] = in[i]; in1[i] = in[i];
} }
fft(in, 7); fft(in, 7);
...@@ -1311,67 +1312,62 @@ void fft_test(void) ...@@ -1311,67 +1312,62 @@ void fft_test(void)
sum_re += in1[n].re * cos(a) - in1[n].im * sin(a); sum_re += in1[n].re * cos(a) - in1[n].im * sin(a);
sum_im += in1[n].re * sin(a) + in1[n].im * cos(a); sum_im += in1[n].re * sin(a) + in1[n].im * cos(a);
} }
printf("%3d: %6d,%6d %6.0f,%6.0f\n", av_log(NULL, AV_LOG_DEBUG, "%3d: %6d,%6d %6.0f,%6.0f\n",
k, in[k].re, in[k].im, sum_re / FN, sum_im / FN); k, in[k].re, in[k].im, sum_re / FN, sum_im / FN);
} }
} }
void mdct_test(void) static void mdct_test(AVLFG *lfg)
{ {
int16_t input[N]; int16_t input[MDCT_SAMPLES];
int32_t output[N/2]; int32_t output[AC3_MAX_COEFS];
float input1[N]; float input1[MDCT_SAMPLES];
float output1[N/2]; float output1[AC3_MAX_COEFS];
float s, a, err, e, emax; float s, a, err, e, emax;
int i, k, n; int i, k, n;
for(i=0;i<N;i++) { for(i=0;i<MDCT_SAMPLES;i++) {
input[i] = (random() % 65535 - 32767) * 9 / 10; input[i] = (av_lfg_get(lfg) % 65535 - 32767) * 9 / 10;
input1[i] = input[i]; input1[i] = input[i];
} }
mdct512(output, input); mdct512(output, input);
/* do it by hand */ /* do it by hand */
for(k=0;k<N/2;k++) { for(k=0;k<AC3_MAX_COEFS;k++) {
s = 0; s = 0;
for(n=0;n<N;n++) { for(n=0;n<MDCT_SAMPLES;n++) {
a = (2*M_PI*(2*n+1+N/2)*(2*k+1) / (4 * N)); a = (2*M_PI*(2*n+1+MDCT_SAMPLES/2)*(2*k+1) / (4 * MDCT_SAMPLES));
s += input1[n] * cos(a); s += input1[n] * cos(a);
} }
output1[k] = -2 * s / N; output1[k] = -2 * s / MDCT_SAMPLES;
} }
err = 0; err = 0;
emax = 0; emax = 0;
for(i=0;i<N/2;i++) { for(i=0;i<AC3_MAX_COEFS;i++) {
printf("%3d: %7d %7.0f\n", i, output[i], output1[i]); av_log(NULL, AV_LOG_DEBUG, "%3d: %7d %7.0f\n", i, output[i], output1[i]);
e = output[i] - output1[i]; e = output[i] - output1[i];
if (e > emax) if (e > emax)
emax = e; emax = e;
err += e * e; err += e * e;
} }
printf("err2=%f emax=%f\n", err / (N/2), emax); av_log(NULL, AV_LOG_DEBUG, "err2=%f emax=%f\n", err / AC3_MAX_COEFS, emax);
} }
void test_ac3(void) int main(void)
{ {
AC3EncodeContext ctx; AVLFG lfg;
unsigned char frame[AC3_MAX_CODED_FRAME_SIZE];
int16_t samples[AC3_FRAME_SIZE];
int ret, i;
AC3_encode_init(&ctx, 44100, 64000, 1); av_log_set_level(AV_LOG_DEBUG);
mdct_init(9);
fft_test(); fft_test(&lfg);
mdct_test(); mdct_test(&lfg);
for(i=0;i<AC3_FRAME_SIZE;i++) return 0;
samples[i] = (int)(sin(2*M_PI*i*1000.0/44100) * 10000);
ret = AC3_encode_frame(&ctx, frame, samples);
printf("ret=%d\n", ret);
} }
#endif #endif /* TEST */
AVCodec ac3_encoder = { AVCodec ac3_encoder = {
"ac3", "ac3",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment