1 /*****************************************************************************
2 * araw.c: Pseudo audio decoder; for raw pcm data
3 *****************************************************************************
4 * Copyright (C) 2001, 2002 VideoLAN
5 * $Id: araw.c,v 1.20 2003/11/01 06:56:29 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 *****************************************************************************/
27 #include <stdlib.h> /* malloc(), free() */
30 #include <vlc/decoder.h>
31 #include <vlc/input.h>
34 #include "aout_internal.h"
38 /*****************************************************************************
40 *****************************************************************************/
41 static int DecoderOpen ( vlc_object_t * );
43 static int EncoderOpen ( vlc_object_t *p_this );
44 static void EncoderClose ( vlc_object_t *p_this );
47 /* audio decoder module */
48 set_description( _("Pseudo Raw/Log Audio decoder") );
49 set_capability( "decoder", 50 );
50 set_callbacks( DecoderOpen, NULL );
52 /* audio encoder submodule */
54 set_description( _("Raw audio encoder") );
55 set_capability( "audio encoder", 10 );
56 set_callbacks( EncoderOpen, EncoderClose );
60 /*****************************************************************************
62 *****************************************************************************/
68 /* Input properties */
69 decoder_fifo_t *p_fifo;
70 int16_t *p_logtos16; // used with m/alaw to int16_t
72 /* Output properties */
73 aout_instance_t * p_aout; /* opaque */
74 aout_input_t * p_aout_input; /* opaque */
75 audio_sample_format_t output_format;
83 static int RunDecoder ( decoder_fifo_t * );
84 static int InitThread ( adec_thread_t * );
85 static void DecodeThread ( adec_thread_t * );
86 static void EndThread ( adec_thread_t * );
89 static block_t *EncoderEncode( encoder_t *p_enc, aout_buffer_t *p_aout_buf );
91 /*****************************************************************************
92 * DecoderOpen: probe the decoder and return score
93 *****************************************************************************
94 * Tries to launch a decoder and return score so that the interface is able
96 *****************************************************************************/
97 static int DecoderOpen( vlc_object_t *p_this )
99 decoder_t *p_dec = (decoder_t*)p_this;
101 switch( p_dec->p_fifo->i_fourcc )
103 case VLC_FOURCC('a','r','a','w'): /* from wav/avi/asf file */
104 case VLC_FOURCC('t','w','o','s'): /* _signed_ big endian samples (mov)*/
105 case VLC_FOURCC('s','o','w','t'): /* _signed_ little endian samples (mov)*/
107 case VLC_FOURCC('a','l','a','w'):
108 case VLC_FOURCC('u','l','a','w'):
109 p_dec->pf_run = RunDecoder;
117 static int pi_channels_maps[6] =
121 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
122 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER,
123 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT,
124 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
125 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT
128 static int16_t ulawtos16[256] =
130 -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
131 -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
132 -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
133 -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,
134 -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
135 -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
136 -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
137 -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
138 -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
139 -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
140 -876, -844, -812, -780, -748, -716, -684, -652,
141 -620, -588, -556, -524, -492, -460, -428, -396,
142 -372, -356, -340, -324, -308, -292, -276, -260,
143 -244, -228, -212, -196, -180, -164, -148, -132,
144 -120, -112, -104, -96, -88, -80, -72, -64,
145 -56, -48, -40, -32, -24, -16, -8, 0,
146 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
147 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
148 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
149 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
150 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
151 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
152 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
153 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
154 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
155 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
156 876, 844, 812, 780, 748, 716, 684, 652,
157 620, 588, 556, 524, 492, 460, 428, 396,
158 372, 356, 340, 324, 308, 292, 276, 260,
159 244, 228, 212, 196, 180, 164, 148, 132,
160 120, 112, 104, 96, 88, 80, 72, 64,
161 56, 48, 40, 32, 24, 16, 8, 0
164 static int16_t alawtos16[256] =
166 -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
167 -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
168 -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
169 -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
170 -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
171 -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
172 -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472,
173 -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
174 -344, -328, -376, -360, -280, -264, -312, -296,
175 -472, -456, -504, -488, -408, -392, -440, -424,
176 -88, -72, -120, -104, -24, -8, -56, -40,
177 -216, -200, -248, -232, -152, -136, -184, -168,
178 -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
179 -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
180 -688, -656, -752, -720, -560, -528, -624, -592,
181 -944, -912, -1008, -976, -816, -784, -880, -848,
182 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
183 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
184 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
185 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
186 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
187 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
188 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
189 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
190 344, 328, 376, 360, 280, 264, 312, 296,
191 472, 456, 504, 488, 408, 392, 440, 424,
192 88, 72, 120, 104, 24, 8, 56, 40,
193 216, 200, 248, 232, 152, 136, 184, 168,
194 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
195 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
196 688, 656, 752, 720, 560, 528, 624, 592,
197 944, 912, 1008, 976, 816, 784, 880, 848
200 /*****************************************************************************
201 * RunDecoder: this function is called just after the thread is created
202 *****************************************************************************/
203 static int RunDecoder( decoder_fifo_t *p_fifo )
205 adec_thread_t *p_adec;
208 if( !( p_adec = malloc( sizeof( adec_thread_t ) ) ) )
210 msg_Err( p_fifo, "out of memory" );
211 DecoderError( p_fifo );
214 memset( p_adec, 0, sizeof( adec_thread_t ) );
216 p_adec->p_fifo = p_fifo;
218 if( InitThread( p_adec ) != 0 )
220 DecoderError( p_fifo );
224 while( ( !p_adec->p_fifo->b_die )&&( !p_adec->p_fifo->b_error ) )
226 DecodeThread( p_adec );
230 if( ( b_error = p_adec->p_fifo->b_error ) )
232 DecoderError( p_adec->p_fifo );
245 #define FREE( p ) if( p ) free( p ); p = NULL
247 /*****************************************************************************
248 * InitThread: initialize data before entering main loop
249 *****************************************************************************/
250 static int InitThread( adec_thread_t * p_adec )
252 if( ( p_adec->p_wf = (WAVEFORMATEX*)p_adec->p_fifo->p_waveformatex )
255 msg_Err( p_adec->p_fifo, "unknown raw format" );
259 /* fixing some values */
260 if( ( p_adec->p_wf->wFormatTag == WAVE_FORMAT_PCM ||
261 p_adec->p_wf->wFormatTag == WAVE_FORMAT_IEEE_FLOAT )&&
262 !p_adec->p_wf->nBlockAlign )
264 p_adec->p_wf->nBlockAlign =
265 p_adec->p_wf->nChannels *
266 ( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 );
269 msg_Dbg( p_adec->p_fifo,
270 "raw format: samplerate:%dHz channels:%d bits/sample:%d "
272 p_adec->p_wf->nSamplesPerSec,
273 p_adec->p_wf->nChannels,
274 p_adec->p_wf->wBitsPerSample,
275 p_adec->p_wf->nBlockAlign );
277 /* Initialize the thread properties */
278 p_adec->p_logtos16 = NULL;
279 if( p_adec->p_wf->wFormatTag == WAVE_FORMAT_IEEE_FLOAT )
281 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
284 p_adec->output_format.i_format = VLC_FOURCC('f','l','3','2');
287 p_adec->output_format.i_format = VLC_FOURCC('f','l','6','4');
290 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
296 if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
298 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
301 p_adec->output_format.i_format = VLC_FOURCC('s','8',' ',' ');
304 p_adec->output_format.i_format = VLC_FOURCC('s','1','6','b');
307 p_adec->output_format.i_format = VLC_FOURCC('s','2','4','b');
310 p_adec->output_format.i_format = VLC_FOURCC('s','3','2','b');
313 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
317 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
319 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
322 p_adec->output_format.i_format = VLC_FOURCC('s','8',' ',' ');
325 p_adec->output_format.i_format = VLC_FOURCC('s','1','6','l');
328 p_adec->output_format.i_format = VLC_FOURCC('s','2','4','l');
331 p_adec->output_format.i_format = VLC_FOURCC('s','3','2','l');
334 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
338 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
340 switch( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 )
343 p_adec->output_format.i_format = VLC_FOURCC('u','8',' ',' ');
346 p_adec->output_format.i_format = VLC_FOURCC('s','1','6','l');
349 p_adec->output_format.i_format = VLC_FOURCC('s','2','4','l');
352 p_adec->output_format.i_format = VLC_FOURCC('s','3','2','l');
355 msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
359 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 'a', 'l', 'a', 'w' ) )
361 p_adec->output_format.i_format = AOUT_FMT_S16_NE;
362 p_adec->p_logtos16 = alawtos16;
364 else if( p_adec->p_fifo->i_fourcc == VLC_FOURCC( 'u', 'l', 'a', 'w' ) )
366 p_adec->output_format.i_format = AOUT_FMT_S16_NE;
367 p_adec->p_logtos16 = ulawtos16;
370 p_adec->output_format.i_rate = p_adec->p_wf->nSamplesPerSec;
372 if( p_adec->p_wf->nChannels <= 0 || p_adec->p_wf->nChannels > 5 )
374 msg_Err( p_adec->p_fifo, "bad channels count(1-5)" );
378 p_adec->output_format.i_physical_channels =
379 p_adec->output_format.i_original_channels =
380 pi_channels_maps[p_adec->p_wf->nChannels];
381 p_adec->p_aout = NULL;
382 p_adec->p_aout_input = NULL;
384 /* **** Create a new audio output **** */
385 aout_DateInit( &p_adec->date, p_adec->output_format.i_rate );
386 p_adec->p_aout_input = aout_DecNew( p_adec->p_fifo,
388 &p_adec->output_format );
389 if( !p_adec->p_aout_input )
391 msg_Err( p_adec->p_fifo, "cannot create aout" );
398 static void GetPESData( uint8_t *p_buf, int i_max, pes_packet_t *p_pes )
403 data_packet_t *p_data;
406 p_data = p_pes->p_first;
407 while( p_data != NULL && i_count < i_max )
410 i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
416 p_data->p_payload_start,
420 p_data = p_data->p_next;
425 if( i_count < i_max )
427 memset( p_buf, 0, i_max - i_count );
431 /*****************************************************************************
432 * DecodeThread: decodes a frame
433 *****************************************************************************/
434 static void DecodeThread( adec_thread_t *p_adec )
436 aout_buffer_t *p_aout_buffer;
437 int i_samples; // per channels
442 /* **** get samples count **** */
443 input_ExtractPES( p_adec->p_fifo, &p_pes );
446 p_adec->p_fifo->b_error = 1;
449 i_size = p_pes->i_pes_size;
451 if( p_adec->p_wf->nBlockAlign > 0 )
453 i_size -= i_size % p_adec->p_wf->nBlockAlign;
455 if( i_size <= 0 || i_size < p_adec->p_wf->nBlockAlign )
457 input_DeletePES( p_adec->p_fifo->p_packets_mgt, p_pes );
461 i_samples = i_size / ( ( p_adec->p_wf->wBitsPerSample + 7 ) / 8 ) /
462 p_adec->p_wf->nChannels;
464 p_adec->pts = p_pes->i_pts;
466 /* **** Now we can output these samples **** */
468 if( p_adec->pts != 0 && p_adec->pts != aout_DateGet( &p_adec->date ) )
470 aout_DateSet( &p_adec->date, p_adec->pts );
472 else if( !aout_DateGet( &p_adec->date ) )
478 p = p_data = malloc( i_size );
479 GetPESData( p_data, i_size, p_pes );
481 while( i_samples > 0 )
485 i_copy = __MIN( i_samples, 1024 );
486 p_aout_buffer = aout_DecNewBuffer( p_adec->p_aout,
487 p_adec->p_aout_input,
491 msg_Err( p_adec->p_fifo, "cannot get aout buffer" );
492 p_adec->p_fifo->b_error = 1;
498 p_aout_buffer->start_date = aout_DateGet( &p_adec->date );
499 p_aout_buffer->end_date = aout_DateIncrement( &p_adec->date,
502 if( p_adec->p_logtos16 )
504 int16_t *s = (int16_t*)p_aout_buffer->p_buffer;
508 for( i = 0; i < p_aout_buffer->i_nb_bytes; i++ )
510 *s++ = p_adec->p_logtos16[*p++];
515 memcpy( p_aout_buffer->p_buffer, p,
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 );
530 /*****************************************************************************
531 * EndThread : faad decoder thread destruction
532 *****************************************************************************/
533 static void EndThread (adec_thread_t *p_adec)
535 if( p_adec->p_aout_input )
537 aout_DecDelete( p_adec->p_aout, p_adec->p_aout_input );
540 msg_Dbg( p_adec->p_fifo, "raw audio decoder closed" );
545 /*****************************************************************************
547 *****************************************************************************/
548 static int EncoderOpen ( vlc_object_t *p_this )
550 encoder_t *p_enc = (encoder_t *)p_this;
552 if( p_enc->format.audio.i_format != VLC_FOURCC( 's', '1', '6', 'b' ) &&
553 p_enc->format.audio.i_format != VLC_FOURCC( 's', '1', '6', 'l' ) )
555 msg_Warn( p_enc, "unhandled input format" );
559 switch( p_enc->i_fourcc )
561 case VLC_FOURCC( 's', '1', '6', 'b' ):
562 case VLC_FOURCC( 's', '1', '6', 'l' ):
563 case VLC_FOURCC( 'u', '8', ' ', ' ' ):
564 case VLC_FOURCC( 's', '8', ' ', ' ' ):
566 -> could be easyly done with table look up
567 case VLC_FOURCC( 'a', 'l', 'a', 'w' ):
568 case VLC_FOURCC( 'u', 'l', 'a', 'w' ):
576 p_enc->pf_header = NULL;
577 p_enc->pf_encode_audio = EncoderEncode;
578 p_enc->pf_encode_video = NULL;
579 p_enc->i_extra_data = 0;
580 p_enc->p_extra_data = NULL;
585 /*****************************************************************************
587 *****************************************************************************/
588 static void EncoderClose ( vlc_object_t *p_this )
593 /*****************************************************************************
595 *****************************************************************************/
596 static block_t *EncoderEncode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
598 block_t *p_block = NULL;
601 if( p_enc->i_fourcc == p_enc->format.audio.i_format )
603 if( ( p_block = block_New( p_enc, p_aout_buf->i_nb_bytes ) ) )
605 memcpy( p_block->p_buffer, p_aout_buf->p_buffer, p_aout_buf->i_nb_bytes );
608 else if( p_enc->i_fourcc == VLC_FOURCC( 'u', '8', ' ', ' ' ) )
610 if( ( p_block = block_New( p_enc, p_aout_buf->i_nb_bytes / 2 ) ) )
612 uint8_t *p_dst = (uint8_t*)p_block->p_buffer;
613 int8_t *p_src = (int8_t*) p_aout_buf->p_buffer;
615 if( p_enc->format.audio.i_format == VLC_FOURCC( 's', '1', '6', 'l' ) )
620 for( i = 0; i < p_aout_buf->i_nb_bytes / 2; i++ )
622 *p_dst++ = *p_src + 128; p_src += 2;
626 else if( p_enc->i_fourcc == VLC_FOURCC( 's', '8', ' ', ' ' ) )
628 if( ( p_block = block_New( p_enc, p_aout_buf->i_nb_bytes / 2 ) ) )
630 int8_t *p_dst = (int8_t*)p_block->p_buffer;
631 int8_t *p_src = (int8_t*)p_aout_buf->p_buffer;
633 if( p_enc->format.audio.i_format == VLC_FOURCC( 's', '1', '6', 'l' ) )
638 for( i = 0; i < p_aout_buf->i_nb_bytes / 2; i++ )
640 *p_dst++ = *p_src; p_src += 2;
646 /* endian swapping */
647 if( ( p_block = block_New( p_enc, p_aout_buf->i_nb_bytes ) ) )
649 uint8_t *p_dst = (uint8_t*)p_block->p_buffer;
650 uint8_t *p_src = (uint8_t*)p_aout_buf->p_buffer;
652 for( i = 0; i < p_aout_buf->i_nb_bytes / 2; i++ )
665 p_block->i_dts = p_block->i_pts = p_aout_buf->start_date;
666 p_block->i_length = (int64_t)p_aout_buf->i_nb_samples * (int64_t)1000000 /
667 p_enc->format.audio.i_rate;