+ case CODEC_ID_ADPCM_EA_MAXIS_XA:
+ for(channel = 0; channel < avctx->channels; channel++) {
+ for (i=0; i<2; i++)
+ coeff[channel][i] = ea_adpcm_table[(*src >> 4) + 4*i];
+ shift[channel] = (*src & 0x0F) + 8;
+ src++;
+ }
+ for (count1 = 0; count1 < (buf_size - avctx->channels) / avctx->channels; count1++) {
+ for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
+ for(channel = 0; channel < avctx->channels; channel++) {
+ int32_t sample = (int32_t)(((*(src+channel) >> i) & 0x0F) << 0x1C) >> shift[channel];
+ sample = (sample +
+ c->status[channel].sample1 * coeff[channel][0] +
+ c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
+ c->status[channel].sample2 = c->status[channel].sample1;
+ c->status[channel].sample1 = av_clip_int16(sample);
+ *samples++ = c->status[channel].sample1;
+ }
+ }
+ src+=avctx->channels;
+ }
+ break;
+ case CODEC_ID_ADPCM_EA_R1:
+ case CODEC_ID_ADPCM_EA_R2:
+ case CODEC_ID_ADPCM_EA_R3: {
+ /* channel numbering
+ 2chan: 0=fl, 1=fr
+ 4chan: 0=fl, 1=rl, 2=fr, 3=rr
+ 6chan: 0=fl, 1=c, 2=fr, 3=rl, 4=rr, 5=sub */
+ const int big_endian = avctx->codec->id == CODEC_ID_ADPCM_EA_R3;
+ int32_t previous_sample, current_sample, next_sample;
+ int32_t coeff1, coeff2;
+ uint8_t shift;
+ unsigned int channel;
+ uint16_t *samplesC;
+ const uint8_t *srcC;
+
+ samples_in_chunk = (big_endian ? bytestream_get_be32(&src)
+ : bytestream_get_le32(&src)) / 28;
+ if (samples_in_chunk > UINT32_MAX/(28*avctx->channels) ||
+ 28*samples_in_chunk*avctx->channels > samples_end-samples) {
+ src += buf_size - 4;
+ break;
+ }
+
+ for (channel=0; channel<avctx->channels; channel++) {
+ srcC = src + (big_endian ? bytestream_get_be32(&src)
+ : bytestream_get_le32(&src))
+ + (avctx->channels-channel-1) * 4;
+ samplesC = samples + channel;
+
+ if (avctx->codec->id == CODEC_ID_ADPCM_EA_R1) {
+ current_sample = (int16_t)bytestream_get_le16(&srcC);
+ previous_sample = (int16_t)bytestream_get_le16(&srcC);
+ } else {
+ current_sample = c->status[channel].predictor;
+ previous_sample = c->status[channel].prev_sample;
+ }
+
+ for (count1=0; count1<samples_in_chunk; count1++) {
+ if (*srcC == 0xEE) { /* only seen in R2 and R3 */
+ srcC++;
+ current_sample = (int16_t)bytestream_get_be16(&srcC);
+ previous_sample = (int16_t)bytestream_get_be16(&srcC);
+
+ for (count2=0; count2<28; count2++) {
+ *samplesC = (int16_t)bytestream_get_be16(&srcC);
+ samplesC += avctx->channels;
+ }
+ } else {
+ coeff1 = ea_adpcm_table[ *srcC>>4 ];
+ coeff2 = ea_adpcm_table[(*srcC>>4) + 4];
+ shift = (*srcC++ & 0x0F) + 8;
+
+ for (count2=0; count2<28; count2++) {
+ if (count2 & 1)
+ next_sample = (int32_t)((*srcC++ & 0x0F) << 28) >> shift;
+ else
+ next_sample = (int32_t)((*srcC & 0xF0) << 24) >> shift;
+
+ next_sample += (current_sample * coeff1) +
+ (previous_sample * coeff2);
+ next_sample = av_clip_int16(next_sample >> 8);
+
+ previous_sample = current_sample;
+ current_sample = next_sample;
+ *samplesC = current_sample;
+ samplesC += avctx->channels;
+ }
+ }
+ }
+
+ if (avctx->codec->id != CODEC_ID_ADPCM_EA_R1) {
+ c->status[channel].predictor = current_sample;
+ c->status[channel].prev_sample = previous_sample;
+ }
+ }
+
+ src = src + buf_size - (4 + 4*avctx->channels);
+ samples += 28 * samples_in_chunk * avctx->channels;
+ break;
+ }
+ case CODEC_ID_ADPCM_EA_XAS:
+ if (samples_end-samples < 32*4*avctx->channels
+ || buf_size < (4+15)*4*avctx->channels) {
+ src += buf_size;
+ break;
+ }
+ for (channel=0; channel<avctx->channels; channel++) {
+ int coeff[2][4], shift[4];
+ short *s2, *s = &samples[channel];
+ for (n=0; n<4; n++, s+=32*avctx->channels) {
+ for (i=0; i<2; i++)
+ coeff[i][n] = ea_adpcm_table[(src[0]&0x0F)+4*i];
+ shift[n] = (src[2]&0x0F) + 8;
+ for (s2=s, i=0; i<2; i++, src+=2, s2+=avctx->channels)
+ s2[0] = (src[0]&0xF0) + (src[1]<<8);
+ }
+
+ for (m=2; m<32; m+=2) {
+ s = &samples[m*avctx->channels + channel];
+ for (n=0; n<4; n++, src++, s+=32*avctx->channels) {
+ for (s2=s, i=0; i<8; i+=4, s2+=avctx->channels) {
+ int level = (int32_t)((*src & (0xF0>>i)) << (24+i)) >> shift[n];
+ int pred = s2[-1*avctx->channels] * coeff[0][n]
+ + s2[-2*avctx->channels] * coeff[1][n];
+ s2[0] = av_clip_int16((level + pred + 0x80) >> 8);
+ }
+ }
+ }
+ }
+ samples += 32*4*avctx->channels;
+ break;
+ case CODEC_ID_ADPCM_IMA_AMV: