ac3enc: merge AC3MDCTContext with AC3EncodeContext.
authorJustin Ruggles <justin.ruggles@gmail.com>
Wed, 13 Jul 2011 19:12:11 +0000 (15:12 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Wed, 13 Jul 2011 20:55:28 +0000 (16:55 -0400)
Since both the fixed-point and floating-point encoders use the FFTContext,
this no longer needs to be in a separate context. Also, when a short-transform
context is added, the same MDCT window will be used.

libavcodec/ac3enc.c
libavcodec/ac3enc.h
libavcodec/ac3enc_fixed.c
libavcodec/ac3enc_float.c
libavcodec/ac3enc_template.c

index f6a3b31..fb4d334 100644 (file)
@@ -1836,8 +1836,7 @@ av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
         av_freep(&block->cpl_coord_mant);
     }
 
-    s->mdct_end(s->mdct);
-    av_freep(&s->mdct);
+    s->mdct_end(s);
 
     av_freep(&avctx->coded_frame);
     return 0;
@@ -2242,8 +2241,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
 
     bit_alloc_init(s);
 
-    FF_ALLOCZ_OR_GOTO(avctx, s->mdct, sizeof(AC3MDCTContext), init_fail);
-    ret = s->mdct_init(avctx, s->mdct, 9);
+    ret = s->mdct_init(s);
     if (ret)
         goto init_fail;
 
index ccef707..6caf4d8 100644 (file)
@@ -66,11 +66,6 @@ typedef int64_t CoefSumType;
 #endif
 
 
-typedef struct AC3MDCTContext {
-    const SampleType *window;           ///< MDCT window function
-    FFTContext fft;                     ///< FFT context for MDCT calculation
-} AC3MDCTContext;
-
 /**
  * Encoding Options used by AVOption.
  */
@@ -143,7 +138,8 @@ typedef struct AC3EncodeContext {
     PutBitContext pb;                       ///< bitstream writer context
     DSPContext dsp;
     AC3DSPContext ac3dsp;                   ///< AC-3 optimized functions
-    AC3MDCTContext *mdct;                   ///< MDCT context
+    FFTContext mdct;                        ///< FFT context for MDCT calculation
+    const SampleType *mdct_window;          ///< MDCT window function array
 
     AC3Block blocks[AC3_MAX_BLOCKS];        ///< per-block info
 
@@ -226,8 +222,8 @@ typedef struct AC3EncodeContext {
     int ref_bap_set;                                         ///< indicates if ref_bap pointers have been set
 
     /* fixed vs. float function pointers */
-    void (*mdct_end)(AC3MDCTContext *mdct);
-    int  (*mdct_init)(AVCodecContext *avctx, AC3MDCTContext *mdct, int nbits);
+    void (*mdct_end)(struct AC3EncodeContext *s);
+    int  (*mdct_init)(struct AC3EncodeContext *s);
 
     /* fixed vs. float templated function pointers */
     int  (*allocate_sample_buffers)(struct AC3EncodeContext *s);
@@ -262,13 +258,11 @@ void ff_ac3_output_frame(AC3EncodeContext *s, unsigned char *frame);
 
 /* prototypes for functions in ac3enc_fixed.c and ac3enc_float.c */
 
-void ff_ac3_fixed_mdct_end(AC3MDCTContext *mdct);
-void ff_ac3_float_mdct_end(AC3MDCTContext *mdct);
+void ff_ac3_fixed_mdct_end(AC3EncodeContext *s);
+void ff_ac3_float_mdct_end(AC3EncodeContext *s);
 
-int ff_ac3_fixed_mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
-                           int nbits);
-int ff_ac3_float_mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
-                           int nbits);
+int ff_ac3_fixed_mdct_init(AC3EncodeContext *s);
+int ff_ac3_float_mdct_init(AC3EncodeContext *s);
 
 
 /* prototypes for functions in ac3enc_template.c */
