diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-18 19:33:04 -0700 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-24 19:02:26 -0700 |
commit | 3a3f06b05eee7c3e9da781864a510eda1ff587b8 (patch) | |
tree | 17f98e8387c21f48f0b873b528242cf90b6993d7 | |
parent | f31a68e78c129a1ed20c73c3a6a774aff8275930 (diff) | |
download | ffmpeg-3a3f06b05eee7c3e9da781864a510eda1ff587b8.tar.gz |
dpcm: convert to bytestream2.
-rw-r--r-- | libavcodec/dpcm.c | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c index 7f5dbfe3b9..2bd7978317 100644 --- a/libavcodec/dpcm.c +++ b/libavcodec/dpcm.c @@ -40,6 +40,7 @@ #include "libavutil/intreadwrite.h" #include "avcodec.h" #include "bytestream.h" +#include "mathops.h" typedef struct DPCMContext { AVFrame frame; @@ -173,20 +174,18 @@ static av_cold int dpcm_decode_init(AVCodecContext *avctx) static int dpcm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { - const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - const uint8_t *buf_end = buf + buf_size; DPCMContext *s = avctx->priv_data; int out = 0, ret; int predictor[2]; int ch = 0; int stereo = s->channels - 1; - int16_t *output_samples; + int16_t *output_samples, *samples_end; + GetByteContext gb; - if (stereo && (buf_size & 1)) { + if (stereo && (buf_size & 1)) buf_size--; - buf_end--; - } + bytestream2_init(&gb, avpkt->data, buf_size); /* calculate output size */ switch(avctx->codec->id) { @@ -218,22 +217,23 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, return ret; } output_samples = (int16_t *)s->frame.data[0]; + samples_end = output_samples + out; switch(avctx->codec->id) { case CODEC_ID_ROQ_DPCM: - buf += 6; + bytestream2_skipu(&gb, 6); if (stereo) { - predictor[1] = (int16_t)(bytestream_get_byte(&buf) << 8); - predictor[0] = (int16_t)(bytestream_get_byte(&buf) << 8); + predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16); + predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16); } else { - predictor[0] = (int16_t)bytestream_get_le16(&buf); + predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16); } /* decode the samples */ - while (buf < buf_end) { - predictor[ch] += s->roq_square_array[*buf++]; + while (output_samples < samples_end) { + predictor[ch] += s->roq_square_array[bytestream2_get_byteu(&gb)]; predictor[ch] = av_clip_int16(predictor[ch]); *output_samples++ = predictor[ch]; @@ -243,16 +243,16 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, break; case CODEC_ID_INTERPLAY_DPCM: - buf += 6; /* skip over the stream mask and stream length */ + bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */ for (ch = 0; ch < s->channels; ch++) { - predictor[ch] = (int16_t)bytestream_get_le16(&buf); + predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16); *output_samples++ = predictor[ch]; } ch = 0; - while (buf < buf_end) { - predictor[ch] += interplay_delta_table[*buf++]; + while (output_samples < samples_end) { + predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)]; predictor[ch] = av_clip_int16(predictor[ch]); *output_samples++ = predictor[ch]; @@ -266,16 +266,19 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, int shift[2] = { 4, 4 }; for (ch = 0; ch < s->channels; ch++) - predictor[ch] = (int16_t)bytestream_get_le16(&buf); + predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16); ch = 0; - while (buf < buf_end) { - uint8_t n = *buf++; - int16_t diff = (n & 0xFC) << 8; - if ((n & 0x03) == 3) + while (output_samples < samples_end) { + int diff = bytestream2_get_byteu(&gb); + int n = diff & 3; + + if (n == 3) shift[ch]++; else - shift[ch] -= (2 * (n & 3)); + shift[ch] -= (2 * n); + diff = sign_extend((diff &~ 3) << 8, 16); + /* saturate the shifter to a lower limit of 0 */ if (shift[ch] < 0) shift[ch] = 0; @@ -293,9 +296,10 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, } case CODEC_ID_SOL_DPCM: if (avctx->codec_tag != 3) { - uint8_t *output_samples_u8 = s->frame.data[0]; - while (buf < buf_end) { - uint8_t n = *buf++; + uint8_t *output_samples_u8 = s->frame.data[0], + *samples_end_u8 = output_samples_u8 + out; + while (output_samples_u8 < samples_end_u8) { + int n = bytestream2_get_byteu(&gb); s->sample[0] += s->sol_table[n >> 4]; s->sample[0] = av_clip_uint8(s->sample[0]); @@ -306,8 +310,8 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, *output_samples_u8++ = s->sample[stereo]; } } else { - while (buf < buf_end) { - uint8_t n = *buf++; + while (output_samples < samples_end) { + int n = bytestream2_get_byteu(&gb); if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F]; else s->sample[ch] += sol_table_16[n & 0x7F]; s->sample[ch] = av_clip_int16(s->sample[ch]); |