]> git.sesse.net Git - vlc/blob - modules/codec/araw.c
* modules/codec/araw.c: got rid of the audio conversion in the encoder, which is...
[vlc] / modules / codec / araw.c
1 /*****************************************************************************
2  * araw.c: Pseudo audio decoder; for raw pcm data
3  *****************************************************************************
4  * Copyright (C) 2001, 2003 VideoLAN
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *
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.
13  *
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.
18  *
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  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #include <vlc/vlc.h>
28 #include <vlc/decoder.h>
29
30 /*****************************************************************************
31  * Module descriptor
32  *****************************************************************************/
33 static int  DecoderOpen ( vlc_object_t * );
34 static void DecoderClose( vlc_object_t * );
35
36 static int  EncoderOpen ( vlc_object_t * );
37 static void EncoderClose( vlc_object_t * );
38
39 vlc_module_begin();
40     /* audio decoder module */
41     set_description( _("Raw/Log Audio decoder") );
42     set_capability( "decoder", 100 );
43     set_callbacks( DecoderOpen, DecoderClose );
44
45     /* audio encoder submodule */
46     add_submodule();
47     set_description( _("Raw audio encoder") );
48     set_capability( "encoder", 150 );
49     set_callbacks( EncoderOpen, EncoderClose );
50 vlc_module_end();
51
52 /*****************************************************************************
53  * Local prototypes
54  *****************************************************************************/
55 static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
56 static block_t *EncoderEncode( encoder_t *, aout_buffer_t * );
57
58 struct decoder_sys_t
59 {
60     int16_t *p_logtos16;  /* used with m/alaw to int16_t */
61
62     audio_date_t end_date;
63 };
64
65 static int pi_channels_maps[7] =
66 {
67     0,
68     AOUT_CHAN_CENTER,
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
77 };
78
79 static int16_t ulawtos16[256] =
80 {
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
113 };
114
115 static int16_t alawtos16[256] =
116 {
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
149 };
150
151 /*****************************************************************************
152  * DecoderOpen: probe the decoder and return score
153  *****************************************************************************/
154 static int DecoderOpen( vlc_object_t *p_this )
155 {
156     decoder_t *p_dec = (decoder_t*)p_this;
157     decoder_sys_t *p_sys;
158
159     switch( p_dec->fmt_in.i_codec )
160     {
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'):
168
169     case VLC_FOURCC('a','l','a','w'):
170     case VLC_FOURCC('u','l','a','w'):
171     case VLC_FOURCC('m','l','a','w'):
172
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',' ',' '):
183         break;
184
185     default:
186         return VLC_EGENERIC;
187     }
188
189     if( p_dec->fmt_in.audio.i_channels <= 0 ||
190         p_dec->fmt_in.audio.i_channels > 6 )
191     {
192         msg_Err( p_dec, "bad channels count(1-6)" );
193         return VLC_EGENERIC;
194     }
195
196     if( p_dec->fmt_in.audio.i_rate <= 0 )
197     {
198         msg_Err( p_dec, "bad samplerate" );
199         return VLC_EGENERIC;
200     }
201
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 )
205     {
206         msg_Err( p_dec, "out of memory" );
207         return VLC_EGENERIC;
208     }
209
210     p_sys->p_logtos16 = NULL;
211
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 );
215
216     if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'f', 'l', '6', '4' ) )
217     {
218         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
219         p_dec->fmt_in.audio.i_bitspersample = 64;
220     }
221     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'f', 'l', '3', '2' ) )
222     {
223         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
224         p_dec->fmt_in.audio.i_bitspersample = 32;
225     }
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' ) )
228     {
229         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
230         p_dec->fmt_in.audio.i_bitspersample = 32;
231     }
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' ) )
234     {
235         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
236         p_dec->fmt_in.audio.i_bitspersample = 24;
237     }
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' ) )
240     {
241         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
242         p_dec->fmt_in.audio.i_bitspersample = 16;
243     }
244     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '8', ' ', ' ' ) ||
245              p_dec->fmt_in.i_codec == VLC_FOURCC( 'u', '8', ' ', ' ' ) )
246     {
247         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
248         p_dec->fmt_in.audio.i_bitspersample = 8;
249     }
250     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
251     {
252         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
253         {
254         case 4:
255             p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
256             break;
257         case 8:
258             p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','6','4');
259             break;
260         default:
261             msg_Err( p_dec, "bad parameters(bits/sample)" );
262             return VLC_EGENERIC;
263         }
264     }
265     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
266     {
267         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
268         {
269         case 1:
270             p_dec->fmt_out.i_codec = VLC_FOURCC('u','8',' ',' ');
271             break;
272         case 2:
273             p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
274             break;
275         case 3:
276             p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
277             break;
278         case 4:
279             p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
280             break;
281         default:
282             msg_Err( p_dec, "bad parameters(bits/sample)" );
283             return VLC_EGENERIC;
284         }
285     }
286     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 't', 'w', 'o', 's' ) )
287     {
288         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
289         {
290         case 1:
291             p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
292             break;
293         case 2:
294             p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','b');
295             break;
296         case 3:
297             p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','b');
298             break;
299         case 4:
300             p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','b');
301             break;
302         default:
303             msg_Err( p_dec, "bad parameters(bits/sample)" );
304             return VLC_EGENERIC;
305         }
306     }
307     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', 'o', 'w', 't' ) )
308     {
309         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
310         {
311         case 1:
312             p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
313             break;
314         case 2:
315             p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
316             break;
317         case 3:
318             p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
319             break;
320         case 4:
321             p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
322             break;
323         default:
324             msg_Err( p_dec, "bad parameters(bits/sample)" );
325             return VLC_EGENERIC;
326         }
327     }
328     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'l', 'a', 'w' ) )
329     {
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;
333     }
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' ) )
336     {
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;
340     }
341
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;
356
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' ) )
360     {
361         p_dec->fmt_out.audio.i_bitspersample = 16;
362     }
363
364     aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
365     aout_DateSet( &p_sys->end_date, 0 );
366
367     p_dec->pf_decode_audio = DecodeBlock;
368
369     return VLC_SUCCESS;
370 }
371
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 )
378 {
379     decoder_sys_t *p_sys = p_dec->p_sys;
380     block_t *p_block;
381     aout_buffer_t *p_out;
382     int i_samples;
383
384     if( !pp_block || !*pp_block ) return NULL;
385
386     p_block = *pp_block;
387
388     if( p_block->i_pts != 0 &&
389         p_block->i_pts != aout_DateGet( &p_sys->end_date ) )
390     {
391         aout_DateSet( &p_sys->end_date, p_block->i_pts );
392     }
393     else if( !aout_DateGet( &p_sys->end_date ) )
394     {
395         /* We've just started the stream, wait for the first PTS. */
396         block_Release( p_block );
397         return NULL;
398     }
399
400     /* Don't re-use the same pts twice */
401     p_block->i_pts = 0;
402
403     i_samples = p_block->i_buffer * 8 / p_dec->fmt_in.audio.i_bitspersample /
404         p_dec->fmt_in.audio.i_channels;
405
406     if( i_samples <= 0 )
407     {
408         block_Release( p_block );
409         return NULL;
410     }
411
412     /* Create chunks of max 1024 samples */
413     i_samples = __MIN( i_samples, 1024 );
414
415     p_out = p_dec->pf_aout_buffer_new( p_dec, i_samples );
416     if( p_out == NULL )
417     {
418         block_Release( p_block );
419         return NULL;
420     }
421
422     p_out->start_date = aout_DateGet( &p_sys->end_date );
423     p_out->end_date   = aout_DateIncrement( &p_sys->end_date, i_samples );
424
425     if( p_sys->p_logtos16 )
426     {
427         int16_t *s = (int16_t*)p_out->p_buffer;
428         unsigned int i;
429
430         for( i = 0; i < p_out->i_nb_bytes / 2; i++ )
431         {
432             *s++ = p_sys->p_logtos16[*p_block->p_buffer++];
433             p_block->i_buffer--;
434         }
435     }
436     else
437     {
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;
441     }
442
443     return p_out;
444 }
445
446 /*****************************************************************************
447  * DecoderClose: decoder destruction
448  *****************************************************************************/
449 static void DecoderClose( vlc_object_t *p_this )
450 {
451     decoder_t *p_dec = (decoder_t *)p_this;
452
453     free( p_dec->p_sys );
454 }
455
456 /*****************************************************************************
457  * EncoderOpen:
458  *****************************************************************************/
459 static int EncoderOpen( vlc_object_t *p_this )
460 {
461     encoder_t *p_enc = (encoder_t *)p_this;
462
463     if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','8',' ',' ') ||
464         p_enc->fmt_out.i_codec == VLC_FOURCC('s','8',' ',' ') )
465     {
466         p_enc->fmt_out.audio.i_bitspersample = 8;
467     }
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') )
472     {
473         p_enc->fmt_out.audio.i_bitspersample = 16;
474     }
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') )
479     {
480         p_enc->fmt_out.audio.i_bitspersample = 24;
481     }
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') )
488     {
489         p_enc->fmt_out.audio.i_bitspersample = 32;
490     }
491     else if( p_enc->fmt_out.i_codec == VLC_FOURCC('f','l','6','4') )
492     {
493         p_enc->fmt_out.audio.i_bitspersample = 64;
494     }
495     else
496     {
497         return VLC_EGENERIC;
498     }
499
500     p_enc->p_sys = NULL;
501     p_enc->pf_encode_audio = EncoderEncode;
502     p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
503
504     return VLC_SUCCESS;
505 }
506
507 /*****************************************************************************
508  * EncoderClose:
509  *****************************************************************************/
510 static void EncoderClose ( vlc_object_t *p_this )
511 {
512     return;
513 }
514
515 /*****************************************************************************
516  * EncoderEncode:
517  *****************************************************************************/
518 static block_t *EncoderEncode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
519 {
520     block_t *p_block = NULL;
521
522     if( !p_aout_buf || !p_aout_buf->i_nb_bytes ) return NULL;
523
524     if( ( p_block = block_New( p_enc, p_aout_buf->i_nb_bytes ) ) )
525     {
526         memcpy( p_block->p_buffer, p_aout_buf->p_buffer,
527                 p_aout_buf->i_nb_bytes );
528     }
529
530     if( p_block )
531     {
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;
535     }
536
537     return p_block;
538 }