index ea3a46c..15c5a4b 100644 (file)
@@ -41,9 +41,9 @@ static AVClass ac3enc_class = { "Fixed-Point AC-3 Encoder", av_default_item_name
 /**
  * Finalize MDCT and free allocated memory.
  */
-av_cold void AC3_NAME(mdct_end)(AC3MDCTContext *mdct)
+av_cold void AC3_NAME(mdct_end)(AC3EncodeContext *s)
 {
-    ff_mdct_end(&mdct->fft);
+    ff_mdct_end(&s->mdct);
 }
 
 
@@ -51,11 +51,10 @@ av_cold void AC3_NAME(mdct_end)(AC3MDCTContext *mdct)
  * Initialize MDCT tables.
  * @param nbits log2(MDCT size)
  */
-av_cold int AC3_NAME(mdct_init)(AVCodecContext *avctx, AC3MDCTContext *mdct,
-                                int nbits)
+av_cold int AC3_NAME(mdct_init)(AC3EncodeContext *s)
 {
-    int ret = ff_mdct_init(&mdct->fft, nbits, 0, -1.0);
-    mdct->window = ff_ac3_window;
+    int ret = ff_mdct_init(&s->mdct, 9, 0, -1.0);
+    s->mdct_window = ff_ac3_window;
     return ret;
 }
 
index 718cc1f..deec79c 100644 (file)
@@ -45,10 +45,10 @@ static AVClass ac3enc_class = { "AC-3 Encoder", av_default_item_name,
 /**
  * Finalize MDCT and free allocated memory.
  */
-av_cold void ff_ac3_float_mdct_end(AC3MDCTContext *mdct)
+av_cold void ff_ac3_float_mdct_end(AC3EncodeContext *s)
 {
-    ff_mdct_end(&mdct->fft);
-    av_freep(&mdct->window);
+    ff_mdct_end(&s->mdct);
+    av_freep(&s->mdct_window);
 }
 
 
@@ -56,26 +56,25 @@ av_cold void ff_ac3_float_mdct_end(AC3MDCTContext *mdct)
  * Initialize MDCT tables.
  * @param nbits log2(MDCT size)
  */
-av_cold int ff_ac3_float_mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
-                                   int nbits)
+av_cold int ff_ac3_float_mdct_init(AC3EncodeContext *s)
 {
     float *window;
     int i, n, n2;
 
-    n  = 1 << nbits;
+    n  = 1 << 9;
     n2 = n >> 1;
 
     window = av_malloc(n * sizeof(*window));
     if (!window) {
-        av_log(avctx, AV_LOG_ERROR, "Cannot allocate memory.\n");
+        av_log(s->avctx, AV_LOG_ERROR, "Cannot allocate memory.\n");
         return AVERROR(ENOMEM);
     }
     ff_kbd_window_init(window, 5.0, n2);
     for (i = 0; i < n2; i++)
         window[n-1-i] = window[i];
-    mdct->window = window;
+    s->mdct_window = window;
 
-    return ff_mdct_init(&mdct->fft, nbits, 0, -2.0 / n);
+    return ff_mdct_init(&s->mdct, 9, 0, -2.0 / n);
 }
 
 
index 95c190b..9b9151b 100644 (file)
@@ -108,13 +108,13 @@ static void apply_mdct(AC3EncodeContext *s)
             const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
 
             apply_window(&s->dsp, s->windowed_samples, input_samples,
-                         s->mdct->window, AC3_WINDOW_SIZE);
+                         s->mdct_window, AC3_WINDOW_SIZE);
 
             if (s->fixed_point)
                 block->coeff_shift[ch+1] = normalize_samples(s);
 
-            s->mdct->fft.mdct_calcw(&s->mdct->fft, block->mdct_coef[ch+1],
-                                    s->windowed_samples);
+            s->mdct.mdct_calcw(&s->mdct, block->mdct_coef[ch+1],
+                               s->windowed_samples);
         }
     }
 }