1 /*****************************************************************************
2 * flac.c: flac decoder/packetizer/encoder module making use of libflac
3 *****************************************************************************
4 * Copyright (C) 1999-2001 the VideoLAN team
7 * Authors: Gildas Bazin <gbazin@videolan.org>
8 * Sigmund Augdal Helberg <dnumgis@videolan.org>
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.
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.
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 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
34 #include <vlc_plugin.h>
35 #include <vlc_codec.h>
38 #ifdef HAVE_FLAC_STREAM_DECODER_H
39 # include <FLAC/stream_decoder.h>
40 # include <FLAC/stream_encoder.h>
44 #include <vlc_block_helper.h>
47 #define MAX_FLAC_HEADER_SIZE 16
49 #if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT >= 8
50 # define USE_NEW_FLAC_API
53 /*****************************************************************************
54 * decoder_sys_t : FLAC decoder descriptor
55 *****************************************************************************/
63 block_bytestream_t bytestream;
66 * Input/Output properties
69 aout_buffer_t *p_aout_buffer;
75 FLAC__StreamDecoder *p_flac;
76 FLAC__StreamMetadata_StreamInfo stream_info;
80 unsigned min_blocksize, max_blocksize;
81 unsigned min_framesize, max_framesize;
84 unsigned bits_per_sample;
93 audio_date_t end_date;
96 int i_frame_size, i_frame_length, i_bits_per_sample;
97 unsigned int i_rate, i_channels, i_channels_conf;
110 static int pi_channels_maps[7] =
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
124 /*****************************************************************************
126 *****************************************************************************/
127 static int OpenDecoder ( vlc_object_t * );
128 static int OpenPacketizer( vlc_object_t * );
129 static void CloseDecoder ( vlc_object_t * );
132 static int OpenEncoder ( vlc_object_t * );
133 static void CloseEncoder ( vlc_object_t * );
137 static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
139 static block_t *PacketizeBlock( decoder_t *, block_t ** );
141 static int SyncInfo( decoder_t *, uint8_t *, unsigned int *, unsigned int *,
142 unsigned int *,int * );
146 static FLAC__StreamDecoderReadStatus
147 DecoderReadCallback( const FLAC__StreamDecoder *decoder,
148 FLAC__byte buffer[], unsigned *bytes, void *client_data );
150 static FLAC__StreamDecoderWriteStatus
151 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
152 const FLAC__Frame *frame,
153 const FLAC__int32 *const buffer[], void *client_data );
155 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
156 const FLAC__StreamMetadata *metadata,
158 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
159 FLAC__StreamDecoderErrorStatus status,
162 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
163 int i_nb_channels, int i_samples );
164 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
165 int i_nb_channels, int i_samples );
167 static void decoder_state_error( decoder_t *p_dec,
168 FLAC__StreamDecoderState state );
171 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read );
172 static uint8_t flac_crc8( const uint8_t *data, unsigned len );
174 /*****************************************************************************
176 *****************************************************************************/
179 set_category( CAT_INPUT );
180 set_subcategory( SUBCAT_INPUT_ACODEC );
181 add_shortcut( "flac" );
184 set_description( _("Flac audio decoder") );
185 set_capability( "decoder", 100 );
186 set_callbacks( OpenDecoder, CloseDecoder );
189 set_description( _("Flac audio encoder") );
190 set_capability( "encoder", 100 );
191 set_callbacks( OpenEncoder, CloseEncoder );
195 set_description( _("Flac audio packetizer") );
196 set_capability( "packetizer", 100 );
197 set_callbacks( OpenPacketizer, CloseDecoder );
201 /*****************************************************************************
202 * OpenDecoder: probe the decoder and return score
203 *****************************************************************************/
204 static int OpenDecoder( vlc_object_t *p_this )
206 decoder_t *p_dec = (decoder_t*)p_this;
207 decoder_sys_t *p_sys;
209 if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','l','a','c') )
214 /* Allocate the memory needed to store the decoder's structure */
215 if( ( p_dec->p_sys = p_sys =
216 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
218 msg_Err( p_dec, "out of memory" );
223 aout_DateSet( &p_sys->end_date, 0 );
224 p_sys->i_state = STATE_NOSYNC;
225 p_sys->b_stream_info = false;
227 p_sys->bytestream = block_BytestreamInit();
230 /* Take care of flac init */
231 if( !(p_sys->p_flac = FLAC__stream_decoder_new()) )
233 msg_Err( p_dec, "FLAC__stream_decoder_new() failed" );
238 #ifdef USE_NEW_FLAC_API
239 if( FLAC__stream_decoder_init_stream( p_sys->p_flac,
245 DecoderWriteCallback,
246 DecoderMetadataCallback,
247 DecoderErrorCallback,
249 != FLAC__STREAM_DECODER_INIT_STATUS_OK )
251 msg_Err( p_dec, "FLAC__stream_decoder_init_stream() failed" );
252 FLAC__stream_decoder_delete( p_sys->p_flac );
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 );
267 FLAC__stream_decoder_init( p_sys->p_flac );
271 /* Set output properties */
272 p_dec->fmt_out.i_cat = AUDIO_ES;
273 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
277 p_dec->pf_decode_audio = DecodeBlock;
283 static int OpenPacketizer( vlc_object_t *p_this )
285 decoder_t *p_dec = (decoder_t*)p_this;
286 es_format_t es_save = p_dec->fmt_out;
290 es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
292 i_ret = OpenDecoder( p_this );
293 p_dec->pf_decode_audio = NULL;
294 p_dec->pf_packetize = PacketizeBlock;
296 /* Set output properties */
297 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
299 if( i_ret != VLC_SUCCESS )
301 es_format_Clean( &p_dec->fmt_out );
302 p_dec->fmt_out = es_save;
307 /*****************************************************************************
308 * CloseDecoder: flac decoder destruction
309 *****************************************************************************/
310 static void CloseDecoder( vlc_object_t *p_this )
312 decoder_t *p_dec = (decoder_t *)p_this;
313 decoder_sys_t *p_sys = p_dec->p_sys;
316 FLAC__stream_decoder_finish( p_sys->p_flac );
317 FLAC__stream_decoder_delete( p_sys->p_flac );
320 free( p_sys->p_block );
324 /*****************************************************************************
325 * ProcessHeader: process Flac header.
326 *****************************************************************************/
327 static void ProcessHeader( decoder_t *p_dec )
329 decoder_sys_t *p_sys = p_dec->p_sys;
332 if( !p_dec->fmt_in.i_extra ) return;
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" );
345 if( !p_dec->fmt_in.i_extra ) return;
347 bs_init( &bs, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra );
349 p_sys->stream_info.min_blocksize = bs_read( &bs, 16 );
350 p_sys->stream_info.max_blocksize = bs_read( &bs, 16 );
352 p_sys->stream_info.min_framesize = bs_read( &bs, 24 );
353 p_sys->stream_info.max_framesize = bs_read( &bs, 24 );
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;
360 if( !p_sys->b_stream_info ) return;
362 if( p_dec->fmt_out.i_codec == VLC_FOURCC('f','l','a','c') )
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 );
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 )
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;
383 if( !pp_block || !*pp_block ) return NULL;
385 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
387 if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
389 p_sys->i_state = STATE_NOSYNC;
390 block_BytestreamFlush( &p_sys->bytestream );
392 // aout_DateSet( &p_sys->end_date, 0 );
393 block_Release( *pp_block );
397 if( !p_sys->b_stream_info ) ProcessHeader( p_dec );
399 if( p_sys->stream_info.channels > 6 )
401 msg_Err( p_dec, "This stream uses too many audio channels" );
405 if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
407 /* We've just started the stream, wait for the first PTS. */
408 block_Release( *pp_block );
411 else if( !aout_DateGet( &p_sys->end_date ) )
413 /* The first PTS is as good as anything else. */
414 aout_DateSet( &p_sys->end_date, (*pp_block)->i_pts );
417 block_BytestreamPush( &p_sys->bytestream, *pp_block );
421 switch( p_sys->i_state )
424 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
427 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
429 p_sys->i_state = STATE_SYNC;
432 block_SkipByte( &p_sys->bytestream );
434 if( p_sys->i_state != STATE_SYNC )
436 block_BytestreamFlush( &p_sys->bytestream );
443 /* New frame, set the Presentation Time Stamp */
444 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
445 if( p_sys->i_pts != 0 &&
446 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
448 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
450 p_sys->i_state = STATE_HEADER;
453 /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
454 if( block_PeekBytes( &p_sys->bytestream, p_header,
455 MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
461 /* Check if frame is valid and get frame info */
462 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
464 &p_sys->i_channels_conf,
466 &p_sys->i_bits_per_sample );
467 if( !p_sys->i_frame_length )
469 msg_Dbg( p_dec, "emulated sync word" );
470 block_SkipByte( &p_sys->bytestream );
471 p_sys->i_state = STATE_NOSYNC;
474 if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
476 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
477 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
479 p_sys->i_state = STATE_NEXT_SYNC;
480 p_sys->i_frame_size = 1;
482 case STATE_NEXT_SYNC:
483 /* TODO: If pp_block == NULL, flush the buffer without checking the
486 /* Check if next expected frame contains the sync word */
487 while( block_PeekOffsetBytes( &p_sys->bytestream,
488 p_sys->i_frame_size, p_header,
489 MAX_FLAC_HEADER_SIZE )
492 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
494 /* Check if frame is valid and get frame info */
496 SyncInfo( p_dec, p_header,
498 &p_sys->i_channels_conf,
500 &p_sys->i_bits_per_sample );
504 p_sys->i_state = STATE_SEND_DATA;
508 p_sys->i_frame_size++;
511 if( p_sys->i_state != STATE_SEND_DATA )
517 case STATE_SEND_DATA:
518 p_sout_block = block_New( p_dec, p_sys->i_frame_size );
520 /* Copy the whole frame into the buffer. When we reach this point
521 * we already know we have enough data available. */
522 block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
523 p_sys->i_frame_size );
525 /* Make sure we don't reuse the same pts twice */
526 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
527 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
529 /* So p_block doesn't get re-added several times */
530 *pp_block = block_BytestreamPop( &p_sys->bytestream );
532 p_sys->i_state = STATE_NOSYNC;
534 /* Date management */
535 p_sout_block->i_pts =
536 p_sout_block->i_dts = aout_DateGet( &p_sys->end_date );
537 aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
538 p_sout_block->i_length =
539 aout_DateGet( &p_sys->end_date ) - p_sout_block->i_pts;
549 /****************************************************************************
550 * DecodeBlock: the whole thing
551 ****************************************************************************/
552 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
554 decoder_sys_t *p_sys = p_dec->p_sys;
556 if( !pp_block || !*pp_block ) return NULL;
558 p_sys->p_aout_buffer = 0;
559 if( ( p_sys->p_block = PacketizeBlock( p_dec, pp_block ) ) )
561 if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) )
563 decoder_state_error( p_dec,
564 FLAC__stream_decoder_get_state( p_sys->p_flac ) );
565 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
568 /* If the decoder is in the "aborted" state,
569 * FLAC__stream_decoder_process_single() won't return an error. */
570 if( FLAC__stream_decoder_get_state(p_dec->p_sys->p_flac)
571 == FLAC__STREAM_DECODER_ABORTED )
573 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
576 block_Release( p_sys->p_block );
577 p_sys->p_block = NULL;
580 return p_sys->p_aout_buffer;
583 /*****************************************************************************
584 * DecoderReadCallback: called by libflac when it needs more data
585 *****************************************************************************/
586 static FLAC__StreamDecoderReadStatus
587 DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
588 unsigned *bytes, void *client_data )
591 decoder_t *p_dec = (decoder_t *)client_data;
592 decoder_sys_t *p_sys = p_dec->p_sys;
594 if( p_sys->p_block && p_sys->p_block->i_buffer )
596 *bytes = __MIN(*bytes, (unsigned)p_sys->p_block->i_buffer);
597 memcpy( buffer, p_sys->p_block->p_buffer, *bytes );
598 p_sys->p_block->i_buffer -= *bytes;
599 p_sys->p_block->p_buffer += *bytes;
604 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
607 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
610 /*****************************************************************************
611 * DecoderWriteCallback: called by libflac to output decoded samples
612 *****************************************************************************/
613 static FLAC__StreamDecoderWriteStatus
614 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
615 const FLAC__Frame *frame,
616 const FLAC__int32 *const buffer[], void *client_data )
619 decoder_t *p_dec = (decoder_t *)client_data;
620 decoder_sys_t *p_sys = p_dec->p_sys;
622 p_sys->p_aout_buffer =
623 p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize );
625 if( p_sys->p_aout_buffer == NULL )
626 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
628 switch( frame->header.bits_per_sample )
631 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
632 frame->header.channels, frame->header.blocksize );
635 Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
636 frame->header.channels, frame->header.blocksize );
639 /* Date management (already done by packetizer) */
640 p_sys->p_aout_buffer->start_date = p_sys->p_block->i_pts;
641 p_sys->p_aout_buffer->end_date =
642 p_sys->p_block->i_pts + p_sys->p_block->i_length;
644 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
647 /*****************************************************************************
648 * DecoderMetadataCallback: called by libflac to when it encounters metadata
649 *****************************************************************************/
650 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
651 const FLAC__StreamMetadata *metadata,
655 decoder_t *p_dec = (decoder_t *)client_data;
656 decoder_sys_t *p_sys = p_dec->p_sys;
658 if( p_dec->pf_decode_audio )
660 switch( metadata->data.stream_info.bits_per_sample )
663 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
666 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
669 msg_Dbg( p_dec, "strange bit/sample value: %d",
670 metadata->data.stream_info.bits_per_sample );
671 p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
676 /* Setup the format */
677 p_dec->fmt_out.audio.i_rate = metadata->data.stream_info.sample_rate;
678 p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
679 p_dec->fmt_out.audio.i_physical_channels =
680 p_dec->fmt_out.audio.i_original_channels =
681 pi_channels_maps[metadata->data.stream_info.channels];
682 p_dec->fmt_out.audio.i_bitspersample =
683 metadata->data.stream_info.bits_per_sample;
685 aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
687 msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
688 p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
689 p_dec->fmt_out.audio.i_bitspersample );
691 p_sys->b_stream_info = true;
692 p_sys->stream_info = metadata->data.stream_info;
697 /*****************************************************************************
698 * DecoderErrorCallback: called when the libflac decoder encounters an error
699 *****************************************************************************/
700 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
701 FLAC__StreamDecoderErrorStatus status,
705 decoder_t *p_dec = (decoder_t *)client_data;
709 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
710 msg_Warn( p_dec, "an error in the stream caused the decoder to "
711 "lose synchronization." );
713 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
714 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
716 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
717 msg_Err( p_dec, "frame's data did not match the CRC in the "
721 msg_Err( p_dec, "got decoder error: %d", status );
724 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
728 /*****************************************************************************
729 * Interleave: helper function to interleave channels
730 *****************************************************************************/
731 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
732 int i_nb_channels, int i_samples )
735 for ( j = 0; j < i_samples; j++ )
737 for ( i = 0; i < i_nb_channels; i++ )
739 p_out[j * i_nb_channels + i] = pp_in[i][j];
743 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
744 int i_nb_channels, int i_samples )
747 for ( j = 0; j < i_samples; j++ )
749 for ( i = 0; i < i_nb_channels; i++ )
751 p_out[j * i_nb_channels + i] = (int32_t)(pp_in[i][j]);
756 /*****************************************************************************
757 * decoder_state_error: print meaningful error messages
758 *****************************************************************************/
759 static void decoder_state_error( decoder_t *p_dec,
760 FLAC__StreamDecoderState state )
764 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
765 msg_Dbg( p_dec, "the decoder is ready to search for metadata." );
767 case FLAC__STREAM_DECODER_READ_METADATA:
768 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
769 "reading metadata." );
771 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
772 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
773 "searching for the frame sync code." );
775 case FLAC__STREAM_DECODER_READ_FRAME:
776 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
777 "reading a frame." );
779 case FLAC__STREAM_DECODER_END_OF_STREAM:
780 msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
782 #ifdef USE_NEW_FLAC_API
783 case FLAC__STREAM_DECODER_OGG_ERROR:
784 msg_Err( p_dec, "error occurred in the Ogg layer." );
786 case FLAC__STREAM_DECODER_SEEK_ERROR:
787 msg_Err( p_dec, "error occurred while seeking." );
790 case FLAC__STREAM_DECODER_ABORTED:
791 msg_Warn( p_dec, "the decoder was aborted by the read callback." );
793 #ifndef USE_NEW_FLAC_API
794 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
795 msg_Warn( p_dec, "the decoder encountered reserved fields in use "
799 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
800 msg_Err( p_dec, "error when allocating memory." );
802 #ifndef USE_NEW_FLAC_API
803 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
804 msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
805 "decoder was already initialized, usually because "
806 "FLAC__stream_decoder_finish() was not called." );
808 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
809 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
810 "all callbacks being set." );
813 case FLAC__STREAM_DECODER_UNINITIALIZED:
814 msg_Err( p_dec, "decoder in uninitialized state." );
817 msg_Warn(p_dec, "unknown error" );
822 /*****************************************************************************
823 * SyncInfo: parse FLAC sync info
824 *****************************************************************************/
825 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
826 unsigned int * pi_channels,
827 unsigned int * pi_channels_conf,
828 unsigned int * pi_sample_rate,
829 int * pi_bits_per_sample )
831 decoder_sys_t *p_sys = p_dec->p_sys;
832 int i_header, i_temp, i_read;
833 int i_blocksize = 0, i_blocksize_hint = 0, i_sample_rate_hint = 0;
834 uint64_t i_sample_number = 0;
836 bool b_variable_blocksize = ( p_sys->b_stream_info &&
837 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
838 bool b_fixed_blocksize = ( p_sys->b_stream_info &&
839 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
842 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
844 /* Check there is no emulated sync code in the rest of the header */
845 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
847 /* Find blocksize (framelength) */
848 switch( i_temp = p_buf[2] >> 4 )
851 if( b_fixed_blocksize )
852 i_blocksize = p_sys->stream_info.min_blocksize;
853 else return 0; /* We can't do anything with this */
864 i_blocksize = 576 << (i_temp - 2);
869 i_blocksize_hint = i_temp;
880 i_blocksize = 256 << (i_temp - 8);
884 /* Find samplerate */
885 switch( i_temp = p_buf[2] & 0x0f )
888 if( p_sys->b_stream_info )
889 *pi_sample_rate = p_sys->stream_info.sample_rate;
890 else return 0; /* We can't do anything with this */
900 *pi_sample_rate = 8000;
904 *pi_sample_rate = 16000;
908 *pi_sample_rate = 22050;
912 *pi_sample_rate = 24000;
916 *pi_sample_rate = 32000;
920 *pi_sample_rate = 44100;
924 *pi_sample_rate = 48000;
928 *pi_sample_rate = 96000;
934 i_sample_rate_hint = i_temp;
942 i_temp = (unsigned)(p_buf[3] >> 4);
946 int i_channel_assignment; /* ??? */
951 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
954 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
957 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
969 *pi_channels = i_temp + 1;
970 *pi_channels_conf = pi_channels_maps[ *pi_channels ];
973 /* Find bits per sample */
974 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
977 if( p_sys->b_stream_info )
978 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
984 *pi_bits_per_sample = 8;
988 *pi_bits_per_sample = 12;
992 *pi_bits_per_sample = 16;
996 *pi_bits_per_sample = 20;
1000 *pi_bits_per_sample = 24;
1009 /* Zero padding bit */
1010 if( p_buf[3] & 0x01 ) return 0;
1012 /* End of fixed size header */
1015 /* Find Sample/Frame number */
1016 if( i_blocksize_hint && b_variable_blocksize )
1018 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1019 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
1023 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1024 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
1026 if( p_sys->b_stream_info )
1027 i_sample_number *= p_sys->stream_info.min_blocksize;
1032 /* Read blocksize */
1033 if( i_blocksize_hint )
1035 int i_val1 = p_buf[i_header++];
1036 if( i_blocksize_hint == 7 )
1038 int i_val2 = p_buf[i_header++];
1039 i_val1 = (i_val1 << 8) | i_val2;
1041 i_blocksize = i_val1 + 1;
1044 /* Read sample rate */
1045 if( i_sample_rate_hint )
1047 int i_val1 = p_buf[i_header++];
1048 if( i_sample_rate_hint != 12 )
1050 int i_val2 = p_buf[i_header++];
1051 i_val1 = (i_val1 << 8) | i_val2;
1053 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
1054 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
1055 else *pi_sample_rate = i_val1 * 10;
1058 /* Check the CRC-8 byte */
1059 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
1067 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
1068 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
1070 uint64_t i_result = 0;
1073 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
1075 i_result = p_buf[0];
1078 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
1080 i_result = p_buf[0] & 0x1F;
1083 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
1085 i_result = p_buf[0] & 0x0F;
1088 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
1090 i_result = p_buf[0] & 0x07;
1093 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
1095 i_result = p_buf[0] & 0x03;
1098 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
1100 i_result = p_buf[0] & 0x01;
1103 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
1109 return INT64_C(0xffffffffffffffff);
1112 for( j = 1; j <= i; j++ )
1114 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
1116 return INT64_C(0xffffffffffffffff);
1119 i_result |= (p_buf[j] & 0x3F);
1126 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
1127 static uint8_t const flac_crc8_table[256] = {
1128 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1129 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1130 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1131 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1132 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
1133 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
1134 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
1135 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
1136 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
1137 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
1138 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
1139 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
1140 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
1141 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
1142 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
1143 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
1144 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
1145 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
1146 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
1147 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
1148 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
1149 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
1150 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
1151 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
1152 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
1153 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
1154 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
1155 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1156 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1157 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1158 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1159 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1162 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1167 crc = flac_crc8_table[crc ^ *data++];
1173 /*****************************************************************************
1174 * encoder_sys_t : flac encoder descriptor
1175 *****************************************************************************/
1176 struct encoder_sys_t
1183 int i_samples_delay;
1186 FLAC__int32 *p_buffer;
1187 unsigned int i_buffer;
1194 FLAC__StreamEncoder *p_flac;
1195 FLAC__StreamMetadata_StreamInfo stream_info;
1203 #define STREAMINFO_SIZE 38
1205 static block_t *Encode( encoder_t *, aout_buffer_t * );
1207 static FLAC__StreamEncoderWriteStatus
1208 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1209 const FLAC__byte buffer[],
1210 unsigned bytes, unsigned samples,
1211 unsigned current_frame, void *client_data );
1213 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1214 const FLAC__StreamMetadata *metadata,
1215 void *client_data );
1217 /*****************************************************************************
1218 * OpenEncoder: probe the encoder and return score
1219 *****************************************************************************/
1220 static int OpenEncoder( vlc_object_t *p_this )
1222 encoder_t *p_enc = (encoder_t *)p_this;
1223 encoder_sys_t *p_sys;
1225 if( p_enc->fmt_out.i_codec != VLC_FOURCC('f','l','a','c') &&
1228 return VLC_EGENERIC;
1231 /* Allocate the memory needed to store the decoder's structure */
1232 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1234 msg_Err( p_enc, "out of memory" );
1235 return VLC_EGENERIC;
1237 p_enc->p_sys = p_sys;
1238 p_enc->pf_encode_audio = Encode;
1239 p_enc->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
1241 p_sys->i_headers = 0;
1242 p_sys->p_buffer = 0;
1243 p_sys->i_buffer = 0;
1244 p_sys->i_samples_delay = 0;
1246 /* Create flac encoder */
1247 if( !(p_sys->p_flac = FLAC__stream_encoder_new()) )
1249 msg_Err( p_enc, "FLAC__stream_encoder_new() failed" );
1251 return VLC_EGENERIC;
1254 FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1255 FLAC__stream_encoder_set_channels( p_sys->p_flac,
1256 p_enc->fmt_in.audio.i_channels );
1257 FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1258 p_enc->fmt_in.audio.i_rate );
1259 FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1260 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
1262 /* Get and store the STREAMINFO metadata block as a p_extra */
1265 #ifdef USE_NEW_FLAC_API
1266 if( FLAC__stream_encoder_init_stream( p_sys->p_flac,
1267 EncoderWriteCallback,
1270 EncoderMetadataCallback,
1272 != FLAC__STREAM_ENCODER_INIT_STATUS_OK )
1274 msg_Err( p_enc, "FLAC__stream_encoder_init_stream() failed" );
1275 FLAC__stream_encoder_delete( p_sys->p_flac );
1277 return VLC_EGENERIC;
1280 FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1281 EncoderWriteCallback );
1282 FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1283 EncoderMetadataCallback );
1284 FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1286 FLAC__stream_encoder_init( p_sys->p_flac );
1292 /****************************************************************************
1293 * Encode: the whole thing
1294 ****************************************************************************
1295 * This function spits out ogg packets.
1296 ****************************************************************************/
1297 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1299 encoder_sys_t *p_sys = p_enc->p_sys;
1303 p_sys->i_pts = p_aout_buf->start_date -
1304 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1305 (mtime_t)p_enc->fmt_in.audio.i_rate;
1307 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1309 /* Convert samples to FLAC__int32 */
1310 if( p_sys->i_buffer < p_aout_buf->i_nb_bytes * 2 )
1313 realloc( p_sys->p_buffer, p_aout_buf->i_nb_bytes * 2 );
1314 p_sys->i_buffer = p_aout_buf->i_nb_bytes * 2;
1317 for( i = 0 ; i < p_aout_buf->i_nb_bytes / 2 ; i++ )
1319 p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1322 FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1323 p_aout_buf->i_nb_samples );
1325 p_chain = p_sys->p_chain;
1331 /*****************************************************************************
1332 * CloseEncoder: encoder destruction
1333 *****************************************************************************/
1334 static void CloseEncoder( vlc_object_t *p_this )
1336 encoder_t *p_enc = (encoder_t *)p_this;
1337 encoder_sys_t *p_sys = p_enc->p_sys;
1339 FLAC__stream_encoder_delete( p_sys->p_flac );
1341 free( p_sys->p_buffer );
1345 /*****************************************************************************
1346 * EncoderMetadataCallback: called by libflac to output metadata
1347 *****************************************************************************/
1348 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1349 const FLAC__StreamMetadata *metadata,
1352 VLC_UNUSED(encoder);
1353 encoder_t *p_enc = (encoder_t *)client_data;
1355 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1359 /*****************************************************************************
1360 * EncoderWriteCallback: called by libflac to output encoded samples
1361 *****************************************************************************/
1362 static FLAC__StreamEncoderWriteStatus
1363 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1364 const FLAC__byte buffer[],
1365 unsigned bytes, unsigned samples,
1366 unsigned current_frame, void *client_data )
1368 VLC_UNUSED(encoder); VLC_UNUSED(current_frame);
1369 encoder_t *p_enc = (encoder_t *)client_data;
1370 encoder_sys_t *p_sys = p_enc->p_sys;
1375 if( p_sys->i_headers == 1 )
1377 msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1379 /* Backup the STREAMINFO metadata block */
1380 p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1381 p_enc->fmt_out.p_extra = malloc( STREAMINFO_SIZE + 4 );
1382 memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1383 memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1386 /* Fake this as the last metadata block */
1387 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1390 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1393 p_block = block_New( p_enc, bytes );
1394 memcpy( p_block->p_buffer, buffer, bytes );
1396 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1398 p_sys->i_samples_delay -= samples;
1400 p_block->i_length = (mtime_t)1000000 *
1401 (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1404 p_sys->i_pts += p_block->i_length;
1406 block_ChainAppend( &p_sys->p_chain, p_block );
1408 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;