| @@ -169,6 +169,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| int in, out = 0; | |||
| int predictor[2]; | |||
| int ch = 0; | |||
| int stereo = s->channels - 1; | |||
| short *output_samples = data; | |||
| int shift[2]; | |||
| unsigned char byte; | |||
| @@ -184,11 +185,11 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| switch(avctx->codec->id) { | |||
| case CODEC_ID_ROQ_DPCM: | |||
| if (s->channels == 1) | |||
| predictor[0] = AV_RL16(&buf[6]); | |||
| else { | |||
| if (stereo) { | |||
| predictor[0] = buf[7] << 8; | |||
| predictor[1] = buf[6] << 8; | |||
| } else { | |||
| predictor[0] = AV_RL16(&buf[6]); | |||
| } | |||
| SE_16BIT(predictor[0]); | |||
| SE_16BIT(predictor[1]); | |||
| @@ -200,7 +201,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| output_samples[out] = predictor[ch]; | |||
| /* toggle channel */ | |||
| ch ^= s->channels - 1; | |||
| ch ^= stereo; | |||
| } | |||
| break; | |||
| @@ -210,7 +211,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| in += 2; | |||
| SE_16BIT(predictor[0]) | |||
| output_samples[out++] = predictor[0]; | |||
| if (s->channels == 2) { | |||
| if (stereo) { | |||
| predictor[1] = AV_RL16(&buf[in]); | |||
| in += 2; | |||
| SE_16BIT(predictor[1]) | |||
| @@ -223,7 +224,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| output_samples[out++] = predictor[ch]; | |||
| /* toggle channel */ | |||
| ch ^= s->channels - 1; | |||
| ch ^= stereo; | |||
| } | |||
| break; | |||
| @@ -234,7 +235,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| predictor[0] = AV_RL16(&buf[in]); | |||
| in += 2; | |||
| SE_16BIT(predictor[0]); | |||
| if (s->channels == 2) { | |||
| if (stereo) { | |||
| predictor[1] = AV_RL16(&buf[in]); | |||
| in += 2; | |||
| SE_16BIT(predictor[1]); | |||
| @@ -258,7 +259,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| output_samples[out++] = predictor[ch]; | |||
| /* toggle channel */ | |||
| ch ^= s->channels - 1; | |||
| ch ^= stereo; | |||
| } | |||
| break; | |||
| case CODEC_ID_SOL_DPCM: | |||
| @@ -271,13 +272,13 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| n1 = (buf[in] >> 4) & 0xF; | |||
| n2 = buf[in++] & 0xF; | |||
| s->sample[0] += s->sol_table[n1]; | |||
| if (s->sample[0] < 0) s->sample[0] = 0; | |||
| if (s->sample[0] < 0) s->sample[0] = 0; | |||
| if (s->sample[0] > 255) s->sample[0] = 255; | |||
| output_samples[out++] = (s->sample[0] - 128) << 8; | |||
| s->sample[s->channels - 1] += s->sol_table[n2]; | |||
| if (s->sample[s->channels - 1] < 0) s->sample[s->channels - 1] = 0; | |||
| if (s->sample[s->channels - 1] > 255) s->sample[s->channels - 1] = 255; | |||
| output_samples[out++] = (s->sample[s->channels - 1] - 128) << 8; | |||
| s->sample[stereo] += s->sol_table[n2]; | |||
| if (s->sample[stereo] < 0) s->sample[stereo] = 0; | |||
| if (s->sample[stereo] > 255) s->sample[stereo] = 255; | |||
| output_samples[out++] = (s->sample[stereo] - 128) << 8; | |||
| } | |||
| } else { | |||
| while (in < buf_size) { | |||
| @@ -288,7 +289,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, | |||
| s->sample[ch] = av_clip_int16(s->sample[ch]); | |||
| output_samples[out++] = s->sample[ch]; | |||
| /* toggle channel */ | |||
| ch ^= s->channels - 1; | |||
| ch ^= stereo; | |||
| } | |||
| } | |||
| break; | |||