adx: use 12-bit coefficients instead of 14-bit to avoid integer overflow

pull/2/head
Justin Ruggles 13 years ago
parent c52ddc6024
commit 954d94dd5e
  1. 6
      libavcodec/adx.h
  2. 2
      libavcodec/adxdec.c
  3. 2
      libavcodec/adxenc.c

@ -43,8 +43,8 @@ typedef struct {
int in_temp; int in_temp;
} ADXContext; } ADXContext;
#define BASEVOL 0x4000 #define COEFF_BITS 12
#define SCALE1 0x7298 #define COEFF1 0x1CA6
#define SCALE2 0x3350 #define COEFF2 0x0CD4
#endif /* AVCODEC_ADX_H */ #endif /* AVCODEC_ADX_H */

@ -59,7 +59,7 @@ static void adx_decode(ADXContext *c, int16_t *out, const uint8_t *in, int ch)
s2 = prev->s2; s2 = prev->s2;
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
d = get_sbits(&gb, 4); d = get_sbits(&gb, 4);
s0 = (BASEVOL * d * scale + SCALE1 * s1 - SCALE2 * s2) >> 14; s0 = ((d << COEFF_BITS) * scale + COEFF1 * s1 - COEFF2 * s2) >> COEFF_BITS;
s2 = s1; s2 = s1;
s1 = av_clip_int16(s0); s1 = av_clip_int16(s0);
*out = s1; *out = s1;

@ -48,7 +48,7 @@ static void adx_encode(unsigned char *adx,const short *wav,
s2 = prev->s2; s2 = prev->s2;
for(i=0;i<32;i++) { for(i=0;i<32;i++) {
s0 = wav[i]; s0 = wav[i];
d = ((s0<<14) - SCALE1*s1 + SCALE2*s2)/BASEVOL; d = ((s0 << COEFF_BITS) - COEFF1 * s1 + COEFF2 * s2) >> COEFF_BITS;
data[i]=d; data[i]=d;
if (max<d) max=d; if (max<d) max=d;
if (min>d) min=d; if (min>d) min=d;

Loading…
Cancel
Save