summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2007-07-29 00:58:32 +0000
committerJustin Ruggles <justin.ruggles@gmail.com>2007-07-29 00:58:32 +0000
commit8b60bbbf5ba8f479152570b6de13e20fffd9d890 (patch)
treeb031d19eeb9057ffcbfac746e6749404bafa3f4f /libavcodec
parentb6acc57f8832b2ed4ec556febf8089a0951e729c (diff)
simplify stereo rematrixing
Originally committed as revision 9824 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/ac3dec.c70
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);
}
}