ADPCM декодирование на С - PullRequest
       56

ADPCM декодирование на С

0 голосов
/ 31 марта 2019

Когда я пытаюсь декодировать IMA ADPCM в 16-битную подписанную PCM, у меня наполовину одета PCM

Я пытаюсь декодировать и кодировать ADACM IMA в файле WAV (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

ADPCM WAV-файлы, преобразованные в PCM WAV, содержат некоторый мусор, но ffmpeg конвертирует его в обычном режиме. Преобразование WAV из PCM WAV в ADPCM в настоящее время не реализовано.

1 Ответ

0 голосов
/ 05 апреля 2019

Это происходит потому, что WAV НЕ содержит PLAIN IMA ADPCM. Каждые первые 4 байта блока находятся в состоянии ADPCM.

Например: WAV.align = 36; // Размер блока 36 байт, структура блока - | текущий (16 бит) | индекс шага (16 байт) | данные (WAV.align-4 (36-4) = 32 (байт) | -

...