[英]ADPCM decoding in C
當我嘗試將IMA ADPCM解碼為16位有符號PCM時,我有半耗盡的PCM
我嘗試在WAV文件中解碼和編碼IMA ADPCM(22050個樣本/秒,4位/樣本,36(!)字節(?)對齊(?!),1個通道)。
int16_t decodeImaAdpcmSampleUIS(struct AdpcmState* state, const uint8_t sample){
int diff;
int8_t si=state->stepindex;
int step=i_step_table[si];
int cur=state->current;
diff=step>>3;
if( sample&0x04 ) diff += step;
if( sample&0x02 ) diff += step>>1;
if( sample&0x01 ) diff += step>>2;
if( sample&0x08 ){
cur -= diff;
if(cur<-32768)
cur=-32768;
}else{
cur += diff;
if(cur>32767)
cur=32767;
}
//predictor: cur, state.current
//step_index: si, stepindex
si+=ima_index_table[sample&0b111];
if(si < 0)
si = 0;
if(si > 88)
si = 88;
state->stepindex=si;
return state->current=cur;
}
void decodeImaAdpcm(uint8_t* src, int16_t* dst, size_t srcLen){
struct AdpcmState state={0,0};
for(size_t i=0; i<srcLen; i++){
*(dst++)=decodeImaAdpcmSampleUIS(&state, (*src)&0xf);
*(dst++)=decodeImaAdpcmSampleUIS(&state, (*src)>>4);
src++;
}
}
包含WAV文件的完整項目: https : //drive.google.com/open?id = 1xuxwXj3Y_QhPDWhrQY7nmz8ycBE1cgyL
轉換為PCM WAV的ADPCM WAV文件包含一些垃圾,但ffmpeg正常轉換它。 PCM WAV到ADPCM WAV轉換目前尚未實現。
發生這種情況是因為WAV 不支持PLAIN IMA ADPCM。 每個前4個字節的塊都是ADPCM狀態。
例如:WAV.align = 36; //塊大小為36字節,塊結構為 - |當前(16位)|步驟索引(16字節)|數據(WAV.align-4(36-4 = 32)字節)| -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.