1 /*****************************************************************************
2 * araw.c: Pseudo audio decoder; for raw pcm data
3 *****************************************************************************
4 * Copyright (C) 2001, 2002 VideoLAN
5 * $Id: araw.c,v 1.14 2003/03/11 17:40:40 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 /*****************************************************************************
26 *****************************************************************************/
29 #include <vlc/decoder.h>
30 #include <vlc/input.h>
32 #include <stdlib.h> /* malloc(), free() */
33 #include <string.h> /* strdup() */
35 /*****************************************************************************
37 *****************************************************************************/
39 typedef struct adec_thread_s
43 /* The bit stream structure handles the PES stream at the bit level */
44 // bit_stream_t bit_stream;
46 /* Input properties */
47 decoder_fifo_t *p_fifo;
48 int16_t *p_logtos16; // used with m/alaw to s16
50 /* Output properties */
51 aout_instance_t * p_aout; /* opaque */
52 aout_input_t * p_aout_input; /* opaque */
53 audio_sample_format_t output_format;
60 static int OpenDecoder ( vlc_object_t * );
62 static int RunDecoder ( decoder_fifo_t * );
63 static int InitThread ( adec_thread_t * );
64 static void DecodeThread ( adec_thread_t * );
65 static void EndThread ( adec_thread_t * );
67 /*****************************************************************************
69 *****************************************************************************/
72 set_description( _("Pseudo Raw/Log Audio decoder") );
73 set_capability( "decoder", 50 );
74 set_callbacks( OpenDecoder, NULL );
78 /*****************************************************************************
79 * OpenDecoder: probe the decoder and return score
80 *****************************************************************************
81 * Tries to launch a decoder and return score so that the interface is able
83 *****************************************************************************/
84 static int OpenDecoder( vlc_object_t *p_this )
86 decoder_fifo_t *p_fifo = (decoder_fifo_t*) p_this;
88 switch( p_fifo->i_fourcc )
90 case VLC_FOURCC('a','r','a','w'): /* from wav/avi/asf file */
91 case VLC_FOURCC('t','w','o','s'): /* _signed_ big endian samples (mov)*/
92 case VLC_FOURCC('s','o','w','t'): /* _signed_ little endian samples (mov)*/
94 case VLC_FOURCC('a','l','a','w'):
95 case VLC_FOURCC('u','l','a','w'):
96 p_fifo->pf_run = RunDecoder;
105 static int pi_channels_maps[6] =
109 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
110 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER,
111 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT,
112 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
113 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT
116 static int16_t ulawtos16[256] =
118 -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
119 -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
120 -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
121 -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,
122 -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
123 -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
124 -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
125 -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
126 -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
127 -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
128 -876, -844, -812, -780, -748, -716, -684, -652,
129 -620, -588, -556, -524, -492, -460, -428, -396,
130 -372, -356, -340, -324, -308, -292, -276, -260,
131 -244, -228, -212, -196, -180, -164, -148, -132,
132 -120, -112, -104, -96, -88, -80, -72, -64,
133 -56, -48, -40, -32, -24, -16, -8, 0,
134 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
135 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
136 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
137 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
138 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
139 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
140 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
141 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
142 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
143 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
144 876, 844, 812, 780, 748, 716, 684, 652,
145 620, 588, 556, 524, 492, 460, 428, 396,
146 372, 356, 340, 324, 308, 292, 276, 260,
147 244, 228, 212, 196, 180, 164, 148, 132,
148 120, 112, 104, 96, 88, 80, 72, 64,
149 56, 48, 40, 32, 24, 16, 8, 0
152 static int16_t alawtos16[256] =
154 -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
155 -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
156 -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
157 -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
158 -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
159 -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
160 -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472,
161 -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
162 -344, -328, -376, -360, -280, -264, -312, -296,
163 -472, -456, -504, -488, -408, -392, -440, -424,
164 -88, -72, -120, -104, -24, -8, -56, -40,
165 -216, -200, -248, -232, -152, -136, -184, -168,
166 -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
167 -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
168 -688, -656, -752, -720, -560, -528, -624, -592,
169 -944, -912, -1008, -976, -816, -784, -880, -848,
170 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
171 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
172 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
173 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
174 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
175 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
176 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
177 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
178 344, 328, 376, 360, 280, 264, 312, 296,
179 472, 456, 504, 488, 408, 392, 440, 424,
180 88, 72, 120, 104, 24, 8, 56, 40,
181 216, 200, 248, 232, 152, 136, 184, 168,
182 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
183 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
184 688, 656, 752, 720, 560, 528, 624, 592,
185 944, 912, 1008, 976, 816, 784, 880, 848
188 /*****************************************************************************
189 * RunDecoder: this function is called just after the thread is created
190 *****************************************************************************/
191 static int RunDecoder( decoder_fifo_t *p_fifo )
193 adec_thread_t *p_adec;
196 if( !( p_adec = malloc( sizeof( adec_thread_t ) ) ) )
198 msg_Err( p_fifo, "out of memory" );
199 DecoderError( p_fifo );
202 memset( p_adec, 0, sizeof( adec_thread_t ) );
204 p_adec->p_fifo = p_fifo;
206 if( InitThread( p_adec ) != 0 )
208 DecoderError( p_fifo );
212 while( ( !p_adec->p_fifo->b_die )&&( !p_adec->p_fifo->b_error ) )
214 DecodeThread( p_adec );
218 if( ( b_error = p_adec->p_fifo->b_error ) )
220 DecoderError( p_adec->p_fifo );
233 #define FREE( p ) if( p ) free( p ); p = NULL
234 #define GetWLE( p ) \
235 ( *(u8*)(p) + ( *((u8*)(p)+1) << 8 ) )
237 #define GetDWLE( p ) \
238 ( *(u8*)(p) + ( *((u8*)(p)+1) << 8 ) + \
239 ( *((u8*)(p)+2) << 16 ) + ( *((u8*)(p)+3) << 24 ) )
242 /*****************************************************************************
243 * InitThread: initialize data before entering main loop
244 *****************************************************************************/
245 static int InitThread( adec_thread_t * p_adec )
247 if( ( p_adec->p_wf = (WAVEFORMATEX*)p_adec->p_fifo->p_waveformatex ) == NULL )
249 msg_Err( p_adec->p_fifo, "unknown raw format" );
253 /* fixing some values */
254 if( ( p_adec->p_wf->wFormatTag == WAVE_FORMAT_PCM ||
255 p_adec->p_wf->wFormatTag == WAVE_FORMAT_IEEE_FLOAT )&&
256 !p_adec->p_wf->nBlockAlign )
258 p_adec->p_wf->nBlockAlign =
259 p_adec->p_wf->nChannels *
260 ( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 );
263 msg_Dbg( p_adec->p_fifo,
264 "raw format: samplerate:%dHz channels:%d bits/sample:%d blockalign:%d",
265 p_adec->p_wf->nSamplesPerSec,
266 p_adec->p_wf->nChannels,
267 p_adec->p_wf->wBitsPerSample,
268 p_adec->p_wf->nBlockAlign );
270 /* Initialize the thread properties */
271 p_adec->p_logtos16 = NULL;
272 if( p_adec->p_wf->wFormatTag == WAVE_FORMAT_IEEE_FLOAT )
274 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
277 p_adec->output_format.i_format = VLC_FOURCC('f','l','3','2');
280 p_adec->output_format.i_format = VLC_FOURCC('f','l','6','4');
283 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
289 if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
291 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
294 p_adec->output_format.i_format = VLC_FOURCC('s','8',' ',' ');
297 p_adec->output_format.i_format = VLC_FOURCC('s','1','6','b');
300 p_adec->output_format.i_format = VLC_FOURCC('s','2','4','b');
303 p_adec->output_format.i_format = VLC_FOURCC('s','3','2','b');
306 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
310 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
312 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
315 p_adec->output_format.i_format = VLC_FOURCC('s','8',' ',' ');
318 p_adec->output_format.i_format = VLC_FOURCC('s','1','6','l');
321 p_adec->output_format.i_format = VLC_FOURCC('s','2','4','l');
324 p_adec->output_format.i_format = VLC_FOURCC('s','3','2','l');
327 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
331 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
333 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
336 p_adec->output_format.i_format = VLC_FOURCC('u','8',' ',' ');
339 p_adec->output_format.i_format = VLC_FOURCC('s','1','6','l');
342 p_adec->output_format.i_format = VLC_FOURCC('s','2','4','l');
345 p_adec->output_format.i_format = VLC_FOURCC('s','3','2','l');
348 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
352 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 'a', 'l', 'a', 'w' ) )
354 p_adec->output_format.i_format = AOUT_FMT_S16_NE;
355 p_adec->p_logtos16 = alawtos16;
357 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 'u', 'l', 'a', 'w' ) )
359 p_adec->output_format.i_format = AOUT_FMT_S16_NE;
360 p_adec->p_logtos16 = ulawtos16;
363 p_adec->output_format.i_rate = p_adec->p_wf->nSamplesPerSec;
365 if( p_adec->p_wf->nChannels <= 0 ||
366 p_adec->p_wf->nChannels > 5 )
368 msg_Err( p_adec->p_fifo, "bad channels count(1-5)" );
372 p_adec->output_format.i_physical_channels =
373 p_adec->output_format.i_original_channels =
374 pi_channels_maps[p_adec->p_wf->nChannels];
375 p_adec->p_aout = NULL;
376 p_adec->p_aout_input = NULL;
378 /* **** Create a new audio output **** */
379 aout_DateInit( &p_adec->date, p_adec->output_format.i_rate );
380 p_adec->p_aout_input = aout_DecNew( p_adec->p_fifo,
382 &p_adec->output_format );
383 if( !p_adec->p_aout_input )
385 msg_Err( p_adec->p_fifo, "cannot create aout" );
389 /* Init the BitStream */
390 // InitBitstream( &p_adec->bit_stream, p_adec->p_fifo,
396 static void GetPESData( u8 *p_buf, int i_max, pes_packet_t *p_pes )
401 data_packet_t *p_data;
404 p_data = p_pes->p_first;
405 while( p_data != NULL && i_count < i_max )
408 i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start, i_max - i_count );
413 p_data->p_payload_start,
417 p_data = p_data->p_next;
422 if( i_count < i_max )
424 memset( p_buf, 0, i_max - i_count );
428 /*****************************************************************************
429 * DecodeThread: decodes a frame
430 *****************************************************************************/
431 static void DecodeThread( adec_thread_t *p_adec )
433 aout_buffer_t *p_aout_buffer;
434 int i_samples; // per channels
439 /* **** get samples count **** */
440 input_ExtractPES( p_adec->p_fifo, &p_pes );
443 p_adec->p_fifo->b_error = 1;
446 i_size = p_pes->i_pes_size;
448 if( p_adec->p_wf->nBlockAlign > 0 )
450 i_size -= i_size % p_adec->p_wf->nBlockAlign;
452 if( i_size <= 0 || i_size < p_adec->p_wf->nBlockAlign )
454 input_DeletePES( p_adec->p_fifo->p_packets_mgt, p_pes );
459 ( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 ) /
460 p_adec->p_wf->nChannels;
462 // msg_Warn( p_adec->p_fifo, "got %d samples (%d bytes)", i_samples, i_size );
463 p_adec->pts = p_pes->i_pts;
465 /* **** Now we can output these samples **** */
467 if( p_adec->pts != 0 && p_adec->pts != aout_DateGet( &p_adec->date ) )
469 aout_DateSet( &p_adec->date, p_adec->pts );
471 else if( !aout_DateGet( &p_adec->date ) )
477 p = p_data = malloc( i_size );
478 GetPESData( p_data, i_size, p_pes );
480 while( i_samples > 0 )
484 i_copy = __MIN( i_samples, 1024 );
485 p_aout_buffer = aout_DecNewBuffer( p_adec->p_aout,
486 p_adec->p_aout_input,
490 msg_Err( p_adec->p_fifo, "cannot get aout buffer" );
491 p_adec->p_fifo->b_error = 1;
497 p_aout_buffer->start_date = aout_DateGet( &p_adec->date );
498 p_aout_buffer->end_date = aout_DateIncrement( &p_adec->date,
501 if( p_adec->p_logtos16 )
503 int16_t *s = (int16_t*)p_aout_buffer->p_buffer;
507 for( i = 0; i < p_aout_buffer->i_nb_bytes; i++ )
509 *s++ = p_adec->p_logtos16[*p++];
514 memcpy( p_aout_buffer->p_buffer,
516 p_aout_buffer->i_nb_bytes );
518 p += p_aout_buffer->i_nb_bytes;
521 aout_DecPlay( p_adec->p_aout, p_adec->p_aout_input, p_aout_buffer );
527 input_DeletePES( p_adec->p_fifo->p_packets_mgt, p_pes );
531 /*****************************************************************************
532 * EndThread : faad decoder thread destruction
533 *****************************************************************************/
534 static void EndThread (adec_thread_t *p_adec)
536 if( p_adec->p_aout_input )
538 aout_DecDelete( p_adec->p_aout, p_adec->p_aout_input );
541 msg_Dbg( p_adec->p_fifo, "raw audio decoder closed" );