diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-06-10 20:42:36 +0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-06-14 00:49:35 +0400 |
commit | e754dfc0bba4f81fe797f240fca94fea5dfd925e (patch) | |
tree | a610aa37e26a60e164d0ae4a1c12552c3df12754 | |
parent | 36151b3e3112cd7d8ae0e02e850dee16bd966696 (diff) |
ac3enc: dynamically allocate AC3EncodeContext fields windowed_samples and mdct
This will allow the same struct to be used for both the fixed and float ac3
encoders.
-rw-r--r-- | libavcodec/ac3enc.c | 15 | ||||
-rw-r--r-- | libavcodec/ac3enc.h | 5 |
2 files changed, 12 insertions, 8 deletions
diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 9403bf6443..e71afe62ee 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -273,12 +273,12 @@ static void apply_mdct(AC3EncodeContext *s) AC3Block *block = &s->blocks[blk]; 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); + apply_window(&s->dsp, s->windowed_samples, input_samples, s->mdct->window, AC3_WINDOW_SIZE); 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->fft.mdct_calcw(&s->mdct->fft, block->mdct_coef[ch+1], + s->windowed_samples); } } } @@ -2318,6 +2318,7 @@ static av_cold int ac3_encode_close(AVCodecContext *avctx) int blk, ch; AC3EncodeContext *s = avctx->priv_data; + av_freep(&s->windowed_samples); for (ch = 0; ch < s->channels; ch++) av_freep(&s->planar_samples[ch]); av_freep(&s->planar_samples); @@ -2343,7 +2344,8 @@ static av_cold int ac3_encode_close(AVCodecContext *avctx) av_freep(&block->qmant); } - mdct_end(&s->mdct); + mdct_end(s->mdct); + av_freep(&s->mdct); av_freep(&avctx->coded_frame); return 0; @@ -2598,6 +2600,8 @@ static av_cold int allocate_buffers(AVCodecContext *avctx) AC3EncodeContext *s = avctx->priv_data; int channels = s->channels + 1; /* includes coupling channel */ + FF_ALLOC_OR_GOTO(avctx, s->windowed_samples, AC3_WINDOW_SIZE * + sizeof(*s->windowed_samples), alloc_fail); FF_ALLOC_OR_GOTO(avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples), alloc_fail); for (ch = 0; ch < s->channels; ch++) { @@ -2741,7 +2745,8 @@ static av_cold int ac3_encode_init(AVCodecContext *avctx) bit_alloc_init(s); - ret = mdct_init(avctx, &s->mdct, 9); + FF_ALLOCZ_OR_GOTO(avctx, s->mdct, sizeof(AC3MDCTContext), init_fail); + ret = mdct_init(avctx, s->mdct, 9); if (ret) goto init_fail; diff --git a/libavcodec/ac3enc.h b/libavcodec/ac3enc.h index 34ca2e449f..ccdb963a7c 100644 --- a/libavcodec/ac3enc.h +++ b/libavcodec/ac3enc.h @@ -128,7 +128,7 @@ typedef struct AC3EncodeContext { PutBitContext pb; ///< bitstream writer context DSPContext dsp; AC3DSPContext ac3dsp; ///< AC-3 optimized functions - AC3MDCTContext mdct; ///< MDCT context + AC3MDCTContext *mdct; ///< MDCT context AC3Block blocks[AC3_MAX_BLOCKS]; ///< per-block info @@ -189,6 +189,7 @@ typedef struct AC3EncodeContext { int frame_bits; ///< all frame bits except exponents and mantissas int exponent_bits; ///< number of bits used for exponents + SampleType *windowed_samples; SampleType **planar_samples; uint8_t *bap_buffer; uint8_t *bap1_buffer; @@ -208,8 +209,6 @@ typedef struct AC3EncodeContext { uint8_t *ref_bap [AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< bit allocation pointers (bap) int ref_bap_set; ///< indicates if ref_bap pointers have been set - DECLARE_ALIGNED(32, SampleType, windowed_samples)[AC3_WINDOW_SIZE]; - void (*output_frame_header)(struct AC3EncodeContext *s); } AC3EncodeContext; |