[FFmpeg-devel] [PATCH v2 04/15] avcodec/adpcm: Fix undefined left shifts of negative numbers
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Sat Sep 28 05:25:59 EEST 2019
Affected the adpcm-afc, adpcm-dtk, adpcm-ea-1, adpcm-ea-2, adpcm-ima-oki,
adpcm-ea-maxis-xa, adpcm-ea-r1, adpcm-ea-r2, adpcm-ea-r3 and adpcm-thp
FATE-tests.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
libavcodec/adpcm.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 7f2ebfc99d..a0c5b6a42a 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -342,7 +342,7 @@ static inline int16_t adpcm_ima_oki_expand_nibble(ADPCMChannelStatus *c, int nib
c->predictor = av_clip_intp2(predictor, 11);
c->step_index = step_index;
- return c->predictor << 4;
+ return c->predictor * (1 << 4);
}
static inline int16_t adpcm_ct_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
@@ -1279,8 +1279,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
for (count2 = 0; count2 < 28; count2++) {
byte = bytestream2_get_byteu(&gb);
- next_left_sample = sign_extend(byte >> 4, 4) << shift_left;
- next_right_sample = sign_extend(byte, 4) << shift_right;
+ next_left_sample = sign_extend(byte >> 4, 4) * (1 << shift_left);
+ next_right_sample = sign_extend(byte, 4) * (1 << shift_right);
next_left_sample = (next_left_sample +
(current_left_sample * coeff1l) +
@@ -1319,7 +1319,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
if (st) byte[1] = bytestream2_get_byteu(&gb);
for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
for(channel = 0; channel < avctx->channels; channel++) {
- int sample = sign_extend(byte[channel] >> i, 4) << shift[channel];
+ int sample = sign_extend(byte[channel] >> i, 4) * (1 << shift[channel]);
sample = (sample +
c->status[channel].sample1 * coeff[channel][0] +
c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
@@ -1380,11 +1380,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
for (count2=0; count2<28; count2++) {
if (count2 & 1)
- next_sample = sign_extend(byte, 4) << shift;
+ next_sample = sign_extend(byte, 4);
else {
byte = bytestream2_get_byte(&gb);
- next_sample = sign_extend(byte >> 4, 4) << shift;
+ next_sample = sign_extend(byte >> 4, 4);
}
+ next_sample *= 1 << shift;
next_sample += (current_sample * coeff1) +
(previous_sample * coeff2);
@@ -1595,8 +1596,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
sampledat = sign_extend(byte >> 4, 4);
}
- sampledat = ((prev1 * factor1 + prev2 * factor2) +
- ((sampledat * scale) << 11)) >> 11;
+ sampledat = ((prev1 * factor1 + prev2 * factor2) >> 11) +
+ sampledat * scale;
*samples = av_clip_int16(sampledat);
prev2 = prev1;
prev1 = *samples++;
@@ -1673,7 +1674,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
}
sampledat = ((c->status[ch].sample1 * factor1
- + c->status[ch].sample2 * factor2) >> 11) + (sampledat << exp);
+ + c->status[ch].sample2 * factor2) >> 11) + sampledat * (1 << exp);
*samples = av_clip_int16(sampledat);
c->status[ch].sample2 = c->status[ch].sample1;
c->status[ch].sample1 = *samples++;
@@ -1720,7 +1721,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
else
sampledat = sign_extend(byte >> 4, 4);
- sampledat = (((sampledat << 12) >> (header & 0xf)) << 6) + prev;
+ sampledat = ((sampledat * (1 << 12)) >> (header & 0xf)) * (1 << 6) + prev;
*samples++ = av_clip_int16(sampledat >> 6);
c->status[channel].sample2 = c->status[channel].sample1;
c->status[channel].sample1 = sampledat;
--
2.20.1
More information about the ffmpeg-devel
mailing list