Commit ae9398ed authored by Laurent Aimar's avatar Laurent Aimar

* adpcm: added IMA4 support.

parent e6868a6a
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* adpcm.c : adpcm variant audio decoder * adpcm.c : adpcm variant audio decoder
***************************************************************************** *****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN * Copyright (C) 2001, 2002 VideoLAN
* $Id: adpcm.c,v 1.8 2003/02/16 11:18:11 fenrir Exp $ * $Id: adpcm.c,v 1.9 2003/03/11 06:58:49 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -78,10 +78,11 @@ static void DecodeThread ( adec_thread_t * ); ...@@ -78,10 +78,11 @@ static void DecodeThread ( adec_thread_t * );
static void EndThread ( adec_thread_t * ); static void EndThread ( adec_thread_t * );
static void DecodeAdpcmMs( adec_thread_t *, aout_buffer_t * ); static void DecodeAdpcmMs ( adec_thread_t *, aout_buffer_t * );
static void DecodeAdpcmImaWav( adec_thread_t *, aout_buffer_t * ); static void DecodeAdpcmImaWav ( adec_thread_t *, aout_buffer_t * );
static void DecodeAdpcmDk4( adec_thread_t *, aout_buffer_t * ); static void DecodeAdpcmImaQT ( adec_thread_t *, aout_buffer_t * );
static void DecodeAdpcmDk3( adec_thread_t *, aout_buffer_t * ); static void DecodeAdpcmDk4 ( adec_thread_t *, aout_buffer_t * );
static void DecodeAdpcmDk3 ( adec_thread_t *, aout_buffer_t * );
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
...@@ -154,7 +155,7 @@ static int OpenDecoder( vlc_object_t *p_this ) ...@@ -154,7 +155,7 @@ static int OpenDecoder( vlc_object_t *p_this )
switch( p_fifo->i_fourcc ) switch( p_fifo->i_fourcc )
{ {
// case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */ case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
case VLC_FOURCC('m','s',0x00,0x02): /* MS ADPCM */ case VLC_FOURCC('m','s',0x00,0x02): /* MS ADPCM */
case VLC_FOURCC('m','s',0x00,0x11): /* IMA ADPCM */ case VLC_FOURCC('m','s',0x00,0x11): /* IMA ADPCM */
case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */ case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */
...@@ -263,13 +264,13 @@ static int InitThread( adec_thread_t * p_adec ) ...@@ -263,13 +264,13 @@ static int InitThread( adec_thread_t * p_adec )
{ {
if( p_adec->i_codec == ADPCM_IMA_QT ) if( p_adec->i_codec == ADPCM_IMA_QT )
{ {
p_adec->i_block = 34; p_adec->i_block = 34 * p_adec->p_wf->nChannels;
} }
else else
{ {
p_adec->i_block = 1024; // XXX FIXME p_adec->i_block = 1024; // XXX FIXME
} }
msg_Err( p_adec->p_fifo, msg_Warn( p_adec->p_fifo,
"block size undefined, using %d default", "block size undefined, using %d default",
p_adec->i_block ); p_adec->i_block );
} }
...@@ -451,6 +452,7 @@ static void DecodeThread( adec_thread_t *p_adec ) ...@@ -451,6 +452,7 @@ static void DecodeThread( adec_thread_t *p_adec )
switch( p_adec->i_codec ) switch( p_adec->i_codec )
{ {
case ADPCM_IMA_QT: case ADPCM_IMA_QT:
DecodeAdpcmImaQT( p_adec, p_aout_buffer );
break; break;
case ADPCM_IMA_WAV: case ADPCM_IMA_WAV:
DecodeAdpcmImaWav( p_adec, p_aout_buffer ); DecodeAdpcmImaWav( p_adec, p_aout_buffer );
...@@ -715,6 +717,45 @@ static void DecodeAdpcmImaWav( adec_thread_t *p_adec, ...@@ -715,6 +717,45 @@ static void DecodeAdpcmImaWav( adec_thread_t *p_adec,
} }
} }
/*
* Ima4 in QT file
*/
static void DecodeAdpcmImaQT( adec_thread_t *p_adec,
aout_buffer_t *p_aout_buffer )
{
uint8_t *p_buffer;
adpcm_ima_wav_channel_t channel[2];
int i_nibbles;
uint16_t *p_sample;
int i_ch;
int i_step;
p_buffer = p_adec->p_block;
i_step = p_adec->p_wf->nChannels;
for( i_ch = 0; i_ch < p_adec->p_wf->nChannels; i_ch++ )
{
p_sample = ((int16_t*)p_aout_buffer->p_buffer) + i_ch;
/* load preambule */
channel[i_ch].i_predictor = ( p_buffer[0] << 1 ) ||( p_buffer[1] >> 7 );
channel[i_ch].i_step_index = p_buffer[1]&0x7f;
CLAMP( channel[i_ch].i_step_index, 0, 88 );
p_buffer += 2;
for( i_nibbles = 0; i_nibbles < 64; i_nibbles +=2 )
{
*p_sample = AdpcmImaWavExpandNibble( &channel[i_ch], (*p_buffer)&0x0f);
p_sample += i_step;
*p_sample = AdpcmImaWavExpandNibble( &channel[i_ch], (*p_buffer >> 4)&0x0f);
p_sample += i_step;
p_buffer++;
}
}
}
/* /*
* Dk4 * Dk4
*/ */
...@@ -841,4 +882,3 @@ static void DecodeAdpcmDk3( adec_thread_t *p_adec, ...@@ -841,4 +882,3 @@ static void DecodeAdpcmDk3( adec_thread_t *p_adec,
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment