On 03/18/2012 01:15 PM, Ronald S. Bultje wrote:
> ---
> libavcodec/adpcm.c | 53 +++++++++++++++++++++++----------------------------
> 1 files changed, 24 insertions(+), 29 deletions(-)
>
> diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> index e0e9923..b49b490 100644
> --- a/libavcodec/adpcm.c
> +++ b/libavcodec/adpcm.c
> @@ -403,9 +403,7 @@ static int get_nb_samples(AVCodecContext *avctx, const
> uint8_t *buf,
> switch (avctx->codec->id) {
> case CODEC_ID_ADPCM_EA:
> has_coded_samples = 1;
> - if (buf_size < 4)
> - return 0;
> - *coded_samples = AV_RL32(buf);
> + *coded_samples = bytestream2_get_le32(gb);
> *coded_samples -= *coded_samples % 28;
> nb_samples = (buf_size - 12) / 30 * 28;
> break;
> @@ -867,37 +865,35 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
> void *data,
> break;
> case CODEC_ID_ADPCM_EA:
> {
> - int32_t previous_left_sample, previous_right_sample;
> - int32_t current_left_sample, current_right_sample;
> - int32_t next_left_sample, next_right_sample;
> - int32_t coeff1l, coeff2l, coeff1r, coeff2r;
> - uint8_t shift_left, shift_right;
> + int previous_left_sample, previous_right_sample;
> + int current_left_sample, current_right_sample;
> + int next_left_sample, next_right_sample;
> + int coeff1l, coeff2l, coeff1r, coeff2r;
> + int shift_left, shift_right;
>
> /* Each EA ADPCM frame has a 12-byte header followed by 30-byte
> pieces,
> each coding 28 stereo samples. */
>
> - src += 4; // skip sample count (already read)
> -
> - current_left_sample = (int16_t)bytestream_get_le16(&src);
> - previous_left_sample = (int16_t)bytestream_get_le16(&src);
> - current_right_sample = (int16_t)bytestream_get_le16(&src);
> - previous_right_sample = (int16_t)bytestream_get_le16(&src);
> + current_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
> + previous_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
> + current_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
> + previous_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
>
> for (count1 = 0; count1 < nb_samples / 28; count1++) {
> - coeff1l = ea_adpcm_table[ *src >> 4 ];
> - coeff2l = ea_adpcm_table[(*src >> 4 ) + 4];
> - coeff1r = ea_adpcm_table[*src & 0x0F];
> - coeff2r = ea_adpcm_table[(*src & 0x0F) + 4];
> - src++;
> + int byte = bytestream2_get_byteu(&gb);
> + coeff1l = ea_adpcm_table[ byte >> 4 ];
> + coeff2l = ea_adpcm_table[(byte >> 4 ) + 4];
> + coeff1r = ea_adpcm_table[ byte & 0x0F];
> + coeff2r = ea_adpcm_table[(byte & 0x0F) + 4];
>
> - shift_left = 20 - (*src >> 4);
> - shift_right = 20 - (*src & 0x0F);
> - src++;
> + byte = bytestream2_get_byteu(&gb);
> + shift_left = 20 - (byte >> 4);
> + shift_right = 20 - (byte & 0x0F);
>
> for (count2 = 0; count2 < 28; count2++) {
> - next_left_sample = sign_extend(*src >> 4, 4) << shift_left;
> - next_right_sample = sign_extend(*src, 4) << shift_right;
> - src++;
> + 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 = (next_left_sample +
> (current_left_sample * coeff1l) +
> @@ -910,13 +906,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
> void *data,
> current_left_sample = av_clip_int16(next_left_sample);
> previous_right_sample = current_right_sample;
> current_right_sample = av_clip_int16(next_right_sample);
> - *samples++ = (unsigned short)current_left_sample;
> - *samples++ = (unsigned short)current_right_sample;
> + *samples++ = current_left_sample;
> + *samples++ = current_right_sample;
> }
> }
>
> - if (src - buf == buf_size - 2)
> - src += 2; // Skip terminating 0x0000
> + bytestream2_skip(&gb, 2); // Skip terminating 0x0000
>
> break;
> }
LGTM
-Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel