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 *****************************************************************************/
33 #include <vlc_common.h>
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 const 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 Interleave24( int8_t *p_out, const int32_t * const *pp_in,
165 int i_nb_channels, int i_samples );
166 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
167 int i_nb_channels, int i_samples );
169 static void decoder_state_error( decoder_t *p_dec,
170 FLAC__StreamDecoderState state );
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 );
176 /*****************************************************************************
178 *****************************************************************************/
181 set_category( CAT_INPUT )
182 set_subcategory( SUBCAT_INPUT_ACODEC )
183 add_shortcut( "flac" )
186 set_description( N_("Flac audio decoder") )
187 set_capability( "decoder", 100 )
188 set_callbacks( OpenDecoder, CloseDecoder )
191 add_shortcut( "flac" )
192 set_description( N_("Flac audio encoder") )
193 set_capability( "encoder", 100 )
194 set_callbacks( OpenEncoder, CloseEncoder )
197 add_shortcut( "flac" )
199 set_description( N_("Flac audio packetizer") )
200 set_capability( "packetizer", 100 )
201 set_callbacks( OpenPacketizer, CloseDecoder )
205 /*****************************************************************************
206 * OpenDecoder: probe the decoder and return score
207 *****************************************************************************/
208 static int OpenDecoder( vlc_object_t *p_this )
210 decoder_t *p_dec = (decoder_t*)p_this;
211 decoder_sys_t *p_sys;
213 if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','l','a','c') )
218 /* Allocate the memory needed to store the decoder's structure */
219 if( ( p_dec->p_sys = p_sys = malloc(sizeof(*p_sys)) ) == NULL )
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_BytestreamEmpty( &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 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 );
419 block_BytestreamPush( &p_sys->bytestream, *pp_block );
423 switch( p_sys->i_state )
426 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
429 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
431 p_sys->i_state = STATE_SYNC;
434 block_SkipByte( &p_sys->bytestream );
436 if( p_sys->i_state != STATE_SYNC )
438 block_BytestreamFlush( &p_sys->bytestream );
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 ) )
450 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
452 p_sys->i_state = 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 )
463 /* Check if frame is valid and get frame info */
464 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
466 &p_sys->i_channels_conf,
468 &p_sys->i_bits_per_sample );
469 if( !p_sys->i_frame_length )
471 msg_Dbg( p_dec, "emulated sync word" );
472 block_SkipByte( &p_sys->bytestream );
473 p_sys->i_state = STATE_NOSYNC;
476 if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
478 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
479 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
481 p_sys->i_state = STATE_NEXT_SYNC;
482 p_sys->i_frame_size = 1;
484 case STATE_NEXT_SYNC:
485 /* TODO: If pp_block == NULL, flush the buffer without checking the
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 )
494 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
496 /* Check if frame is valid and get frame info */
498 SyncInfo( p_dec, p_header,
500 &p_sys->i_channels_conf,
502 &p_sys->i_bits_per_sample );
506 p_sys->i_state = STATE_SEND_DATA;
510 p_sys->i_frame_size++;
513 if( p_sys->i_state != STATE_SEND_DATA )
519 case STATE_SEND_DATA:
520 p_sout_block = block_New( p_dec, p_sys->i_frame_size );
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 );
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;
531 /* So p_block doesn't get re-added several times */
532 *pp_block = block_BytestreamPop( &p_sys->bytestream );
534 p_sys->i_state = STATE_NOSYNC;
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;
551 /****************************************************************************
552 * DecodeBlock: the whole thing
553 ****************************************************************************/
554 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
556 decoder_sys_t *p_sys = p_dec->p_sys;
558 if( !pp_block || !*pp_block ) return NULL;
560 p_sys->p_aout_buffer = 0;
561 if( ( p_sys->p_block = PacketizeBlock( p_dec, pp_block ) ) )
563 if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) )
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 );
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 )
575 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
578 block_Release( p_sys->p_block );
579 p_sys->p_block = NULL;
582 return p_sys->p_aout_buffer;
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 )
593 decoder_t *p_dec = (decoder_t *)client_data;
594 decoder_sys_t *p_sys = p_dec->p_sys;
596 if( p_sys->p_block && p_sys->p_block->i_buffer )
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;
606 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
609 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
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 )
621 decoder_t *p_dec = (decoder_t *)client_data;
622 decoder_sys_t *p_sys = p_dec->p_sys;
624 p_sys->p_aout_buffer =
625 decoder_NewAudioBuffer( p_dec, frame->header.blocksize );
627 if( p_sys->p_aout_buffer == NULL )
628 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
630 switch( frame->header.bits_per_sample )
633 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
634 frame->header.channels, frame->header.blocksize );
637 Interleave24( (int8_t *)p_sys->p_aout_buffer->p_buffer, buffer,
638 frame->header.channels, frame->header.blocksize );
641 Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
642 frame->header.channels, frame->header.blocksize );
645 /* Date management (already done by packetizer) */
646 p_sys->p_aout_buffer->start_date = p_sys->p_block->i_pts;
647 p_sys->p_aout_buffer->end_date =
648 p_sys->p_block->i_pts + p_sys->p_block->i_length;
650 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
653 /*****************************************************************************
654 * DecoderMetadataCallback: called by libflac to when it encounters metadata
655 *****************************************************************************/
656 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
657 const FLAC__StreamMetadata *metadata,
661 decoder_t *p_dec = (decoder_t *)client_data;
662 decoder_sys_t *p_sys = p_dec->p_sys;
664 if( p_dec->pf_decode_audio )
666 switch( metadata->data.stream_info.bits_per_sample )
669 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
672 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
675 p_dec->fmt_out.i_codec = AOUT_FMT_S24_NE;
678 msg_Dbg( p_dec, "strange bit/sample value: %d",
679 metadata->data.stream_info.bits_per_sample );
680 p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
685 /* Setup the format */
686 p_dec->fmt_out.audio.i_rate = metadata->data.stream_info.sample_rate;
687 p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
688 p_dec->fmt_out.audio.i_physical_channels =
689 p_dec->fmt_out.audio.i_original_channels =
690 pi_channels_maps[metadata->data.stream_info.channels];
691 p_dec->fmt_out.audio.i_bitspersample =
692 metadata->data.stream_info.bits_per_sample;
694 aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
696 msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
697 p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
698 p_dec->fmt_out.audio.i_bitspersample );
700 p_sys->b_stream_info = true;
701 p_sys->stream_info = metadata->data.stream_info;
706 /*****************************************************************************
707 * DecoderErrorCallback: called when the libflac decoder encounters an error
708 *****************************************************************************/
709 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
710 FLAC__StreamDecoderErrorStatus status,
714 decoder_t *p_dec = (decoder_t *)client_data;
718 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
719 msg_Warn( p_dec, "an error in the stream caused the decoder to "
720 "lose synchronization." );
722 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
723 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
725 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
726 msg_Err( p_dec, "frame's data did not match the CRC in the "
730 msg_Err( p_dec, "got decoder error: %d", status );
733 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
737 /*****************************************************************************
738 * Interleave: helper function to interleave channels
739 *****************************************************************************/
740 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
741 int i_nb_channels, int i_samples )
744 for ( j = 0; j < i_samples; j++ )
746 for ( i = 0; i < i_nb_channels; i++ )
748 p_out[j * i_nb_channels + i] = pp_in[i][j];
753 static void Interleave24( int8_t *p_out, const int32_t * const *pp_in,
754 int i_nb_channels, int i_samples )
757 for ( j = 0; j < i_samples; j++ )
759 for ( i = 0; i < i_nb_channels; i++ )
761 #ifdef WORDS_BIGENDIAN
762 p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 16) & 0xff;
763 p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff;
764 p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 0 ) & 0xff;
766 p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 16) & 0xff;
767 p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff;
768 p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 0 ) & 0xff;
774 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
775 int i_nb_channels, int i_samples )
778 for ( j = 0; j < i_samples; j++ )
780 for ( i = 0; i < i_nb_channels; i++ )
782 p_out[j * i_nb_channels + i] = (int32_t)(pp_in[i][j]);
787 /*****************************************************************************
788 * decoder_state_error: print meaningful error messages
789 *****************************************************************************/
790 static void decoder_state_error( decoder_t *p_dec,
791 FLAC__StreamDecoderState state )
795 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
796 msg_Dbg( p_dec, "the decoder is ready to search for metadata." );
798 case FLAC__STREAM_DECODER_READ_METADATA:
799 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
800 "reading metadata." );
802 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
803 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
804 "searching for the frame sync code." );
806 case FLAC__STREAM_DECODER_READ_FRAME:
807 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
808 "reading a frame." );
810 case FLAC__STREAM_DECODER_END_OF_STREAM:
811 msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
813 #ifdef USE_NEW_FLAC_API
814 case FLAC__STREAM_DECODER_OGG_ERROR:
815 msg_Err( p_dec, "error occurred in the Ogg layer." );
817 case FLAC__STREAM_DECODER_SEEK_ERROR:
818 msg_Err( p_dec, "error occurred while seeking." );
821 case FLAC__STREAM_DECODER_ABORTED:
822 msg_Warn( p_dec, "the decoder was aborted by the read callback." );
824 #ifndef USE_NEW_FLAC_API
825 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
826 msg_Warn( p_dec, "the decoder encountered reserved fields in use "
830 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
831 msg_Err( p_dec, "error when allocating memory." );
833 #ifndef USE_NEW_FLAC_API
834 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
835 msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
836 "decoder was already initialized, usually because "
837 "FLAC__stream_decoder_finish() was not called." );
839 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
840 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
841 "all callbacks being set." );
844 case FLAC__STREAM_DECODER_UNINITIALIZED:
845 msg_Err( p_dec, "decoder in uninitialized state." );
848 msg_Warn(p_dec, "unknown error" );
853 /*****************************************************************************
854 * SyncInfo: parse FLAC sync info
855 *****************************************************************************/
856 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
857 unsigned int * pi_channels,
858 unsigned int * pi_channels_conf,
859 unsigned int * pi_sample_rate,
860 int * pi_bits_per_sample )
862 decoder_sys_t *p_sys = p_dec->p_sys;
863 int i_header, i_temp, i_read;
864 unsigned i_blocksize = 0;
865 int i_blocksize_hint = 0, i_sample_rate_hint = 0;
866 uint64_t i_sample_number = 0;
868 bool b_variable_blocksize = ( p_sys->b_stream_info &&
869 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
870 bool b_fixed_blocksize = ( p_sys->b_stream_info &&
871 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
874 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
876 /* Check there is no emulated sync code in the rest of the header */
877 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
879 /* Find blocksize (framelength) */
880 switch( i_temp = p_buf[2] >> 4 )
883 if( b_fixed_blocksize )
884 i_blocksize = p_sys->stream_info.min_blocksize;
885 else return 0; /* We can't do anything with this */
896 i_blocksize = 576 << (i_temp - 2);
901 i_blocksize_hint = i_temp;
912 i_blocksize = 256 << (i_temp - 8);
916 /* Find samplerate */
917 switch( i_temp = p_buf[2] & 0x0f )
920 if( p_sys->b_stream_info )
921 *pi_sample_rate = p_sys->stream_info.sample_rate;
922 else return 0; /* We can't do anything with this */
932 *pi_sample_rate = 8000;
936 *pi_sample_rate = 16000;
940 *pi_sample_rate = 22050;
944 *pi_sample_rate = 24000;
948 *pi_sample_rate = 32000;
952 *pi_sample_rate = 44100;
956 *pi_sample_rate = 48000;
960 *pi_sample_rate = 96000;
966 i_sample_rate_hint = i_temp;
974 i_temp = (unsigned)(p_buf[3] >> 4);
978 int i_channel_assignment; /* ??? */
983 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
986 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
989 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
1001 *pi_channels = i_temp + 1;
1002 *pi_channels_conf = pi_channels_maps[ *pi_channels ];
1005 /* Find bits per sample */
1006 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
1009 if( p_sys->b_stream_info )
1010 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
1016 *pi_bits_per_sample = 8;
1020 *pi_bits_per_sample = 12;
1024 *pi_bits_per_sample = 16;
1028 *pi_bits_per_sample = 20;
1032 *pi_bits_per_sample = 24;
1041 /* Zero padding bit */
1042 if( p_buf[3] & 0x01 ) return 0;
1044 /* End of fixed size header */
1047 /* Find Sample/Frame number */
1048 if( i_blocksize_hint && b_variable_blocksize )
1050 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1051 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
1055 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1056 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
1058 if( p_sys->b_stream_info )
1059 i_sample_number *= p_sys->stream_info.min_blocksize;
1064 /* Read blocksize */
1065 if( i_blocksize_hint )
1067 int i_val1 = p_buf[i_header++];
1068 if( i_blocksize_hint == 7 )
1070 int i_val2 = p_buf[i_header++];
1071 i_val1 = (i_val1 << 8) | i_val2;
1073 i_blocksize = i_val1 + 1;
1076 /* Read sample rate */
1077 if( i_sample_rate_hint )
1079 int i_val1 = p_buf[i_header++];
1080 if( i_sample_rate_hint != 12 )
1082 int i_val2 = p_buf[i_header++];
1083 i_val1 = (i_val1 << 8) | i_val2;
1085 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
1086 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
1087 else *pi_sample_rate = i_val1 * 10;
1090 /* Check the CRC-8 byte */
1091 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
1096 /* Sanity check using stream info header when possible */
1097 if( p_sys->b_stream_info )
1099 if( i_blocksize < p_sys->stream_info.min_blocksize ||
1100 i_blocksize > p_sys->stream_info.max_blocksize )
1106 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
1107 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
1109 uint64_t i_result = 0;
1112 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
1114 i_result = p_buf[0];
1117 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
1119 i_result = p_buf[0] & 0x1F;
1122 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
1124 i_result = p_buf[0] & 0x0F;
1127 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
1129 i_result = p_buf[0] & 0x07;
1132 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
1134 i_result = p_buf[0] & 0x03;
1137 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
1139 i_result = p_buf[0] & 0x01;
1142 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
1148 return INT64_C(0xffffffffffffffff);
1151 for( j = 1; j <= i; j++ )
1153 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
1155 return INT64_C(0xffffffffffffffff);
1158 i_result |= (p_buf[j] & 0x3F);
1165 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
1166 static const uint8_t flac_crc8_table[256] = {
1167 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1168 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1169 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1170 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1171 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
1172 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
1173 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
1174 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
1175 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
1176 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
1177 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
1178 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
1179 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
1180 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
1181 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
1182 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
1183 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
1184 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
1185 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
1186 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
1187 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
1188 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
1189 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
1190 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
1191 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
1192 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
1193 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
1194 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1195 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1196 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1197 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1198 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1201 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1206 crc = flac_crc8_table[crc ^ *data++];
1212 /*****************************************************************************
1213 * encoder_sys_t : flac encoder descriptor
1214 *****************************************************************************/
1215 struct encoder_sys_t
1222 int i_samples_delay;
1225 FLAC__int32 *p_buffer;
1226 unsigned int i_buffer;
1233 FLAC__StreamEncoder *p_flac;
1234 FLAC__StreamMetadata_StreamInfo stream_info;
1242 #define STREAMINFO_SIZE 38
1244 static block_t *Encode( encoder_t *, aout_buffer_t * );
1246 static FLAC__StreamEncoderWriteStatus
1247 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1248 const FLAC__byte buffer[],
1249 unsigned bytes, unsigned samples,
1250 unsigned current_frame, void *client_data );
1252 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1253 const FLAC__StreamMetadata *metadata,
1254 void *client_data );
1256 /*****************************************************************************
1257 * OpenEncoder: probe the encoder and return score
1258 *****************************************************************************/
1259 static int OpenEncoder( vlc_object_t *p_this )
1261 encoder_t *p_enc = (encoder_t *)p_this;
1262 encoder_sys_t *p_sys;
1264 if( p_enc->fmt_out.i_codec != VLC_FOURCC('f','l','a','c') &&
1267 return VLC_EGENERIC;
1270 /* Allocate the memory needed to store the decoder's structure */
1271 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1273 p_enc->p_sys = p_sys;
1274 p_enc->pf_encode_audio = Encode;
1275 p_enc->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
1277 p_sys->i_headers = 0;
1278 p_sys->p_buffer = 0;
1279 p_sys->i_buffer = 0;
1280 p_sys->i_samples_delay = 0;
1282 /* Create flac encoder */
1283 if( !(p_sys->p_flac = FLAC__stream_encoder_new()) )
1285 msg_Err( p_enc, "FLAC__stream_encoder_new() failed" );
1287 return VLC_EGENERIC;
1290 FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1291 FLAC__stream_encoder_set_channels( p_sys->p_flac,
1292 p_enc->fmt_in.audio.i_channels );
1293 FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1294 p_enc->fmt_in.audio.i_rate );
1295 FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1296 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
1298 /* Get and store the STREAMINFO metadata block as a p_extra */
1301 #ifdef USE_NEW_FLAC_API
1302 if( FLAC__stream_encoder_init_stream( p_sys->p_flac,
1303 EncoderWriteCallback,
1306 EncoderMetadataCallback,
1308 != FLAC__STREAM_ENCODER_INIT_STATUS_OK )
1310 msg_Err( p_enc, "FLAC__stream_encoder_init_stream() failed" );
1311 FLAC__stream_encoder_delete( p_sys->p_flac );
1313 return VLC_EGENERIC;
1316 FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1317 EncoderWriteCallback );
1318 FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1319 EncoderMetadataCallback );
1320 FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1322 FLAC__stream_encoder_init( p_sys->p_flac );
1328 /****************************************************************************
1329 * Encode: the whole thing
1330 ****************************************************************************
1331 * This function spits out ogg packets.
1332 ****************************************************************************/
1333 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1335 encoder_sys_t *p_sys = p_enc->p_sys;
1339 p_sys->i_pts = p_aout_buf->start_date -
1340 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1341 (mtime_t)p_enc->fmt_in.audio.i_rate;
1343 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1345 /* Convert samples to FLAC__int32 */
1346 if( p_sys->i_buffer < p_aout_buf->i_nb_bytes * 2 )
1349 realloc( p_sys->p_buffer, p_aout_buf->i_nb_bytes * 2 );
1350 p_sys->i_buffer = p_aout_buf->i_nb_bytes * 2;
1353 for( i = 0 ; i < p_aout_buf->i_nb_bytes / 2 ; i++ )
1355 p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1358 FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1359 p_aout_buf->i_nb_samples );
1361 p_chain = p_sys->p_chain;
1367 /*****************************************************************************
1368 * CloseEncoder: encoder destruction
1369 *****************************************************************************/
1370 static void CloseEncoder( vlc_object_t *p_this )
1372 encoder_t *p_enc = (encoder_t *)p_this;
1373 encoder_sys_t *p_sys = p_enc->p_sys;
1375 FLAC__stream_encoder_delete( p_sys->p_flac );
1377 free( p_sys->p_buffer );
1381 /*****************************************************************************
1382 * EncoderMetadataCallback: called by libflac to output metadata
1383 *****************************************************************************/
1384 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1385 const FLAC__StreamMetadata *metadata,
1388 VLC_UNUSED(encoder);
1389 encoder_t *p_enc = (encoder_t *)client_data;
1391 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1395 /*****************************************************************************
1396 * EncoderWriteCallback: called by libflac to output encoded samples
1397 *****************************************************************************/
1398 static FLAC__StreamEncoderWriteStatus
1399 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1400 const FLAC__byte buffer[],
1401 unsigned bytes, unsigned samples,
1402 unsigned current_frame, void *client_data )
1404 VLC_UNUSED(encoder); VLC_UNUSED(current_frame);
1405 encoder_t *p_enc = (encoder_t *)client_data;
1406 encoder_sys_t *p_sys = p_enc->p_sys;
1411 if( p_sys->i_headers == 1 )
1413 msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1415 /* Backup the STREAMINFO metadata block */
1416 p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1417 p_enc->fmt_out.p_extra = malloc( STREAMINFO_SIZE + 4 );
1418 memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1419 memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1422 /* Fake this as the last metadata block */
1423 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1426 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1429 p_block = block_New( p_enc, bytes );
1430 memcpy( p_block->p_buffer, buffer, bytes );
1432 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1434 p_sys->i_samples_delay -= samples;
1436 p_block->i_length = (mtime_t)1000000 *
1437 (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1440 p_sys->i_pts += p_block->i_length;
1442 block_ChainAppend( &p_sys->p_chain, p_block );
1444 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;