|
|
|
@ -168,7 +168,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, |
|
|
|
|
DPCMContext *s = avctx->priv_data; |
|
|
|
|
int in, out = 0; |
|
|
|
|
int predictor[2]; |
|
|
|
|
int channel_number = 0; |
|
|
|
|
int ch = 0; |
|
|
|
|
short *output_samples = data; |
|
|
|
|
int shift[2]; |
|
|
|
|
unsigned char byte; |
|
|
|
@ -195,12 +195,12 @@ static int dpcm_decode_frame(AVCodecContext *avctx, |
|
|
|
|
|
|
|
|
|
/* decode the samples */ |
|
|
|
|
for (in = 8, out = 0; in < buf_size; in++, out++) { |
|
|
|
|
predictor[channel_number] += s->roq_square_array[buf[in]]; |
|
|
|
|
predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
|
|
|
|
output_samples[out] = predictor[channel_number]; |
|
|
|
|
predictor[ch] += s->roq_square_array[buf[in]]; |
|
|
|
|
predictor[ch] = av_clip_int16(predictor[ch]); |
|
|
|
|
output_samples[out] = predictor[ch]; |
|
|
|
|
|
|
|
|
|
/* toggle channel */ |
|
|
|
|
channel_number ^= s->channels - 1; |
|
|
|
|
ch ^= s->channels - 1; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
@ -218,12 +218,12 @@ static int dpcm_decode_frame(AVCodecContext *avctx, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (in < buf_size) { |
|
|
|
|
predictor[channel_number] += interplay_delta_table[buf[in++]]; |
|
|
|
|
predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
|
|
|
|
output_samples[out++] = predictor[channel_number]; |
|
|
|
|
predictor[ch] += interplay_delta_table[buf[in++]]; |
|
|
|
|
predictor[ch] = av_clip_int16(predictor[ch]); |
|
|
|
|
output_samples[out++] = predictor[ch]; |
|
|
|
|
|
|
|
|
|
/* toggle channel */ |
|
|
|
|
channel_number ^= s->channels - 1; |
|
|
|
|
ch ^= s->channels - 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
@ -244,21 +244,21 @@ static int dpcm_decode_frame(AVCodecContext *avctx, |
|
|
|
|
byte = buf[in++]; |
|
|
|
|
diff = (byte & 0xFC) << 8; |
|
|
|
|
if ((byte & 0x03) == 3) |
|
|
|
|
shift[channel_number]++; |
|
|
|
|
shift[ch]++; |
|
|
|
|
else |
|
|
|
|
shift[channel_number] -= (2 * (byte & 3)); |
|
|
|
|
shift[ch] -= (2 * (byte & 3)); |
|
|
|
|
/* saturate the shifter to a lower limit of 0 */ |
|
|
|
|
if (shift[channel_number] < 0) |
|
|
|
|
shift[channel_number] = 0; |
|
|
|
|
if (shift[ch] < 0) |
|
|
|
|
shift[ch] = 0; |
|
|
|
|
|
|
|
|
|
diff >>= shift[channel_number]; |
|
|
|
|
predictor[channel_number] += diff; |
|
|
|
|
diff >>= shift[ch]; |
|
|
|
|
predictor[ch] += diff; |
|
|
|
|
|
|
|
|
|
predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
|
|
|
|
output_samples[out++] = predictor[channel_number]; |
|
|
|
|
predictor[ch] = av_clip_int16(predictor[ch]); |
|
|
|
|
output_samples[out++] = predictor[ch]; |
|
|
|
|
|
|
|
|
|
/* toggle channel */ |
|
|
|
|
channel_number ^= s->channels - 1; |
|
|
|
|
ch ^= s->channels - 1; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case CODEC_ID_SOL_DPCM: |
|
|
|
@ -283,12 +283,12 @@ static int dpcm_decode_frame(AVCodecContext *avctx, |
|
|
|
|
while (in < buf_size) { |
|
|
|
|
int n; |
|
|
|
|
n = buf[in++]; |
|
|
|
|
if (n & 0x80) s->sample[channel_number] -= s->sol_table[n & 0x7F]; |
|
|
|
|
else s->sample[channel_number] += s->sol_table[n & 0x7F]; |
|
|
|
|
s->sample[channel_number] = av_clip_int16(s->sample[channel_number]); |
|
|
|
|
output_samples[out++] = s->sample[channel_number]; |
|
|
|
|
if (n & 0x80) s->sample[ch] -= s->sol_table[n & 0x7F]; |
|
|
|
|
else s->sample[ch] += s->sol_table[n & 0x7F]; |
|
|
|
|
s->sample[ch] = av_clip_int16(s->sample[ch]); |
|
|
|
|
output_samples[out++] = s->sample[ch]; |
|
|
|
|
/* toggle channel */ |
|
|
|
|
channel_number ^= s->channels - 1; |
|
|
|
|
ch ^= s->channels - 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|