From d7dc7ad05cbedb397574d87ebb17f10d1c1e8e59 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Fri, 3 Aug 2007 23:53:53 +0000 Subject: [PATCH] split out coupling coefficient reconstruction into a separate function Originally committed as revision 9882 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/ac3dec.c | 74 +++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index b9614e7e6a..d44d8f0c17 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -148,6 +148,7 @@ typedef struct { uint8_t bap[5][256]; //fbw channel bit allocation pointers uint8_t lfebap[256]; //lfe channel bit allocation pointers + float transform_coeffs_cpl[256]; DECLARE_ALIGNED_16(float, transform_coeffs[AC3_MAX_CHANNELS][256]); //transform coefficients /* For IMDCT. */ @@ -421,6 +422,31 @@ static void decode_exponents(GetBitContext *gb, int expstr, int ngrps, } } +/** + * Generates transform coefficients for each coupled channel in the coupling + * range using the coupling coefficients and coupling coordinates. + * reference: Section 7.4.3 Coupling Coordinate Format + */ +static void uncouple_channels(AC3DecodeContext *ctx) +{ + int i, j, ch, bnd, subbnd; + + subbnd = -1; + i = ctx->cplstrtmant; + for(bnd=0; bndncplbnd; bnd++) { + do { + subbnd++; + for(j=0; j<12; j++) { + for(ch=1; ch<=ctx->nfchans; ch++) { + if(ctx->chincpl[ch-1]) + ctx->transform_coeffs[ch][i] = ctx->transform_coeffs_cpl[i] * ctx->cplco[ch-1][bnd]; + } + i++; + } + } while((ctx->cplbndstrc >> subbnd) & 1); + } +} + typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */ int16_t l3_quantizers[3]; int16_t l5_quantizers[3]; @@ -438,40 +464,18 @@ typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantizati static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) { GetBitContext *gb = &ctx->gb; - int ch, start, end, cplbndstrc, bnd, gcode, tbap; - float cplcos[5], cplcoeff; + int start, gcode, tbap; + float cplcoeff; uint8_t *exps = ctx->dcplexps; uint8_t *bap = ctx->cplbap; - - cplbndstrc = ctx->cplbndstrc; start = ctx->cplstrtmant; - bnd = 0; while (start < ctx->cplendmant) { - end = start + 12; - while (cplbndstrc & 1) { - end += 12; - cplbndstrc >>= 1; - } - cplbndstrc >>= 1; - for (ch = 0; ch < ctx->nfchans; ch++) - cplcos[ch] = ctx->cplco[ch][bnd]; - bnd++; - - while (start < end) { tbap = bap[start]; switch(tbap) { case 0: - for (ch = 0; ch < ctx->nfchans; ch++) - if (ctx->chincpl[ch]) { - if (ctx->dithflag[ch]) { - cplcoeff = (av_random(&ctx->dith_state) & 0xFFFF) * scale_factors[exps[start]]; - ctx->transform_coeffs[ch + 1][start] = cplcoeff * cplcos[ch] * LEVEL_MINUS_3DB; - } else - ctx->transform_coeffs[ch + 1][start] = 0; - } - start++; - continue; + cplcoeff = (av_random(&ctx->dith_state) & 0xFFFF); + break; case 1: if (m->l3ptr > 2) { gcode = get_bits(gb, 5); @@ -480,7 +484,7 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) m->l3_quantizers[2] = l3_quantizers_3[gcode]; m->l3ptr = 0; } - cplcoeff = m->l3_quantizers[m->l3ptr++] * scale_factors[exps[start]]; + cplcoeff = m->l3_quantizers[m->l3ptr++]; break; case 2: @@ -491,11 +495,11 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) m->l5_quantizers[2] = l5_quantizers_3[gcode]; m->l5ptr = 0; } - cplcoeff = m->l5_quantizers[m->l5ptr++] * scale_factors[exps[start]]; + cplcoeff = m->l5_quantizers[m->l5ptr++]; break; case 3: - cplcoeff = l7_quantizers[get_bits(gb, 3)] * scale_factors[exps[start]]; + cplcoeff = l7_quantizers[get_bits(gb, 3)]; break; case 4: @@ -505,21 +509,18 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) m->l11_quantizers[1] = l11_quantizers_2[gcode]; m->l11ptr = 0; } - cplcoeff = m->l11_quantizers[m->l11ptr++] * scale_factors[exps[start]]; + cplcoeff = m->l11_quantizers[m->l11ptr++]; break; case 5: - cplcoeff = l15_quantizers[get_bits(gb, 4)] * scale_factors[exps[start]]; + cplcoeff = l15_quantizers[get_bits(gb, 4)]; break; default: - cplcoeff = (get_sbits(gb, qntztab[tbap]) << (16 - qntztab[tbap])) * scale_factors[exps[start]]; + cplcoeff = get_sbits(gb, qntztab[tbap]) << (16 - qntztab[tbap]); } - for (ch = 0; ch < ctx->nfchans; ch++) - if (ctx->chincpl[ch]) - ctx->transform_coeffs[ch + 1][start] = cplcoeff * cplcos[ch]; + ctx->transform_coeffs_cpl[start] = cplcoeff * scale_factors[exps[start]]; start++; - } } return 0; @@ -635,6 +636,7 @@ static int get_transform_coeffs(AC3DecodeContext * ctx) av_log(NULL, AV_LOG_ERROR, "error in decoupling channels\n"); return -1; } + uncouple_channels(ctx); got_cplchan = 1; } end = ctx->cplendmant;