]> git.sesse.net Git - vlc/blob - modules/codec/flac.c
use proper error
[vlc] / modules / codec / flac.c
1 /*****************************************************************************
2  * flac.c: flac decoder/packetizer/encoder module making use of libflac
3  *****************************************************************************
4  * Copyright (C) 1999-2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@videolan.org>
8  *          Sigmund Augdal Helberg <dnumgis@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28
29 #ifdef HAVE_CONFIG_H
30 # include "config.h"
31 #endif
32
33 #include <vlc/vlc.h>
34 #include <vlc_codec.h>
35 #include <vlc_aout.h>
36
37 #ifdef HAVE_FLAC_STREAM_DECODER_H
38 #   include <FLAC/stream_decoder.h>
39 #   include <FLAC/stream_encoder.h>
40 #   define USE_LIBFLAC
41 #endif
42
43 #include <vlc_block_helper.h>
44 #include <vlc_bits.h>
45
46 #define MAX_FLAC_HEADER_SIZE 16
47
48 #if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT >= 8
49 #   define USE_NEW_FLAC_API
50 #endif
51
52 /*****************************************************************************
53  * decoder_sys_t : FLAC decoder descriptor
54  *****************************************************************************/
55 struct decoder_sys_t
56 {
57     /*
58      * Input properties
59      */
60     int i_state;
61
62     block_bytestream_t bytestream;
63
64     /*
65      * Input/Output properties
66      */
67     block_t *p_block;
68     aout_buffer_t *p_aout_buffer;
69
70     /*
71      * FLAC properties
72      */
73 #ifdef USE_LIBFLAC
74     FLAC__StreamDecoder *p_flac;
75     FLAC__StreamMetadata_StreamInfo stream_info;
76 #else
77     struct
78     {
79         unsigned min_blocksize, max_blocksize;
80         unsigned min_framesize, max_framesize;
81         unsigned sample_rate;
82         unsigned channels;
83         unsigned bits_per_sample;
84
85     } stream_info;
86 #endif
87     vlc_bool_t b_stream_info;
88
89     /*
90      * Common properties
91      */
92     audio_date_t end_date;
93     mtime_t i_pts;
94
95     int i_frame_size, i_frame_length, i_bits_per_sample;
96     unsigned int i_rate, i_channels, i_channels_conf;
97 };
98
99 enum {
100
101     STATE_NOSYNC,
102     STATE_SYNC,
103     STATE_HEADER,
104     STATE_NEXT_SYNC,
105     STATE_GET_DATA,
106     STATE_SEND_DATA
107 };
108
109 static int pi_channels_maps[7] =
110 {
111     0,
112     AOUT_CHAN_CENTER,
113     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
114     AOUT_CHAN_CENTER | AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
115     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT
116      | AOUT_CHAN_REARRIGHT,
117     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
118      | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT,
119     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
120      | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE
121 };
122
123 /*****************************************************************************
124  * Local prototypes
125  *****************************************************************************/
126 static int  OpenDecoder   ( vlc_object_t * );
127 static int  OpenPacketizer( vlc_object_t * );
128 static void CloseDecoder  ( vlc_object_t * );
129
130 #ifdef USE_LIBFLAC
131 static int OpenEncoder   ( vlc_object_t * );
132 static void CloseEncoder ( vlc_object_t * );
133 #endif
134
135 #ifdef USE_LIBFLAC
136 static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
137 #endif
138 static block_t *PacketizeBlock( decoder_t *, block_t ** );
139
140 static int SyncInfo( decoder_t *, uint8_t *, unsigned int *, unsigned int *,
141                      unsigned int *,int * );
142
143
144 #ifdef USE_LIBFLAC
145 static FLAC__StreamDecoderReadStatus
146 DecoderReadCallback( const FLAC__StreamDecoder *decoder,
147                      FLAC__byte buffer[], unsigned *bytes, void *client_data );
148
149 static FLAC__StreamDecoderWriteStatus
150 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
151                       const FLAC__Frame *frame,
152                       const FLAC__int32 *const buffer[], void *client_data );
153
154 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
155                                      const FLAC__StreamMetadata *metadata,
156                                      void *client_data );
157 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
158                                   FLAC__StreamDecoderErrorStatus status,
159                                   void *client_data);
160
161 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
162                           int i_nb_channels, int i_samples );
163 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
164                           int i_nb_channels, int i_samples );
165
166 static void decoder_state_error( decoder_t *p_dec,
167                                  FLAC__StreamDecoderState state );
168 #endif
169
170 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read );
171 static uint8_t flac_crc8( const uint8_t *data, unsigned len );
172
173 /*****************************************************************************
174  * Module descriptor
175  *****************************************************************************/
176 vlc_module_begin();
177
178     set_category( CAT_INPUT );
179     set_subcategory( SUBCAT_INPUT_ACODEC );
180     add_shortcut( "flac" );
181
182 #ifdef USE_LIBFLAC
183     set_description( _("Flac audio decoder") );
184     set_capability( "decoder", 100 );
185     set_callbacks( OpenDecoder, CloseDecoder );
186
187     add_submodule();
188     set_description( _("Flac audio encoder") );
189     set_capability( "encoder", 100 );
190     set_callbacks( OpenEncoder, CloseEncoder );
191
192     add_submodule();
193 #endif
194     set_description( _("Flac audio packetizer") );
195     set_capability( "packetizer", 100 );
196     set_callbacks( OpenPacketizer, CloseDecoder );
197
198 vlc_module_end();
199
200 /*****************************************************************************
201  * OpenDecoder: probe the decoder and return score
202  *****************************************************************************/
203 static int OpenDecoder( vlc_object_t *p_this )
204 {
205     decoder_t *p_dec = (decoder_t*)p_this;
206     decoder_sys_t *p_sys;
207
208     if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','l','a','c') )
209     {
210         return VLC_EGENERIC;
211     }
212
213     /* Allocate the memory needed to store the decoder's structure */
214     if( ( p_dec->p_sys = p_sys =
215           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
216     {
217         msg_Err( p_dec, "out of memory" );
218         return VLC_ENOMEM;
219     }
220
221     /* Misc init */
222     aout_DateSet( &p_sys->end_date, 0 );
223     p_sys->i_state = STATE_NOSYNC;
224     p_sys->b_stream_info = VLC_FALSE;
225     p_sys->p_block=NULL;
226     p_sys->bytestream = block_BytestreamInit();
227
228 #ifdef USE_LIBFLAC
229     /* Take care of flac init */
230     if( !(p_sys->p_flac = FLAC__stream_decoder_new()) )
231     {
232         msg_Err( p_dec, "FLAC__stream_decoder_new() failed" );
233         free( p_sys );
234         return VLC_EGENERIC;
235     }
236
237 #ifdef USE_NEW_FLAC_API
238     if( FLAC__stream_decoder_init_stream( p_sys->p_flac,
239                                           DecoderReadCallback,
240                                           NULL,
241                                           NULL,
242                                           NULL,
243                                           NULL,
244                                           DecoderWriteCallback,
245                                           DecoderMetadataCallback,
246                                           DecoderErrorCallback,
247                                           p_dec )
248         != FLAC__STREAM_DECODER_INIT_STATUS_OK )
249     {
250         msg_Err( p_dec, "FLAC__stream_decoder_init_stream() failed" );
251         FLAC__stream_decoder_delete( p_sys->p_flac );
252         free( p_sys );
253         return VLC_EGENERIC;
254     }
255 #else
256     FLAC__stream_decoder_set_read_callback( p_sys->p_flac,
257                                             DecoderReadCallback );
258     FLAC__stream_decoder_set_write_callback( p_sys->p_flac,
259                                              DecoderWriteCallback );
260     FLAC__stream_decoder_set_metadata_callback( p_sys->p_flac,
261                                                 DecoderMetadataCallback );
262     FLAC__stream_decoder_set_error_callback( p_sys->p_flac,
263                                              DecoderErrorCallback );
264     FLAC__stream_decoder_set_client_data( p_sys->p_flac, p_dec );
265
266     FLAC__stream_decoder_init( p_sys->p_flac );
267 #endif
268 #endif
269
270     /* Set output properties */
271     p_dec->fmt_out.i_cat = AUDIO_ES;
272     p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
273
274     /* Set callbacks */
275 #ifdef USE_LIBFLAC
276     p_dec->pf_decode_audio = DecodeBlock;
277 #endif
278
279     return VLC_SUCCESS;
280 }
281
282 static int OpenPacketizer( vlc_object_t *p_this )
283 {
284     decoder_t *p_dec = (decoder_t*)p_this;
285     es_format_t es_save = p_dec->fmt_out;
286     int i_ret;
287
288     /* */
289     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
290
291     i_ret = OpenDecoder( p_this );
292     p_dec->pf_decode_audio = NULL;
293     p_dec->pf_packetize    = PacketizeBlock;
294
295     /* Set output properties */
296     p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
297
298     if( i_ret != VLC_SUCCESS )
299     {
300         es_format_Clean( &p_dec->fmt_out );
301         p_dec->fmt_out = es_save;
302     }
303     return i_ret;
304 }
305
306 /*****************************************************************************
307  * CloseDecoder: flac decoder destruction
308  *****************************************************************************/
309 static void CloseDecoder( vlc_object_t *p_this )
310 {
311     decoder_t *p_dec = (decoder_t *)p_this;
312     decoder_sys_t *p_sys = p_dec->p_sys;
313
314 #ifdef USE_LIBFLAC
315     FLAC__stream_decoder_finish( p_sys->p_flac );
316     FLAC__stream_decoder_delete( p_sys->p_flac );
317 #endif
318
319     if( p_sys->p_block ) free( p_sys->p_block );
320     free( p_sys );
321 }
322
323 /*****************************************************************************
324  * ProcessHeader: process Flac header.
325  *****************************************************************************/
326 static void ProcessHeader( decoder_t *p_dec )
327 {
328     decoder_sys_t *p_sys = p_dec->p_sys;
329
330 #ifdef USE_LIBFLAC
331     if( !p_dec->fmt_in.i_extra ) return;
332
333     /* Decode STREAMINFO */
334     msg_Dbg( p_dec, "decode STREAMINFO" );
335     p_sys->p_block = block_New( p_dec, p_dec->fmt_in.i_extra );
336     memcpy( p_sys->p_block->p_buffer, p_dec->fmt_in.p_extra,
337             p_dec->fmt_in.i_extra );
338     FLAC__stream_decoder_process_until_end_of_metadata( p_sys->p_flac );
339     msg_Dbg( p_dec, "STREAMINFO decoded" );
340
341 #else
342     bs_t bs;
343
344     if( !p_dec->fmt_in.i_extra ) return;
345
346     bs_init( &bs, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra );
347
348     p_sys->stream_info.min_blocksize = bs_read( &bs, 16 );
349     p_sys->stream_info.max_blocksize = bs_read( &bs, 16 );
350
351     p_sys->stream_info.min_framesize = bs_read( &bs, 24 );
352     p_sys->stream_info.max_framesize = bs_read( &bs, 24 );
353
354     p_sys->stream_info.sample_rate = bs_read( &bs, 20 );
355     p_sys->stream_info.channels = bs_read( &bs, 3 ) + 1;
356     p_sys->stream_info.bits_per_sample = bs_read( &bs, 5 ) + 1;
357 #endif
358
359     if( !p_sys->b_stream_info ) return;
360
361     if( p_dec->fmt_out.i_codec == VLC_FOURCC('f','l','a','c') )
362     {
363         p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
364         p_dec->fmt_out.p_extra =
365             realloc( p_dec->fmt_out.p_extra, p_dec->fmt_out.i_extra );
366         memcpy( p_dec->fmt_out.p_extra,
367                 p_dec->fmt_in.p_extra, p_dec->fmt_out.i_extra );
368     }
369 }
370
371 /****************************************************************************
372  * PacketizeBlock: the whole thing
373  ****************************************************************************
374  * This function is called just after the thread is launched.
375  ****************************************************************************/
376 static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
377 {
378     decoder_sys_t *p_sys = p_dec->p_sys;
379     uint8_t p_header[MAX_FLAC_HEADER_SIZE];
380     block_t *p_sout_block;
381
382     if( !pp_block || !*pp_block ) return NULL;
383
384     if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
385     {
386         if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
387         {
388             p_sys->i_state = STATE_NOSYNC;
389             block_BytestreamFlush( &p_sys->bytestream );
390         }
391 //        aout_DateSet( &p_sys->end_date, 0 );
392         block_Release( *pp_block );
393         return NULL;
394     }
395
396     if( !p_sys->b_stream_info ) ProcessHeader( p_dec );
397
398     if( p_sys->stream_info.channels > 6 )
399     {
400         msg_Err( p_dec, "This stream uses too many audio channels" );
401         return NULL;
402     }
403
404     if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
405     {
406         /* We've just started the stream, wait for the first PTS. */
407         block_Release( *pp_block );
408         return NULL;
409     }
410     else if( !aout_DateGet( &p_sys->end_date ) )
411     {
412         /* The first PTS is as good as anything else. */
413         aout_DateSet( &p_sys->end_date, (*pp_block)->i_pts );
414     }
415
416     block_BytestreamPush( &p_sys->bytestream, *pp_block );
417
418     while( 1 )
419     {
420         switch( p_sys->i_state )
421         {
422         case STATE_NOSYNC:
423             while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
424                    == VLC_SUCCESS )
425             {
426                 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
427                 {
428                     p_sys->i_state = STATE_SYNC;
429                     break;
430                 }
431                 block_SkipByte( &p_sys->bytestream );
432             }
433             if( p_sys->i_state != STATE_SYNC )
434             {
435                 block_BytestreamFlush( &p_sys->bytestream );
436
437                 /* Need more data */
438                 return NULL;
439             }
440
441         case STATE_SYNC:
442             /* New frame, set the Presentation Time Stamp */
443             p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
444             if( p_sys->i_pts != 0 &&
445                 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
446             {
447                 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
448             }
449             p_sys->i_state = STATE_HEADER;
450
451         case STATE_HEADER:
452             /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
453             if( block_PeekBytes( &p_sys->bytestream, p_header,
454                                  MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
455             {
456                 /* Need more data */
457                 return NULL;
458             }
459
460             /* Check if frame is valid and get frame info */
461             p_sys->i_frame_length = SyncInfo( p_dec, p_header,
462                                               &p_sys->i_channels,
463                                               &p_sys->i_channels_conf,
464                                               &p_sys->i_rate,
465                                               &p_sys->i_bits_per_sample );
466             if( !p_sys->i_frame_length )
467             {
468                 msg_Dbg( p_dec, "emulated sync word" );
469                 block_SkipByte( &p_sys->bytestream );
470                 p_sys->i_state = STATE_NOSYNC;
471                 break;
472             }
473             if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
474             {
475                 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
476                 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
477             }
478             p_sys->i_state = STATE_NEXT_SYNC;
479             p_sys->i_frame_size = 1;
480
481         case STATE_NEXT_SYNC:
482             /* TODO: If pp_block == NULL, flush the buffer without checking the
483              * next sync word */
484
485             /* Check if next expected frame contains the sync word */
486             while( block_PeekOffsetBytes( &p_sys->bytestream,
487                                           p_sys->i_frame_size, p_header,
488                                           MAX_FLAC_HEADER_SIZE )
489                    == VLC_SUCCESS )
490             {
491                 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
492                 {
493                     /* Check if frame is valid and get frame info */
494                     int i_frame_length =
495                         SyncInfo( p_dec, p_header,
496                                   &p_sys->i_channels,
497                                   &p_sys->i_channels_conf,
498                                   &p_sys->i_rate,
499                                   &p_sys->i_bits_per_sample );
500
501                     if( i_frame_length )
502                     {
503                         p_sys->i_state = STATE_SEND_DATA;
504                         break;
505                     }
506                 }
507                 p_sys->i_frame_size++;
508             }
509
510             if( p_sys->i_state != STATE_SEND_DATA )
511             {
512                 /* Need more data */
513                 return NULL;
514             }
515
516         case STATE_SEND_DATA:
517             p_sout_block = block_New( p_dec, p_sys->i_frame_size );
518
519             /* Copy the whole frame into the buffer. When we reach this point
520              * we already know we have enough data available. */
521             block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
522                             p_sys->i_frame_size );
523
524             /* Make sure we don't reuse the same pts twice */
525             if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
526                 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
527
528             /* So p_block doesn't get re-added several times */
529             *pp_block = block_BytestreamPop( &p_sys->bytestream );
530
531             p_sys->i_state = STATE_NOSYNC;
532
533             /* Date management */
534             p_sout_block->i_pts =
535                 p_sout_block->i_dts = aout_DateGet( &p_sys->end_date );
536             aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
537             p_sout_block->i_length =
538                 aout_DateGet( &p_sys->end_date ) - p_sout_block->i_pts;
539
540             return p_sout_block;
541         }
542     }
543
544     return NULL;
545 }
546
547 #ifdef USE_LIBFLAC
548 /****************************************************************************
549  * DecodeBlock: the whole thing
550  ****************************************************************************/
551 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
552 {
553     decoder_sys_t *p_sys = p_dec->p_sys;
554
555     if( !pp_block || !*pp_block ) return NULL;
556
557     p_sys->p_aout_buffer = 0;
558     if( ( p_sys->p_block = PacketizeBlock( p_dec, pp_block ) ) )
559     {
560         if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) )
561         {
562             decoder_state_error( p_dec,
563                 FLAC__stream_decoder_get_state( p_sys->p_flac ) );
564             FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
565         }
566
567         /* If the decoder is in the "aborted" state,
568          * FLAC__stream_decoder_process_single() won't return an error. */
569         if( FLAC__stream_decoder_get_state(p_dec->p_sys->p_flac)
570             == FLAC__STREAM_DECODER_ABORTED )
571         {
572             FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
573         }
574
575         block_Release( p_sys->p_block );
576         p_sys->p_block = NULL;
577     }
578
579     return p_sys->p_aout_buffer;
580 }
581
582 /*****************************************************************************
583  * DecoderReadCallback: called by libflac when it needs more data
584  *****************************************************************************/
585 static FLAC__StreamDecoderReadStatus
586 DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
587                      unsigned *bytes, void *client_data )
588 {
589     VLC_UNUSED(decoder);
590     decoder_t *p_dec = (decoder_t *)client_data;
591     decoder_sys_t *p_sys = p_dec->p_sys;
592
593     if( p_sys->p_block && p_sys->p_block->i_buffer )
594     {
595         *bytes = __MIN(*bytes, (unsigned)p_sys->p_block->i_buffer);
596         memcpy( buffer, p_sys->p_block->p_buffer, *bytes );
597         p_sys->p_block->i_buffer -= *bytes;
598         p_sys->p_block->p_buffer += *bytes;
599     }
600     else
601     {
602         *bytes = 0;
603         return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
604     }
605
606     return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
607 }
608
609 /*****************************************************************************
610  * DecoderWriteCallback: called by libflac to output decoded samples
611  *****************************************************************************/
612 static FLAC__StreamDecoderWriteStatus
613 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
614                       const FLAC__Frame *frame,
615                       const FLAC__int32 *const buffer[], void *client_data )
616 {
617     VLC_UNUSED(decoder);
618     decoder_t *p_dec = (decoder_t *)client_data;
619     decoder_sys_t *p_sys = p_dec->p_sys;
620
621     p_sys->p_aout_buffer =
622         p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize );
623
624     if( p_sys->p_aout_buffer == NULL )
625         return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
626
627     switch( frame->header.bits_per_sample )
628     {
629     case 16:
630         Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
631                       frame->header.channels, frame->header.blocksize );
632         break;
633     default:
634         Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
635                       frame->header.channels, frame->header.blocksize );
636     }
637
638     /* Date management (already done by packetizer) */
639     p_sys->p_aout_buffer->start_date = p_sys->p_block->i_pts;
640     p_sys->p_aout_buffer->end_date =
641         p_sys->p_block->i_pts + p_sys->p_block->i_length;
642
643     return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
644 }
645
646 /*****************************************************************************
647  * DecoderMetadataCallback: called by libflac to when it encounters metadata
648  *****************************************************************************/
649 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
650                                      const FLAC__StreamMetadata *metadata,
651                                      void *client_data )
652 {
653     VLC_UNUSED(decoder);
654     decoder_t *p_dec = (decoder_t *)client_data;
655     decoder_sys_t *p_sys = p_dec->p_sys;
656
657     if( p_dec->pf_decode_audio )
658     {
659         switch( metadata->data.stream_info.bits_per_sample )
660         {
661         case 8:
662             p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
663             break;
664         case 16:
665             p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
666             break;
667         default:
668             msg_Dbg( p_dec, "strange bit/sample value: %d",
669                      metadata->data.stream_info.bits_per_sample );
670             p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
671             break;
672         }
673     }
674
675     /* Setup the format */
676     p_dec->fmt_out.audio.i_rate     = metadata->data.stream_info.sample_rate;
677     p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
678     p_dec->fmt_out.audio.i_physical_channels =
679         p_dec->fmt_out.audio.i_original_channels =
680             pi_channels_maps[metadata->data.stream_info.channels];
681     p_dec->fmt_out.audio.i_bitspersample =
682         metadata->data.stream_info.bits_per_sample;
683
684     aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
685
686     msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
687              p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
688              p_dec->fmt_out.audio.i_bitspersample );
689
690     p_sys->b_stream_info = VLC_TRUE;
691     p_sys->stream_info = metadata->data.stream_info;
692
693     return;
694 }
695
696 /*****************************************************************************
697  * DecoderErrorCallback: called when the libflac decoder encounters an error
698  *****************************************************************************/
699 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
700                                   FLAC__StreamDecoderErrorStatus status,
701                                   void *client_data )
702 {
703     VLC_UNUSED(decoder);
704     decoder_t *p_dec = (decoder_t *)client_data;
705
706     switch( status )
707     {
708     case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
709         msg_Warn( p_dec, "an error in the stream caused the decoder to "
710                  "lose synchronization." );
711         break;
712     case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
713         msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
714         break;
715     case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
716         msg_Err( p_dec, "frame's data did not match the CRC in the "
717                  "footer." );
718         break;
719     default:
720         msg_Err( p_dec, "got decoder error: %d", status );
721     }
722
723     FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
724     return;
725 }
726
727 /*****************************************************************************
728  * Interleave: helper function to interleave channels
729  *****************************************************************************/
730 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
731                           int i_nb_channels, int i_samples )
732 {
733     int i, j;
734     for ( j = 0; j < i_samples; j++ )
735     {
736         for ( i = 0; i < i_nb_channels; i++ )
737         {
738             p_out[j * i_nb_channels + i] = pp_in[i][j];
739         }
740     }
741 }
742 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
743                           int i_nb_channels, int i_samples )
744 {
745     int i, j;
746     for ( j = 0; j < i_samples; j++ )
747     {
748         for ( i = 0; i < i_nb_channels; i++ )
749         {
750             p_out[j * i_nb_channels + i] = (int32_t)(pp_in[i][j]);
751         }
752     }
753 }
754
755 /*****************************************************************************
756  * decoder_state_error: print meaningful error messages
757  *****************************************************************************/
758 static void decoder_state_error( decoder_t *p_dec,
759                                  FLAC__StreamDecoderState state )
760 {
761     switch ( state )
762     {
763     case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
764         msg_Dbg( p_dec, "the decoder is ready to search for metadata." );
765         break;
766     case FLAC__STREAM_DECODER_READ_METADATA:
767         msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
768                  "reading metadata." );
769         break;
770     case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
771         msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
772                  "searching for the frame sync code." );
773         break;
774     case FLAC__STREAM_DECODER_READ_FRAME:
775         msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
776                  "reading a frame." );
777         break;
778     case FLAC__STREAM_DECODER_END_OF_STREAM:
779         msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
780         break;
781 #ifdef USE_NEW_FLAC_API
782     case FLAC__STREAM_DECODER_OGG_ERROR:
783         msg_Err( p_dec, "error occurred in the Ogg layer." );
784         break;
785     case FLAC__STREAM_DECODER_SEEK_ERROR:
786         msg_Err( p_dec, "error occurred while seeking." );
787         break;
788 #endif
789     case FLAC__STREAM_DECODER_ABORTED:
790         msg_Warn( p_dec, "the decoder was aborted by the read callback." );
791         break;
792 #ifndef USE_NEW_FLAC_API
793     case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
794         msg_Warn( p_dec, "the decoder encountered reserved fields in use "
795                  "in the stream." );
796         break;
797 #endif
798     case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
799         msg_Err( p_dec, "error when allocating memory." );
800         break;
801 #ifndef USE_NEW_FLAC_API
802     case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
803         msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
804                  "decoder was already initialized, usually because "
805                  "FLAC__stream_decoder_finish() was not called." );
806         break;
807     case FLAC__STREAM_DECODER_INVALID_CALLBACK:
808         msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
809                  "all callbacks being set." );
810         break;
811 #endif
812     case FLAC__STREAM_DECODER_UNINITIALIZED:
813         msg_Err( p_dec, "decoder in uninitialized state." );
814         break;
815     default:
816         msg_Warn(p_dec, "unknown error" );
817     }
818 }
819 #endif
820
821 /*****************************************************************************
822  * SyncInfo: parse FLAC sync info
823  *****************************************************************************/
824 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
825                      unsigned int * pi_channels,
826                      unsigned int * pi_channels_conf,
827                      unsigned int * pi_sample_rate,
828                      int * pi_bits_per_sample )
829 {
830     decoder_sys_t *p_sys = p_dec->p_sys;
831     int i_header, i_temp, i_read;
832     int i_blocksize = 0, i_blocksize_hint = 0, i_sample_rate_hint = 0;
833     uint64_t i_sample_number = 0;
834
835     vlc_bool_t b_variable_blocksize = ( p_sys->b_stream_info &&
836         p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
837     vlc_bool_t b_fixed_blocksize = ( p_sys->b_stream_info &&
838         p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
839
840     /* Check syncword */
841     if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
842
843     /* Check there is no emulated sync code in the rest of the header */
844     if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
845
846     /* Find blocksize (framelength) */
847     switch( i_temp = p_buf[2] >> 4 )
848     {
849     case 0:
850         if( b_fixed_blocksize )
851             i_blocksize = p_sys->stream_info.min_blocksize;
852         else return 0; /* We can't do anything with this */
853         break;
854
855     case 1:
856         i_blocksize = 192;
857         break;
858
859     case 2:
860     case 3:
861     case 4:
862     case 5:
863         i_blocksize = 576 << (i_temp - 2);
864         break;
865
866     case 6:
867     case 7:
868         i_blocksize_hint = i_temp;
869         break;
870
871     case 8:
872     case 9:
873     case 10:
874     case 11:
875     case 12:
876     case 13:
877     case 14:
878     case 15:
879         i_blocksize = 256 << (i_temp - 8);
880         break;
881     }
882
883     /* Find samplerate */
884     switch( i_temp = p_buf[2] & 0x0f )
885     {
886     case 0:
887         if( p_sys->b_stream_info )
888             *pi_sample_rate = p_sys->stream_info.sample_rate;
889         else return 0; /* We can't do anything with this */
890         break;
891
892     case 1:
893     case 2:
894     case 3:
895         return 0;
896         break;
897
898     case 4:
899         *pi_sample_rate = 8000;
900         break;
901
902     case 5:
903         *pi_sample_rate = 16000;
904         break;
905
906     case 6:
907         *pi_sample_rate = 22050;
908         break;
909
910     case 7:
911         *pi_sample_rate = 24000;
912         break;
913
914     case 8:
915         *pi_sample_rate = 32000;
916         break;
917
918     case 9:
919         *pi_sample_rate = 44100;
920         break;
921
922     case 10:
923         *pi_sample_rate = 48000;
924         break;
925
926     case 11:
927         *pi_sample_rate = 96000;
928         break;
929
930     case 12:
931     case 13:
932     case 14:
933         i_sample_rate_hint = i_temp;
934         break;
935
936     case 15:
937         return 0;
938     }
939
940     /* Find channels */
941     i_temp = (unsigned)(p_buf[3] >> 4);
942     if( i_temp & 8 )
943     {
944 #ifdef USE_LIBFLAC
945         int i_channel_assignment; /* ??? */
946
947         switch( i_temp & 7 )
948         {
949         case 0:
950             i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
951             break;
952         case 1:
953             i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
954             break;
955         case 2:
956             i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
957             break;
958         default:
959             return 0;
960             break;
961         }
962 #endif
963
964         *pi_channels = 2;
965     }
966     else
967     {
968         *pi_channels = i_temp + 1;
969         *pi_channels_conf = pi_channels_maps[ *pi_channels ];
970     }
971
972     /* Find bits per sample */
973     switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
974     {
975     case 0:
976         if( p_sys->b_stream_info )
977             *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
978         else
979             return 0;
980         break;
981
982     case 1:
983         *pi_bits_per_sample = 8;
984         break;
985
986     case 2:
987         *pi_bits_per_sample = 12;
988         break;
989
990     case 4:
991         *pi_bits_per_sample = 16;
992         break;
993
994     case 5:
995         *pi_bits_per_sample = 20;
996         break;
997
998     case 6:
999         *pi_bits_per_sample = 24;
1000         break;
1001
1002     case 3:
1003     case 7:
1004         return 0;
1005         break;
1006     }
1007
1008     /* Zero padding bit */
1009     if( p_buf[3] & 0x01 ) return 0;
1010
1011     /* End of fixed size header */
1012     i_header = 4;
1013
1014     /* Find Sample/Frame number */
1015     if( i_blocksize_hint && b_variable_blocksize )
1016     {
1017         i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1018         if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
1019     }
1020     else
1021     {
1022         i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1023         if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
1024
1025         if( p_sys->b_stream_info )
1026             i_sample_number *= p_sys->stream_info.min_blocksize;
1027     }
1028
1029     i_header += i_read;
1030
1031     /* Read blocksize */
1032     if( i_blocksize_hint )
1033     {
1034         int i_val1 = p_buf[i_header++];
1035         if( i_blocksize_hint == 7 )
1036         {
1037             int i_val2 = p_buf[i_header++];
1038             i_val1 = (i_val1 << 8) | i_val2;
1039         }
1040         i_blocksize = i_val1 + 1;
1041     }
1042
1043     /* Read sample rate */
1044     if( i_sample_rate_hint )
1045     {
1046         int i_val1 = p_buf[i_header++];
1047         if( i_sample_rate_hint != 12 )
1048         {
1049             int i_val2 = p_buf[i_header++];
1050             i_val1 = (i_val1 << 8) | i_val2;
1051         }
1052         if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
1053         else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
1054         else *pi_sample_rate = i_val1 * 10;
1055     }
1056
1057     /* Check the CRC-8 byte */
1058     if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
1059     {
1060         return 0;
1061     }
1062
1063     return i_blocksize;
1064 }
1065
1066 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
1067 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
1068 {
1069     uint64_t i_result = 0;
1070     unsigned i, j;
1071
1072     if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
1073     {
1074         i_result = p_buf[0];
1075         i = 0;
1076     }
1077     else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
1078     {
1079         i_result = p_buf[0] & 0x1F;
1080         i = 1;
1081     }
1082     else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
1083     {
1084         i_result = p_buf[0] & 0x0F;
1085         i = 2;
1086     }
1087     else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
1088     {
1089         i_result = p_buf[0] & 0x07;
1090         i = 3;
1091     }
1092     else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
1093     {
1094         i_result = p_buf[0] & 0x03;
1095         i = 4;
1096     }
1097     else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
1098     {
1099         i_result = p_buf[0] & 0x01;
1100         i = 5;
1101     }
1102     else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
1103     {
1104         i_result = 0;
1105         i = 6;
1106     }
1107     else {
1108         return I64C(0xffffffffffffffff);
1109     }
1110
1111     for( j = 1; j <= i; j++ )
1112     {
1113         if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
1114         {
1115             return I64C(0xffffffffffffffff);
1116         }
1117         i_result <<= 6;
1118         i_result |= (p_buf[j] & 0x3F);
1119     }
1120
1121     *pi_read = i;
1122     return i_result;
1123 }
1124
1125 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
1126 static uint8_t const flac_crc8_table[256] = {
1127         0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1128         0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1129         0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1130         0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1131         0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
1132         0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
1133         0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
1134         0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
1135         0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
1136         0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
1137         0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
1138         0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
1139         0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
1140         0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
1141         0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
1142         0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
1143         0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
1144         0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
1145         0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
1146         0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
1147         0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
1148         0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
1149         0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
1150         0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
1151         0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
1152         0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
1153         0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
1154         0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1155         0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1156         0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1157         0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1158         0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1159 };
1160
1161 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1162 {
1163     uint8_t crc = 0;
1164
1165     while(len--)
1166         crc = flac_crc8_table[crc ^ *data++];
1167
1168     return crc;
1169 }
1170
1171 #ifdef USE_LIBFLAC
1172 /*****************************************************************************
1173  * encoder_sys_t : flac encoder descriptor
1174  *****************************************************************************/
1175 struct encoder_sys_t
1176 {
1177     /*
1178      * Input properties
1179      */
1180     int i_headers;
1181
1182     int i_samples_delay;
1183     int i_channels;
1184
1185     FLAC__int32 *p_buffer;
1186     unsigned int i_buffer;
1187
1188     block_t *p_chain;
1189
1190     /*
1191      * FLAC properties
1192      */
1193     FLAC__StreamEncoder *p_flac;
1194     FLAC__StreamMetadata_StreamInfo stream_info;
1195
1196     /*
1197      * Common properties
1198      */
1199     mtime_t i_pts;
1200 };
1201
1202 #define STREAMINFO_SIZE 38
1203
1204 static block_t *Encode( encoder_t *, aout_buffer_t * );
1205
1206 static FLAC__StreamEncoderWriteStatus
1207 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1208                       const FLAC__byte buffer[],
1209                       unsigned bytes, unsigned samples,
1210                       unsigned current_frame, void *client_data );
1211
1212 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1213                                      const FLAC__StreamMetadata *metadata,
1214                                      void *client_data );
1215
1216 /*****************************************************************************
1217  * OpenEncoder: probe the encoder and return score
1218  *****************************************************************************/
1219 static int OpenEncoder( vlc_object_t *p_this )
1220 {
1221     encoder_t *p_enc = (encoder_t *)p_this;
1222     encoder_sys_t *p_sys;
1223
1224     if( p_enc->fmt_out.i_codec != VLC_FOURCC('f','l','a','c') &&
1225         !p_enc->b_force )
1226     {
1227         return VLC_EGENERIC;
1228     }
1229
1230     /* Allocate the memory needed to store the decoder's structure */
1231     if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1232     {
1233         msg_Err( p_enc, "out of memory" );
1234         return VLC_EGENERIC;
1235     }
1236     p_enc->p_sys = p_sys;
1237     p_enc->pf_encode_audio = Encode;
1238     p_enc->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
1239
1240     p_sys->i_headers = 0;
1241     p_sys->p_buffer = 0;
1242     p_sys->i_buffer = 0;
1243     p_sys->i_samples_delay = 0;
1244
1245     /* Create flac encoder */
1246     if( !(p_sys->p_flac = FLAC__stream_encoder_new()) )
1247     {
1248         msg_Err( p_enc, "FLAC__stream_encoder_new() failed" );
1249         free( p_sys );
1250         return VLC_EGENERIC;
1251     }
1252
1253     FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1254     FLAC__stream_encoder_set_channels( p_sys->p_flac,
1255                                        p_enc->fmt_in.audio.i_channels );
1256     FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1257                                           p_enc->fmt_in.audio.i_rate );
1258     FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1259     p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
1260
1261     /* Get and store the STREAMINFO metadata block as a p_extra */
1262     p_sys->p_chain = 0;
1263
1264 #ifdef USE_NEW_FLAC_API
1265     if( FLAC__stream_encoder_init_stream( p_sys->p_flac,
1266                                           EncoderWriteCallback,
1267                                           NULL,
1268                                           NULL,
1269                                           EncoderMetadataCallback,
1270                                           p_enc )
1271         != FLAC__STREAM_ENCODER_INIT_STATUS_OK )
1272     {
1273         msg_Err( p_enc, "FLAC__stream_encoder_init_stream() failed" );
1274         FLAC__stream_encoder_delete( p_sys->p_flac );
1275         free( p_sys );
1276         return VLC_EGENERIC;
1277     }
1278 #else
1279     FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1280         EncoderWriteCallback );
1281     FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1282         EncoderMetadataCallback );
1283     FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1284
1285     FLAC__stream_encoder_init( p_sys->p_flac );
1286 #endif
1287
1288     return VLC_SUCCESS;
1289 }
1290
1291 /****************************************************************************
1292  * Encode: the whole thing
1293  ****************************************************************************
1294  * This function spits out ogg packets.
1295  ****************************************************************************/
1296 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1297 {
1298     encoder_sys_t *p_sys = p_enc->p_sys;
1299     block_t *p_chain;
1300     unsigned int i;
1301
1302     p_sys->i_pts = p_aout_buf->start_date -
1303                 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1304                 (mtime_t)p_enc->fmt_in.audio.i_rate;
1305
1306     p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1307
1308     /* Convert samples to FLAC__int32 */
1309     if( p_sys->i_buffer < p_aout_buf->i_nb_bytes * 2 )
1310     {
1311         p_sys->p_buffer =
1312             realloc( p_sys->p_buffer, p_aout_buf->i_nb_bytes * 2 );
1313         p_sys->i_buffer = p_aout_buf->i_nb_bytes * 2;
1314     }
1315
1316     for( i = 0 ; i < p_aout_buf->i_nb_bytes / 2 ; i++ )
1317     {
1318         p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1319     }
1320
1321     FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1322                                               p_aout_buf->i_nb_samples );
1323
1324     p_chain = p_sys->p_chain;
1325     p_sys->p_chain = 0;
1326
1327     return p_chain;
1328 }
1329
1330 /*****************************************************************************
1331  * CloseEncoder: encoder destruction
1332  *****************************************************************************/
1333 static void CloseEncoder( vlc_object_t *p_this )
1334 {
1335     encoder_t *p_enc = (encoder_t *)p_this;
1336     encoder_sys_t *p_sys = p_enc->p_sys;
1337
1338     FLAC__stream_encoder_delete( p_sys->p_flac );
1339
1340     if( p_sys->p_buffer ) free( p_sys->p_buffer );
1341     free( p_sys );
1342 }
1343
1344 /*****************************************************************************
1345  * EncoderMetadataCallback: called by libflac to output metadata
1346  *****************************************************************************/
1347 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1348                                      const FLAC__StreamMetadata *metadata,
1349                                      void *client_data )
1350 {
1351     VLC_UNUSED(encoder);
1352     encoder_t *p_enc = (encoder_t *)client_data;
1353
1354     msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1355     return;
1356 }
1357
1358 /*****************************************************************************
1359  * EncoderWriteCallback: called by libflac to output encoded samples
1360  *****************************************************************************/
1361 static FLAC__StreamEncoderWriteStatus
1362 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1363                       const FLAC__byte buffer[],
1364                       unsigned bytes, unsigned samples,
1365                       unsigned current_frame, void *client_data )
1366 {
1367     VLC_UNUSED(encoder); VLC_UNUSED(current_frame);
1368     encoder_t *p_enc = (encoder_t *)client_data;
1369     encoder_sys_t *p_sys = p_enc->p_sys;
1370     block_t *p_block;
1371
1372     if( samples == 0 )
1373     {
1374         if( p_sys->i_headers == 1 )
1375         {
1376             msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1377
1378             /* Backup the STREAMINFO metadata block */
1379             p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1380             p_enc->fmt_out.p_extra = malloc( STREAMINFO_SIZE + 4 );
1381             memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1382             memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1383                     STREAMINFO_SIZE );
1384
1385             /* Fake this as the last metadata block */
1386             ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1387         }
1388         p_sys->i_headers++;
1389         return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1390     }
1391
1392     p_block = block_New( p_enc, bytes );
1393     memcpy( p_block->p_buffer, buffer, bytes );
1394
1395     p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1396
1397     p_sys->i_samples_delay -= samples;
1398
1399     p_block->i_length = (mtime_t)1000000 *
1400         (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1401
1402     /* Update pts */
1403     p_sys->i_pts += p_block->i_length;
1404
1405     block_ChainAppend( &p_sys->p_chain, p_block );
1406
1407     return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1408 }
1409 #endif