diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2007-07-29 00:58:32 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2007-07-29 00:58:32 +0000 |
commit | 8b60bbbf5ba8f479152570b6de13e20fffd9d890 (patch) | |
tree | b031d19eeb9057ffcbfac746e6749404bafa3f4f /libavcodec | |
parent | b6acc57f8832b2ed4ec556febf8089a0951e729c (diff) | |
download | ffmpeg-8b60bbbf5ba8f479152570b6de13e20fffd9d890.tar.gz |
simplify stereo rematrixing
Originally committed as revision 9824 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/ac3dec.c | 70 |
1 files changed, 29 insertions, 41 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index d2b9f9748a..9d72c5abf5 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -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 @@ typedef struct { int cplcoe; uint32_t cplbndstrc; int rematstr; + int nrematbnd; int rematflg[AC3_MAX_CHANNELS]; int cplexpstr; int lfeexpstr; @@ -648,43 +655,28 @@ static int get_transform_coeffs(AC3DecodeContext * ctx) 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 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) { 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 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) 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); } } |