Commit 1744ab9e authored by Ronald S. Bultje's avatar Ronald S. Bultje

adpcm: convert adpcm_thp to bytestream2.

parent 72eda778
...@@ -410,8 +410,7 @@ static void adpcm_swf_decode(AVCodecContext *avctx, const uint8_t *buf, int buf_ ...@@ -410,8 +410,7 @@ static void adpcm_swf_decode(AVCodecContext *avctx, const uint8_t *buf, int buf_
* packet, or 0 if the codec does not encode the * packet, or 0 if the codec does not encode the
* number of samples in each frame. * number of samples in each frame.
*/ */
static int get_nb_samples(AVCodecContext *avctx, const uint8_t *buf, static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
GetByteContext *gb,
int buf_size, int *coded_samples) int buf_size, int *coded_samples)
{ {
ADPCMDecodeContext *s = avctx->priv_data; ADPCMDecodeContext *s = avctx->priv_data;
...@@ -549,9 +548,8 @@ static int get_nb_samples(AVCodecContext *avctx, const uint8_t *buf, ...@@ -549,9 +548,8 @@ static int get_nb_samples(AVCodecContext *avctx, const uint8_t *buf,
} }
case CODEC_ID_ADPCM_THP: case CODEC_ID_ADPCM_THP:
has_coded_samples = 1; has_coded_samples = 1;
if (buf_size < 8) bytestream2_skip(gb, 4); // channel size
return 0; *coded_samples = bytestream2_get_be32(gb);
*coded_samples = AV_RB32(&buf[4]);
*coded_samples -= *coded_samples % 14; *coded_samples -= *coded_samples % 14;
nb_samples = (buf_size - 80) / (8 * ch) * 14; nb_samples = (buf_size - 80) / (8 * ch) * 14;
break; break;
...@@ -576,14 +574,13 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, ...@@ -576,14 +574,13 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
ADPCMChannelStatus *cs; ADPCMChannelStatus *cs;
int n, m, channel, i; int n, m, channel, i;
short *samples; short *samples;
const uint8_t *src;
int st; /* stereo */ int st; /* stereo */
int count1, count2; int count1, count2;
int nb_samples, coded_samples, ret; int nb_samples, coded_samples, ret;
GetByteContext gb; GetByteContext gb;
bytestream2_init(&gb, buf, buf_size); bytestream2_init(&gb, buf, buf_size);
nb_samples = get_nb_samples(avctx, buf, &gb, buf_size, &coded_samples); nb_samples = get_nb_samples(avctx, &gb, buf_size, &coded_samples);
if (nb_samples <= 0) { if (nb_samples <= 0) {
av_log(avctx, AV_LOG_ERROR, "invalid number of samples in packet\n"); av_log(avctx, AV_LOG_ERROR, "invalid number of samples in packet\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -605,8 +602,6 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, ...@@ -605,8 +602,6 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
c->frame.nb_samples = nb_samples = coded_samples; c->frame.nb_samples = nb_samples = coded_samples;
} }
src = buf;
st = avctx->channels == 2 ? 1 : 0; st = avctx->channels == 2 ? 1 : 0;
switch(avctx->codec->id) { switch(avctx->codec->id) {
...@@ -1214,31 +1209,34 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, ...@@ -1214,31 +1209,34 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
int prev[2][2]; int prev[2][2];
int ch; int ch;
src += 4; // skip channel size
src += 4; // skip number of samples (already read)
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
table[0][i] = (int16_t)bytestream_get_be16(&src); table[0][i] = sign_extend(bytestream2_get_be16u(&gb), 16);
/* Initialize the previous sample. */ /* Initialize the previous sample. */
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
prev[0][i] = (int16_t)bytestream_get_be16(&src); prev[0][i] = sign_extend(bytestream2_get_be16u(&gb), 16);
for (ch = 0; ch <= st; ch++) { for (ch = 0; ch <= st; ch++) {
samples = (short *)c->frame.data[0] + ch; samples = (short *)c->frame.data[0] + ch;
/* Read in every sample for this channel. */ /* Read in every sample for this channel. */
for (i = 0; i < nb_samples / 14; i++) { for (i = 0; i < nb_samples / 14; i++) {
int index = (*src >> 4) & 7; int byte = bytestream2_get_byteu(&gb);
unsigned int exp = *src++ & 15; int index = (byte >> 4) & 7;
unsigned int exp = byte & 0x0F;
int factor1 = table[ch][index * 2]; int factor1 = table[ch][index * 2];
int factor2 = table[ch][index * 2 + 1]; int factor2 = table[ch][index * 2 + 1];
/* Decode 14 samples. */ /* Decode 14 samples. */
for (n = 0; n < 14; n++) { for (n = 0; n < 14; n++) {
int32_t sampledat; int32_t sampledat;
if(n&1) sampledat = sign_extend(*src++, 4);
else sampledat = sign_extend(*src >> 4, 4); if (n & 1) {
sampledat = sign_extend(byte, 4);
} else {
byte = bytestream2_get_byteu(&gb);
sampledat = sign_extend(byte >> 4, 4);
}
sampledat = ((prev[ch][0]*factor1 sampledat = ((prev[ch][0]*factor1
+ prev[ch][1]*factor2) >> 11) + (sampledat << exp); + prev[ch][1]*factor2) >> 11) + (sampledat << exp);
...@@ -1262,7 +1260,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, ...@@ -1262,7 +1260,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
*got_frame_ptr = 1; *got_frame_ptr = 1;
*(AVFrame *)data = c->frame; *(AVFrame *)data = c->frame;
return src == buf ? bytestream2_tell(&gb) : src - buf; return bytestream2_tell(&gb);
} }
......
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