From dca9f42cdf577f6ca0b2abde6680e495d2a3373a Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sun, 21 Dec 2008 23:49:02 +0000 Subject: Fix decoding of stereo frames with silence in only one channel. * Make the standalone decoder contain debugging information. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19552 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/demac/libdemac/decoder.c | 21 +++++++++++++-------- apps/codecs/demac/libdemac/entropy.c | 7 +++++-- apps/codecs/demac/libdemac/parser.h | 4 +++- 3 files changed, 21 insertions(+), 11 deletions(-) (limited to 'apps/codecs/demac/libdemac') diff --git a/apps/codecs/demac/libdemac/decoder.c b/apps/codecs/demac/libdemac/decoder.c index 2200faf187..0763c11037 100644 --- a/apps/codecs/demac/libdemac/decoder.c +++ b/apps/codecs/demac/libdemac/decoder.c @@ -89,14 +89,17 @@ int ICODE_ATTR_DEMAC decode_chunk(struct ape_ctx_t* ape_ctx, #else #define SCALE(x) (x) #endif + + if ((ape_ctx->channels==1) || ((ape_ctx->frameflags + & (APE_FRAMECODE_PSEUDO_STEREO|APE_FRAMECODE_STEREO_SILENCE)) + == APE_FRAMECODE_PSEUDO_STEREO)) { - if ((ape_ctx->channels==1) || (ape_ctx->frameflags & APE_FRAMECODE_PSEUDO_STEREO)) { - if (ape_ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) { - entropy_decode(ape_ctx, inbuffer, firstbyte, bytesconsumed, decoded0, decoded1, count); + entropy_decode(ape_ctx, inbuffer, firstbyte, bytesconsumed, + decoded0, NULL, count); + + if (ape_ctx->frameflags & APE_FRAMECODE_MONO_SILENCE) { /* We are pure silence, so we're done. */ return 0; - } else { - entropy_decode(ape_ctx, inbuffer, firstbyte, bytesconsumed, decoded0, NULL, count); } switch (ape_ctx->compressiontype) @@ -142,12 +145,14 @@ int ICODE_ATTR_DEMAC decode_chunk(struct ape_ctx_t* ape_ctx, } #endif } else { /* Stereo */ - if (ape_ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) { + entropy_decode(ape_ctx, inbuffer, firstbyte, bytesconsumed, + decoded0, decoded1, count); + + if ((ape_ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) + == APE_FRAMECODE_STEREO_SILENCE) { /* We are pure silence, so we're done. */ return 0; } - - entropy_decode(ape_ctx, inbuffer, firstbyte, bytesconsumed, decoded0, decoded1, count); /* Apply filters - compression type 1000 doesn't have any */ switch (ape_ctx->compressiontype) diff --git a/apps/codecs/demac/libdemac/entropy.c b/apps/codecs/demac/libdemac/entropy.c index 54b5cc57b6..24f5932de6 100644 --- a/apps/codecs/demac/libdemac/entropy.c +++ b/apps/codecs/demac/libdemac/entropy.c @@ -430,10 +430,13 @@ void ICODE_ATTR_DEMAC entropy_decode(struct ape_ctx_t* ape_ctx, ape_ctx->blocksdecoded += blockstodecode; - if (ape_ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) { + if ((ape_ctx->frameflags & APE_FRAMECODE_LEFT_SILENCE) + && ((ape_ctx->frameflags & APE_FRAMECODE_RIGHT_SILENCE) + || (decoded1 == NULL))) { /* We are pure silence, just memset the output buffer. */ memset(decoded0, 0, blockstodecode * sizeof(int32_t)); - memset(decoded1, 0, blockstodecode * sizeof(int32_t)); + if (decoded1 != NULL) + memset(decoded1, 0, blockstodecode * sizeof(int32_t)); } else { if (ape_ctx->fileversion > 3970) { while (LIKELY(blockstodecode--)) { diff --git a/apps/codecs/demac/libdemac/parser.h b/apps/codecs/demac/libdemac/parser.h index 53157f7681..6f07deac12 100644 --- a/apps/codecs/demac/libdemac/parser.h +++ b/apps/codecs/demac/libdemac/parser.h @@ -50,7 +50,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA */ #define APE_FRAMECODE_MONO_SILENCE 1 -#define APE_FRAMECODE_STEREO_SILENCE 3 +#define APE_FRAMECODE_LEFT_SILENCE 1 /* same as mono */ +#define APE_FRAMECODE_RIGHT_SILENCE 2 +#define APE_FRAMECODE_STEREO_SILENCE 3 /* combined */ #define APE_FRAMECODE_PSEUDO_STEREO 4 #define PREDICTOR_ORDER 8 -- cgit v1.2.3