# HG changeset patch # User vitor # Date 1220780577 0 # Node ID 8c32b5606f830e71ac800c3b93768462bd88f5e1 # Parent b90764c4f31ae379c4e06378f1cc7c9b581e4134 Do not share context variables between channels and do not zero them at decode_frame(). This makes the output much closer to that of the binary decoder. diff -r b90764c4f31a -r 8c32b5606f83 mace.c --- a/mace.c Sun Sep 07 09:38:37 2008 +0000 +++ b/mace.c Sun Sep 07 09:42:57 2008 +0000 @@ -234,11 +234,15 @@ { 0x3E22, 0x7FFF, 0x8000, 0xC1DD, 0, 0, 0, 0 }, { 0x40E7, 0x7FFF, 0x8000, 0xBF18, 0, 0, 0, 0 }, }; +typedef struct ChannelData { + short index, lev, factor, prev2, previous, level; +} ChannelData; + typedef struct MACEContext { - short index, lev, factor, prev2, previous, level; + ChannelData chd[2]; } MACEContext; -static void chomp3(MACEContext *ctx, int16_t *output, uint8_t val, +static void chomp3(ChannelData *ctx, int16_t *output, uint8_t val, const uint16_t tab1[], const uint16_t tab2[][8], uint32_t numChannels) { @@ -260,7 +264,7 @@ ctx->index = 0; } -static void chomp6(MACEContext *ctx, int16_t *output, uint8_t val, +static void chomp6(ChannelData *ctx, int16_t *output, uint8_t val, const uint16_t tab1[], const uint16_t tab2[][8], uint32_t numChannels) { @@ -319,16 +323,15 @@ for(i = 0; i < avctx->channels; i++) { int16_t *output = samples + i; - ctx->index = ctx->lev = 0; for (j=0; j < buf_size / 2 / avctx->channels; j++) for (k=0; k < 2; k++) { uint8_t pkt = buf[i*2 + j*2*avctx->channels + k]; - chomp3(ctx, output, pkt &7, MACEtab1, MACEtab2, avctx->channels); + chomp3(&ctx->chd[i], output, pkt &7, MACEtab1, MACEtab2, avctx->channels); output += avctx->channels; - chomp3(ctx, output,(pkt >> 3) &3, MACEtab3, MACEtab4, avctx->channels); + chomp3(&ctx->chd[i], output,(pkt >> 3) &3, MACEtab3, MACEtab4, avctx->channels); output += avctx->channels; - chomp3(ctx, output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels); + chomp3(&ctx->chd[i], output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels); output += avctx->channels; } } @@ -348,16 +351,15 @@ for(i = 0; i < avctx->channels; i++) { int16_t *output = samples + i; - ctx->previous = ctx->prev2 = ctx->index = ctx->level = ctx->factor = 0; for (j = 0; j < buf_size / avctx->channels; j++) { uint8_t pkt = buf[i + j*avctx->channels]; - chomp6(ctx, output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels); + chomp6(&ctx->chd[i], output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels); output += avctx->channels << 1; - chomp6(ctx, output,(pkt >> 3) & 3, MACEtab3, MACEtab4, avctx->channels); + chomp6(&ctx->chd[i], output,(pkt >> 3) & 3, MACEtab3, MACEtab4, avctx->channels); output += avctx->channels << 1; - chomp6(ctx, output, pkt & 7, MACEtab1, MACEtab2, avctx->channels); + chomp6(&ctx->chd[i], output, pkt & 7, MACEtab1, MACEtab2, avctx->channels); output += avctx->channels << 1; } }