1 /*****************************************************************************
2 * flac.c: flac decoder/packetizer/encoder module making use of libflac
3 *****************************************************************************
4 * Copyright (C) 1999-2001 VideoLAN
7 * Authors: Gildas Bazin <gbazin@videolan.org>
8 * Sigmund Augdal <sigmunau@idi.ntnu.no>
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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
30 #include <vlc/decoder.h>
32 #include <FLAC/stream_decoder.h>
33 #include <FLAC/stream_encoder.h>
35 #include "vlc_block_helper.h"
37 #define MAX_FLAC_HEADER_SIZE 16
39 /*****************************************************************************
40 * decoder_sys_t : FLAC decoder descriptor
41 *****************************************************************************/
49 block_bytestream_t bytestream;
52 * Input/Output properties
55 aout_buffer_t *p_aout_buffer;
60 FLAC__StreamDecoder *p_flac;
62 vlc_bool_t b_stream_info;
63 FLAC__StreamMetadata_StreamInfo stream_info;
68 audio_date_t end_date;
71 int i_frame_size, i_frame_length, i_bits_per_sample;
72 unsigned int i_rate, i_channels, i_channels_conf;
85 static int pi_channels_maps[6] =
89 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
90 AOUT_CHAN_CENTER | AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
91 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT
92 | AOUT_CHAN_REARRIGHT,
93 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
94 | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
97 /*****************************************************************************
99 *****************************************************************************/
100 static int OpenDecoder ( vlc_object_t * );
101 static int OpenPacketizer( vlc_object_t * );
102 static void CloseDecoder ( vlc_object_t * );
104 static int OpenEncoder ( vlc_object_t * );
105 static void CloseEncoder ( vlc_object_t * );
107 static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
108 static block_t *PacketizeBlock( decoder_t *, block_t ** );
110 static int SyncInfo( decoder_t *, uint8_t *, int *, int *, int *,int * );
113 static FLAC__StreamDecoderReadStatus
114 DecoderReadCallback( const FLAC__StreamDecoder *decoder,
115 FLAC__byte buffer[], unsigned *bytes, void *client_data );
117 static FLAC__StreamDecoderWriteStatus
118 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
119 const FLAC__Frame *frame,
120 const FLAC__int32 *const buffer[], void *client_data );
122 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
123 const FLAC__StreamMetadata *metadata,
125 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
126 FLAC__StreamDecoderErrorStatus status,
129 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
130 int i_nb_channels, int i_samples );
131 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
132 int i_nb_channels, int i_samples );
134 static void decoder_state_error( decoder_t *p_dec,
135 FLAC__StreamDecoderState state );
137 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read );
138 static uint8_t flac_crc8( const uint8_t *data, unsigned len );
140 /*****************************************************************************
142 *****************************************************************************/
145 set_category( CAT_INPUT );
146 set_subcategory( SUBCAT_INPUT_ACODEC );
148 set_description( _("Flac audio decoder") );
149 set_capability( "decoder", 100 );
150 set_callbacks( OpenDecoder, CloseDecoder );
153 set_description( _("Flac audio packetizer") );
154 set_capability( "packetizer", 100 );
155 set_callbacks( OpenPacketizer, CloseDecoder );
158 set_description( _("Flac audio encoder") );
159 set_capability( "encoder", 100 );
160 set_callbacks( OpenEncoder, CloseEncoder );
162 add_shortcut( "flac" );
165 /*****************************************************************************
166 * OpenDecoder: probe the decoder and return score
167 *****************************************************************************/
168 static int OpenDecoder( vlc_object_t *p_this )
170 decoder_t *p_dec = (decoder_t*)p_this;
171 decoder_sys_t *p_sys;
173 if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','l','a','c') )
178 /* Allocate the memory needed to store the decoder's structure */
179 if( ( p_dec->p_sys = p_sys =
180 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
182 msg_Err( p_dec, "out of memory" );
187 aout_DateSet( &p_sys->end_date, 0 );
188 p_sys->i_state = STATE_NOSYNC;
189 p_sys->b_stream_info = VLC_FALSE;
191 p_sys->bytestream = block_BytestreamInit( p_dec );
193 /* Take care of flac init */
194 if( !(p_sys->p_flac = FLAC__stream_decoder_new()) )
196 msg_Err( p_dec, "FLAC__stream_decoder_new() failed" );
201 FLAC__stream_decoder_set_read_callback( p_sys->p_flac,
202 DecoderReadCallback );
203 FLAC__stream_decoder_set_write_callback( p_sys->p_flac,
204 DecoderWriteCallback );
205 FLAC__stream_decoder_set_metadata_callback( p_sys->p_flac,
206 DecoderMetadataCallback );
207 FLAC__stream_decoder_set_error_callback( p_sys->p_flac,
208 DecoderErrorCallback );
209 FLAC__stream_decoder_set_client_data( p_sys->p_flac, p_dec );
211 FLAC__stream_decoder_init( p_sys->p_flac );
213 /* Set output properties */
214 p_dec->fmt_out.i_cat = AUDIO_ES;
215 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
218 p_dec->pf_decode_audio = DecodeBlock;
219 p_dec->pf_packetize = PacketizeBlock;
224 static int OpenPacketizer( vlc_object_t *p_this )
226 decoder_t *p_dec = (decoder_t*)p_this;
229 /* Hmmm, mem leak ?*/
230 es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
232 i_ret = OpenDecoder( p_this );
234 /* Set output properties */
235 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
237 if( i_ret != VLC_SUCCESS ) return i_ret;
242 /*****************************************************************************
243 * ProcessHeader: processe Flac header.
244 *****************************************************************************/
245 static void ProcessHeader( decoder_t *p_dec )
247 decoder_sys_t *p_sys = p_dec->p_sys;
249 if( !p_dec->fmt_in.i_extra ) return;
251 /* Decode STREAMINFO */
252 msg_Dbg( p_dec, "decode STREAMINFO" );
253 p_sys->p_block = block_New( p_dec, p_dec->fmt_in.i_extra );
254 memcpy( p_sys->p_block->p_buffer, p_dec->fmt_in.p_extra,
255 p_dec->fmt_in.i_extra );
256 FLAC__stream_decoder_process_until_end_of_metadata( p_sys->p_flac );
257 msg_Dbg( p_dec, "STREAMINFO decoded" );
259 if( !p_sys->b_stream_info ) return;
261 if( p_dec->fmt_out.i_codec == VLC_FOURCC('f','l','a','c') )
263 p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
264 p_dec->fmt_out.p_extra =
265 realloc( p_dec->fmt_out.p_extra, p_dec->fmt_out.i_extra );
266 memcpy( p_dec->fmt_out.p_extra,
267 p_dec->fmt_in.p_extra, p_dec->fmt_out.i_extra );
271 /****************************************************************************
272 * PacketizeBlock: the whole thing
273 ****************************************************************************
274 * This function is called just after the thread is launched.
275 ****************************************************************************/
276 static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
278 decoder_sys_t *p_sys = p_dec->p_sys;
279 uint8_t p_header[MAX_FLAC_HEADER_SIZE];
280 block_t *p_sout_block;
282 if( !pp_block || !*pp_block ) return NULL;
284 if( !p_sys->b_stream_info ) ProcessHeader( p_dec );
286 if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
288 /* We've just started the stream, wait for the first PTS. */
289 block_Release( *pp_block );
292 else if( !aout_DateGet( &p_sys->end_date ) )
294 /* The first PTS is as good as anything else. */
295 aout_DateSet( &p_sys->end_date, (*pp_block)->i_pts );
298 if( (*pp_block)->i_flags&BLOCK_FLAG_DISCONTINUITY )
300 p_sys->i_state = STATE_NOSYNC;
303 block_BytestreamPush( &p_sys->bytestream, *pp_block );
307 switch( p_sys->i_state )
310 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
313 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
315 p_sys->i_state = STATE_SYNC;
318 block_SkipByte( &p_sys->bytestream );
320 if( p_sys->i_state != STATE_SYNC )
322 block_BytestreamFlush( &p_sys->bytestream );
329 /* New frame, set the Presentation Time Stamp */
330 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
331 if( p_sys->i_pts != 0 &&
332 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
334 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
336 p_sys->i_state = STATE_HEADER;
339 /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
340 if( block_PeekBytes( &p_sys->bytestream, p_header,
341 MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
347 /* Check if frame is valid and get frame info */
348 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
350 &p_sys->i_channels_conf,
352 &p_sys->i_bits_per_sample );
353 if( !p_sys->i_frame_length )
355 msg_Dbg( p_dec, "emulated sync word" );
356 block_SkipByte( &p_sys->bytestream );
357 p_sys->i_state = STATE_NOSYNC;
360 if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
362 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
363 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
365 p_sys->i_state = STATE_NEXT_SYNC;
366 p_sys->i_frame_size = 1;
368 case STATE_NEXT_SYNC:
369 /* TODO: If pp_block == NULL, flush the buffer without checking the
372 /* Check if next expected frame contains the sync word */
373 while( block_PeekOffsetBytes( &p_sys->bytestream,
374 p_sys->i_frame_size, p_header,
375 MAX_FLAC_HEADER_SIZE )
378 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
380 /* Check if frame is valid and get frame info */
382 SyncInfo( p_dec, p_header,
384 &p_sys->i_channels_conf,
386 &p_sys->i_bits_per_sample );
390 p_sys->i_state = STATE_SEND_DATA;
394 p_sys->i_frame_size++;
397 if( p_sys->i_state != STATE_SEND_DATA )
403 case STATE_SEND_DATA:
404 p_sout_block = block_New( p_dec, p_sys->i_frame_size );
406 /* Copy the whole frame into the buffer. When we reach this point
407 * we already know we have enough data available. */
408 block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
409 p_sys->i_frame_size );
411 /* Make sure we don't reuse the same pts twice */
412 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
413 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
415 /* So p_block doesn't get re-added several times */
416 *pp_block = block_BytestreamPop( &p_sys->bytestream );
418 p_sys->i_state = STATE_NOSYNC;
420 /* Date management */
421 p_sout_block->i_pts =
422 p_sout_block->i_dts = aout_DateGet( &p_sys->end_date );
423 aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
424 p_sout_block->i_length =
425 aout_DateGet( &p_sys->end_date ) - p_sout_block->i_pts;
434 /****************************************************************************
435 * DecodeBlock: the whole thing
436 ****************************************************************************/
437 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
439 decoder_sys_t *p_sys = p_dec->p_sys;
441 if( !pp_block || !*pp_block ) return NULL;
443 p_sys->p_aout_buffer = 0;
444 if( ( p_sys->p_block = PacketizeBlock( p_dec, pp_block ) ) )
446 if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) )
448 decoder_state_error( p_dec,
449 FLAC__stream_decoder_get_state( p_sys->p_flac ) );
450 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
453 /* If the decoder is in the "aborted" state,
454 * FLAC__stream_decoder_process_single() won't return an error. */
455 if( FLAC__stream_decoder_get_state(p_dec->p_sys->p_flac)
456 == FLAC__STREAM_DECODER_ABORTED )
458 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
461 block_Release( p_sys->p_block );
462 p_sys->p_block = NULL;
465 return p_sys->p_aout_buffer;
468 /*****************************************************************************
469 * CloseDecoder: flac decoder destruction
470 *****************************************************************************/
471 static void CloseDecoder( vlc_object_t *p_this )
473 decoder_t *p_dec = (decoder_t *)p_this;
474 decoder_sys_t *p_sys = p_dec->p_sys;
476 FLAC__stream_decoder_finish( p_sys->p_flac );
477 FLAC__stream_decoder_delete( p_sys->p_flac );
478 if( p_sys->p_block ) free( p_sys->p_block );
482 /*****************************************************************************
483 * DecoderReadCallback: called by libflac when it needs more data
484 *****************************************************************************/
485 static FLAC__StreamDecoderReadStatus
486 DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
487 unsigned *bytes, void *client_data )
489 decoder_t *p_dec = (decoder_t *)client_data;
490 decoder_sys_t *p_sys = p_dec->p_sys;
492 if( p_sys->p_block && p_sys->p_block->i_buffer )
494 *bytes = __MIN(*bytes, (unsigned)p_sys->p_block->i_buffer);
495 memcpy( buffer, p_sys->p_block->p_buffer, *bytes );
496 p_sys->p_block->i_buffer -= *bytes;
497 p_sys->p_block->p_buffer += *bytes;
502 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
505 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
508 /*****************************************************************************
509 * DecoderWriteCallback: called by libflac to output decoded samples
510 *****************************************************************************/
511 static FLAC__StreamDecoderWriteStatus
512 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
513 const FLAC__Frame *frame,
514 const FLAC__int32 *const buffer[], void *client_data )
516 decoder_t *p_dec = (decoder_t *)client_data;
517 decoder_sys_t *p_sys = p_dec->p_sys;
519 p_sys->p_aout_buffer =
520 p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize );
522 if( p_sys->p_aout_buffer == NULL )
523 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
525 switch( frame->header.bits_per_sample )
528 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
529 frame->header.channels, frame->header.blocksize );
532 Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
533 frame->header.channels, frame->header.blocksize );
536 /* Date management (already done by packetizer) */
537 p_sys->p_aout_buffer->start_date = p_sys->p_block->i_pts;
538 p_sys->p_aout_buffer->end_date =
539 p_sys->p_block->i_pts + p_sys->p_block->i_length;
541 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
544 /*****************************************************************************
545 * DecoderMetadataCallback: called by libflac to when it encounters metadata
546 *****************************************************************************/
547 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
548 const FLAC__StreamMetadata *metadata,
551 decoder_t *p_dec = (decoder_t *)client_data;
552 decoder_sys_t *p_sys = p_dec->p_sys;
554 switch( metadata->data.stream_info.bits_per_sample )
557 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
560 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
563 msg_Dbg( p_dec, "strange bit/sample value: %d",
564 metadata->data.stream_info.bits_per_sample );
565 p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
569 /* Setup the format */
570 p_dec->fmt_out.audio.i_rate = metadata->data.stream_info.sample_rate;
571 p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
572 p_dec->fmt_out.audio.i_physical_channels =
573 p_dec->fmt_out.audio.i_original_channels =
574 pi_channels_maps[metadata->data.stream_info.channels];
575 p_dec->fmt_out.audio.i_bitspersample =
576 metadata->data.stream_info.bits_per_sample;
578 aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
580 msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
581 p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
582 p_dec->fmt_out.audio.i_bitspersample );
584 p_sys->b_stream_info = VLC_TRUE;
585 p_sys->stream_info = metadata->data.stream_info;
590 /*****************************************************************************
591 * DecoderErrorCallback: called when the libflac decoder encounters an error
592 *****************************************************************************/
593 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
594 FLAC__StreamDecoderErrorStatus status,
597 decoder_t *p_dec = (decoder_t *)client_data;
601 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
602 msg_Err( p_dec, "an error in the stream caused the decoder to "
603 "lose synchronization." );
605 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
606 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
608 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
609 msg_Err( p_dec, "frame's data did not match the CRC in the "
613 msg_Err( p_dec, "got decoder error: %d", status );
616 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
620 /*****************************************************************************
621 * Interleave: helper function to interleave channels
622 *****************************************************************************/
623 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
624 int i_nb_channels, int i_samples )
627 for ( j = 0; j < i_samples; j++ )
629 for ( i = 0; i < i_nb_channels; i++ )
631 p_out[j * i_nb_channels + i] = pp_in[i][j];
635 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
636 int i_nb_channels, int i_samples )
639 for ( j = 0; j < i_samples; j++ )
641 for ( i = 0; i < i_nb_channels; i++ )
643 p_out[j * i_nb_channels + i] = (int32_t)(pp_in[i][j]);
648 /*****************************************************************************
649 * decoder_state_error: print meaningful error messages
650 *****************************************************************************/
651 static void decoder_state_error( decoder_t *p_dec,
652 FLAC__StreamDecoderState state )
656 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
657 msg_Err( p_dec, "the decoder is ready to search for metadata." );
659 case FLAC__STREAM_DECODER_READ_METADATA:
660 msg_Err( p_dec, "the decoder is ready to or is in the process of "
661 "reading metadata." );
663 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
664 msg_Err( p_dec, "the decoder is ready to or is in the process of "
665 "searching for the frame sync code." );
667 case FLAC__STREAM_DECODER_READ_FRAME:
668 msg_Err( p_dec, "the decoder is ready to or is in the process of "
669 "reading a frame." );
671 case FLAC__STREAM_DECODER_END_OF_STREAM:
672 msg_Err( p_dec, "the decoder has reached the end of the stream." );
674 case FLAC__STREAM_DECODER_ABORTED:
675 msg_Err( p_dec, "the decoder was aborted by the read callback." );
677 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
678 msg_Err( p_dec, "the decoder encountered reserved fields in use "
681 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
682 msg_Err( p_dec, "error when allocating memory." );
684 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
685 msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
686 "decoder was already initialized, usually because "
687 "FLAC__stream_decoder_finish() was not called." );
689 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
690 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
691 "all callbacks being set." );
693 case FLAC__STREAM_DECODER_UNINITIALIZED:
694 msg_Err( p_dec, "decoder in uninitialized state." );
697 msg_Err(p_dec, "unknown error" );
701 /*****************************************************************************
702 * SyncInfo: parse FLAC sync info
703 *****************************************************************************/
704 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
705 int * pi_channels, int * pi_channels_conf,
706 int * pi_sample_rate, int * pi_bits_per_sample )
708 decoder_sys_t *p_sys = p_dec->p_sys;
709 int i_header, i_temp, i_read;
710 int i_blocksize = 0, i_blocksize_hint = 0, i_sample_rate_hint = 0;
711 uint64_t i_sample_number = 0;
713 vlc_bool_t b_variable_blocksize = ( p_sys->b_stream_info &&
714 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
715 vlc_bool_t b_fixed_blocksize = ( p_sys->b_stream_info &&
716 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
719 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
721 /* Check there is no emulated sync code in the rest of the header */
722 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
724 /* Find blocksize (framelength) */
725 switch( i_temp = p_buf[2] >> 4 )
728 if( b_fixed_blocksize )
729 i_blocksize = p_sys->stream_info.min_blocksize;
730 else return 0; /* We can't do anything with this */
741 i_blocksize = 576 << (i_temp - 2);
746 i_blocksize_hint = i_temp;
757 i_blocksize = 256 << (i_temp - 8);
761 /* Find samplerate */
762 switch( i_temp = p_buf[2] & 0x0f )
765 if( p_sys->b_stream_info )
766 *pi_sample_rate = p_sys->stream_info.sample_rate;
767 else return 0; /* We can't do anything with this */
777 *pi_sample_rate = 8000;
781 *pi_sample_rate = 16000;
785 *pi_sample_rate = 22050;
789 *pi_sample_rate = 24000;
793 *pi_sample_rate = 32000;
797 *pi_sample_rate = 44100;
801 *pi_sample_rate = 48000;
805 *pi_sample_rate = 96000;
811 i_sample_rate_hint = i_temp;
819 i_temp = (unsigned)(p_buf[3] >> 4);
822 int i_channel_assignment; /* ??? */
828 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
831 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
834 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
843 *pi_channels = i_temp + 1;
844 *pi_channels_conf = pi_channels_maps[ *pi_channels ];
847 /* Find bits per sample */
848 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
851 if( p_sys->b_stream_info )
852 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
858 *pi_bits_per_sample = 8;
862 *pi_bits_per_sample = 12;
866 *pi_bits_per_sample = 16;
870 *pi_bits_per_sample = 20;
874 *pi_bits_per_sample = 24;
883 /* Zero padding bit */
884 if( p_buf[3] & 0x01 ) return 0;
886 /* End of fixed size header */
889 /* Find Sample/Frame number */
890 if( i_blocksize_hint && b_variable_blocksize )
892 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
893 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
897 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
898 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
900 if( p_sys->b_stream_info )
901 i_sample_number *= p_sys->stream_info.min_blocksize;
907 if( i_blocksize_hint )
909 int i_val1 = p_buf[i_header++];
910 if( i_blocksize_hint == 7 )
912 int i_val2 = p_buf[i_header++];
913 i_val1 = (i_val1 << 8) | i_val2;
915 i_blocksize = i_val1 + 1;
918 /* Read sample rate */
919 if( i_sample_rate_hint )
921 int i_val1 = p_buf[i_header++];
922 if( i_sample_rate_hint != 12 )
924 int i_val2 = p_buf[i_header++];
925 i_val1 = (i_val1 << 8) | i_val2;
927 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
928 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
929 else *pi_sample_rate = i_val1 * 10;
932 /* Check the CRC-8 byte */
933 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
941 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
942 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
944 uint64_t i_result = 0;
947 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
952 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
954 i_result = p_buf[0] & 0x1F;
957 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
959 i_result = p_buf[0] & 0x0F;
962 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
964 i_result = p_buf[0] & 0x07;
967 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
969 i_result = p_buf[0] & 0x03;
972 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
974 i_result = p_buf[0] & 0x01;
977 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
983 return I64C(0xffffffffffffffff);
986 for( j = 1; j <= i; j++ )
988 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
990 return I64C(0xffffffffffffffff);
993 i_result |= (p_buf[j] & 0x3F);
1000 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
1001 static uint8_t const flac_crc8_table[256] = {
1002 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1003 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1004 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1005 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1006 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
1007 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
1008 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
1009 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
1010 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
1011 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
1012 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
1013 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
1014 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
1015 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
1016 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
1017 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
1018 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
1019 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
1020 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
1021 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
1022 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
1023 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
1024 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
1025 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
1026 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
1027 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
1028 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
1029 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1030 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1031 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1032 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1033 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1036 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1041 crc = flac_crc8_table[crc ^ *data++];
1046 /*****************************************************************************
1047 * encoder_sys_t : flac encoder descriptor
1048 *****************************************************************************/
1049 struct encoder_sys_t
1056 int i_samples_delay;
1059 FLAC__int32 *p_buffer;
1067 FLAC__StreamEncoder *p_flac;
1068 FLAC__StreamMetadata_StreamInfo stream_info;
1076 #define STREAMINFO_SIZE 38
1078 static block_t *Encode( encoder_t *, aout_buffer_t * );
1080 static FLAC__StreamEncoderWriteStatus
1081 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1082 const FLAC__byte buffer[],
1083 unsigned bytes, unsigned samples,
1084 unsigned current_frame, void *client_data );
1086 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1087 const FLAC__StreamMetadata *metadata,
1088 void *client_data );
1090 /*****************************************************************************
1091 * OpenEncoder: probe the encoder and return score
1092 *****************************************************************************/
1093 static int OpenEncoder( vlc_object_t *p_this )
1095 encoder_t *p_enc = (encoder_t *)p_this;
1096 encoder_sys_t *p_sys;
1098 if( p_enc->fmt_out.i_codec != VLC_FOURCC('f','l','a','c') &&
1101 return VLC_EGENERIC;
1104 /* Allocate the memory needed to store the decoder's structure */
1105 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1107 msg_Err( p_enc, "out of memory" );
1108 return VLC_EGENERIC;
1110 p_enc->p_sys = p_sys;
1111 p_enc->pf_encode_audio = Encode;
1112 p_enc->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
1114 p_sys->i_headers = 0;
1115 p_sys->p_buffer = 0;
1116 p_sys->i_buffer = 0;
1117 p_sys->i_samples_delay = 0;
1119 /* Create flac encoder */
1120 p_sys->p_flac = FLAC__stream_encoder_new();
1122 FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1123 FLAC__stream_encoder_set_channels( p_sys->p_flac,
1124 p_enc->fmt_in.audio.i_channels );
1125 FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1126 p_enc->fmt_in.audio.i_rate );
1127 FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1128 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
1130 FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1131 EncoderWriteCallback );
1132 FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1133 EncoderMetadataCallback );
1134 FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1136 /* Get and store the STREAMINFO metadata block as a p_extra */
1138 FLAC__stream_encoder_init( p_sys->p_flac );
1143 /****************************************************************************
1144 * Encode: the whole thing
1145 ****************************************************************************
1146 * This function spits out ogg packets.
1147 ****************************************************************************/
1148 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1150 encoder_sys_t *p_sys = p_enc->p_sys;
1154 p_sys->i_pts = p_aout_buf->start_date -
1155 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1156 (mtime_t)p_enc->fmt_in.audio.i_rate;
1158 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1160 /* Convert samples to FLAC__int32 */
1161 if( p_sys->i_buffer < p_aout_buf->i_nb_bytes * 2 )
1164 realloc( p_sys->p_buffer, p_aout_buf->i_nb_bytes * 2 );
1165 p_sys->i_buffer = p_aout_buf->i_nb_bytes * 2;
1168 for( i = 0 ; i < p_aout_buf->i_nb_bytes / 2 ; i++ )
1170 p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1173 FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1174 p_aout_buf->i_nb_samples );
1176 p_chain = p_sys->p_chain;
1182 /*****************************************************************************
1183 * CloseEncoder: encoder destruction
1184 *****************************************************************************/
1185 static void CloseEncoder( vlc_object_t *p_this )
1187 encoder_t *p_enc = (encoder_t *)p_this;
1188 encoder_sys_t *p_sys = p_enc->p_sys;
1190 FLAC__stream_encoder_delete( p_sys->p_flac );
1192 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1196 /*****************************************************************************
1197 * EncoderMetadataCallback: called by libflac to output metadata
1198 *****************************************************************************/
1199 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1200 const FLAC__StreamMetadata *metadata,
1203 encoder_t *p_enc = (encoder_t *)client_data;
1205 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1209 /*****************************************************************************
1210 * EncoderWriteCallback: called by libflac to output encoded samples
1211 *****************************************************************************/
1212 static FLAC__StreamEncoderWriteStatus
1213 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1214 const FLAC__byte buffer[],
1215 unsigned bytes, unsigned samples,
1216 unsigned current_frame, void *client_data )
1218 encoder_t *p_enc = (encoder_t *)client_data;
1219 encoder_sys_t *p_sys = p_enc->p_sys;
1224 if( p_sys->i_headers == 1 )
1226 msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1228 /* Backup the STREAMINFO metadata block */
1229 p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1230 p_enc->fmt_out.p_extra = malloc( STREAMINFO_SIZE + 4 );
1231 memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1232 memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1235 /* Fake this as the last metadata block */
1236 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1239 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1242 p_block = block_New( p_enc, bytes );
1243 memcpy( p_block->p_buffer, buffer, bytes );
1245 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1247 p_sys->i_samples_delay -= samples;
1249 p_block->i_length = (mtime_t)1000000 *
1250 (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1253 p_sys->i_pts += p_block->i_length;
1255 block_ChainAppend( &p_sys->p_chain, p_block );
1257 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;