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 *****************************************************************************/
30 #include <vlc_codec.h>
33 #ifdef HAVE_FLAC_STREAM_DECODER_H
34 # include <FLAC/stream_decoder.h>
35 # include <FLAC/stream_encoder.h>
39 #include <vlc_block_helper.h>
42 #define MAX_FLAC_HEADER_SIZE 16
44 #if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT >= 8
45 # define USE_NEW_FLAC_API
48 /*****************************************************************************
49 * decoder_sys_t : FLAC decoder descriptor
50 *****************************************************************************/
58 block_bytestream_t bytestream;
61 * Input/Output properties
64 aout_buffer_t *p_aout_buffer;
70 FLAC__StreamDecoder *p_flac;
71 FLAC__StreamMetadata_StreamInfo stream_info;
75 unsigned min_blocksize, max_blocksize;
76 unsigned min_framesize, max_framesize;
79 unsigned bits_per_sample;
83 vlc_bool_t b_stream_info;
88 audio_date_t end_date;
91 int i_frame_size, i_frame_length, i_bits_per_sample;
92 unsigned int i_rate, i_channels, i_channels_conf;
105 static int pi_channels_maps[7] =
109 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
110 AOUT_CHAN_CENTER | AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
111 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT
112 | AOUT_CHAN_REARRIGHT,
113 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
114 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT,
115 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
116 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE
119 /*****************************************************************************
121 *****************************************************************************/
122 static int OpenDecoder ( vlc_object_t * );
123 static int OpenPacketizer( vlc_object_t * );
124 static void CloseDecoder ( vlc_object_t * );
127 static int OpenEncoder ( vlc_object_t * );
128 static void CloseEncoder ( vlc_object_t * );
132 static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
134 static block_t *PacketizeBlock( decoder_t *, block_t ** );
136 static int SyncInfo( decoder_t *, uint8_t *, unsigned int *, unsigned int *,
137 unsigned int *,int * );
141 static FLAC__StreamDecoderReadStatus
142 DecoderReadCallback( const FLAC__StreamDecoder *decoder,
143 FLAC__byte buffer[], unsigned *bytes, void *client_data );
145 static FLAC__StreamDecoderWriteStatus
146 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
147 const FLAC__Frame *frame,
148 const FLAC__int32 *const buffer[], void *client_data );
150 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
151 const FLAC__StreamMetadata *metadata,
153 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
154 FLAC__StreamDecoderErrorStatus status,
157 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
158 int i_nb_channels, int i_samples );
159 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
160 int i_nb_channels, int i_samples );
162 static void decoder_state_error( decoder_t *p_dec,
163 FLAC__StreamDecoderState state );
166 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read );
167 static uint8_t flac_crc8( const uint8_t *data, unsigned len );
169 /*****************************************************************************
171 *****************************************************************************/
174 set_category( CAT_INPUT );
175 set_subcategory( SUBCAT_INPUT_ACODEC );
178 set_description( _("Flac audio decoder") );
179 set_capability( "decoder", 100 );
180 set_callbacks( OpenDecoder, CloseDecoder );
183 set_description( _("Flac audio encoder") );
184 set_capability( "encoder", 100 );
185 set_callbacks( OpenEncoder, CloseEncoder );
189 set_description( _("Flac audio packetizer") );
190 set_capability( "packetizer", 100 );
191 set_callbacks( OpenPacketizer, CloseDecoder );
193 add_shortcut( "flac" );
196 /*****************************************************************************
197 * OpenDecoder: probe the decoder and return score
198 *****************************************************************************/
199 static int OpenDecoder( vlc_object_t *p_this )
201 decoder_t *p_dec = (decoder_t*)p_this;
202 decoder_sys_t *p_sys;
204 if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','l','a','c') )
209 /* Allocate the memory needed to store the decoder's structure */
210 if( ( p_dec->p_sys = p_sys =
211 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
213 msg_Err( p_dec, "out of memory" );
218 aout_DateSet( &p_sys->end_date, 0 );
219 p_sys->i_state = STATE_NOSYNC;
220 p_sys->b_stream_info = VLC_FALSE;
222 p_sys->bytestream = block_BytestreamInit( p_dec );
225 /* Take care of flac init */
226 if( !(p_sys->p_flac = FLAC__stream_decoder_new()) )
228 msg_Err( p_dec, "FLAC__stream_decoder_new() failed" );
233 #ifdef USE_NEW_FLAC_API
234 if( FLAC__stream_decoder_init_stream( p_sys->p_flac,
240 DecoderWriteCallback,
241 DecoderMetadataCallback,
242 DecoderErrorCallback,
244 != FLAC__STREAM_DECODER_INIT_STATUS_OK )
246 msg_Err( p_dec, "FLAC__stream_decoder_init_stream() failed" );
247 FLAC__stream_decoder_delete( p_sys->p_flac );
252 FLAC__stream_decoder_set_read_callback( p_sys->p_flac,
253 DecoderReadCallback );
254 FLAC__stream_decoder_set_write_callback( p_sys->p_flac,
255 DecoderWriteCallback );
256 FLAC__stream_decoder_set_metadata_callback( p_sys->p_flac,
257 DecoderMetadataCallback );
258 FLAC__stream_decoder_set_error_callback( p_sys->p_flac,
259 DecoderErrorCallback );
260 FLAC__stream_decoder_set_client_data( p_sys->p_flac, p_dec );
262 FLAC__stream_decoder_init( p_sys->p_flac );
266 /* Set output properties */
267 p_dec->fmt_out.i_cat = AUDIO_ES;
268 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
272 p_dec->pf_decode_audio = DecodeBlock;
274 p_dec->pf_packetize = PacketizeBlock;
279 static int OpenPacketizer( vlc_object_t *p_this )
281 decoder_t *p_dec = (decoder_t*)p_this;
282 es_format_t es_save = p_dec->fmt_out;
286 es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
288 i_ret = OpenDecoder( p_this );
290 /* Set output properties */
291 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
293 if( i_ret != VLC_SUCCESS )
295 es_format_Clean( &p_dec->fmt_out );
296 p_dec->fmt_out = es_save;
301 /*****************************************************************************
302 * CloseDecoder: flac decoder destruction
303 *****************************************************************************/
304 static void CloseDecoder( vlc_object_t *p_this )
306 decoder_t *p_dec = (decoder_t *)p_this;
307 decoder_sys_t *p_sys = p_dec->p_sys;
310 FLAC__stream_decoder_finish( p_sys->p_flac );
311 FLAC__stream_decoder_delete( p_sys->p_flac );
314 if( p_sys->p_block ) free( p_sys->p_block );
318 /*****************************************************************************
319 * ProcessHeader: process Flac header.
320 *****************************************************************************/
321 static void ProcessHeader( decoder_t *p_dec )
323 decoder_sys_t *p_sys = p_dec->p_sys;
326 if( !p_dec->fmt_in.i_extra ) return;
328 /* Decode STREAMINFO */
329 msg_Dbg( p_dec, "decode STREAMINFO" );
330 p_sys->p_block = block_New( p_dec, p_dec->fmt_in.i_extra );
331 memcpy( p_sys->p_block->p_buffer, p_dec->fmt_in.p_extra,
332 p_dec->fmt_in.i_extra );
333 FLAC__stream_decoder_process_until_end_of_metadata( p_sys->p_flac );
334 msg_Dbg( p_dec, "STREAMINFO decoded" );
339 if( !p_dec->fmt_in.i_extra ) return;
341 bs_init( &bs, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra );
343 p_sys->stream_info.min_blocksize = bs_read( &bs, 16 );
344 p_sys->stream_info.max_blocksize = bs_read( &bs, 16 );
346 p_sys->stream_info.min_framesize = bs_read( &bs, 24 );
347 p_sys->stream_info.max_framesize = bs_read( &bs, 24 );
349 p_sys->stream_info.sample_rate = bs_read( &bs, 20 );
350 p_sys->stream_info.channels = bs_read( &bs, 3 ) + 1;
351 p_sys->stream_info.bits_per_sample = bs_read( &bs, 5 ) + 1;
354 if( !p_sys->b_stream_info ) return;
356 if( p_dec->fmt_out.i_codec == VLC_FOURCC('f','l','a','c') )
358 p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
359 p_dec->fmt_out.p_extra =
360 realloc( p_dec->fmt_out.p_extra, p_dec->fmt_out.i_extra );
361 memcpy( p_dec->fmt_out.p_extra,
362 p_dec->fmt_in.p_extra, p_dec->fmt_out.i_extra );
366 /****************************************************************************
367 * PacketizeBlock: the whole thing
368 ****************************************************************************
369 * This function is called just after the thread is launched.
370 ****************************************************************************/
371 static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
373 decoder_sys_t *p_sys = p_dec->p_sys;
374 uint8_t p_header[MAX_FLAC_HEADER_SIZE];
375 block_t *p_sout_block;
377 if( !pp_block || !*pp_block ) return NULL;
379 if( !p_sys->b_stream_info ) ProcessHeader( p_dec );
381 if( p_sys->stream_info.channels > 6 )
383 msg_Err( p_dec, "This stream uses too many audio channels" );
387 if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
389 /* We've just started the stream, wait for the first PTS. */
390 block_Release( *pp_block );
393 else if( !aout_DateGet( &p_sys->end_date ) )
395 /* The first PTS is as good as anything else. */
396 aout_DateSet( &p_sys->end_date, (*pp_block)->i_pts );
399 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
401 p_sys->i_state = STATE_NOSYNC;
404 block_BytestreamPush( &p_sys->bytestream, *pp_block );
408 switch( p_sys->i_state )
411 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
414 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
416 p_sys->i_state = STATE_SYNC;
419 block_SkipByte( &p_sys->bytestream );
421 if( p_sys->i_state != STATE_SYNC )
423 block_BytestreamFlush( &p_sys->bytestream );
430 /* New frame, set the Presentation Time Stamp */
431 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
432 if( p_sys->i_pts != 0 &&
433 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
435 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
437 p_sys->i_state = STATE_HEADER;
440 /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
441 if( block_PeekBytes( &p_sys->bytestream, p_header,
442 MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
448 /* Check if frame is valid and get frame info */
449 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
451 &p_sys->i_channels_conf,
453 &p_sys->i_bits_per_sample );
454 if( !p_sys->i_frame_length )
456 msg_Dbg( p_dec, "emulated sync word" );
457 block_SkipByte( &p_sys->bytestream );
458 p_sys->i_state = STATE_NOSYNC;
461 if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
463 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
464 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
466 p_sys->i_state = STATE_NEXT_SYNC;
467 p_sys->i_frame_size = 1;
469 case STATE_NEXT_SYNC:
470 /* TODO: If pp_block == NULL, flush the buffer without checking the
473 /* Check if next expected frame contains the sync word */
474 while( block_PeekOffsetBytes( &p_sys->bytestream,
475 p_sys->i_frame_size, p_header,
476 MAX_FLAC_HEADER_SIZE )
479 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
481 /* Check if frame is valid and get frame info */
483 SyncInfo( p_dec, p_header,
485 &p_sys->i_channels_conf,
487 &p_sys->i_bits_per_sample );
491 p_sys->i_state = STATE_SEND_DATA;
495 p_sys->i_frame_size++;
498 if( p_sys->i_state != STATE_SEND_DATA )
504 case STATE_SEND_DATA:
505 p_sout_block = block_New( p_dec, p_sys->i_frame_size );
507 /* Copy the whole frame into the buffer. When we reach this point
508 * we already know we have enough data available. */
509 block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
510 p_sys->i_frame_size );
512 /* Make sure we don't reuse the same pts twice */
513 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
514 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
516 /* So p_block doesn't get re-added several times */
517 *pp_block = block_BytestreamPop( &p_sys->bytestream );
519 p_sys->i_state = STATE_NOSYNC;
521 /* Date management */
522 p_sout_block->i_pts =
523 p_sout_block->i_dts = aout_DateGet( &p_sys->end_date );
524 aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
525 p_sout_block->i_length =
526 aout_DateGet( &p_sys->end_date ) - p_sout_block->i_pts;
536 /****************************************************************************
537 * DecodeBlock: the whole thing
538 ****************************************************************************/
539 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
541 decoder_sys_t *p_sys = p_dec->p_sys;
543 if( !pp_block || !*pp_block ) return NULL;
545 p_sys->p_aout_buffer = 0;
546 if( ( p_sys->p_block = PacketizeBlock( p_dec, pp_block ) ) )
548 if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) )
550 decoder_state_error( p_dec,
551 FLAC__stream_decoder_get_state( p_sys->p_flac ) );
552 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
555 /* If the decoder is in the "aborted" state,
556 * FLAC__stream_decoder_process_single() won't return an error. */
557 if( FLAC__stream_decoder_get_state(p_dec->p_sys->p_flac)
558 == FLAC__STREAM_DECODER_ABORTED )
560 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
563 block_Release( p_sys->p_block );
564 p_sys->p_block = NULL;
567 return p_sys->p_aout_buffer;
570 /*****************************************************************************
571 * DecoderReadCallback: called by libflac when it needs more data
572 *****************************************************************************/
573 static FLAC__StreamDecoderReadStatus
574 DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
575 unsigned *bytes, void *client_data )
577 decoder_t *p_dec = (decoder_t *)client_data;
578 decoder_sys_t *p_sys = p_dec->p_sys;
580 if( p_sys->p_block && p_sys->p_block->i_buffer )
582 *bytes = __MIN(*bytes, (unsigned)p_sys->p_block->i_buffer);
583 memcpy( buffer, p_sys->p_block->p_buffer, *bytes );
584 p_sys->p_block->i_buffer -= *bytes;
585 p_sys->p_block->p_buffer += *bytes;
590 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
593 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
596 /*****************************************************************************
597 * DecoderWriteCallback: called by libflac to output decoded samples
598 *****************************************************************************/
599 static FLAC__StreamDecoderWriteStatus
600 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
601 const FLAC__Frame *frame,
602 const FLAC__int32 *const buffer[], void *client_data )
604 decoder_t *p_dec = (decoder_t *)client_data;
605 decoder_sys_t *p_sys = p_dec->p_sys;
607 p_sys->p_aout_buffer =
608 p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize );
610 if( p_sys->p_aout_buffer == NULL )
611 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
613 switch( frame->header.bits_per_sample )
616 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
617 frame->header.channels, frame->header.blocksize );
620 Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
621 frame->header.channels, frame->header.blocksize );
624 /* Date management (already done by packetizer) */
625 p_sys->p_aout_buffer->start_date = p_sys->p_block->i_pts;
626 p_sys->p_aout_buffer->end_date =
627 p_sys->p_block->i_pts + p_sys->p_block->i_length;
629 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
632 /*****************************************************************************
633 * DecoderMetadataCallback: called by libflac to when it encounters metadata
634 *****************************************************************************/
635 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
636 const FLAC__StreamMetadata *metadata,
639 decoder_t *p_dec = (decoder_t *)client_data;
640 decoder_sys_t *p_sys = p_dec->p_sys;
642 switch( metadata->data.stream_info.bits_per_sample )
645 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
648 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
651 msg_Dbg( p_dec, "strange bit/sample value: %d",
652 metadata->data.stream_info.bits_per_sample );
653 p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
657 /* Setup the format */
658 p_dec->fmt_out.audio.i_rate = metadata->data.stream_info.sample_rate;
659 p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
660 p_dec->fmt_out.audio.i_physical_channels =
661 p_dec->fmt_out.audio.i_original_channels =
662 pi_channels_maps[metadata->data.stream_info.channels];
663 p_dec->fmt_out.audio.i_bitspersample =
664 metadata->data.stream_info.bits_per_sample;
666 aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
668 msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
669 p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
670 p_dec->fmt_out.audio.i_bitspersample );
672 p_sys->b_stream_info = VLC_TRUE;
673 p_sys->stream_info = metadata->data.stream_info;
678 /*****************************************************************************
679 * DecoderErrorCallback: called when the libflac decoder encounters an error
680 *****************************************************************************/
681 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
682 FLAC__StreamDecoderErrorStatus status,
685 decoder_t *p_dec = (decoder_t *)client_data;
689 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
690 msg_Warn( p_dec, "an error in the stream caused the decoder to "
691 "lose synchronization." );
693 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
694 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
696 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
697 msg_Err( p_dec, "frame's data did not match the CRC in the "
701 msg_Err( p_dec, "got decoder error: %d", status );
704 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
708 /*****************************************************************************
709 * Interleave: helper function to interleave channels
710 *****************************************************************************/
711 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
712 int i_nb_channels, int i_samples )
715 for ( j = 0; j < i_samples; j++ )
717 for ( i = 0; i < i_nb_channels; i++ )
719 p_out[j * i_nb_channels + i] = pp_in[i][j];
723 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
724 int i_nb_channels, int i_samples )
727 for ( j = 0; j < i_samples; j++ )
729 for ( i = 0; i < i_nb_channels; i++ )
731 p_out[j * i_nb_channels + i] = (int32_t)(pp_in[i][j]);
736 /*****************************************************************************
737 * decoder_state_error: print meaningful error messages
738 *****************************************************************************/
739 static void decoder_state_error( decoder_t *p_dec,
740 FLAC__StreamDecoderState state )
744 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
745 msg_Dbg( p_dec, "the decoder is ready to search for metadata." );
747 case FLAC__STREAM_DECODER_READ_METADATA:
748 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
749 "reading metadata." );
751 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
752 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
753 "searching for the frame sync code." );
755 case FLAC__STREAM_DECODER_READ_FRAME:
756 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
757 "reading a frame." );
759 case FLAC__STREAM_DECODER_END_OF_STREAM:
760 msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
762 #ifdef USE_NEW_FLAC_API
763 case FLAC__STREAM_DECODER_OGG_ERROR:
764 msg_Err( p_dec, "error occurred in the Ogg layer." );
766 case FLAC__STREAM_DECODER_SEEK_ERROR:
767 msg_Err( p_dec, "error occurred while seeking." );
770 case FLAC__STREAM_DECODER_ABORTED:
771 msg_Warn( p_dec, "the decoder was aborted by the read callback." );
773 #ifndef USE_NEW_FLAC_API
774 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
775 msg_Warn( p_dec, "the decoder encountered reserved fields in use "
779 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
780 msg_Err( p_dec, "error when allocating memory." );
782 #ifndef USE_NEW_FLAC_API
783 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
784 msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
785 "decoder was already initialized, usually because "
786 "FLAC__stream_decoder_finish() was not called." );
788 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
789 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
790 "all callbacks being set." );
793 case FLAC__STREAM_DECODER_UNINITIALIZED:
794 msg_Err( p_dec, "decoder in uninitialized state." );
797 msg_Warn(p_dec, "unknown error" );
802 /*****************************************************************************
803 * SyncInfo: parse FLAC sync info
804 *****************************************************************************/
805 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
806 unsigned int * pi_channels,
807 unsigned int * pi_channels_conf,
808 unsigned int * pi_sample_rate,
809 int * pi_bits_per_sample )
811 decoder_sys_t *p_sys = p_dec->p_sys;
812 int i_header, i_temp, i_read;
813 int i_blocksize = 0, i_blocksize_hint = 0, i_sample_rate_hint = 0;
814 uint64_t i_sample_number = 0;
816 vlc_bool_t b_variable_blocksize = ( p_sys->b_stream_info &&
817 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
818 vlc_bool_t b_fixed_blocksize = ( p_sys->b_stream_info &&
819 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
822 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
824 /* Check there is no emulated sync code in the rest of the header */
825 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
827 /* Find blocksize (framelength) */
828 switch( i_temp = p_buf[2] >> 4 )
831 if( b_fixed_blocksize )
832 i_blocksize = p_sys->stream_info.min_blocksize;
833 else return 0; /* We can't do anything with this */
844 i_blocksize = 576 << (i_temp - 2);
849 i_blocksize_hint = i_temp;
860 i_blocksize = 256 << (i_temp - 8);
864 /* Find samplerate */
865 switch( i_temp = p_buf[2] & 0x0f )
868 if( p_sys->b_stream_info )
869 *pi_sample_rate = p_sys->stream_info.sample_rate;
870 else return 0; /* We can't do anything with this */
880 *pi_sample_rate = 8000;
884 *pi_sample_rate = 16000;
888 *pi_sample_rate = 22050;
892 *pi_sample_rate = 24000;
896 *pi_sample_rate = 32000;
900 *pi_sample_rate = 44100;
904 *pi_sample_rate = 48000;
908 *pi_sample_rate = 96000;
914 i_sample_rate_hint = i_temp;
922 i_temp = (unsigned)(p_buf[3] >> 4);
926 int i_channel_assignment; /* ??? */
931 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
934 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
937 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
949 *pi_channels = i_temp + 1;
950 *pi_channels_conf = pi_channels_maps[ *pi_channels ];
953 /* Find bits per sample */
954 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
957 if( p_sys->b_stream_info )
958 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
964 *pi_bits_per_sample = 8;
968 *pi_bits_per_sample = 12;
972 *pi_bits_per_sample = 16;
976 *pi_bits_per_sample = 20;
980 *pi_bits_per_sample = 24;
989 /* Zero padding bit */
990 if( p_buf[3] & 0x01 ) return 0;
992 /* End of fixed size header */
995 /* Find Sample/Frame number */
996 if( i_blocksize_hint && b_variable_blocksize )
998 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
999 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
1003 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1004 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
1006 if( p_sys->b_stream_info )
1007 i_sample_number *= p_sys->stream_info.min_blocksize;
1012 /* Read blocksize */
1013 if( i_blocksize_hint )
1015 int i_val1 = p_buf[i_header++];
1016 if( i_blocksize_hint == 7 )
1018 int i_val2 = p_buf[i_header++];
1019 i_val1 = (i_val1 << 8) | i_val2;
1021 i_blocksize = i_val1 + 1;
1024 /* Read sample rate */
1025 if( i_sample_rate_hint )
1027 int i_val1 = p_buf[i_header++];
1028 if( i_sample_rate_hint != 12 )
1030 int i_val2 = p_buf[i_header++];
1031 i_val1 = (i_val1 << 8) | i_val2;
1033 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
1034 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
1035 else *pi_sample_rate = i_val1 * 10;
1038 /* Check the CRC-8 byte */
1039 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
1047 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
1048 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
1050 uint64_t i_result = 0;
1053 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
1055 i_result = p_buf[0];
1058 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
1060 i_result = p_buf[0] & 0x1F;
1063 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
1065 i_result = p_buf[0] & 0x0F;
1068 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
1070 i_result = p_buf[0] & 0x07;
1073 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
1075 i_result = p_buf[0] & 0x03;
1078 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
1080 i_result = p_buf[0] & 0x01;
1083 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
1089 return I64C(0xffffffffffffffff);
1092 for( j = 1; j <= i; j++ )
1094 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
1096 return I64C(0xffffffffffffffff);
1099 i_result |= (p_buf[j] & 0x3F);
1106 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
1107 static uint8_t const flac_crc8_table[256] = {
1108 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1109 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1110 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1111 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1112 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
1113 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
1114 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
1115 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
1116 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
1117 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
1118 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
1119 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
1120 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
1121 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
1122 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
1123 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
1124 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
1125 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
1126 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
1127 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
1128 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
1129 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
1130 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
1131 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
1132 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
1133 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
1134 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
1135 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1136 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1137 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1138 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1139 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1142 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1147 crc = flac_crc8_table[crc ^ *data++];
1153 /*****************************************************************************
1154 * encoder_sys_t : flac encoder descriptor
1155 *****************************************************************************/
1156 struct encoder_sys_t
1163 int i_samples_delay;
1166 FLAC__int32 *p_buffer;
1167 unsigned int i_buffer;
1174 FLAC__StreamEncoder *p_flac;
1175 FLAC__StreamMetadata_StreamInfo stream_info;
1183 #define STREAMINFO_SIZE 38
1185 static block_t *Encode( encoder_t *, aout_buffer_t * );
1187 static FLAC__StreamEncoderWriteStatus
1188 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1189 const FLAC__byte buffer[],
1190 unsigned bytes, unsigned samples,
1191 unsigned current_frame, void *client_data );
1193 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1194 const FLAC__StreamMetadata *metadata,
1195 void *client_data );
1197 /*****************************************************************************
1198 * OpenEncoder: probe the encoder and return score
1199 *****************************************************************************/
1200 static int OpenEncoder( vlc_object_t *p_this )
1202 encoder_t *p_enc = (encoder_t *)p_this;
1203 encoder_sys_t *p_sys;
1205 if( p_enc->fmt_out.i_codec != VLC_FOURCC('f','l','a','c') &&
1208 return VLC_EGENERIC;
1211 /* Allocate the memory needed to store the decoder's structure */
1212 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1214 msg_Err( p_enc, "out of memory" );
1215 return VLC_EGENERIC;
1217 p_enc->p_sys = p_sys;
1218 p_enc->pf_encode_audio = Encode;
1219 p_enc->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
1221 p_sys->i_headers = 0;
1222 p_sys->p_buffer = 0;
1223 p_sys->i_buffer = 0;
1224 p_sys->i_samples_delay = 0;
1226 /* Create flac encoder */
1227 if( !(p_sys->p_flac = FLAC__stream_encoder_new()) )
1229 msg_Err( p_enc, "FLAC__stream_encoder_new() failed" );
1231 return VLC_EGENERIC;
1234 FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1235 FLAC__stream_encoder_set_channels( p_sys->p_flac,
1236 p_enc->fmt_in.audio.i_channels );
1237 FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1238 p_enc->fmt_in.audio.i_rate );
1239 FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1240 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
1242 /* Get and store the STREAMINFO metadata block as a p_extra */
1245 #ifdef USE_NEW_FLAC_API
1246 if( FLAC__stream_encoder_init_stream( p_sys->p_flac,
1247 EncoderWriteCallback,
1250 EncoderMetadataCallback,
1252 != FLAC__STREAM_ENCODER_INIT_STATUS_OK )
1254 msg_Err( p_enc, "FLAC__stream_encoder_init_stream() failed" );
1255 FLAC__stream_encoder_delete( p_sys->p_flac );
1257 return VLC_EGENERIC;
1260 FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1261 EncoderWriteCallback );
1262 FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1263 EncoderMetadataCallback );
1264 FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1266 FLAC__stream_encoder_init( p_sys->p_flac );
1272 /****************************************************************************
1273 * Encode: the whole thing
1274 ****************************************************************************
1275 * This function spits out ogg packets.
1276 ****************************************************************************/
1277 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1279 encoder_sys_t *p_sys = p_enc->p_sys;
1283 p_sys->i_pts = p_aout_buf->start_date -
1284 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1285 (mtime_t)p_enc->fmt_in.audio.i_rate;
1287 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1289 /* Convert samples to FLAC__int32 */
1290 if( p_sys->i_buffer < p_aout_buf->i_nb_bytes * 2 )
1293 realloc( p_sys->p_buffer, p_aout_buf->i_nb_bytes * 2 );
1294 p_sys->i_buffer = p_aout_buf->i_nb_bytes * 2;
1297 for( i = 0 ; i < p_aout_buf->i_nb_bytes / 2 ; i++ )
1299 p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1302 FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1303 p_aout_buf->i_nb_samples );
1305 p_chain = p_sys->p_chain;
1311 /*****************************************************************************
1312 * CloseEncoder: encoder destruction
1313 *****************************************************************************/
1314 static void CloseEncoder( vlc_object_t *p_this )
1316 encoder_t *p_enc = (encoder_t *)p_this;
1317 encoder_sys_t *p_sys = p_enc->p_sys;
1319 FLAC__stream_encoder_delete( p_sys->p_flac );
1321 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1325 /*****************************************************************************
1326 * EncoderMetadataCallback: called by libflac to output metadata
1327 *****************************************************************************/
1328 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1329 const FLAC__StreamMetadata *metadata,
1332 encoder_t *p_enc = (encoder_t *)client_data;
1334 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1338 /*****************************************************************************
1339 * EncoderWriteCallback: called by libflac to output encoded samples
1340 *****************************************************************************/
1341 static FLAC__StreamEncoderWriteStatus
1342 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1343 const FLAC__byte buffer[],
1344 unsigned bytes, unsigned samples,
1345 unsigned current_frame, void *client_data )
1347 encoder_t *p_enc = (encoder_t *)client_data;
1348 encoder_sys_t *p_sys = p_enc->p_sys;
1353 if( p_sys->i_headers == 1 )
1355 msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1357 /* Backup the STREAMINFO metadata block */
1358 p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1359 p_enc->fmt_out.p_extra = malloc( STREAMINFO_SIZE + 4 );
1360 memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1361 memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1364 /* Fake this as the last metadata block */
1365 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1368 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1371 p_block = block_New( p_enc, bytes );
1372 memcpy( p_block->p_buffer, buffer, bytes );
1374 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1376 p_sys->i_samples_delay -= samples;
1378 p_block->i_length = (mtime_t)1000000 *
1379 (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1382 p_sys->i_pts += p_block->i_length;
1384 block_ChainAppend( &p_sys->p_chain, p_block );
1386 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;