comparison adpcm.c @ 5851:dea3ac1d4c67 libavcodec

EA ADPCM R1, R2 and R3 decoder original patch by Peter Ross
author aurel
date Wed, 24 Oct 2007 20:49:42 +0000
parents 94b29c56556b
children 286738ef0a4e
comparison
equal deleted inserted replaced
5850:da358b2602ce 5851:dea3ac1d4c67
28 * First version by Francois Revol (revol@free.fr) 28 * First version by Francois Revol (revol@free.fr)
29 * Fringe ADPCM codecs (e.g., DK3, DK4, Westwood) 29 * Fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
30 * by Mike Melanson (melanson@pcisys.net) 30 * by Mike Melanson (melanson@pcisys.net)
31 * CD-ROM XA ADPCM codec by BERO 31 * CD-ROM XA ADPCM codec by BERO
32 * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com) 32 * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com)
33 * EA ADPCM R1/R2/R3 decoder by Peter Ross (pross@xvid.org)
33 * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl) 34 * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl)
34 * 35 *
35 * Features and limitations: 36 * Features and limitations:
36 * 37 *
37 * Reference documents: 38 * Reference documents:
142 int idelta; 143 int idelta;
143 } ADPCMChannelStatus; 144 } ADPCMChannelStatus;
144 145
145 typedef struct ADPCMContext { 146 typedef struct ADPCMContext {
146 int channel; /* for stereo MOVs, decode left, then decode right, then tell it's decoded */ 147 int channel; /* for stereo MOVs, decode left, then decode right, then tell it's decoded */
147 ADPCMChannelStatus status[2]; 148 ADPCMChannelStatus status[6];
148 } ADPCMContext; 149 } ADPCMContext;
149 150
150 /* XXX: implement encoding */ 151 /* XXX: implement encoding */
151 152
152 #ifdef CONFIG_ENCODERS 153 #ifdef CONFIG_ENCODERS
633 #endif //CONFIG_ENCODERS 634 #endif //CONFIG_ENCODERS
634 635
635 static int adpcm_decode_init(AVCodecContext * avctx) 636 static int adpcm_decode_init(AVCodecContext * avctx)
636 { 637 {
637 ADPCMContext *c = avctx->priv_data; 638 ADPCMContext *c = avctx->priv_data;
638 639 unsigned int max_channels = 2;
639 if(avctx->channels > 2U){ 640
641 switch(avctx->codec->id) {
642 case CODEC_ID_ADPCM_EA_R1:
643 case CODEC_ID_ADPCM_EA_R2:
644 case CODEC_ID_ADPCM_EA_R3:
645 max_channels = 6;
646 break;
647 }
648 if(avctx->channels > max_channels){
640 return -1; 649 return -1;
641 } 650 }
642 651
643 switch(avctx->codec->id) { 652 switch(avctx->codec->id) {
644 case CODEC_ID_ADPCM_CT: 653 case CODEC_ID_ADPCM_CT:
1174 *samples++ = (unsigned short)current_left_sample; 1183 *samples++ = (unsigned short)current_left_sample;
1175 *samples++ = (unsigned short)current_right_sample; 1184 *samples++ = (unsigned short)current_right_sample;
1176 } 1185 }
1177 } 1186 }
1178 break; 1187 break;
1188 case CODEC_ID_ADPCM_EA_R1:
1189 case CODEC_ID_ADPCM_EA_R2:
1190 case CODEC_ID_ADPCM_EA_R3: {
1191 /* channel numbering
1192 2chan: 0=fl, 1=fr
1193 4chan: 0=fl, 1=rl, 2=fr, 3=rr
1194 6chan: 0=fl, 1=c, 2=fr, 3=rl, 4=rr, 5=sub */
1195 const int big_endian = avctx->codec->id == CODEC_ID_ADPCM_EA_R3;
1196 int32_t previous_sample, current_sample, next_sample;
1197 int32_t coeff1, coeff2;
1198 uint8_t shift;
1199 unsigned int channel;
1200 uint16_t *samplesC;
1201 uint8_t *srcC;
1202
1203 samples_in_chunk = (big_endian ? bytestream_get_be32(&src)
1204 : bytestream_get_le32(&src)) / 28;
1205 if (samples_in_chunk > UINT32_MAX/(28*avctx->channels) ||
1206 28*samples_in_chunk*avctx->channels > samples_end-samples) {
1207 src += buf_size - 4;
1208 break;
1209 }
1210
1211 for (channel=0; channel<avctx->channels; channel++) {
1212 srcC = src + (big_endian ? bytestream_get_be32(&src)
1213 : bytestream_get_le32(&src))
1214 + (avctx->channels-channel-1) * 4;
1215 samplesC = samples + channel;
1216
1217 if (avctx->codec->id == CODEC_ID_ADPCM_EA_R1) {
1218 current_sample = (int16_t)bytestream_get_le16(&srcC);
1219 previous_sample = (int16_t)bytestream_get_le16(&srcC);
1220 } else {
1221 current_sample = c->status[channel].predictor;
1222 previous_sample = c->status[channel].prev_sample;
1223 }
1224
1225 for (count1=0; count1<samples_in_chunk; count1++) {
1226 if (*srcC == 0xEE) { /* only seen in R2 and R3 */
1227 srcC++;
1228 current_sample = (int16_t)bytestream_get_be16(&srcC);
1229 previous_sample = (int16_t)bytestream_get_be16(&srcC);
1230
1231 for (count2=0; count2<28; count2++) {
1232 *samplesC = (int16_t)bytestream_get_be16(&srcC);
1233 samplesC += avctx->channels;
1234 }
1235 } else {
1236 coeff1 = ea_adpcm_table[ (*srcC>>4) & 0x0F ];
1237 coeff2 = ea_adpcm_table[((*srcC>>4) & 0x0F) + 4];
1238 shift = (*srcC++ & 0x0F) + 8;
1239
1240 for (count2=0; count2<28; count2++) {
1241 if (count2 & 1)
1242 next_sample = ((*srcC++ & 0x0F) << 28) >> shift;
1243 else
1244 next_sample = ((*srcC & 0xF0) << 24) >> shift;
1245
1246 next_sample += (current_sample * coeff1) +
1247 (previous_sample * coeff2);
1248 next_sample = av_clip_int16(next_sample >> 8);
1249
1250 previous_sample = current_sample;
1251 current_sample = next_sample;
1252 *samplesC = current_sample;
1253 samplesC += avctx->channels;
1254 }
1255 }
1256 }
1257
1258 if (avctx->codec->id != CODEC_ID_ADPCM_EA_R1) {
1259 c->status[channel].predictor = current_sample;
1260 c->status[channel].prev_sample = previous_sample;
1261 }
1262 }
1263
1264 src = src + buf_size - (4 + 4*avctx->channels);
1265 samples += 28 * samples_in_chunk * avctx->channels;
1266 break;
1267 }
1179 case CODEC_ID_ADPCM_IMA_AMV: 1268 case CODEC_ID_ADPCM_IMA_AMV:
1180 case CODEC_ID_ADPCM_IMA_SMJPEG: 1269 case CODEC_ID_ADPCM_IMA_SMJPEG:
1181 c->status[0].predictor = (int16_t)bytestream_get_le16(&src); 1270 c->status[0].predictor = (int16_t)bytestream_get_le16(&src);
1182 c->status[0].step_index = bytestream_get_le16(&src); 1271 c->status[0].step_index = bytestream_get_le16(&src);
1183 1272
1449 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_QT, adpcm_ima_qt); 1538 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_QT, adpcm_ima_qt);
1450 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_SMJPEG, adpcm_ima_smjpeg); 1539 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_SMJPEG, adpcm_ima_smjpeg);
1451 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav); 1540 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav);
1452 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WS, adpcm_ima_ws); 1541 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WS, adpcm_ima_ws);
1453 ADPCM_CODEC(CODEC_ID_ADPCM_MS, adpcm_ms); 1542 ADPCM_CODEC(CODEC_ID_ADPCM_MS, adpcm_ms);
1543 ADPCM_CODEC(CODEC_ID_ADPCM_EA_R1, adpcm_ea_r1);
1544 ADPCM_CODEC(CODEC_ID_ADPCM_EA_R2, adpcm_ea_r2);
1545 ADPCM_CODEC(CODEC_ID_ADPCM_EA_R3, adpcm_ea_r3);
1454 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_4, adpcm_sbpro_4); 1546 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_4, adpcm_sbpro_4);
1455 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_3, adpcm_sbpro_3); 1547 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_3, adpcm_sbpro_3);
1456 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_2, adpcm_sbpro_2); 1548 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_2, adpcm_sbpro_2);
1457 ADPCM_CODEC(CODEC_ID_ADPCM_SWF, adpcm_swf); 1549 ADPCM_CODEC(CODEC_ID_ADPCM_SWF, adpcm_swf);
1458 ADPCM_CODEC(CODEC_ID_ADPCM_THP, adpcm_thp); 1550 ADPCM_CODEC(CODEC_ID_ADPCM_THP, adpcm_thp);