---
 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

Reply via email to