Commit 4a876eba authored by Ronald S. Bultje's avatar Ronald S. Bultje

adpcm: convert adpcm_ea to bytestream2.

parent 524af484
...@@ -403,9 +403,7 @@ static int get_nb_samples(AVCodecContext *avctx, const uint8_t *buf, ...@@ -403,9 +403,7 @@ static int get_nb_samples(AVCodecContext *avctx, const uint8_t *buf,
switch (avctx->codec->id) { switch (avctx->codec->id) {
case CODEC_ID_ADPCM_EA: case CODEC_ID_ADPCM_EA:
has_coded_samples = 1; has_coded_samples = 1;
if (buf_size < 4) *coded_samples = bytestream2_get_le32(gb);
return 0;
*coded_samples = AV_RL32(buf);
*coded_samples -= *coded_samples % 28; *coded_samples -= *coded_samples % 28;
nb_samples = (buf_size - 12) / 30 * 28; nb_samples = (buf_size - 12) / 30 * 28;
break; break;
...@@ -868,37 +866,35 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, ...@@ -868,37 +866,35 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
break; break;
case CODEC_ID_ADPCM_EA: case CODEC_ID_ADPCM_EA:
{ {
int32_t previous_left_sample, previous_right_sample; int previous_left_sample, previous_right_sample;
int32_t current_left_sample, current_right_sample; int current_left_sample, current_right_sample;
int32_t next_left_sample, next_right_sample; int next_left_sample, next_right_sample;
int32_t coeff1l, coeff2l, coeff1r, coeff2r; int coeff1l, coeff2l, coeff1r, coeff2r;
uint8_t shift_left, shift_right; int shift_left, shift_right;
/* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces, /* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces,
each coding 28 stereo samples. */ each coding 28 stereo samples. */
src += 4; // skip sample count (already read) current_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
previous_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
current_left_sample = (int16_t)bytestream_get_le16(&src); current_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
previous_left_sample = (int16_t)bytestream_get_le16(&src); previous_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
current_right_sample = (int16_t)bytestream_get_le16(&src);
previous_right_sample = (int16_t)bytestream_get_le16(&src);
for (count1 = 0; count1 < nb_samples / 28; count1++) { for (count1 = 0; count1 < nb_samples / 28; count1++) {
coeff1l = ea_adpcm_table[ *src >> 4 ]; int byte = bytestream2_get_byteu(&gb);
coeff2l = ea_adpcm_table[(*src >> 4 ) + 4]; coeff1l = ea_adpcm_table[ byte >> 4 ];
coeff1r = ea_adpcm_table[*src & 0x0F]; coeff2l = ea_adpcm_table[(byte >> 4 ) + 4];
coeff2r = ea_adpcm_table[(*src & 0x0F) + 4]; coeff1r = ea_adpcm_table[ byte & 0x0F];
src++; coeff2r = ea_adpcm_table[(byte & 0x0F) + 4];
shift_left = 20 - (*src >> 4); byte = bytestream2_get_byteu(&gb);
shift_right = 20 - (*src & 0x0F); shift_left = 20 - (byte >> 4);
src++; shift_right = 20 - (byte & 0x0F);
for (count2 = 0; count2 < 28; count2++) { for (count2 = 0; count2 < 28; count2++) {
next_left_sample = sign_extend(*src >> 4, 4) << shift_left; byte = bytestream2_get_byteu(&gb);
next_right_sample = sign_extend(*src, 4) << shift_right; next_left_sample = sign_extend(byte >> 4, 4) << shift_left;
src++; next_right_sample = sign_extend(byte, 4) << shift_right;
next_left_sample = (next_left_sample + next_left_sample = (next_left_sample +
(current_left_sample * coeff1l) + (current_left_sample * coeff1l) +
...@@ -911,13 +907,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, ...@@ -911,13 +907,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
current_left_sample = av_clip_int16(next_left_sample); current_left_sample = av_clip_int16(next_left_sample);
previous_right_sample = current_right_sample; previous_right_sample = current_right_sample;
current_right_sample = av_clip_int16(next_right_sample); current_right_sample = av_clip_int16(next_right_sample);
*samples++ = (unsigned short)current_left_sample; *samples++ = current_left_sample;
*samples++ = (unsigned short)current_right_sample; *samples++ = current_right_sample;
} }
} }
if (src - buf == buf_size - 2) bytestream2_skip(&gb, 2); // Skip terminating 0x0000
src += 2; // Skip terminating 0x0000
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment