+ *p_sample++ =AdpcmImaWavExpandNibble( &channel[0], (*p_buffer)&0x0f );
+ *p_sample++ =AdpcmImaWavExpandNibble( &channel[0], (*p_buffer) >> 4 );
+ }
+ }
+}
+
+/*
+ * Ima4 in QT file
+ */
+static void DecodeAdpcmImaQT( decoder_t *p_dec, int16_t *p_sample,
+ uint8_t *p_buffer )
+{
+ adpcm_ima_wav_channel_t channel[2];
+ int i_nibbles;
+ int i_ch;
+ int i_step;
+
+ i_step = p_dec->fmt_in.audio.i_channels;
+
+ for( i_ch = 0; i_ch < p_dec->fmt_in.audio.i_channels; i_ch++ )
+ {
+ /* load preambule */
+ channel[i_ch].i_predictor = (int16_t)((( ( p_buffer[0] << 1 )|( p_buffer[1] >> 7 ) ))<<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++;
+ }
+
+ /* Next channel */
+ p_sample += 1 - 64 * i_step;
+ }
+}
+
+/*
+ * Dk4
+ */
+static void DecodeAdpcmDk4( decoder_t *p_dec, int16_t *p_sample,
+ uint8_t *p_buffer )
+{
+ decoder_sys_t *p_sys = p_dec->p_sys;
+ adpcm_ima_wav_channel_t channel[2];
+ int i_nibbles;
+ int b_stereo;
+
+ b_stereo = p_dec->fmt_in.audio.i_channels == 2 ? 1 : 0;
+
+ GetWord( channel[0].i_predictor );
+ GetByte( channel[0].i_step_index );
+ CLAMP( channel[0].i_step_index, 0, 88 );
+ p_buffer++;
+
+ if( b_stereo )
+ {
+ GetWord( channel[1].i_predictor );
+ GetByte( channel[1].i_step_index );
+ CLAMP( channel[1].i_step_index, 0, 88 );
+ p_buffer++;
+ }
+
+ /* first output predictor */
+ *p_sample++ = channel[0].i_predictor;
+ if( b_stereo )
+ {
+ *p_sample++ = channel[1].i_predictor;
+ }
+
+ for( i_nibbles = 0;
+ i_nibbles < p_sys->i_block - 4 * (b_stereo ? 2:1 );
+ i_nibbles++ )
+ {
+ *p_sample++ = AdpcmImaWavExpandNibble( &channel[0],
+ (*p_buffer) >> 4);
+ *p_sample++ = AdpcmImaWavExpandNibble( &channel[b_stereo ? 1 : 0],
+ (*p_buffer)&0x0f);
+
+ p_buffer++;
+ }
+}
+
+/*
+ * Dk3
+ */
+static void DecodeAdpcmDk3( decoder_t *p_dec, int16_t *p_sample,
+ uint8_t *p_buffer )
+{
+ decoder_sys_t *p_sys = p_dec->p_sys;
+ uint8_t *p_end = &p_buffer[p_sys->i_block];
+ adpcm_ima_wav_channel_t sum;
+ adpcm_ima_wav_channel_t diff;
+ int i_diff_value;
+
+ p_buffer += 10;
+
+ GetWord( sum.i_predictor );
+ GetWord( diff.i_predictor );
+ GetByte( sum.i_step_index );
+ GetByte( diff.i_step_index );
+
+ i_diff_value = diff.i_predictor;
+ /* we process 6 nibbles at once */
+ while( p_buffer + 1 <= p_end )
+ {
+ /* first 3 nibbles */
+ AdpcmImaWavExpandNibble( &sum,
+ (*p_buffer)&0x0f);
+
+ AdpcmImaWavExpandNibble( &diff,
+ (*p_buffer) >> 4 );
+
+ i_diff_value = ( i_diff_value + diff.i_predictor ) / 2;
+
+ *p_sample++ = sum.i_predictor + i_diff_value;
+ *p_sample++ = sum.i_predictor - i_diff_value;
+
+ p_buffer++;
+
+ AdpcmImaWavExpandNibble( &sum,
+ (*p_buffer)&0x0f);
+
+ *p_sample++ = sum.i_predictor + i_diff_value;
+ *p_sample++ = sum.i_predictor - i_diff_value;
+
+ /* now last 3 nibbles */
+ AdpcmImaWavExpandNibble( &sum,
+ (*p_buffer)>>4);
+ p_buffer++;
+ if( p_buffer < p_end )
+ {
+ AdpcmImaWavExpandNibble( &diff,
+ (*p_buffer)&0x0f );
+
+ i_diff_value = ( i_diff_value + diff.i_predictor ) / 2;
+
+ *p_sample++ = sum.i_predictor + i_diff_value;
+ *p_sample++ = sum.i_predictor - i_diff_value;
+
+ AdpcmImaWavExpandNibble( &sum,
+ (*p_buffer)>>4);
+ p_buffer++;
+
+ *p_sample++ = sum.i_predictor + i_diff_value;
+ *p_sample++ = sum.i_predictor - i_diff_value;