Mercurial > libavcodec.hg
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); |