summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/mace.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/libavcodec/mace.c b/libavcodec/mace.c
index be5f094aa7..79e9b30ef1 100644
--- a/libavcodec/mace.c
+++ b/libavcodec/mace.c
@@ -244,6 +244,20 @@ typedef struct MACEContext {
ChannelData chd[2];
} MACEContext;
+/**
+ * MACE version of av_clip_int16(). We have to do this to keep binary
+ * identical output to the binary decoder.
+ */
+static inline int16_t mace_broken_clip_int16(int n)
+{
+ if (n > 32767)
+ return 32767;
+ else if (n < -32768)
+ return -32767;
+ else
+ return n;
+}
+
static void chomp3(ChannelData *ctx, int16_t *output, uint8_t val,
const uint16_t tab1[],
const uint16_t tab2[][8], uint32_t numChannels)
@@ -252,12 +266,7 @@ static void chomp3(ChannelData *ctx, int16_t *output, uint8_t val,
current = (short) tab2[(ctx->index & 0x7f0) >> 4][val];
- if (current + ctx->lev > 32767)
- current = 32767;
- else if (current + ctx->lev < -32768)
- current = -32767;
- else
- current += ctx->lev;
+ current = mace_broken_clip_int16(current + ctx->lev);
ctx->lev = current - (current >> 3);
//*ctx->outPtr++=current >> 8;
@@ -286,12 +295,7 @@ static void chomp6(ChannelData *ctx, int16_t *output, uint8_t val,
ctx->factor -= 314;
}
- if (current + ctx->level > 32767)
- current = 32767;
- else if (current + ctx->level < -32768)
- current = -32767;
- else
- current += ctx->level;
+ current = mace_broken_clip_int16(current + ctx->level);
ctx->level = ((current*ctx->factor) >> 15);
current >>= 1;