diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-17 12:45:09 -0700 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-18 15:25:25 -0700 |
commit | 9604307dd89745071611e6e2898a78460bb61fcb (patch) | |
tree | 8d562287e490f189b437aa008565248c852d3561 /libavcodec/adpcm.c | |
parent | c346f6304c35e9dfffacc6c71a2b3dfd8913d90b (diff) | |
download | ffmpeg-9604307dd89745071611e6e2898a78460bb61fcb.tar.gz |
adpcm: convert adpcm_ima_qt to bytestream2.
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r-- | libavcodec/adpcm.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 3610a58812..1f61c56d80 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -544,6 +544,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, int st; /* stereo */ int count1, count2; int nb_samples, coded_samples, ret; + GetByteContext gb; nb_samples = get_nb_samples(avctx, buf, buf_size, &coded_samples); if (nb_samples <= 0) { @@ -568,6 +569,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, } src = buf; + bytestream2_init(&gb, buf, buf_size); st = avctx->channels == 2 ? 1 : 0; @@ -576,20 +578,18 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, /* In QuickTime, IMA is encoded by chunks of 34 bytes (=64 samples). Channel data is interleaved per-chunk. */ for (channel = 0; channel < avctx->channels; channel++) { - int16_t predictor; + int predictor; int step_index; cs = &(c->status[channel]); /* (pppppp) (piiiiiii) */ /* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */ - predictor = AV_RB16(src); + predictor = sign_extend(bytestream2_get_be16u(&gb), 16); step_index = predictor & 0x7F; - predictor &= 0xFF80; - - src += 2; + predictor &= ~0x7F; if (cs->step_index == step_index) { - int diff = (int)predictor - cs->predictor; + int diff = predictor - cs->predictor; if (diff < 0) diff = - diff; if (diff > 0x7f) @@ -600,19 +600,20 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, cs->predictor = predictor; } - if (cs->step_index > 88){ - av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index); - cs->step_index = 88; + if (cs->step_index > 88u){ + av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n", + channel, cs->step_index); + return AVERROR_INVALIDDATA; } samples = (short *)c->frame.data[0] + channel; for (m = 0; m < 32; m++) { - *samples = adpcm_ima_qt_expand_nibble(cs, src[0] & 0x0F, 3); + int byte = bytestream2_get_byteu(&gb); + *samples = adpcm_ima_qt_expand_nibble(cs, byte & 0x0F, 3); samples += avctx->channels; - *samples = adpcm_ima_qt_expand_nibble(cs, src[0] >> 4 , 3); + *samples = adpcm_ima_qt_expand_nibble(cs, byte >> 4 , 3); samples += avctx->channels; - src ++; } } break; @@ -1239,7 +1240,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, *got_frame_ptr = 1; *(AVFrame *)data = c->frame; - return src - buf; + return src == buf ? bytestream2_tell(&gb) : src - buf; } |