mirror of https://git.ffmpeg.org/ffmpeg.git
simplify snr offset and bit allocation
Originally committed as revision 9784 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
e9a3824880
commit
4611b64ec1
|
@ -107,13 +107,12 @@ typedef struct {
|
||||||
int cplexpstr;
|
int cplexpstr;
|
||||||
int lfeexpstr;
|
int lfeexpstr;
|
||||||
int chexpstr[5];
|
int chexpstr[5];
|
||||||
int csnroffst;
|
int cplsnroffst;
|
||||||
int cplfsnroffst;
|
int cplfgain;
|
||||||
int cplfgaincod;
|
int snroffst[5];
|
||||||
int fsnroffst[5];
|
int fgain[5];
|
||||||
int fgaincod[5];
|
int lfesnroffst;
|
||||||
int lfefsnroffst;
|
int lfefgain;
|
||||||
int lfefgaincod;
|
|
||||||
int cpldeltbae;
|
int cpldeltbae;
|
||||||
int deltbae[5];
|
int deltbae[5];
|
||||||
int cpldeltnseg;
|
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 */
|
typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */
|
||||||
int16_t l3_quantizers[3];
|
int16_t l3_quantizers[3];
|
||||||
int16_t l5_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 */
|
if (get_bits1(gb)) { /* snroffset */
|
||||||
|
int csnr;
|
||||||
bit_alloc_flags = 127;
|
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 */
|
if (ctx->cplinu) { /* coupling fine snr offset and fast gain code */
|
||||||
ctx->cplfsnroffst = get_bits(gb, 4);
|
ctx->cplsnroffst = (csnr + get_bits(gb, 4)) << 2;
|
||||||
ctx->cplfgaincod = get_bits(gb, 3);
|
ctx->cplfgain = ff_fgaintab[get_bits(gb, 3)];
|
||||||
}
|
}
|
||||||
for (i = 0; i < nfchans; i++) { /* channel fine snr offset and fast gain code */
|
for (i = 0; i < nfchans; i++) { /* channel fine snr offset and fast gain code */
|
||||||
ctx->fsnroffst[i] = get_bits(gb, 4);
|
ctx->snroffst[i] = (csnr + get_bits(gb, 4)) << 2;
|
||||||
ctx->fgaincod[i] = get_bits(gb, 3);
|
ctx->fgain[i] = ff_fgaintab[get_bits(gb, 3)];
|
||||||
}
|
}
|
||||||
if (ctx->lfeon) { /* lfe fine snr offset and fast gain code */
|
if (ctx->lfeon) { /* lfe fine snr offset and fast gain code */
|
||||||
ctx->lfefsnroffst = get_bits(gb, 4);
|
ctx->lfesnroffst = (csnr + get_bits(gb, 4)) << 2;
|
||||||
ctx->lfefgaincod = get_bits(gb, 3);
|
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 (bit_alloc_flags) {
|
||||||
if (ctx->cplinu && (bit_alloc_flags & 64))
|
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++)
|
for (i = 0; i < nfchans; i++)
|
||||||
if ((bit_alloc_flags >> i) & 1)
|
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))
|
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 */
|
if (get_bits1(gb)) { /* unused dummy data */
|
||||||
|
|
Loading…
Reference in New Issue