diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2007-07-24 02:08:27 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2007-07-24 02:08:27 +0000 |
commit | 4611b64ec1d90d43a5b64c572ad58b5b7367b033 (patch) | |
tree | e7b414c1efd684ce89e18b75d6057a7955acfe4f | |
parent | e9a3824880b0c405661071a4027c81c83d70e2b0 (diff) | |
download | ffmpeg-4611b64ec1d90d43a5b64c572ad58b5b7367b033.tar.gz |
simplify snr offset and bit allocation
Originally committed as revision 9784 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/ac3dec.c | 83 |
1 files changed, 31 insertions, 52 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index abc70d15dc..f9842cf853 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -107,13 +107,12 @@ typedef struct { int cplexpstr; int lfeexpstr; int chexpstr[5]; - int csnroffst; - int cplfsnroffst; - int cplfgaincod; - int fsnroffst[5]; - int fgaincod[5]; - int lfefsnroffst; - int lfefgaincod; + int cplsnroffst; + int cplfgain; + int snroffst[5]; + int fgain[5]; + int lfesnroffst; + int lfefgain; int cpldeltbae; int deltbae[5]; int cpldeltnseg; @@ -424,41 +423,6 @@ static void decode_exponents(GetBitContext *gb, int expstr, int ngrps, } } -/* Performs bit allocation. - * This function performs bit allocation for the requested chanenl. - */ -static void do_bit_allocation(AC3DecodeContext *ctx, int chnl) -{ - int fgain, snroffset; - - if (chnl == 5) { - fgain = ff_fgaintab[ctx->cplfgaincod]; - snroffset = (((ctx->csnroffst - 15) << 4) + ctx->cplfsnroffst) << 2; - ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->cplbap, - ctx->dcplexps, ctx->cplstrtmant, - ctx->cplendmant, snroffset, fgain, 0, - ctx->cpldeltbae, ctx->cpldeltnseg, - ctx->cpldeltoffst, ctx->cpldeltlen, - ctx->cpldeltba); - } - else if (chnl == 6) { - fgain = ff_fgaintab[ctx->lfefgaincod]; - snroffset = (((ctx->csnroffst - 15) << 4) + ctx->lfefsnroffst) << 2; - ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->lfebap, - ctx->dlfeexps, 0, 7, snroffset, fgain, 1, - DBA_NONE, 0, NULL, NULL, NULL); - } - else { - fgain = ff_fgaintab[ctx->fgaincod[chnl]]; - snroffset = (((ctx->csnroffst - 15) << 4) + ctx->fsnroffst[chnl]) << 2; - ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->bap[chnl], - ctx->dexps[chnl], 0, ctx->endmant[chnl], - snroffset, fgain, 0, ctx->deltbae[chnl], - ctx->deltnseg[chnl], ctx->deltoffst[chnl], - ctx->deltlen[chnl], ctx->deltba[chnl]); - } -} - typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */ int16_t l3_quantizers[3]; int16_t l5_quantizers[3]; @@ -1463,19 +1427,20 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) } if (get_bits1(gb)) { /* snroffset */ + int csnr; bit_alloc_flags = 127; - ctx->csnroffst = get_bits(gb, 6); + csnr = (get_bits(gb, 6) - 15) << 4; if (ctx->cplinu) { /* coupling fine snr offset and fast gain code */ - ctx->cplfsnroffst = get_bits(gb, 4); - ctx->cplfgaincod = get_bits(gb, 3); + ctx->cplsnroffst = (csnr + get_bits(gb, 4)) << 2; + ctx->cplfgain = ff_fgaintab[get_bits(gb, 3)]; } for (i = 0; i < nfchans; i++) { /* channel fine snr offset and fast gain code */ - ctx->fsnroffst[i] = get_bits(gb, 4); - ctx->fgaincod[i] = get_bits(gb, 3); + ctx->snroffst[i] = (csnr + get_bits(gb, 4)) << 2; + ctx->fgain[i] = ff_fgaintab[get_bits(gb, 3)]; } if (ctx->lfeon) { /* lfe fine snr offset and fast gain code */ - ctx->lfefsnroffst = get_bits(gb, 4); - ctx->lfefgaincod = get_bits(gb, 3); + ctx->lfesnroffst = (csnr + get_bits(gb, 4)) << 2; + ctx->lfefgain = ff_fgaintab[get_bits(gb, 3)]; } } @@ -1533,12 +1498,26 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) if (bit_alloc_flags) { if (ctx->cplinu && (bit_alloc_flags & 64)) - do_bit_allocation(ctx, 5); + ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->cplbap, + ctx->dcplexps, ctx->cplstrtmant, + ctx->cplendmant, ctx->cplsnroffst, + ctx->cplfgain, 0, + ctx->cpldeltbae, ctx->cpldeltnseg, + ctx->cpldeltoffst, ctx->cpldeltlen, + ctx->cpldeltba); for (i = 0; i < nfchans; i++) if ((bit_alloc_flags >> i) & 1) - do_bit_allocation(ctx, i); + ac3_parametric_bit_allocation(&ctx->bit_alloc_params, + ctx->bap[i], ctx->dexps[i], 0, + ctx->endmant[i], ctx->snroffst[i], + ctx->fgain[i], 0, ctx->deltbae[i], + ctx->deltnseg[i], ctx->deltoffst[i], + ctx->deltlen[i], ctx->deltba[i]); if (ctx->lfeon && (bit_alloc_flags & 32)) - do_bit_allocation(ctx, 6); + ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->lfebap, + ctx->dlfeexps, 0, 7, ctx->lfesnroffst, + ctx->lfefgain, 1, + DBA_NONE, 0, NULL, NULL, NULL); } if (get_bits1(gb)) { /* unused dummy data */ |