diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2007-08-05 21:10:09 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2007-08-05 21:10:09 +0000 |
commit | 77416325cbbc7a6a2383c2e40f2d875e423c6db9 (patch) | |
tree | 6938cf4ed0fb230281fc52b3abec4ebd3b7fa244 | |
parent | 5abee3186c38716e95a0c1dba340795df7de904d (diff) | |
download | ffmpeg-77416325cbbc7a6a2383c2e40f2d875e423c6db9.tar.gz |
use array for dynamic range scaling factors
Originally committed as revision 9953 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/ac3dec.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index c09fad2493..65d5853387 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -163,8 +163,7 @@ typedef struct { float downmix_coeffs[AC3_MAX_CHANNELS][2]; ///< stereo downmix coefficients float dialnorm[2]; ///< dialogue normalization - float dynrng; //dynamic range gain - float dynrng2; //dynamic range gain for 1+1 mode + float dynrng[2]; ///< dynamic range float cplco[AC3_MAX_CHANNELS][18]; //coupling coordinates int ncplbnd; //number of coupling bands int ncplsubnd; //number of coupling sub bands @@ -782,19 +781,15 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) ctx->dither_all = 0; } - if (get_bits1(gb)) { /* dynamic range */ - ctx->dynrng = dynrng_tbl[get_bits(gb, 8)]; - } else if(blk == 0) { - ctx->dynrng = 1.0; - } - - if(acmod == AC3_ACMOD_DUALMONO) { /* dynamic range 1+1 mode */ + /* dynamic range */ + i = !(ctx->acmod); + do { if(get_bits1(gb)) { - ctx->dynrng2 = dynrng_tbl[get_bits(gb, 8)]; + ctx->dynrng[i] = dynrng_tbl[get_bits(gb, 8)]; } else if(blk == 0) { - ctx->dynrng2 = 1.0; + ctx->dynrng[i] = 1.0f; } - } + } while(i--); if (get_bits1(gb)) { /* coupling strategy */ memset(bit_alloc_stages, 3, AC3_MAX_CHANNELS); @@ -1022,10 +1017,10 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) /* apply scaling to coefficients (headroom, dialnorm, dynrng) */ for(ch=1; ch<=ctx->nchans; ch++) { float gain = 2.0f * ctx->mul_bias; - if(ctx->acmod == AC3_ACMOD_DUALMONO && ch == 2) { - gain *= ctx->dialnorm[ch-1] * ctx->dynrng2; + if(ctx->acmod == AC3_ACMOD_DUALMONO) { + gain *= ctx->dialnorm[ch-1] * ctx->dynrng[ch-1]; } else { - gain *= ctx->dialnorm[0] * ctx->dynrng; + gain *= ctx->dialnorm[0] * ctx->dynrng[0]; } for(i=0; i<ctx->endmant[ch]; i++) { ctx->transform_coeffs[ch][i] *= gain; |