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;
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 const int *pi_order, int i_nb_channels, int i_samples );
164 static void Interleave24( int8_t *p_out, const int32_t * const *pp_in,
165 const int *pi_order, int i_nb_channels, int i_samples );
166 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
167 const int *pi_order, int i_nb_channels, int i_samples );
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_CODEC_FLAC )
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 date_Set( &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_CODEC_FL32;
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_CODEC_FLAC;
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_CODEC_FLAC )
364 p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
365 p_dec->fmt_out.p_extra = xrealloc( p_dec->fmt_out.p_extra,
366 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 date_Set( &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( !date_Get( &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( !date_Get( &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 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
416 date_Set( &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 != date_Get( &p_sys->end_date ) )
450 date_Set( &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 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
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 = date_Get( &p_sys->end_date );
539 date_Increment( &p_sys->end_date, p_sys->i_frame_length );
540 p_sout_block->i_length =
541 date_Get( &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 )
620 /* XXX it supposes our internal format is WG4 */
621 static const int ppi_reorder[1+8][8] = {
628 { 0, 1, 4, 5, 2, 3 },
630 { 0, 1, 6, 2, 3, 4, 5 }, /* 7.0 Unspecified by flac */
631 { 0, 1, 6, 7, 2, 3, 4, 5 }, /* 7.1 Unspecified by flac */
635 decoder_t *p_dec = (decoder_t *)client_data;
636 decoder_sys_t *p_sys = p_dec->p_sys;
638 if( p_dec->fmt_out.audio.i_channels <= 0 ||
639 p_dec->fmt_out.audio.i_channels > 8 )
640 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
641 const int * const pi_reorder = ppi_reorder[p_dec->fmt_out.audio.i_channels];
643 p_sys->p_aout_buffer =
644 decoder_NewAudioBuffer( p_dec, frame->header.blocksize );
646 if( p_sys->p_aout_buffer == NULL )
647 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
649 switch( frame->header.bits_per_sample )
652 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer, pi_reorder,
653 frame->header.channels, frame->header.blocksize );
656 Interleave24( (int8_t *)p_sys->p_aout_buffer->p_buffer, buffer, pi_reorder,
657 frame->header.channels, frame->header.blocksize );
660 Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer, pi_reorder,
661 frame->header.channels, frame->header.blocksize );
664 /* Date management (already done by packetizer) */
665 p_sys->p_aout_buffer->i_pts = p_sys->p_block->i_pts;
666 p_sys->p_aout_buffer->i_length = p_sys->p_block->i_length;
668 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
671 /*****************************************************************************
672 * DecoderMetadataCallback: called by libflac to when it encounters metadata
673 *****************************************************************************/
674 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
675 const FLAC__StreamMetadata *metadata,
679 decoder_t *p_dec = (decoder_t *)client_data;
680 decoder_sys_t *p_sys = p_dec->p_sys;
682 if( p_dec->pf_decode_audio )
684 switch( metadata->data.stream_info.bits_per_sample )
687 p_dec->fmt_out.i_codec = VLC_CODEC_S8;
690 p_dec->fmt_out.i_codec = VLC_CODEC_S16N;
693 p_dec->fmt_out.i_codec = VLC_CODEC_S24N;
696 msg_Dbg( p_dec, "strange bit/sample value: %d",
697 metadata->data.stream_info.bits_per_sample );
698 p_dec->fmt_out.i_codec = VLC_CODEC_FI32;
703 /* Setup the format */
704 p_dec->fmt_out.audio.i_rate = metadata->data.stream_info.sample_rate;
705 p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
706 p_dec->fmt_out.audio.i_physical_channels =
707 p_dec->fmt_out.audio.i_original_channels =
708 pi_channels_maps[metadata->data.stream_info.channels];
709 p_dec->fmt_out.audio.i_bitspersample =
710 metadata->data.stream_info.bits_per_sample;
712 date_Init( &p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1 );
714 msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
715 p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
716 p_dec->fmt_out.audio.i_bitspersample );
718 p_sys->b_stream_info = true;
719 p_sys->stream_info = metadata->data.stream_info;
724 /*****************************************************************************
725 * DecoderErrorCallback: called when the libflac decoder encounters an error
726 *****************************************************************************/
727 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
728 FLAC__StreamDecoderErrorStatus status,
732 decoder_t *p_dec = (decoder_t *)client_data;
736 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
737 msg_Warn( p_dec, "an error in the stream caused the decoder to "
738 "lose synchronization." );
740 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
741 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
743 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
744 msg_Err( p_dec, "frame's data did not match the CRC in the "
748 msg_Err( p_dec, "got decoder error: %d", status );
751 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
755 /*****************************************************************************
756 * Interleave: helper function to interleave channels
757 *****************************************************************************/
758 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
759 const int pi_index[],
760 int i_nb_channels, int i_samples )
763 for ( j = 0; j < i_samples; j++ )
765 for ( i = 0; i < i_nb_channels; i++ )
767 p_out[j * i_nb_channels + i] = pp_in[pi_index[i]][j];
772 static void Interleave24( int8_t *p_out, const int32_t * const *pp_in,
773 const int pi_index[],
774 int i_nb_channels, int i_samples )
777 for ( j = 0; j < i_samples; j++ )
779 for ( i = 0; i < i_nb_channels; i++ )
781 const int i_index = pi_index[i];
782 #ifdef WORDS_BIGENDIAN
783 p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i_index][j] >> 16) & 0xff;
784 p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i_index][j] >> 8 ) & 0xff;
785 p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i_index][j] >> 0 ) & 0xff;
787 p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i_index][j] >> 16) & 0xff;
788 p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i_index][j] >> 8 ) & 0xff;
789 p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i_index][j] >> 0 ) & 0xff;
795 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
796 const int pi_index[],
797 int i_nb_channels, int i_samples )
800 for ( j = 0; j < i_samples; j++ )
802 for ( i = 0; i < i_nb_channels; i++ )
804 p_out[j * i_nb_channels + i] = (int32_t)(pp_in[pi_index[i]][j]);
809 /*****************************************************************************
810 * decoder_state_error: print meaningful error messages
811 *****************************************************************************/
812 static void decoder_state_error( decoder_t *p_dec,
813 FLAC__StreamDecoderState state )
817 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
818 msg_Dbg( p_dec, "the decoder is ready to search for metadata." );
820 case FLAC__STREAM_DECODER_READ_METADATA:
821 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
822 "reading metadata." );
824 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
825 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
826 "searching for the frame sync code." );
828 case FLAC__STREAM_DECODER_READ_FRAME:
829 msg_Dbg( p_dec, "the decoder is ready to or is in the process of "
830 "reading a frame." );
832 case FLAC__STREAM_DECODER_END_OF_STREAM:
833 msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
835 #ifdef USE_NEW_FLAC_API
836 case FLAC__STREAM_DECODER_OGG_ERROR:
837 msg_Err( p_dec, "error occurred in the Ogg layer." );
839 case FLAC__STREAM_DECODER_SEEK_ERROR:
840 msg_Err( p_dec, "error occurred while seeking." );
843 case FLAC__STREAM_DECODER_ABORTED:
844 msg_Warn( p_dec, "the decoder was aborted by the read callback." );
846 #ifndef USE_NEW_FLAC_API
847 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
848 msg_Warn( p_dec, "the decoder encountered reserved fields in use "
852 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
853 msg_Err( p_dec, "error when allocating memory." );
855 #ifndef USE_NEW_FLAC_API
856 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
857 msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
858 "decoder was already initialized, usually because "
859 "FLAC__stream_decoder_finish() was not called." );
861 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
862 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
863 "all callbacks being set." );
866 case FLAC__STREAM_DECODER_UNINITIALIZED:
867 msg_Err( p_dec, "decoder in uninitialized state." );
870 msg_Warn(p_dec, "unknown error" );
875 /*****************************************************************************
876 * SyncInfo: parse FLAC sync info
877 *****************************************************************************/
878 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
879 unsigned int * pi_channels,
880 unsigned int * pi_channels_conf,
881 unsigned int * pi_sample_rate,
882 int * pi_bits_per_sample )
884 decoder_sys_t *p_sys = p_dec->p_sys;
885 int i_header, i_temp, i_read;
886 unsigned i_blocksize = 0;
887 int i_blocksize_hint = 0, i_sample_rate_hint = 0;
888 uint64_t i_sample_number = 0;
890 bool b_variable_blocksize = ( p_sys->b_stream_info &&
891 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
892 bool b_fixed_blocksize = ( p_sys->b_stream_info &&
893 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
896 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
898 /* Check there is no emulated sync code in the rest of the header */
899 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
901 /* Find blocksize (framelength) */
902 switch( i_temp = p_buf[2] >> 4 )
905 if( b_fixed_blocksize )
906 i_blocksize = p_sys->stream_info.min_blocksize;
907 else return 0; /* We can't do anything with this */
918 i_blocksize = 576 << (i_temp - 2);
923 i_blocksize_hint = i_temp;
934 i_blocksize = 256 << (i_temp - 8);
938 /* Find samplerate */
939 switch( i_temp = p_buf[2] & 0x0f )
942 if( p_sys->b_stream_info )
943 *pi_sample_rate = p_sys->stream_info.sample_rate;
944 else return 0; /* We can't do anything with this */
954 *pi_sample_rate = 8000;
958 *pi_sample_rate = 16000;
962 *pi_sample_rate = 22050;
966 *pi_sample_rate = 24000;
970 *pi_sample_rate = 32000;
974 *pi_sample_rate = 44100;
978 *pi_sample_rate = 48000;
982 *pi_sample_rate = 96000;
988 i_sample_rate_hint = i_temp;
996 i_temp = (unsigned)(p_buf[3] >> 4);
1000 int i_channel_assignment; /* ??? */
1002 switch( i_temp & 7 )
1005 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
1008 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
1011 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
1023 *pi_channels = i_temp + 1;
1024 *pi_channels_conf = pi_channels_maps[ *pi_channels ];
1027 /* Find bits per sample */
1028 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
1031 if( p_sys->b_stream_info )
1032 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
1038 *pi_bits_per_sample = 8;
1042 *pi_bits_per_sample = 12;
1046 *pi_bits_per_sample = 16;
1050 *pi_bits_per_sample = 20;
1054 *pi_bits_per_sample = 24;
1063 /* Zero padding bit */
1064 if( p_buf[3] & 0x01 ) return 0;
1066 /* End of fixed size header */
1069 /* Find Sample/Frame number */
1070 if( i_blocksize_hint && b_variable_blocksize )
1072 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1073 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
1077 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
1078 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
1080 if( p_sys->b_stream_info )
1081 i_sample_number *= p_sys->stream_info.min_blocksize;
1086 /* Read blocksize */
1087 if( i_blocksize_hint )
1089 int i_val1 = p_buf[i_header++];
1090 if( i_blocksize_hint == 7 )
1092 int i_val2 = p_buf[i_header++];
1093 i_val1 = (i_val1 << 8) | i_val2;
1095 i_blocksize = i_val1 + 1;
1098 /* Read sample rate */
1099 if( i_sample_rate_hint )
1101 int i_val1 = p_buf[i_header++];
1102 if( i_sample_rate_hint != 12 )
1104 int i_val2 = p_buf[i_header++];
1105 i_val1 = (i_val1 << 8) | i_val2;
1107 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
1108 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
1109 else *pi_sample_rate = i_val1 * 10;
1112 /* Check the CRC-8 byte */
1113 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
1118 /* Sanity check using stream info header when possible */
1119 if( p_sys->b_stream_info )
1121 if( i_blocksize < p_sys->stream_info.min_blocksize ||
1122 i_blocksize > p_sys->stream_info.max_blocksize )
1128 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
1129 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
1131 uint64_t i_result = 0;
1134 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
1136 i_result = p_buf[0];
1139 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
1141 i_result = p_buf[0] & 0x1F;
1144 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
1146 i_result = p_buf[0] & 0x0F;
1149 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
1151 i_result = p_buf[0] & 0x07;
1154 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
1156 i_result = p_buf[0] & 0x03;
1159 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
1161 i_result = p_buf[0] & 0x01;
1164 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
1170 return INT64_C(0xffffffffffffffff);
1173 for( j = 1; j <= i; j++ )
1175 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
1177 return INT64_C(0xffffffffffffffff);
1180 i_result |= (p_buf[j] & 0x3F);
1187 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
1188 static const uint8_t flac_crc8_table[256] = {
1189 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1190 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1191 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1192 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1193 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
1194 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
1195 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
1196 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
1197 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
1198 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
1199 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
1200 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
1201 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
1202 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
1203 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
1204 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
1205 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
1206 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
1207 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
1208 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
1209 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
1210 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
1211 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
1212 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
1213 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
1214 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
1215 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
1216 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1217 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1218 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1219 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1220 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1223 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1228 crc = flac_crc8_table[crc ^ *data++];
1234 /*****************************************************************************
1235 * encoder_sys_t : flac encoder descriptor
1236 *****************************************************************************/
1237 struct encoder_sys_t
1244 int i_samples_delay;
1247 FLAC__int32 *p_buffer;
1248 unsigned int i_buffer;
1255 FLAC__StreamEncoder *p_flac;
1256 FLAC__StreamMetadata_StreamInfo stream_info;
1264 #define STREAMINFO_SIZE 38
1266 static block_t *Encode( encoder_t *, aout_buffer_t * );
1268 static FLAC__StreamEncoderWriteStatus
1269 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1270 const FLAC__byte buffer[],
1271 unsigned bytes, unsigned samples,
1272 unsigned current_frame, void *client_data );
1274 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1275 const FLAC__StreamMetadata *metadata,
1276 void *client_data );
1278 /*****************************************************************************
1279 * OpenEncoder: probe the encoder and return score
1280 *****************************************************************************/
1281 static int OpenEncoder( vlc_object_t *p_this )
1283 encoder_t *p_enc = (encoder_t *)p_this;
1284 encoder_sys_t *p_sys;
1286 if( p_enc->fmt_out.i_codec != VLC_CODEC_FLAC &&
1289 return VLC_EGENERIC;
1292 /* Allocate the memory needed to store the decoder's structure */
1293 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1295 p_enc->p_sys = p_sys;
1296 p_enc->pf_encode_audio = Encode;
1297 p_enc->fmt_out.i_codec = VLC_CODEC_FLAC;
1299 p_sys->i_headers = 0;
1300 p_sys->p_buffer = 0;
1301 p_sys->i_buffer = 0;
1302 p_sys->i_samples_delay = 0;
1304 /* Create flac encoder */
1305 if( !(p_sys->p_flac = FLAC__stream_encoder_new()) )
1307 msg_Err( p_enc, "FLAC__stream_encoder_new() failed" );
1309 return VLC_EGENERIC;
1312 FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1313 FLAC__stream_encoder_set_channels( p_sys->p_flac,
1314 p_enc->fmt_in.audio.i_channels );
1315 FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1316 p_enc->fmt_in.audio.i_rate );
1317 FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1318 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
1320 /* Get and store the STREAMINFO metadata block as a p_extra */
1323 #ifdef USE_NEW_FLAC_API
1324 if( FLAC__stream_encoder_init_stream( p_sys->p_flac,
1325 EncoderWriteCallback,
1328 EncoderMetadataCallback,
1330 != FLAC__STREAM_ENCODER_INIT_STATUS_OK )
1332 msg_Err( p_enc, "FLAC__stream_encoder_init_stream() failed" );
1333 FLAC__stream_encoder_delete( p_sys->p_flac );
1335 return VLC_EGENERIC;
1338 FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1339 EncoderWriteCallback );
1340 FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1341 EncoderMetadataCallback );
1342 FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1344 FLAC__stream_encoder_init( p_sys->p_flac );
1350 /****************************************************************************
1351 * Encode: the whole thing
1352 ****************************************************************************
1353 * This function spits out ogg packets.
1354 ****************************************************************************/
1355 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1357 encoder_sys_t *p_sys = p_enc->p_sys;
1361 p_sys->i_pts = p_aout_buf->i_pts -
1362 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1363 (mtime_t)p_enc->fmt_in.audio.i_rate;
1365 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1367 /* Convert samples to FLAC__int32 */
1368 if( p_sys->i_buffer < p_aout_buf->i_buffer * 2 )
1371 xrealloc( p_sys->p_buffer, p_aout_buf->i_buffer * 2 );
1372 p_sys->i_buffer = p_aout_buf->i_buffer * 2;
1375 for( i = 0 ; i < p_aout_buf->i_buffer / 2 ; i++ )
1377 p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1380 FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1381 p_aout_buf->i_nb_samples );
1383 p_chain = p_sys->p_chain;
1389 /*****************************************************************************
1390 * CloseEncoder: encoder destruction
1391 *****************************************************************************/
1392 static void CloseEncoder( vlc_object_t *p_this )
1394 encoder_t *p_enc = (encoder_t *)p_this;
1395 encoder_sys_t *p_sys = p_enc->p_sys;
1397 FLAC__stream_encoder_delete( p_sys->p_flac );
1399 free( p_sys->p_buffer );
1403 /*****************************************************************************
1404 * EncoderMetadataCallback: called by libflac to output metadata
1405 *****************************************************************************/
1406 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1407 const FLAC__StreamMetadata *metadata,
1410 VLC_UNUSED(encoder);
1411 encoder_t *p_enc = (encoder_t *)client_data;
1413 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1417 /*****************************************************************************
1418 * EncoderWriteCallback: called by libflac to output encoded samples
1419 *****************************************************************************/
1420 static FLAC__StreamEncoderWriteStatus
1421 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1422 const FLAC__byte buffer[],
1423 unsigned bytes, unsigned samples,
1424 unsigned current_frame, void *client_data )
1426 VLC_UNUSED(encoder); VLC_UNUSED(current_frame);
1427 encoder_t *p_enc = (encoder_t *)client_data;
1428 encoder_sys_t *p_sys = p_enc->p_sys;
1433 if( p_sys->i_headers == 1 )
1435 msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1437 /* Backup the STREAMINFO metadata block */
1438 p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1439 p_enc->fmt_out.p_extra = xmalloc( STREAMINFO_SIZE + 4 );
1440 memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1441 memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1444 /* Fake this as the last metadata block */
1445 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1448 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1451 p_block = block_New( p_enc, bytes );
1452 memcpy( p_block->p_buffer, buffer, bytes );
1454 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1456 p_sys->i_samples_delay -= samples;
1458 p_block->i_length = (mtime_t)1000000 *
1459 (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1462 p_sys->i_pts += p_block->i_length;
1464 block_ChainAppend( &p_sys->p_chain, p_block );
1466 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;