---
libavcodec/ac3enc.c | 85 +++++++++++++++++++++++++++++++++++---------------
1 files changed, 59 insertions(+), 26 deletions(-)
diff --git libavcodec/ac3enc.c libavcodec/ac3enc.c
index 7c01094..7235dd8 100644
--- libavcodec/ac3enc.c
+++ libavcodec/ac3enc.c
@@ -1627,85 +1627,118 @@ static av_cold int AC3_encode_close(AVCodecContext *avctx)
#include "libavutil/lfg.h"
-#define FN (MDCT_SAMPLES/4)
-
-static void fft_test(AVLFG *lfg)
+static void fft_test(AC3MDCTContext *mdct, AVLFG *lfg)
{
- IComplex in[FN], in1[FN];
+ IComplex *in, *in1;
int k, n, i;
float sum_re, sum_im, a;
+ int fft_size = 1 << (mdct->nbits - 2);
+
+ in = av_malloc(fft_size * sizeof(*in));
+ in1 = av_malloc(fft_size * sizeof(*in1));
+ if (!in || !in1) {
+ av_freep(&in);
+ av_freep(&in1);
+ return;
+ }
/* FFT test */
- for (i = 0; i < FN; i++) {
+ for (i = 0; i < fft_size; i++) {
in[i].re = av_lfg_get(lfg) % 65535 - 32767;
in[i].im = av_lfg_get(lfg) % 65535 - 32767;
in1[i] = in[i];
}
- fft(in, 7);
+ calc_fft(mdct, in, 7);
/* do it by hand */
- for (k = 0; k < FN; k++) {
+ for (k = 0; k < fft_size; k++) {
sum_re = 0;
sum_im = 0;
- for (n = 0; n < FN; n++) {
- a = -2 * M_PI * (n * k) / FN;
+ for (n = 0; n < fft_size; n++) {
+ a = -2 * M_PI * (n * k) / fft_size;
sum_re += in1[n].re * cos(a) - in1[n].im * sin(a);
sum_im += in1[n].re * sin(a) + in1[n].im * cos(a);
}
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 / fft_size, sum_im / fft_size);
}
+
+ av_freep(&in);
+ av_freep(&in1);
}
-static void mdct_test(AVLFG *lfg)
+static void mdct_test(AC3MDCTContext *mdct, AVLFG *lfg)
{
- int16_t input[MDCT_SAMPLES];
- int32_t output[AC3_MAX_COEFS];
- float input1[MDCT_SAMPLES];
- float output1[AC3_MAX_COEFS];
+ int16_t *input;
+ int32_t *output;
+ float *input1;
+ float *output1;
float s, a, err, e, emax;
int i, k, n;
+ int mdct_size = 1 << mdct->nbits;
+ int out_size = mdct_size >> 1;
+
+ input = av_malloc(mdct_size * sizeof(*input));
+ input1 = av_malloc(mdct_size * sizeof(*input1));
+ output = av_malloc(out_size * sizeof(*output));
+ output1 = av_malloc(out_size * sizeof(*output1));
+ if (!input || !input1 || !output || !output1) {
+ av_freep(&input);
+ av_freep(&input1);
+ av_freep(&output);
+ av_freep(&output1);
+ return;
+ }
- for (i = 0; i < MDCT_SAMPLES; i++) {
+ for (i = 0; i < mdct_size; i++) {
input[i] = (av_lfg_get(lfg) % 65535 - 32767) * 9 / 10;
input1[i] = input[i];
}
- mdct512(output, input);
+ calc_mdct(mdct, output, input);
/* do it by hand */
- for (k = 0; k < AC3_MAX_COEFS; k++) {
+ for (k = 0; k < out_size; k++) {
s = 0;
- for (n = 0; n < MDCT_SAMPLES; n++) {
- a = (2*M_PI * (2*n + 1 + MDCT_SAMPLES/2) * (2*k + 1) / (4*MDCT_SAMPLES));
+ for (n = 0; n < mdct_size; n++) {
+ a = (2*M_PI * (2*n + 1 + mdct_size/2) * (2*k + 1) / (4*mdct_size));
s += input1[n] * cos(a);
}
- output1[k] = -2 * s / MDCT_SAMPLES;
+ output1[k] = -2 * s / mdct_size;
}
err = 0;
emax = 0;
- for (i = 0; i < AC3_MAX_COEFS; i++) {
+ for (i = 0; i < out_size; i++) {
av_log(NULL, AV_LOG_DEBUG, "%3d: %7d %7.0f\n", i, output[i], output1[i]);
e = output[i] - output1[i];
if (e > emax)
emax = e;
err += e * e;
}
- av_log(NULL, AV_LOG_DEBUG, "err2=%f emax=%f\n", err / AC3_MAX_COEFS, emax);
+ av_log(NULL, AV_LOG_DEBUG, "err2=%f emax=%f\n", err / out_size, emax);
+
+ av_freep(&input);
+ av_freep(&input1);
+ av_freep(&output);
+ av_freep(&output1);
}
int main(void)
{
AVLFG lfg;
+ AC3MDCTContext mdct;
+ mdct.avctx = NULL;
av_log_set_level(AV_LOG_DEBUG);
- mdct_init();
+ mdct_init(&mdct, 9);
av_lfg_init(&lfg, 0xdeadbeef);
- fft_test(&lfg);
- mdct_test(&lfg);
+ fft_test(&mdct, &lfg);
+ mdct_test(&mdct, &lfg);
+
+ mdct_end(&mdct);
return 0;
}
_______________________________________________
FFmpeg-soc mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc