| @@ -139,6 +139,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) | |||
| case AV_CODEC_ID_ADPCM_IMA_QT: | |||
| case AV_CODEC_ID_ADPCM_IMA_WAV: | |||
| case AV_CODEC_ID_ADPCM_4XM: | |||
| case AV_CODEC_ID_ADPCM_XA: | |||
| avctx->sample_fmt = AV_SAMPLE_FMT_S16P; | |||
| break; | |||
| case AV_CODEC_ID_ADPCM_IMA_WS: | |||
| @@ -277,17 +278,22 @@ static inline short adpcm_yamaha_expand_nibble(ADPCMChannelStatus *c, unsigned c | |||
| return c->predictor; | |||
| } | |||
| static int xa_decode(AVCodecContext *avctx, | |||
| short *out, const unsigned char *in, | |||
| ADPCMChannelStatus *left, ADPCMChannelStatus *right, int inc) | |||
| static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1, | |||
| const uint8_t *in, ADPCMChannelStatus *left, | |||
| ADPCMChannelStatus *right, int channels, int sample_offset) | |||
| { | |||
| int i, j; | |||
| int shift,filter,f0,f1; | |||
| int s_1,s_2; | |||
| int d,s,t; | |||
| for(i=0;i<4;i++) { | |||
| out0 += sample_offset; | |||
| if (channels == 1) | |||
| out1 = out0 + 28; | |||
| else | |||
| out1 += sample_offset; | |||
| for(i=0;i<4;i++) { | |||
| shift = 12 - (in[4+i*2] & 15); | |||
| filter = in[4+i*2] >> 4; | |||
| if (filter > 4) { | |||
| @@ -309,16 +315,14 @@ static int xa_decode(AVCodecContext *avctx, | |||
| s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6); | |||
| s_2 = s_1; | |||
| s_1 = av_clip_int16(s); | |||
| *out = s_1; | |||
| out += inc; | |||
| out0[j] = s_1; | |||
| } | |||
| if (inc==2) { /* stereo */ | |||
| if (channels == 2) { | |||
| left->sample1 = s_1; | |||
| left->sample2 = s_2; | |||
| s_1 = right->sample1; | |||
| s_2 = right->sample2; | |||
| out = out + 1 - 28*2; | |||
| } | |||
| shift = 12 - (in[5+i*2] & 15); | |||
| @@ -339,18 +343,19 @@ static int xa_decode(AVCodecContext *avctx, | |||
| s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6); | |||
| s_2 = s_1; | |||
| s_1 = av_clip_int16(s); | |||
| *out = s_1; | |||
| out += inc; | |||
| out1[j] = s_1; | |||
| } | |||
| if (inc==2) { /* stereo */ | |||
| if (channels == 2) { | |||
| right->sample1 = s_1; | |||
| right->sample2 = s_2; | |||
| out -= 1; | |||
| } else { | |||
| left->sample1 = s_1; | |||
| left->sample2 = s_2; | |||
| } | |||
| out0 += 28 * (3 - channels); | |||
| out1 += 28 * (3 - channels); | |||
| } | |||
| return 0; | |||
| @@ -887,14 +892,21 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | |||
| bytestream2_seek(&gb, 0, SEEK_END); | |||
| break; | |||
| case AV_CODEC_ID_ADPCM_XA: | |||
| { | |||
| int16_t *out0 = samples_p[0]; | |||
| int16_t *out1 = samples_p[1]; | |||
| int samples_per_block = 28 * (3 - avctx->channels) * 4; | |||
| int sample_offset = 0; | |||
| while (bytestream2_get_bytes_left(&gb) >= 128) { | |||
| if ((ret = xa_decode(avctx, samples, buf + bytestream2_tell(&gb), &c->status[0], | |||
| &c->status[1], avctx->channels)) < 0) | |||
| if ((ret = xa_decode(avctx, out0, out1, buf + bytestream2_tell(&gb), | |||
| &c->status[0], &c->status[1], | |||
| avctx->channels, sample_offset)) < 0) | |||
| return ret; | |||
| bytestream2_skipu(&gb, 128); | |||
| samples += 28 * 8; | |||
| sample_offset += samples_per_block; | |||
| } | |||
| break; | |||
| } | |||
| case AV_CODEC_ID_ADPCM_IMA_EA_EACS: | |||
| for (i=0; i<=st; i++) { | |||
| c->status[i].step_index = bytestream2_get_le32u(&gb); | |||
| @@ -1318,5 +1330,5 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_3, sample_fmts_s16, adpcm_sbpro_3, | |||
| ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_4, sample_fmts_s16, adpcm_sbpro_4, "ADPCM Sound Blaster Pro 4-bit"); | |||
| ADPCM_DECODER(AV_CODEC_ID_ADPCM_SWF, sample_fmts_s16, adpcm_swf, "ADPCM Shockwave Flash"); | |||
| ADPCM_DECODER(AV_CODEC_ID_ADPCM_THP, sample_fmts_s16, adpcm_thp, "ADPCM Nintendo Gamecube THP"); | |||
| ADPCM_DECODER(AV_CODEC_ID_ADPCM_XA, sample_fmts_s16, adpcm_xa, "ADPCM CDROM XA"); | |||
| ADPCM_DECODER(AV_CODEC_ID_ADPCM_XA, sample_fmts_s16p, adpcm_xa, "ADPCM CDROM XA"); | |||
| ADPCM_DECODER(AV_CODEC_ID_ADPCM_YAMAHA, sample_fmts_s16, adpcm_yamaha, "ADPCM Yamaha"); | |||