Mercurial > libavcodec.hg
changeset 5415:8bf7358978c8 libavcodec
simplify stereo rematrixing
author | jbr |
---|---|
date | Sun, 29 Jul 2007 00:58:32 +0000 |
parents | 9746c9a0384f |
children | 90d90aecc83c |
files | ac3dec.c |
diffstat | 1 files changed, 29 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/ac3dec.c Sun Jul 29 00:35:30 2007 +0000 +++ b/ac3dec.c Sun Jul 29 00:58:32 2007 +0000 @@ -38,6 +38,12 @@ #include "dsputil.h" #include "random.h" +/** + * Table of bin locations for rematrixing bands + * reference: Section 7.5.2 Rematrixing : Frequency Band Definitions + */ +static const uint8_t rematrix_band_tbl[5] = { 13, 25, 37, 61, 253 }; + /* table for exponent to scale_factor mapping * scale_factor[i] = 2 ^ -(i + 15) */ @@ -92,6 +98,7 @@ int cplcoe; uint32_t cplbndstrc; int rematstr; + int nrematbnd; int rematflg[AC3_MAX_CHANNELS]; int cplexpstr; int lfeexpstr; @@ -648,43 +655,28 @@ return 0; } -/* Rematrixing routines. */ -static void do_rematrixing1(AC3DecodeContext *ctx, int start, int end) -{ - float tmp0, tmp1; - - while (start < end) { - tmp0 = ctx->transform_coeffs[1][start]; - tmp1 = ctx->transform_coeffs[2][start]; - ctx->transform_coeffs[1][start] = tmp0 + tmp1; - ctx->transform_coeffs[2][start] = tmp0 - tmp1; - start++; - } -} - +/** + * Performs stereo rematrixing. + * reference: Section 7.5.4 Rematrixing : Decoding Technique + */ static void do_rematrixing(AC3DecodeContext *ctx) { - int bnd1 = 13, bnd2 = 25, bnd3 = 37, bnd4 = 61; + int bnd, i; int end, bndend; + float tmp0, tmp1; end = FFMIN(ctx->endmant[0], ctx->endmant[1]); - if (ctx->rematflg[0]) - do_rematrixing1(ctx, bnd1, bnd2); - - if (ctx->rematflg[1]) - do_rematrixing1(ctx, bnd2, bnd3); - - bndend = bnd4; - if (bndend > end) { - bndend = end; - if (ctx->rematflg[2]) - do_rematrixing1(ctx, bnd3, bndend); - } else { - if (ctx->rematflg[2]) - do_rematrixing1(ctx, bnd3, bnd4); - if (ctx->rematflg[3]) - do_rematrixing1(ctx, bnd4, end); + for(bnd=0; bnd<ctx->nrematbnd; bnd++) { + if(ctx->rematflg[bnd]) { + bndend = FFMIN(end, rematrix_band_tbl[bnd+1]); + for(i=rematrix_band_tbl[bnd]; i<bndend; i++) { + tmp0 = ctx->transform_coeffs[1][i]; + tmp1 = ctx->transform_coeffs[2][i]; + ctx->transform_coeffs[1][i] = tmp0 + tmp1; + ctx->transform_coeffs[2][i] = tmp0 - tmp1; + } + } } } @@ -766,7 +758,7 @@ { int nfchans = ctx->nfchans; int acmod = ctx->acmod; - int i, bnd, rbnd, seg, grpsize, ch; + int i, bnd, seg, grpsize, ch; GetBitContext *gb = &ctx->gb; int bit_alloc_flags = 0; int8_t *dexps; @@ -857,15 +849,11 @@ if (acmod == AC3_ACMOD_STEREO) {/* rematrixing */ ctx->rematstr = get_bits1(gb); if (ctx->rematstr) { - if (!(ctx->cplinu) || ctx->cplstrtmant > 61) - for (rbnd = 0; rbnd < 4; rbnd++) - ctx->rematflg[rbnd] = get_bits1(gb); - if (ctx->cplstrtmant > 37 && ctx->cplstrtmant <= 61 && ctx->cplinu) - for (rbnd = 0; rbnd < 3; rbnd++) - ctx->rematflg[rbnd] = get_bits1(gb); - if (ctx->cplstrtmant == 37 && ctx->cplinu) - for (rbnd = 0; rbnd < 2; rbnd++) - ctx->rematflg[rbnd] = get_bits1(gb); + ctx->nrematbnd = 4; + if(ctx->cplinu && ctx->cplstrtmant <= 61) + ctx->nrematbnd -= 1 + (ctx->cplstrtmant == 37); + for(bnd=0; bnd<ctx->nrematbnd; bnd++) + ctx->rematflg[bnd] = get_bits1(gb); } }