1 /*****************************************************************************
2 * araw.c: Pseudo audio decoder; for raw pcm data
3 *****************************************************************************
4 * Copyright (C) 2001, 2003 VideoLAN
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 *****************************************************************************/
28 #include <vlc/decoder.h>
30 /*****************************************************************************
32 *****************************************************************************/
33 static int DecoderOpen ( vlc_object_t * );
34 static void DecoderClose( vlc_object_t * );
36 static int EncoderOpen ( vlc_object_t * );
37 static void EncoderClose( vlc_object_t * );
40 /* audio decoder module */
41 set_description( _("Raw/Log Audio decoder") );
42 set_capability( "decoder", 100 );
43 set_callbacks( DecoderOpen, DecoderClose );
45 /* audio encoder submodule */
47 set_description( _("Raw audio encoder") );
48 set_capability( "encoder", 150 );
49 set_callbacks( EncoderOpen, EncoderClose );
52 /*****************************************************************************
54 *****************************************************************************/
55 static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
56 static block_t *EncoderEncode( encoder_t *, aout_buffer_t * );
60 int16_t *p_logtos16; /* used with m/alaw to int16_t */
62 audio_date_t end_date;
65 static int pi_channels_maps[7] =
69 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
70 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER,
71 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT
72 | AOUT_CHAN_REARRIGHT,
73 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
74 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT,
75 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
76 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE
79 static int16_t ulawtos16[256] =
81 -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
82 -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
83 -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
84 -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,
85 -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
86 -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
87 -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
88 -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
89 -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
90 -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
91 -876, -844, -812, -780, -748, -716, -684, -652,
92 -620, -588, -556, -524, -492, -460, -428, -396,
93 -372, -356, -340, -324, -308, -292, -276, -260,
94 -244, -228, -212, -196, -180, -164, -148, -132,
95 -120, -112, -104, -96, -88, -80, -72, -64,
96 -56, -48, -40, -32, -24, -16, -8, 0,
97 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
98 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
99 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
100 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
101 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
102 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
103 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
104 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
105 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
106 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
107 876, 844, 812, 780, 748, 716, 684, 652,
108 620, 588, 556, 524, 492, 460, 428, 396,
109 372, 356, 340, 324, 308, 292, 276, 260,
110 244, 228, 212, 196, 180, 164, 148, 132,
111 120, 112, 104, 96, 88, 80, 72, 64,
112 56, 48, 40, 32, 24, 16, 8, 0
115 static int16_t alawtos16[256] =
117 -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
118 -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
119 -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
120 -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
121 -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
122 -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
123 -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472,
124 -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
125 -344, -328, -376, -360, -280, -264, -312, -296,
126 -472, -456, -504, -488, -408, -392, -440, -424,
127 -88, -72, -120, -104, -24, -8, -56, -40,
128 -216, -200, -248, -232, -152, -136, -184, -168,
129 -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
130 -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
131 -688, -656, -752, -720, -560, -528, -624, -592,
132 -944, -912, -1008, -976, -816, -784, -880, -848,
133 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
134 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
135 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
136 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
137 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
138 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
139 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
140 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
141 344, 328, 376, 360, 280, 264, 312, 296,
142 472, 456, 504, 488, 408, 392, 440, 424,
143 88, 72, 120, 104, 24, 8, 56, 40,
144 216, 200, 248, 232, 152, 136, 184, 168,
145 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
146 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
147 688, 656, 752, 720, 560, 528, 624, 592,
148 944, 912, 1008, 976, 816, 784, 880, 848
151 /*****************************************************************************
152 * DecoderOpen: probe the decoder and return score
153 *****************************************************************************/
154 static int DecoderOpen( vlc_object_t *p_this )
156 decoder_t *p_dec = (decoder_t*)p_this;
157 decoder_sys_t *p_sys;
159 switch( p_dec->fmt_in.i_codec )
161 /* from wav/avi/asf file */
162 case VLC_FOURCC('a','r','a','w'):
163 case VLC_FOURCC('a','f','l','t'):
164 /* _signed_ big endian samples (mov)*/
165 case VLC_FOURCC('t','w','o','s'):
166 /* _signed_ little endian samples (mov)*/
167 case VLC_FOURCC('s','o','w','t'):
169 case VLC_FOURCC('a','l','a','w'):
170 case VLC_FOURCC('u','l','a','w'):
171 case VLC_FOURCC('m','l','a','w'):
173 case VLC_FOURCC('f','l','6','4'):
174 case VLC_FOURCC('f','l','3','2'):
175 case VLC_FOURCC('s','3','2','l'):
176 case VLC_FOURCC('s','3','2','b'):
177 case VLC_FOURCC('s','2','4','l'):
178 case VLC_FOURCC('s','2','4','b'):
179 case VLC_FOURCC('s','1','6','l'):
180 case VLC_FOURCC('s','1','6','b'):
181 case VLC_FOURCC('s','8',' ',' '):
182 case VLC_FOURCC('u','8',' ',' '):
189 if( p_dec->fmt_in.audio.i_channels <= 0 ||
190 p_dec->fmt_in.audio.i_channels > 6 )
192 msg_Err( p_dec, "bad channels count(1-6)" );
196 if( p_dec->fmt_in.audio.i_rate <= 0 )
198 msg_Err( p_dec, "bad samplerate" );
202 /* Allocate the memory needed to store the decoder's structure */
203 if( ( p_dec->p_sys = p_sys =
204 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
206 msg_Err( p_dec, "out of memory" );
210 p_sys->p_logtos16 = NULL;
212 msg_Dbg( p_dec, "samplerate:%dHz channels:%d bits/sample:%d",
213 p_dec->fmt_in.audio.i_rate, p_dec->fmt_in.audio.i_channels,
214 p_dec->fmt_in.audio.i_bitspersample );
216 if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'f', 'l', '6', '4' ) )
218 p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
219 p_dec->fmt_in.audio.i_bitspersample = 64;
221 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'f', 'l', '3', '2' ) )
223 p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
224 p_dec->fmt_in.audio.i_bitspersample = 32;
226 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '3', '2', 'l' ) ||
227 p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '3', '2', 'b' ) )
229 p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
230 p_dec->fmt_in.audio.i_bitspersample = 32;
232 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '2', '4', 'l' ) ||
233 p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '2', '4', 'b' ) )
235 p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
236 p_dec->fmt_in.audio.i_bitspersample = 24;
238 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '1', '6', 'l' ) ||
239 p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '1', '6', 'b' ) )
241 p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
242 p_dec->fmt_in.audio.i_bitspersample = 16;
244 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '8', ' ', ' ' ) ||
245 p_dec->fmt_in.i_codec == VLC_FOURCC( 'u', '8', ' ', ' ' ) )
247 p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
248 p_dec->fmt_in.audio.i_bitspersample = 8;
250 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
252 switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
255 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
258 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','6','4');
261 msg_Err( p_dec, "bad parameters(bits/sample)" );
265 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
267 switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
270 p_dec->fmt_out.i_codec = VLC_FOURCC('u','8',' ',' ');
273 p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
276 p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
279 p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
282 msg_Err( p_dec, "bad parameters(bits/sample)" );
286 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 't', 'w', 'o', 's' ) )
288 switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
291 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
294 p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','b');
297 p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','b');
300 p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','b');
303 msg_Err( p_dec, "bad parameters(bits/sample)" );
307 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', 'o', 'w', 't' ) )
309 switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
312 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
315 p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
318 p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
321 p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
324 msg_Err( p_dec, "bad parameters(bits/sample)" );
328 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'l', 'a', 'w' ) )
330 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
331 p_sys->p_logtos16 = alawtos16;
332 p_dec->fmt_in.audio.i_bitspersample = 8;
334 else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'u', 'l', 'a', 'w' ) ||
335 p_dec->fmt_in.i_codec == VLC_FOURCC( 'm', 'l', 'a', 'w' ) )
337 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
338 p_sys->p_logtos16 = ulawtos16;
339 p_dec->fmt_in.audio.i_bitspersample = 8;
342 /* Set output properties */
343 p_dec->fmt_out.i_cat = AUDIO_ES;
344 p_dec->fmt_out.audio.i_rate = p_dec->fmt_in.audio.i_rate;
345 p_dec->fmt_out.audio.i_channels = p_dec->fmt_in.audio.i_channels;
346 p_dec->fmt_out.audio.i_bitspersample = p_dec->fmt_in.audio.i_bitspersample;
347 p_dec->fmt_out.audio.i_physical_channels =
348 p_dec->fmt_out.audio.i_original_channels =
349 pi_channels_maps[p_dec->fmt_in.audio.i_channels];
350 if( p_dec->fmt_in.audio.i_physical_channels )
351 p_dec->fmt_out.audio.i_physical_channels =
352 p_dec->fmt_in.audio.i_physical_channels;
353 if( p_dec->fmt_in.audio.i_original_channels )
354 p_dec->fmt_out.audio.i_original_channels =
355 p_dec->fmt_in.audio.i_original_channels;
357 if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'l', 'a', 'w' ) ||
358 p_dec->fmt_in.i_codec == VLC_FOURCC( 'u', 'l', 'a', 'w' ) ||
359 p_dec->fmt_in.i_codec == VLC_FOURCC( 'm', 'l', 'a', 'w' ) )
361 p_dec->fmt_out.audio.i_bitspersample = 16;
364 aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
365 aout_DateSet( &p_sys->end_date, 0 );
367 p_dec->pf_decode_audio = DecodeBlock;
372 /****************************************************************************
373 * DecodeBlock: the whole thing
374 ****************************************************************************
375 * This function must be fed with whole samples (see nBlockAlign).
376 ****************************************************************************/
377 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
379 decoder_sys_t *p_sys = p_dec->p_sys;
381 aout_buffer_t *p_out;
384 if( !pp_block || !*pp_block ) return NULL;
388 if( p_block->i_pts != 0 &&
389 p_block->i_pts != aout_DateGet( &p_sys->end_date ) )
391 aout_DateSet( &p_sys->end_date, p_block->i_pts );
393 else if( !aout_DateGet( &p_sys->end_date ) )
395 /* We've just started the stream, wait for the first PTS. */
396 block_Release( p_block );
400 /* Don't re-use the same pts twice */
403 i_samples = p_block->i_buffer * 8 / p_dec->fmt_in.audio.i_bitspersample /
404 p_dec->fmt_in.audio.i_channels;
408 block_Release( p_block );
412 /* Create chunks of max 1024 samples */
413 i_samples = __MIN( i_samples, 1024 );
415 p_out = p_dec->pf_aout_buffer_new( p_dec, i_samples );
418 block_Release( p_block );
422 p_out->start_date = aout_DateGet( &p_sys->end_date );
423 p_out->end_date = aout_DateIncrement( &p_sys->end_date, i_samples );
425 if( p_sys->p_logtos16 )
427 int16_t *s = (int16_t*)p_out->p_buffer;
430 for( i = 0; i < p_out->i_nb_bytes / 2; i++ )
432 *s++ = p_sys->p_logtos16[*p_block->p_buffer++];
438 memcpy( p_out->p_buffer, p_block->p_buffer, p_out->i_nb_bytes );
439 p_block->p_buffer += p_out->i_nb_bytes;
440 p_block->i_buffer -= p_out->i_nb_bytes;
446 /*****************************************************************************
447 * DecoderClose: decoder destruction
448 *****************************************************************************/
449 static void DecoderClose( vlc_object_t *p_this )
451 decoder_t *p_dec = (decoder_t *)p_this;
453 free( p_dec->p_sys );
456 /*****************************************************************************
458 *****************************************************************************/
459 static int EncoderOpen( vlc_object_t *p_this )
461 encoder_t *p_enc = (encoder_t *)p_this;
463 if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','8',' ',' ') ||
464 p_enc->fmt_out.i_codec == VLC_FOURCC('s','8',' ',' ') )
466 p_enc->fmt_out.audio.i_bitspersample = 8;
468 else if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','1','6','l') ||
469 p_enc->fmt_out.i_codec == VLC_FOURCC('u','1','6','b') ||
470 p_enc->fmt_out.i_codec == VLC_FOURCC('s','1','6','l') ||
471 p_enc->fmt_out.i_codec == VLC_FOURCC('s','1','6','b') )
473 p_enc->fmt_out.audio.i_bitspersample = 16;
475 else if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','2','4','l') ||
476 p_enc->fmt_out.i_codec == VLC_FOURCC('u','2','4','b') ||
477 p_enc->fmt_out.i_codec == VLC_FOURCC('s','2','4','l') ||
478 p_enc->fmt_out.i_codec == VLC_FOURCC('s','2','4','b') )
480 p_enc->fmt_out.audio.i_bitspersample = 24;
482 else if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','3','2','l') ||
483 p_enc->fmt_out.i_codec == VLC_FOURCC('u','3','2','b') ||
484 p_enc->fmt_out.i_codec == VLC_FOURCC('s','3','2','l') ||
485 p_enc->fmt_out.i_codec == VLC_FOURCC('s','3','2','b') ||
486 p_enc->fmt_out.i_codec == VLC_FOURCC('f','i','3','2') ||
487 p_enc->fmt_out.i_codec == VLC_FOURCC('f','l','3','2') )
489 p_enc->fmt_out.audio.i_bitspersample = 32;
491 else if( p_enc->fmt_out.i_codec == VLC_FOURCC('f','l','6','4') )
493 p_enc->fmt_out.audio.i_bitspersample = 64;
501 p_enc->pf_encode_audio = EncoderEncode;
502 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
507 /*****************************************************************************
509 *****************************************************************************/
510 static void EncoderClose ( vlc_object_t *p_this )
515 /*****************************************************************************
517 *****************************************************************************/
518 static block_t *EncoderEncode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
520 block_t *p_block = NULL;
522 if( !p_aout_buf || !p_aout_buf->i_nb_bytes ) return NULL;
524 if( ( p_block = block_New( p_enc, p_aout_buf->i_nb_bytes ) ) )
526 memcpy( p_block->p_buffer, p_aout_buf->p_buffer,
527 p_aout_buf->i_nb_bytes );
532 p_block->i_dts = p_block->i_pts = p_aout_buf->start_date;
533 p_block->i_length = (int64_t)p_aout_buf->i_nb_samples *
534 (int64_t)1000000 / p_enc->fmt_in.audio.i_rate;