1 /*****************************************************************************
2 * adpcm.c : adpcm variant audio decoder
3 *****************************************************************************
4 * Copyright (C) 2001, 2002 VideoLAN
5 * $Id: adpcm.c,v 1.12 2003/08/17 23:02:51 fenrir Exp $
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 /*****************************************************************************
27 * Documentation: http://www.pcisys.net/~melanson/codecs/adpcm.txt
28 *****************************************************************************/
31 #include <vlc/decoder.h>
32 #include <vlc/input.h>
34 #include <stdlib.h> /* malloc(), free() */
35 #include <string.h> /* strdup() */
37 /*****************************************************************************
39 *****************************************************************************/
41 #define ADPCM_IMA_QT 1
42 #define ADPCM_IMA_WAV 2
47 typedef struct adec_thread_s
55 int i_samplesperblock;
57 uint8_t *p_buffer; /* buffer for gather pes */ \
58 int i_buffer; /* bytes present in p_buffer */
60 /* Input properties */
61 decoder_fifo_t *p_fifo;
63 /* Output properties */
64 aout_instance_t * p_aout; /* opaque */
65 aout_input_t * p_aout_input; /* opaque */
66 audio_sample_format_t output_format;
73 static int OpenDecoder ( vlc_object_t * );
75 static int RunDecoder ( decoder_fifo_t * );
76 static int InitThread ( adec_thread_t * );
77 static void DecodeThread ( adec_thread_t * );
78 static void EndThread ( adec_thread_t * );
81 static void DecodeAdpcmMs ( adec_thread_t *, aout_buffer_t * );
82 static void DecodeAdpcmImaWav ( adec_thread_t *, aout_buffer_t * );
83 static void DecodeAdpcmImaQT ( adec_thread_t *, aout_buffer_t * );
84 static void DecodeAdpcmDk4 ( adec_thread_t *, aout_buffer_t * );
85 static void DecodeAdpcmDk3 ( adec_thread_t *, aout_buffer_t * );
87 /*****************************************************************************
89 *****************************************************************************/
92 set_description( _("ADPCM audio decoder") );
93 set_capability( "decoder", 50 );
94 set_callbacks( OpenDecoder, NULL );
98 static int pi_channels_maps[6] =
102 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
103 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER,
104 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT,
105 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
106 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT
109 /* Various table from http://www.pcisys.net/~melanson/codecs/adpcm.txt */
110 static int i_index_table[16] =
112 -1, -1, -1, -1, 2, 4, 6, 8,
113 -1, -1, -1, -1, 2, 4, 6, 8
116 static int i_step_table[89] =
118 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
119 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
120 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
121 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
122 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
123 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
124 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
125 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
126 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
129 static int i_adaptation_table[16] =
131 230, 230, 230, 230, 307, 409, 512, 614,
132 768, 614, 512, 409, 307, 230, 230, 230
135 static int i_adaptation_coeff1[7] =
137 256, 512, 0, 192, 240, 460, 392
140 static int i_adaptation_coeff2[7] =
142 0, -256, 0, 64, 0, -208, -232
146 /*****************************************************************************
147 * OpenDecoder: probe the decoder and return score
148 *****************************************************************************
149 * Tries to launch a decoder and return score so that the interface is able
151 *****************************************************************************/
152 static int OpenDecoder( vlc_object_t *p_this )
154 decoder_fifo_t *p_fifo = (decoder_fifo_t*) p_this;
156 switch( p_fifo->i_fourcc )
158 case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
159 case VLC_FOURCC('m','s',0x00,0x02): /* MS ADPCM */
160 case VLC_FOURCC('m','s',0x00,0x11): /* IMA ADPCM */
161 case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */
162 case VLC_FOURCC('m','s',0x00,0x62): /* Duck DK3 ADPCM */
164 p_fifo->pf_run = RunDecoder;
173 /*****************************************************************************
174 * RunDecoder: this function is called just after the thread is created
175 *****************************************************************************/
176 static int RunDecoder( decoder_fifo_t *p_fifo )
178 adec_thread_t *p_adec;
181 if( !( p_adec = malloc( sizeof( adec_thread_t ) ) ) )
183 msg_Err( p_fifo, "out of memory" );
184 DecoderError( p_fifo );
187 memset( p_adec, 0, sizeof( adec_thread_t ) );
189 p_adec->p_fifo = p_fifo;
191 if( InitThread( p_adec ) != 0 )
193 DecoderError( p_fifo );
197 while( ( !p_adec->p_fifo->b_die )&&( !p_adec->p_fifo->b_error ) )
199 DecodeThread( p_adec );
203 if( ( b_error = p_adec->p_fifo->b_error ) )
205 DecoderError( p_adec->p_fifo );
218 #define FREE( p ) if( p ) free( p ); p = NULL
220 /*****************************************************************************
221 * InitThread: initialize data before entering main loop
222 *****************************************************************************/
224 static int InitThread( adec_thread_t * p_adec )
226 if( ( p_adec->p_wf = (WAVEFORMATEX*)p_adec->p_fifo->p_waveformatex ) == NULL )
228 msg_Err( p_adec->p_fifo, "missing format" );
231 /* fourcc to codec */
232 switch( p_adec->p_fifo->i_fourcc )
234 case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
235 p_adec->i_codec = ADPCM_IMA_QT;
237 case VLC_FOURCC('m','s',0x00,0x11): /* IMA ADPCM */
238 p_adec->i_codec = ADPCM_IMA_WAV;
240 case VLC_FOURCC('m','s',0x00,0x02): /* MS ADPCM */
241 p_adec->i_codec = ADPCM_MS;
243 case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */
244 p_adec->i_codec = ADPCM_DK4;
246 case VLC_FOURCC('m','s',0x00,0x62): /* Duck DK3 ADPCM */
247 p_adec->i_codec = ADPCM_DK3;
251 if( p_adec->p_wf->nChannels < 1 ||
252 p_adec->p_wf->nChannels > 2 )
254 msg_Err( p_adec->p_fifo, "bad channels count(1-2)" );
257 if( !( p_adec->i_block = p_adec->p_wf->nBlockAlign ) )
259 if( p_adec->i_codec == ADPCM_IMA_QT )
261 p_adec->i_block = 34 * p_adec->p_wf->nChannels;
265 p_adec->i_block = 1024; // XXX FIXME
267 msg_Warn( p_adec->p_fifo,
268 "block size undefined, using %d default",
271 p_adec->p_block = NULL;
273 /* calculate samples per block */
274 switch( p_adec->i_codec )
277 p_adec->i_samplesperblock = 64;
280 p_adec->i_samplesperblock =
281 2 * ( p_adec->i_block - 4 * p_adec->p_wf->nChannels )/
282 p_adec->p_wf->nChannels;
285 p_adec->i_samplesperblock =
286 2 * ( p_adec->i_block - 7 * p_adec->p_wf->nChannels ) /
287 p_adec->p_wf->nChannels + 2;
290 p_adec->i_samplesperblock =
291 2 * ( p_adec->i_block - 4 * p_adec->p_wf->nChannels ) /
292 p_adec->p_wf->nChannels + 1;
295 p_adec->p_wf->nChannels = 2;
296 p_adec->i_samplesperblock = ( 4 * ( p_adec->i_block - 16 ) + 2 )/ 3;
299 msg_Err( p_adec->p_fifo, "unknown adpcm variant" );
303 msg_Dbg( p_adec->p_fifo,
304 "format: samplerate:%dHz channels:%d bits/sample:%d blockalign:%d samplesperblock %d",
305 p_adec->p_wf->nSamplesPerSec,
306 p_adec->p_wf->nChannels,
307 p_adec->p_wf->wBitsPerSample,
308 p_adec->p_wf->nBlockAlign,
309 p_adec->i_samplesperblock );
311 //p_adec->output_format.i_format = VLC_FOURCC('s','1','6','l');
312 /* FIXME good way ? */
313 p_adec->output_format.i_format = AOUT_FMT_S16_NE;
314 p_adec->output_format.i_rate = p_adec->p_wf->nSamplesPerSec;
317 p_adec->output_format.i_physical_channels =
318 p_adec->output_format.i_original_channels =
319 pi_channels_maps[p_adec->p_wf->nChannels];
320 p_adec->p_aout = NULL;
321 p_adec->p_aout_input = NULL;
323 /* **** Create a new audio output **** */
324 aout_DateInit( &p_adec->date, p_adec->output_format.i_rate );
325 p_adec->p_aout_input = aout_DecNew( p_adec->p_fifo,
327 &p_adec->output_format );
328 if( !p_adec->p_aout_input )
330 msg_Err( p_adec->p_fifo, "cannot create aout" );
334 /* Init the BitStream */
335 // InitBitstream( &p_adec->bit_stream, p_adec->p_fifo,
342 static void GetPESData( uint8_t *p_buf, int i_max, pes_packet_t *p_pes )
347 data_packet_t *p_data;
350 p_data = p_pes->p_first;
351 while( p_data != NULL && i_count < i_max )
354 i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
360 p_data->p_payload_start,
364 p_data = p_data->p_next;
369 if( i_count < i_max )
371 memset( p_buf, 0, i_max - i_count );
375 /*****************************************************************************
376 * DecodeThread: decodes a frame
377 *****************************************************************************/
378 static void DecodeThread( adec_thread_t *p_adec )
380 aout_buffer_t *p_aout_buffer;
385 /* **** Get a new frames from streams **** */
388 input_ExtractPES( p_adec->p_fifo, &p_pes );
391 p_adec->p_fifo->b_error = 1;
394 if( p_pes->i_pts != 0 )
396 p_adec->pts = p_pes->i_pts;
398 i_frame_size = p_pes->i_pes_size;
400 if( i_frame_size > 0 )
402 if( p_adec->i_buffer < i_frame_size + 16 )
404 FREE( p_adec->p_buffer );
405 p_adec->p_buffer = malloc( i_frame_size + 16 );
406 p_adec->i_buffer = i_frame_size + 16;
409 GetPESData( p_adec->p_buffer, p_adec->i_buffer, p_pes );
411 input_DeletePES( p_adec->p_fifo->p_packets_mgt, p_pes );
413 } while( i_frame_size <= 0 );
415 for( p_adec->p_block = p_adec->p_buffer;
416 i_frame_size >= p_adec->i_block;
417 p_adec->p_block += p_adec->i_block, i_frame_size -= p_adec->i_block )
419 /* get output buffer */
420 if( p_adec->pts != 0 && p_adec->pts != aout_DateGet( &p_adec->date ) )
422 aout_DateSet( &p_adec->date, p_adec->pts );
424 else if( !aout_DateGet( &p_adec->date ) )
430 p_aout_buffer = aout_DecNewBuffer( p_adec->p_aout,
431 p_adec->p_aout_input,
432 p_adec->i_samplesperblock );
435 msg_Err( p_adec->p_fifo, "cannot get aout buffer" );
436 p_adec->p_fifo->b_error = 1;
440 p_aout_buffer->start_date = aout_DateGet( &p_adec->date );
441 p_aout_buffer->end_date = aout_DateIncrement( &p_adec->date,
442 p_adec->i_samplesperblock );
446 switch( p_adec->i_codec )
449 DecodeAdpcmImaQT( p_adec, p_aout_buffer );
452 DecodeAdpcmImaWav( p_adec, p_aout_buffer );
455 DecodeAdpcmMs( p_adec, p_aout_buffer );
458 DecodeAdpcmDk4( p_adec, p_aout_buffer );
460 DecodeAdpcmDk3( p_adec, p_aout_buffer );
466 /* **** Now we can output these samples **** */
467 aout_DecPlay( p_adec->p_aout, p_adec->p_aout_input, p_aout_buffer );
472 /*****************************************************************************
473 * EndThread : faad decoder thread destruction
474 *****************************************************************************/
475 static void EndThread (adec_thread_t *p_adec)
477 if( p_adec->p_aout_input )
479 aout_DecDelete( p_adec->p_aout, p_adec->p_aout_input );
482 msg_Dbg( p_adec->p_fifo, "adpcm audio decoder closed" );
484 FREE( p_adec->p_buffer );
487 #define CLAMP( v, min, max ) \
488 if( (v) < (min) ) (v) = (min); \
489 if( (v) > (max) ) (v) = (max)
491 #define GetByte( v ) \
492 (v) = *p_buffer; p_buffer++;
494 #define GetWord( v ) \
495 (v) = *p_buffer; p_buffer++; \
496 (v) |= ( *p_buffer ) << 8; p_buffer++; \
497 if( (v)&0x8000 ) (v) -= 0x010000;
502 typedef struct adpcm_ms_channel_s
505 int i_sample1, i_sample2;
506 int i_coeff1, i_coeff2;
508 } adpcm_ms_channel_t;
511 static int AdpcmMsExpandNibble(adpcm_ms_channel_t *p_channel,
518 i_snibble = i_nibble - ( i_nibble&0x08 ? 0x10 : 0 );
520 i_predictor = ( p_channel->i_sample1 * p_channel->i_coeff1 +
521 p_channel->i_sample2 * p_channel->i_coeff2 ) / 256 +
522 i_snibble * p_channel->i_idelta;
524 CLAMP( i_predictor, -32768, 32767 );
526 p_channel->i_sample2 = p_channel->i_sample1;
527 p_channel->i_sample1 = i_predictor;
529 p_channel->i_idelta = ( i_adaptation_table[i_nibble] *
530 p_channel->i_idelta ) / 256;
531 if( p_channel->i_idelta < 16 )
533 p_channel->i_idelta = 16;
535 return( i_predictor );
538 static void DecodeAdpcmMs( adec_thread_t *p_adec,
539 aout_buffer_t *p_aout_buffer)
542 adpcm_ms_channel_t channel[2];
546 int i_block_predictor;
548 p_buffer = p_adec->p_block;
549 b_stereo = p_adec->p_wf->nChannels == 2 ? 1 : 0;
551 GetByte( i_block_predictor );
552 CLAMP( i_block_predictor, 0, 6 );
553 channel[0].i_coeff1 = i_adaptation_coeff1[i_block_predictor];
554 channel[0].i_coeff2 = i_adaptation_coeff2[i_block_predictor];
558 GetByte( i_block_predictor );
559 CLAMP( i_block_predictor, 0, 6 );
560 channel[1].i_coeff1 = i_adaptation_coeff1[i_block_predictor];
561 channel[1].i_coeff2 = i_adaptation_coeff2[i_block_predictor];
563 GetWord( channel[0].i_idelta );
566 GetWord( channel[1].i_idelta );
569 GetWord( channel[0].i_sample1 );
572 GetWord( channel[1].i_sample1 );
575 GetWord( channel[0].i_sample2 );
578 GetWord( channel[1].i_sample2 );
581 p_sample = (int16_t*)p_aout_buffer->p_buffer;
585 *p_sample = channel[0].i_sample2; p_sample++;
586 *p_sample = channel[1].i_sample2; p_sample++;
587 *p_sample = channel[0].i_sample1; p_sample++;
588 *p_sample = channel[1].i_sample1; p_sample++;
592 *p_sample = channel[0].i_sample2; p_sample++;
593 *p_sample = channel[0].i_sample1; p_sample++;
596 for( i_nibbles = 2 *( p_adec->i_block - 7 * p_adec->p_wf->nChannels );
597 i_nibbles > 0; i_nibbles -= 2,p_buffer++ )
599 *p_sample = AdpcmMsExpandNibble( &channel[0], (*p_buffer) >> 4);
602 *p_sample = AdpcmMsExpandNibble( &channel[b_stereo ? 1 : 0],
613 typedef struct adpcm_ima_wav_channel_s
618 } adpcm_ima_wav_channel_t;
620 static int AdpcmImaWavExpandNibble(adpcm_ima_wav_channel_t *p_channel,
625 i_diff = i_step_table[p_channel->i_step_index] >> 3;
626 if( i_nibble&0x04 ) i_diff += i_step_table[p_channel->i_step_index];
627 if( i_nibble&0x02 ) i_diff += i_step_table[p_channel->i_step_index]>>1;
628 if( i_nibble&0x01 ) i_diff += i_step_table[p_channel->i_step_index]>>2;
630 p_channel->i_predictor -= i_diff;
632 p_channel->i_predictor += i_diff;
634 CLAMP( p_channel->i_predictor, -32768, 32767 );
636 p_channel->i_step_index += i_index_table[i_nibble];
638 CLAMP( p_channel->i_step_index, 0, 88 );
640 return( p_channel->i_predictor );
643 static void DecodeAdpcmImaWav( adec_thread_t *p_adec,
644 aout_buffer_t *p_aout_buffer)
647 adpcm_ima_wav_channel_t channel[2];
652 p_buffer = p_adec->p_block;
653 b_stereo = p_adec->p_wf->nChannels == 2 ? 1 : 0;
655 GetWord( channel[0].i_predictor );
656 GetByte( channel[0].i_step_index );
657 CLAMP( channel[0].i_step_index, 0, 88 );
662 GetWord( channel[1].i_predictor );
663 GetByte( channel[1].i_step_index );
664 CLAMP( channel[1].i_step_index, 0, 88 );
668 p_sample = (int16_t*)p_aout_buffer->p_buffer;
671 for( i_nibbles = 2 * (p_adec->i_block - 8);
677 for( i = 0; i < 4; i++ )
680 AdpcmImaWavExpandNibble(&channel[0],p_buffer[i]&0x0f);
681 p_sample[i * 4 + 2] =
682 AdpcmImaWavExpandNibble(&channel[0],p_buffer[i] >> 4);
686 for( i = 0; i < 4; i++ )
688 p_sample[i * 4 + 1] =
689 AdpcmImaWavExpandNibble(&channel[1],p_buffer[i]&0x0f);
690 p_sample[i * 4 + 3] =
691 AdpcmImaWavExpandNibble(&channel[1],p_buffer[i] >> 4);
702 for( i_nibbles = 2 * (p_adec->i_block - 4);
704 i_nibbles -= 2, p_buffer++ )
706 *p_sample =AdpcmImaWavExpandNibble( &channel[0], (*p_buffer)&0x0f );
708 *p_sample =AdpcmImaWavExpandNibble( &channel[0], (*p_buffer) >> 4 );
717 static void DecodeAdpcmImaQT( adec_thread_t *p_adec,
718 aout_buffer_t *p_aout_buffer )
721 adpcm_ima_wav_channel_t channel[2];
727 p_buffer = p_adec->p_block;
728 i_step = p_adec->p_wf->nChannels;
730 for( i_ch = 0; i_ch < p_adec->p_wf->nChannels; i_ch++ )
732 p_sample = ((int16_t*)p_aout_buffer->p_buffer) + i_ch;
734 channel[i_ch].i_predictor = (int16_t)((( ( p_buffer[0] << 1 )|( p_buffer[1] >> 7 ) ))<<7);
735 channel[i_ch].i_step_index = p_buffer[1]&0x7f;
737 CLAMP( channel[i_ch].i_step_index, 0, 88 );
740 for( i_nibbles = 0; i_nibbles < 64; i_nibbles +=2 )
742 *p_sample = AdpcmImaWavExpandNibble( &channel[i_ch], (*p_buffer)&0x0f);
745 *p_sample = AdpcmImaWavExpandNibble( &channel[i_ch], (*p_buffer >> 4)&0x0f);
757 static void DecodeAdpcmDk4( adec_thread_t *p_adec,
758 aout_buffer_t *p_aout_buffer)
761 adpcm_ima_wav_channel_t channel[2];
766 p_buffer = p_adec->p_block;
767 b_stereo = p_adec->p_wf->nChannels == 2 ? 1 : 0;
769 GetWord( channel[0].i_predictor );
770 GetByte( channel[0].i_step_index );
771 CLAMP( channel[0].i_step_index, 0, 88 );
776 GetWord( channel[1].i_predictor );
777 GetByte( channel[1].i_step_index );
778 CLAMP( channel[1].i_step_index, 0, 88 );
782 p_sample = (int16_t*)p_aout_buffer->p_buffer;
784 /* first output predictor */
785 *p_sample++ = channel[0].i_predictor;
788 *p_sample++ = channel[1].i_predictor;
792 i_nibbles < p_adec->i_block - 4 * (b_stereo ? 2:1 );
795 *p_sample++ = AdpcmImaWavExpandNibble( &channel[0],
797 *p_sample++ = AdpcmImaWavExpandNibble( &channel[b_stereo ? 1 : 0],
808 static void DecodeAdpcmDk3( adec_thread_t *p_adec,
809 aout_buffer_t *p_aout_buffer)
811 uint8_t *p_buffer, *p_end;
812 adpcm_ima_wav_channel_t sum;
813 adpcm_ima_wav_channel_t diff;
817 p_buffer = p_adec->p_block;
818 p_end = p_buffer + p_adec->i_block;
821 GetWord( sum.i_predictor );
822 GetWord( diff.i_predictor );
823 GetByte( sum.i_step_index );
824 GetByte( diff.i_step_index );
826 p_sample = (int16_t*)p_aout_buffer->p_buffer;
827 i_diff_value = diff.i_predictor;
828 /* we process 6 nibbles at once */
829 //for( i_group = 0; i_group < ( p_adec->i_block -16 ) / 3; i_group++ )
830 while( p_buffer + 1 <= p_end )
832 /* first 3 nibbles */
833 AdpcmImaWavExpandNibble( &sum,
836 AdpcmImaWavExpandNibble( &diff,
839 i_diff_value = ( i_diff_value + diff.i_predictor ) / 2;
841 *p_sample++ = sum.i_predictor + i_diff_value;
842 *p_sample++ = sum.i_predictor - i_diff_value;
846 AdpcmImaWavExpandNibble( &sum,
849 *p_sample++ = sum.i_predictor + i_diff_value;
850 *p_sample++ = sum.i_predictor - i_diff_value;
852 /* now last 3 nibbles */
853 AdpcmImaWavExpandNibble( &sum,
856 if( p_buffer < p_end )
858 AdpcmImaWavExpandNibble( &diff,
861 i_diff_value = ( i_diff_value + diff.i_predictor ) / 2;
863 *p_sample++ = sum.i_predictor + i_diff_value;
864 *p_sample++ = sum.i_predictor - i_diff_value;
866 AdpcmImaWavExpandNibble( &sum,
870 *p_sample++ = sum.i_predictor + i_diff_value;
871 *p_sample++ = sum.i_predictor - i_diff_value;