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