aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/ac3dec.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2007-07-24 02:08:27 +0000
committerJustin Ruggles <justin.ruggles@gmail.com>2007-07-24 02:08:27 +0000
commit4611b64ec1d90d43a5b64c572ad58b5b7367b033 (patch)
treee7b414c1efd684ce89e18b75d6057a7955acfe4f /libavcodec/ac3dec.c
parente9a3824880b0c405661071a4027c81c83d70e2b0 (diff)
downloadffmpeg-4611b64ec1d90d43a5b64c572ad58b5b7367b033.tar.gz
simplify snr offset and bit allocation
Originally committed as revision 9784 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/ac3dec.c')
-rw-r--r--libavcodec/ac3dec.c83
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 */