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_description( _("Flac audio decoder") );
146 set_capability( "decoder", 100 );
147 set_callbacks( OpenDecoder, CloseDecoder );
150 set_description( _("Flac audio packetizer") );
151 set_capability( "packetizer", 100 );
152 set_callbacks( OpenPacketizer, CloseDecoder );
155 set_description( _("Flac audio encoder") );
156 set_capability( "encoder", 100 );
157 set_callbacks( OpenEncoder, CloseEncoder );
159 add_shortcut( "flac" );
162 /*****************************************************************************
163 * OpenDecoder: probe the decoder and return score
164 *****************************************************************************/
165 static int OpenDecoder( vlc_object_t *p_this )
167 decoder_t *p_dec = (decoder_t*)p_this;
168 decoder_sys_t *p_sys;
170 if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','l','a','c') )
175 /* Allocate the memory needed to store the decoder's structure */
176 if( ( p_dec->p_sys = p_sys =
177 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
179 msg_Err( p_dec, "out of memory" );
184 aout_DateSet( &p_sys->end_date, 0 );
185 p_sys->i_state = STATE_NOSYNC;
186 p_sys->b_stream_info = VLC_FALSE;
188 p_sys->bytestream = block_BytestreamInit( p_dec );
190 /* Take care of flac init */
191 if( !(p_sys->p_flac = FLAC__stream_decoder_new()) )
193 msg_Err( p_dec, "FLAC__stream_decoder_new() failed" );
198 FLAC__stream_decoder_set_read_callback( p_sys->p_flac,
199 DecoderReadCallback );
200 FLAC__stream_decoder_set_write_callback( p_sys->p_flac,
201 DecoderWriteCallback );
202 FLAC__stream_decoder_set_metadata_callback( p_sys->p_flac,
203 DecoderMetadataCallback );
204 FLAC__stream_decoder_set_error_callback( p_sys->p_flac,
205 DecoderErrorCallback );
206 FLAC__stream_decoder_set_client_data( p_sys->p_flac, p_dec );
208 FLAC__stream_decoder_init( p_sys->p_flac );
210 /* Set output properties */
211 p_dec->fmt_out.i_cat = AUDIO_ES;
212 p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
215 p_dec->pf_decode_audio = DecodeBlock;
216 p_dec->pf_packetize = PacketizeBlock;
218 /* Decode STREAMINFO */
219 msg_Dbg( p_dec, "decode STREAMINFO" );
220 p_sys->p_block = block_New( p_dec, p_dec->fmt_in.i_extra );
221 memcpy( p_sys->p_block->p_buffer, p_dec->fmt_in.p_extra,
222 p_dec->fmt_in.i_extra );
223 FLAC__stream_decoder_process_until_end_of_metadata( p_sys->p_flac );
224 msg_Dbg( p_dec, "STREAMINFO decoded" );
229 static int OpenPacketizer( vlc_object_t *p_this )
231 decoder_t *p_dec = (decoder_t*)p_this;
233 /* Hmmm, mem leak ?*/
234 es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
236 int i_ret = OpenDecoder( p_this );
238 if( i_ret != VLC_SUCCESS ) return i_ret;
243 /****************************************************************************
244 * PacketizeBlock: the whole thing
245 ****************************************************************************
246 * This function is called just after the thread is launched.
247 ****************************************************************************/
248 static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
250 decoder_sys_t *p_sys = p_dec->p_sys;
251 uint8_t p_header[MAX_FLAC_HEADER_SIZE];
252 block_t *p_sout_block;
254 if( !pp_block || !*pp_block ) return NULL;
256 if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
258 /* We've just started the stream, wait for the first PTS. */
259 block_Release( *pp_block );
262 else if( !aout_DateGet( &p_sys->end_date ) )
264 /* The first PTS is as good as anything else. */
265 aout_DateSet( &p_sys->end_date, (*pp_block)->i_pts );
268 if( (*pp_block)->i_flags&BLOCK_FLAG_DISCONTINUITY )
270 p_sys->i_state = STATE_NOSYNC;
273 block_BytestreamPush( &p_sys->bytestream, *pp_block );
277 switch( p_sys->i_state )
280 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
283 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
285 p_sys->i_state = STATE_SYNC;
288 block_SkipByte( &p_sys->bytestream );
290 if( p_sys->i_state != STATE_SYNC )
292 block_BytestreamFlush( &p_sys->bytestream );
299 /* New frame, set the Presentation Time Stamp */
300 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
301 if( p_sys->i_pts != 0 &&
302 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
304 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
306 p_sys->i_state = STATE_HEADER;
309 /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
310 if( block_PeekBytes( &p_sys->bytestream, p_header,
311 MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
317 /* Check if frame is valid and get frame info */
318 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
320 &p_sys->i_channels_conf,
322 &p_sys->i_bits_per_sample );
323 if( !p_sys->i_frame_length )
325 msg_Dbg( p_dec, "emulated sync word" );
326 block_SkipByte( &p_sys->bytestream );
327 p_sys->i_state = STATE_NOSYNC;
330 if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
332 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
333 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
335 p_sys->i_state = STATE_NEXT_SYNC;
336 p_sys->i_frame_size = 1;
338 case STATE_NEXT_SYNC:
339 /* TODO: If pp_block == NULL, flush the buffer without checking the
342 /* Check if next expected frame contains the sync word */
343 while( block_PeekOffsetBytes( &p_sys->bytestream,
344 p_sys->i_frame_size, p_header,
345 MAX_FLAC_HEADER_SIZE )
348 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
350 /* Check if frame is valid and get frame info */
352 SyncInfo( p_dec, p_header,
354 &p_sys->i_channels_conf,
356 &p_sys->i_bits_per_sample );
360 p_sys->i_state = STATE_SEND_DATA;
364 p_sys->i_frame_size++;
367 if( p_sys->i_state != STATE_SEND_DATA )
373 case STATE_SEND_DATA:
374 p_sout_block = block_New( p_dec, p_sys->i_frame_size );
376 /* Copy the whole frame into the buffer. When we reach this point
377 * we already know we have enough data available. */
378 block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
379 p_sys->i_frame_size );
381 /* Make sure we don't reuse the same pts twice */
382 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
383 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
385 /* So p_block doesn't get re-added several times */
386 *pp_block = block_BytestreamPop( &p_sys->bytestream );
388 p_sys->i_state = STATE_NOSYNC;
390 /* Date management */
391 p_sout_block->i_pts =
392 p_sout_block->i_dts = aout_DateGet( &p_sys->end_date );
393 aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
394 p_sout_block->i_length =
395 aout_DateGet( &p_sys->end_date ) - p_sout_block->i_pts;
404 /****************************************************************************
405 * DecodeBlock: the whole thing
406 ****************************************************************************/
407 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
409 decoder_sys_t *p_sys = p_dec->p_sys;
411 if( !pp_block || !*pp_block ) return NULL;
413 p_sys->p_aout_buffer = 0;
414 if( ( p_sys->p_block = PacketizeBlock( p_dec, pp_block ) ) )
416 if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) )
418 decoder_state_error( p_dec,
419 FLAC__stream_decoder_get_state( p_sys->p_flac ) );
420 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
423 /* If the decoder is in the "aborted" state,
424 * FLAC__stream_decoder_process_single() won't return an error. */
425 if( FLAC__stream_decoder_get_state(p_dec->p_sys->p_flac)
426 == FLAC__STREAM_DECODER_ABORTED )
428 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
431 block_Release( p_sys->p_block );
432 p_sys->p_block = NULL;
435 return p_sys->p_aout_buffer;
438 /*****************************************************************************
439 * CloseDecoder: flac decoder destruction
440 *****************************************************************************/
441 static void CloseDecoder( vlc_object_t *p_this )
443 decoder_t *p_dec = (decoder_t *)p_this;
444 decoder_sys_t *p_sys = p_dec->p_sys;
446 FLAC__stream_decoder_finish( p_sys->p_flac );
447 FLAC__stream_decoder_delete( p_sys->p_flac );
448 if( p_sys->p_block ) free( p_sys->p_block );
452 /*****************************************************************************
453 * DecoderReadCallback: called by libflac when it needs more data
454 *****************************************************************************/
455 static FLAC__StreamDecoderReadStatus
456 DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
457 unsigned *bytes, void *client_data )
459 decoder_t *p_dec = (decoder_t *)client_data;
460 decoder_sys_t *p_sys = p_dec->p_sys;
462 if( p_sys->p_block && p_sys->p_block->i_buffer )
464 *bytes = __MIN(*bytes, (unsigned)p_sys->p_block->i_buffer);
465 memcpy( buffer, p_sys->p_block->p_buffer, *bytes );
466 p_sys->p_block->i_buffer -= *bytes;
467 p_sys->p_block->p_buffer += *bytes;
472 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
475 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
478 /*****************************************************************************
479 * DecoderWriteCallback: called by libflac to output decoded samples
480 *****************************************************************************/
481 static FLAC__StreamDecoderWriteStatus
482 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
483 const FLAC__Frame *frame,
484 const FLAC__int32 *const buffer[], void *client_data )
486 decoder_t *p_dec = (decoder_t *)client_data;
487 decoder_sys_t *p_sys = p_dec->p_sys;
489 p_sys->p_aout_buffer =
490 p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize );
492 if( p_sys->p_aout_buffer == NULL )
493 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
495 switch( frame->header.bits_per_sample )
498 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
499 frame->header.channels, frame->header.blocksize );
502 Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
503 frame->header.channels, frame->header.blocksize );
506 /* Date management (already done by packetizer) */
507 p_sys->p_aout_buffer->start_date = p_sys->p_block->i_pts;
508 p_sys->p_aout_buffer->end_date =
509 p_sys->p_block->i_pts + p_sys->p_block->i_length;
511 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
514 /*****************************************************************************
515 * DecoderMetadataCallback: called by libflac to when it encounters metadata
516 *****************************************************************************/
517 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
518 const FLAC__StreamMetadata *metadata,
521 decoder_t *p_dec = (decoder_t *)client_data;
522 decoder_sys_t *p_sys = p_dec->p_sys;
524 switch( metadata->data.stream_info.bits_per_sample )
527 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
530 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
533 msg_Dbg( p_dec, "strange bit/sample value: %d",
534 metadata->data.stream_info.bits_per_sample );
535 p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
539 /* Setup the format */
540 p_dec->fmt_out.audio.i_rate = metadata->data.stream_info.sample_rate;
541 p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
542 p_dec->fmt_out.audio.i_physical_channels =
543 p_dec->fmt_out.audio.i_original_channels =
544 pi_channels_maps[metadata->data.stream_info.channels];
545 p_dec->fmt_out.audio.i_bitspersample =
546 metadata->data.stream_info.bits_per_sample;
548 aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
550 msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
551 p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
552 p_dec->fmt_out.audio.i_bitspersample );
554 p_sys->b_stream_info = VLC_TRUE;
555 p_sys->stream_info = metadata->data.stream_info;
560 /*****************************************************************************
561 * DecoderErrorCallback: called when the libflac decoder encounters an error
562 *****************************************************************************/
563 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
564 FLAC__StreamDecoderErrorStatus status,
567 decoder_t *p_dec = (decoder_t *)client_data;
571 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
572 msg_Err( p_dec, "an error in the stream caused the decoder to "
573 "lose synchronization." );
575 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
576 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
578 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
579 msg_Err( p_dec, "frame's data did not match the CRC in the "
583 msg_Err( p_dec, "got decoder error: %d", status );
586 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
590 /*****************************************************************************
591 * Interleave: helper function to interleave channels
592 *****************************************************************************/
593 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
594 int i_nb_channels, int i_samples )
597 for ( j = 0; j < i_samples; j++ )
599 for ( i = 0; i < i_nb_channels; i++ )
601 p_out[j * i_nb_channels + i] = pp_in[i][j];
605 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
606 int i_nb_channels, int i_samples )
609 for ( j = 0; j < i_samples; j++ )
611 for ( i = 0; i < i_nb_channels; i++ )
613 p_out[j * i_nb_channels + i] = (int32_t)(pp_in[i][j]);
618 /*****************************************************************************
619 * decoder_state_error: print meaningful error messages
620 *****************************************************************************/
621 static void decoder_state_error( decoder_t *p_dec,
622 FLAC__StreamDecoderState state )
626 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
627 msg_Err( p_dec, "the decoder is ready to search for metadata." );
629 case FLAC__STREAM_DECODER_READ_METADATA:
630 msg_Err( p_dec, "the decoder is ready to or is in the process of "
631 "reading metadata." );
633 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
634 msg_Err( p_dec, "the decoder is ready to or is in the process of "
635 "searching for the frame sync code." );
637 case FLAC__STREAM_DECODER_READ_FRAME:
638 msg_Err( p_dec, "the decoder is ready to or is in the process of "
639 "reading a frame." );
641 case FLAC__STREAM_DECODER_END_OF_STREAM:
642 msg_Err( p_dec, "the decoder has reached the end of the stream." );
644 case FLAC__STREAM_DECODER_ABORTED:
645 msg_Err( p_dec, "the decoder was aborted by the read callback." );
647 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
648 msg_Err( p_dec, "the decoder encountered reserved fields in use "
651 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
652 msg_Err( p_dec, "error when allocating memory." );
654 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
655 msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
656 "decoder was already initialized, usually because "
657 "FLAC__stream_decoder_finish() was not called." );
659 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
660 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
661 "all callbacks being set." );
663 case FLAC__STREAM_DECODER_UNINITIALIZED:
664 msg_Err( p_dec, "decoder in uninitialized state." );
667 msg_Err(p_dec, "unknown error" );
671 /*****************************************************************************
672 * SyncInfo: parse FLAC sync info
673 *****************************************************************************/
674 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
675 int * pi_channels, int * pi_channels_conf,
676 int * pi_sample_rate, int * pi_bits_per_sample )
678 decoder_sys_t *p_sys = p_dec->p_sys;
679 int i_header, i_temp, i_read;
680 int i_blocksize = 0, i_blocksize_hint = 0, i_sample_rate_hint = 0;
681 uint64_t i_sample_number = 0;
683 vlc_bool_t b_variable_blocksize = ( p_sys->b_stream_info &&
684 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
685 vlc_bool_t b_fixed_blocksize = ( p_sys->b_stream_info &&
686 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
689 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
691 /* Check there is no emulated sync code in the rest of the header */
692 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
694 /* Find blocksize (framelength) */
695 switch( i_temp = p_buf[2] >> 4 )
698 if( b_fixed_blocksize )
699 i_blocksize = p_sys->stream_info.min_blocksize;
700 else return 0; /* We can't do anything with this */
711 i_blocksize = 576 << (i_temp - 2);
716 i_blocksize_hint = i_temp;
727 i_blocksize = 256 << (i_temp - 8);
731 /* Find samplerate */
732 switch( i_temp = p_buf[2] & 0x0f )
735 if( p_sys->b_stream_info )
736 *pi_sample_rate = p_sys->stream_info.sample_rate;
737 else return 0; /* We can't do anything with this */
747 *pi_sample_rate = 8000;
751 *pi_sample_rate = 16000;
755 *pi_sample_rate = 22050;
759 *pi_sample_rate = 24000;
763 *pi_sample_rate = 32000;
767 *pi_sample_rate = 44100;
771 *pi_sample_rate = 48000;
775 *pi_sample_rate = 96000;
781 i_sample_rate_hint = i_temp;
789 i_temp = (unsigned)(p_buf[3] >> 4);
792 int i_channel_assignment; /* ??? */
798 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
801 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
804 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
813 *pi_channels = i_temp + 1;
814 *pi_channels_conf = pi_channels_maps[ *pi_channels ];
817 /* Find bits per sample */
818 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
821 if( p_sys->b_stream_info )
822 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
828 *pi_bits_per_sample = 8;
832 *pi_bits_per_sample = 12;
836 *pi_bits_per_sample = 16;
840 *pi_bits_per_sample = 20;
844 *pi_bits_per_sample = 24;
853 /* Zero padding bit */
854 if( p_buf[3] & 0x01 ) return 0;
856 /* End of fixed size header */
859 /* Find Sample/Frame number */
860 if( i_blocksize_hint && b_variable_blocksize )
862 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
863 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
867 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
868 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
870 if( p_sys->b_stream_info )
871 i_sample_number *= p_sys->stream_info.min_blocksize;
877 if( i_blocksize_hint )
879 int i_val1 = p_buf[i_header++];
880 if( i_blocksize_hint == 7 )
882 int i_val2 = p_buf[i_header++];
883 i_val1 = (i_val1 << 8) | i_val2;
885 i_blocksize = i_val1 + 1;
888 /* Read sample rate */
889 if( i_sample_rate_hint )
891 int i_val1 = p_buf[i_header++];
892 if( i_sample_rate_hint != 12 )
894 int i_val2 = p_buf[i_header++];
895 i_val1 = (i_val1 << 8) | i_val2;
897 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
898 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
899 else *pi_sample_rate = i_val1 * 10;
902 /* Check the CRC-8 byte */
903 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
911 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
912 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
914 uint64_t i_result = 0;
917 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
922 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
924 i_result = p_buf[0] & 0x1F;
927 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
929 i_result = p_buf[0] & 0x0F;
932 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
934 i_result = p_buf[0] & 0x07;
937 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
939 i_result = p_buf[0] & 0x03;
942 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
944 i_result = p_buf[0] & 0x01;
947 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
953 return I64C(0xffffffffffffffff);
956 for( j = 1; j <= i; j++ )
958 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
960 return I64C(0xffffffffffffffff);
963 i_result |= (p_buf[j] & 0x3F);
970 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
971 static uint8_t const flac_crc8_table[256] = {
972 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
973 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
974 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
975 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
976 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
977 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
978 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
979 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
980 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
981 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
982 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
983 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
984 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
985 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
986 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
987 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
988 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
989 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
990 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
991 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
992 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
993 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
994 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
995 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
996 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
997 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
998 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
999 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1000 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1001 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1002 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1003 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1006 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1011 crc = flac_crc8_table[crc ^ *data++];
1016 /*****************************************************************************
1017 * encoder_sys_t : flac encoder descriptor
1018 *****************************************************************************/
1019 struct encoder_sys_t
1026 int i_samples_delay;
1029 FLAC__int32 *p_buffer;
1037 FLAC__StreamEncoder *p_flac;
1038 FLAC__StreamMetadata_StreamInfo stream_info;
1046 #define STREAMINFO_SIZE 38
1048 static block_t *Encode( encoder_t *, aout_buffer_t * );
1050 static FLAC__StreamEncoderWriteStatus
1051 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1052 const FLAC__byte buffer[],
1053 unsigned bytes, unsigned samples,
1054 unsigned current_frame, void *client_data );
1056 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1057 const FLAC__StreamMetadata *metadata,
1058 void *client_data );
1060 /*****************************************************************************
1061 * OpenEncoder: probe the encoder and return score
1062 *****************************************************************************/
1063 static int OpenEncoder( vlc_object_t *p_this )
1065 encoder_t *p_enc = (encoder_t *)p_this;
1066 encoder_sys_t *p_sys;
1068 if( p_enc->fmt_out.i_codec != VLC_FOURCC('f','l','a','c') &&
1071 return VLC_EGENERIC;
1074 /* Allocate the memory needed to store the decoder's structure */
1075 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1077 msg_Err( p_enc, "out of memory" );
1078 return VLC_EGENERIC;
1080 p_enc->p_sys = p_sys;
1081 p_enc->pf_encode_audio = Encode;
1082 p_enc->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
1084 p_sys->i_headers = 0;
1085 p_sys->p_buffer = 0;
1086 p_sys->i_buffer = 0;
1087 p_sys->i_samples_delay = 0;
1089 /* Create flac encoder */
1090 p_sys->p_flac = FLAC__stream_encoder_new();
1092 FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1093 FLAC__stream_encoder_set_channels( p_sys->p_flac,
1094 p_enc->fmt_in.audio.i_channels );
1095 FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1096 p_enc->fmt_in.audio.i_rate );
1097 FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1098 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
1100 FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1101 EncoderWriteCallback );
1102 FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1103 EncoderMetadataCallback );
1104 FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1106 /* Get and store the STREAMINFO metadata block as a p_extra */
1108 FLAC__stream_encoder_init( p_sys->p_flac );
1113 /****************************************************************************
1114 * Encode: the whole thing
1115 ****************************************************************************
1116 * This function spits out ogg packets.
1117 ****************************************************************************/
1118 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1120 encoder_sys_t *p_sys = p_enc->p_sys;
1124 p_sys->i_pts = p_aout_buf->start_date -
1125 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1126 (mtime_t)p_enc->fmt_in.audio.i_rate;
1128 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1130 /* Convert samples to FLAC__int32 */
1131 if( p_sys->i_buffer < p_aout_buf->i_nb_bytes * 2 )
1134 realloc( p_sys->p_buffer, p_aout_buf->i_nb_bytes * 2 );
1135 p_sys->i_buffer = p_aout_buf->i_nb_bytes * 2;
1138 for( i = 0 ; i < p_aout_buf->i_nb_bytes / 2 ; i++ )
1140 p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1143 FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1144 p_aout_buf->i_nb_samples );
1146 p_chain = p_sys->p_chain;
1152 /*****************************************************************************
1153 * CloseEncoder: encoder destruction
1154 *****************************************************************************/
1155 static void CloseEncoder( vlc_object_t *p_this )
1157 encoder_t *p_enc = (encoder_t *)p_this;
1158 encoder_sys_t *p_sys = p_enc->p_sys;
1160 FLAC__stream_encoder_delete( p_sys->p_flac );
1162 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1166 /*****************************************************************************
1167 * EncoderMetadataCallback: called by libflac to output metadata
1168 *****************************************************************************/
1169 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1170 const FLAC__StreamMetadata *metadata,
1173 encoder_t *p_enc = (encoder_t *)client_data;
1175 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1179 /*****************************************************************************
1180 * EncoderWriteCallback: called by libflac to output encoded samples
1181 *****************************************************************************/
1182 static FLAC__StreamEncoderWriteStatus
1183 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1184 const FLAC__byte buffer[],
1185 unsigned bytes, unsigned samples,
1186 unsigned current_frame, void *client_data )
1188 encoder_t *p_enc = (encoder_t *)client_data;
1189 encoder_sys_t *p_sys = p_enc->p_sys;
1194 if( p_sys->i_headers == 1 )
1196 msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1198 /* Backup the STREAMINFO metadata block */
1199 p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1200 p_enc->fmt_out.p_extra = malloc( STREAMINFO_SIZE + 4 );
1201 memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1202 memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1205 /* Fake this as the last metadata block */
1206 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1209 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1212 p_block = block_New( p_enc, bytes );
1213 memcpy( p_block->p_buffer, buffer, bytes );
1215 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1217 p_sys->i_samples_delay -= samples;
1219 p_block->i_length = (mtime_t)1000000 *
1220 (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1223 p_sys->i_pts += p_block->i_length;
1225 block_ChainAppend( &p_sys->p_chain, p_block );
1227 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;