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 int i_ret = OpenDecoder( p_this );
235 if( i_ret != VLC_SUCCESS ) return i_ret;
237 es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
242 /****************************************************************************
243 * PacketizeBlock: the whole thing
244 ****************************************************************************
245 * This function is called just after the thread is launched.
246 ****************************************************************************/
247 static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
249 decoder_sys_t *p_sys = p_dec->p_sys;
250 uint8_t p_header[MAX_FLAC_HEADER_SIZE];
251 block_t *p_sout_block;
253 if( !pp_block || !*pp_block ) return NULL;
255 if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
257 /* We've just started the stream, wait for the first PTS. */
258 block_Release( *pp_block );
262 if( (*pp_block)->i_flags&BLOCK_FLAG_DISCONTINUITY )
264 p_sys->i_state = STATE_NOSYNC;
267 block_BytestreamPush( &p_sys->bytestream, *pp_block );
271 switch( p_sys->i_state )
274 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
277 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
279 p_sys->i_state = STATE_SYNC;
282 block_SkipByte( &p_sys->bytestream );
284 if( p_sys->i_state != STATE_SYNC )
286 block_BytestreamFlush( &p_sys->bytestream );
293 /* New frame, set the Presentation Time Stamp */
294 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
295 if( p_sys->i_pts != 0 &&
296 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
298 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
300 p_sys->i_state = STATE_HEADER;
303 /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
304 if( block_PeekBytes( &p_sys->bytestream, p_header,
305 MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
311 /* Check if frame is valid and get frame info */
312 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
314 &p_sys->i_channels_conf,
316 &p_sys->i_bits_per_sample );
317 if( !p_sys->i_frame_length )
319 msg_Dbg( p_dec, "emulated sync word" );
320 block_SkipByte( &p_sys->bytestream );
321 p_sys->i_state = STATE_NOSYNC;
324 if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
326 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
327 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
328 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
330 p_sys->i_state = STATE_NEXT_SYNC;
331 p_sys->i_frame_size = 1;
333 case STATE_NEXT_SYNC:
334 /* TODO: If pp_block == NULL, flush the buffer without checking the
337 /* Check if next expected frame contains the sync word */
338 while( block_PeekOffsetBytes( &p_sys->bytestream,
339 p_sys->i_frame_size, p_header,
340 MAX_FLAC_HEADER_SIZE )
343 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
345 /* Check if frame is valid and get frame info */
347 SyncInfo( p_dec, p_header,
349 &p_sys->i_channels_conf,
351 &p_sys->i_bits_per_sample );
355 p_sys->i_state = STATE_SEND_DATA;
359 p_sys->i_frame_size++;
362 if( p_sys->i_state != STATE_SEND_DATA )
369 case STATE_SEND_DATA:
370 p_sout_block = block_New( p_dec, p_sys->i_frame_size );
372 /* Copy the whole frame into the buffer. When we reach this point
373 * we already know we have enough data available. */
374 block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
375 p_sys->i_frame_size );
377 /* Make sure we don't reuse the same pts twice */
378 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
379 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
381 /* So p_block doesn't get re-added several times */
382 *pp_block = block_BytestreamPop( &p_sys->bytestream );
384 p_sys->i_state = STATE_NOSYNC;
386 /* Date management */
387 p_sout_block->i_pts =
388 p_sout_block->i_dts = aout_DateGet( &p_sys->end_date );
389 aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
390 p_sout_block->i_length =
391 aout_DateGet( &p_sys->end_date ) - p_sout_block->i_pts;
400 /****************************************************************************
401 * DecodeBlock: the whole thing
402 ****************************************************************************/
403 static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
405 decoder_sys_t *p_sys = p_dec->p_sys;
407 if( !pp_block || !*pp_block ) return NULL;
409 p_sys->p_aout_buffer = 0;
410 if( ( p_sys->p_block = PacketizeBlock( p_dec, pp_block ) ) )
412 if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) )
414 decoder_state_error( p_dec,
415 FLAC__stream_decoder_get_state( p_sys->p_flac ) );
416 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
419 /* If the decoder is in the "aborted" state,
420 * FLAC__stream_decoder_process_single() won't return an error. */
421 if( FLAC__stream_decoder_get_state(p_dec->p_sys->p_flac)
422 == FLAC__STREAM_DECODER_ABORTED )
424 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
427 block_Release( p_sys->p_block );
428 p_sys->p_block = NULL;
431 return p_sys->p_aout_buffer;
434 /*****************************************************************************
435 * CloseDecoder: flac decoder destruction
436 *****************************************************************************/
437 static void CloseDecoder( vlc_object_t *p_this )
439 decoder_t *p_dec = (decoder_t *)p_this;
440 decoder_sys_t *p_sys = p_dec->p_sys;
442 FLAC__stream_decoder_finish( p_sys->p_flac );
443 FLAC__stream_decoder_delete( p_sys->p_flac );
444 if( p_sys->p_block ) free( p_sys->p_block );
448 /*****************************************************************************
449 * DecoderReadCallback: called by libflac when it needs more data
450 *****************************************************************************/
451 static FLAC__StreamDecoderReadStatus
452 DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
453 unsigned *bytes, void *client_data )
455 decoder_t *p_dec = (decoder_t *)client_data;
456 decoder_sys_t *p_sys = p_dec->p_sys;
458 if( p_sys->p_block && p_sys->p_block->i_buffer )
460 *bytes = __MIN(*bytes, (unsigned)p_sys->p_block->i_buffer);
461 memcpy( buffer, p_sys->p_block->p_buffer, *bytes );
462 p_sys->p_block->i_buffer -= *bytes;
463 p_sys->p_block->p_buffer += *bytes;
468 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
471 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
474 /*****************************************************************************
475 * DecoderWriteCallback: called by libflac to output decoded samples
476 *****************************************************************************/
477 static FLAC__StreamDecoderWriteStatus
478 DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
479 const FLAC__Frame *frame,
480 const FLAC__int32 *const buffer[], void *client_data )
482 decoder_t *p_dec = (decoder_t *)client_data;
483 decoder_sys_t *p_sys = p_dec->p_sys;
485 p_sys->p_aout_buffer =
486 p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize );
488 if( p_sys->p_aout_buffer == NULL )
489 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
491 switch( frame->header.bits_per_sample )
494 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
495 frame->header.channels, frame->header.blocksize );
498 Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
499 frame->header.channels, frame->header.blocksize );
502 /* Date management (already done by packetizer) */
503 p_sys->p_aout_buffer->start_date = p_sys->p_block->i_pts;
504 p_sys->p_aout_buffer->end_date =
505 p_sys->p_block->i_pts + p_sys->p_block->i_length;
507 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
510 /*****************************************************************************
511 * DecoderMetadataCallback: called by libflac to when it encounters metadata
512 *****************************************************************************/
513 static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
514 const FLAC__StreamMetadata *metadata,
517 decoder_t *p_dec = (decoder_t *)client_data;
518 decoder_sys_t *p_sys = p_dec->p_sys;
520 switch( metadata->data.stream_info.bits_per_sample )
523 p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
526 p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
529 msg_Dbg( p_dec, "strange bit/sample value: %d",
530 metadata->data.stream_info.bits_per_sample );
531 p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
535 /* Setup the format */
536 p_dec->fmt_out.audio.i_rate = metadata->data.stream_info.sample_rate;
537 p_dec->fmt_out.audio.i_channels = metadata->data.stream_info.channels;
538 p_dec->fmt_out.audio.i_physical_channels =
539 p_dec->fmt_out.audio.i_original_channels =
540 pi_channels_maps[metadata->data.stream_info.channels];
541 p_dec->fmt_out.audio.i_bitspersample =
542 metadata->data.stream_info.bits_per_sample;
544 aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
546 msg_Dbg( p_dec, "channels:%d samplerate:%d bitspersamples:%d",
547 p_dec->fmt_out.audio.i_channels, p_dec->fmt_out.audio.i_rate,
548 p_dec->fmt_out.audio.i_bitspersample );
550 p_sys->b_stream_info = VLC_TRUE;
551 p_sys->stream_info = metadata->data.stream_info;
556 /*****************************************************************************
557 * DecoderErrorCallback: called when the libflac decoder encounters an error
558 *****************************************************************************/
559 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
560 FLAC__StreamDecoderErrorStatus status,
563 decoder_t *p_dec = (decoder_t *)client_data;
567 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
568 msg_Err( p_dec, "an error in the stream caused the decoder to "
569 "lose synchronization." );
571 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
572 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
574 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
575 msg_Err( p_dec, "frame's data did not match the CRC in the "
579 msg_Err( p_dec, "got decoder error: %d", status );
582 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
586 /*****************************************************************************
587 * Interleave: helper function to interleave channels
588 *****************************************************************************/
589 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
590 int i_nb_channels, int i_samples )
593 for ( j = 0; j < i_samples; j++ )
595 for ( i = 0; i < i_nb_channels; i++ )
597 p_out[j * i_nb_channels + i] = pp_in[i][j];
601 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
602 int i_nb_channels, int i_samples )
605 for ( j = 0; j < i_samples; j++ )
607 for ( i = 0; i < i_nb_channels; i++ )
609 p_out[j * i_nb_channels + i] = (int32_t)(pp_in[i][j]);
614 /*****************************************************************************
615 * decoder_state_error: print meaningful error messages
616 *****************************************************************************/
617 static void decoder_state_error( decoder_t *p_dec,
618 FLAC__StreamDecoderState state )
622 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
623 msg_Err( p_dec, "the decoder is ready to search for metadata." );
625 case FLAC__STREAM_DECODER_READ_METADATA:
626 msg_Err( p_dec, "the decoder is ready to or is in the process of "
627 "reading metadata." );
629 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
630 msg_Err( p_dec, "the decoder is ready to or is in the process of "
631 "searching for the frame sync code." );
633 case FLAC__STREAM_DECODER_READ_FRAME:
634 msg_Err( p_dec, "the decoder is ready to or is in the process of "
635 "reading a frame." );
637 case FLAC__STREAM_DECODER_END_OF_STREAM:
638 msg_Err( p_dec, "the decoder has reached the end of the stream." );
640 case FLAC__STREAM_DECODER_ABORTED:
641 msg_Err( p_dec, "the decoder was aborted by the read callback." );
643 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
644 msg_Err( p_dec, "the decoder encountered reserved fields in use "
647 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
648 msg_Err( p_dec, "error when allocating memory." );
650 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
651 msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
652 "decoder was already initialized, usually because "
653 "FLAC__stream_decoder_finish() was not called." );
655 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
656 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
657 "all callbacks being set." );
659 case FLAC__STREAM_DECODER_UNINITIALIZED:
660 msg_Err( p_dec, "decoder in uninitialized state." );
663 msg_Err(p_dec, "unknown error" );
667 /*****************************************************************************
668 * SyncInfo: parse FLAC sync info
669 *****************************************************************************/
670 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
671 int * pi_channels, int * pi_channels_conf,
672 int * pi_sample_rate, int * pi_bits_per_sample )
674 decoder_sys_t *p_sys = p_dec->p_sys;
675 int i_header, i_temp, i_read;
676 int i_blocksize = 0, i_blocksize_hint = 0, i_sample_rate_hint = 0;
677 uint64_t i_sample_number = 0;
679 vlc_bool_t b_variable_blocksize = ( p_sys->b_stream_info &&
680 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
681 vlc_bool_t b_fixed_blocksize = ( p_sys->b_stream_info &&
682 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
685 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
687 /* Check there is no emulated sync code in the rest of the header */
688 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
690 /* Find blocksize (framelength) */
691 switch( i_temp = p_buf[2] >> 4 )
694 if( b_fixed_blocksize )
695 i_blocksize = p_sys->stream_info.min_blocksize;
696 else return 0; /* We can't do anything with this */
707 i_blocksize = 576 << (i_temp - 2);
712 i_blocksize_hint = i_temp;
723 i_blocksize = 256 << (i_temp - 8);
727 /* Find samplerate */
728 switch( i_temp = p_buf[2] & 0x0f )
731 if( p_sys->b_stream_info )
732 *pi_sample_rate = p_sys->stream_info.sample_rate;
733 else return 0; /* We can't do anything with this */
743 *pi_sample_rate = 8000;
747 *pi_sample_rate = 16000;
751 *pi_sample_rate = 22050;
755 *pi_sample_rate = 24000;
759 *pi_sample_rate = 32000;
763 *pi_sample_rate = 44100;
767 *pi_sample_rate = 48000;
771 *pi_sample_rate = 96000;
777 i_sample_rate_hint = i_temp;
785 i_temp = (unsigned)(p_buf[3] >> 4);
788 int i_channel_assignment; /* ??? */
794 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
797 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
800 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
809 *pi_channels = i_temp + 1;
810 *pi_channels_conf = pi_channels_maps[ *pi_channels ];
813 /* Find bits per sample */
814 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
817 if( p_sys->b_stream_info )
818 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
824 *pi_bits_per_sample = 8;
828 *pi_bits_per_sample = 12;
832 *pi_bits_per_sample = 16;
836 *pi_bits_per_sample = 20;
840 *pi_bits_per_sample = 24;
849 /* Zero padding bit */
850 if( p_buf[3] & 0x01 ) return 0;
852 /* End of fixed size header */
855 /* Find Sample/Frame number */
856 if( i_blocksize_hint && b_variable_blocksize )
858 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
859 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
863 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
864 if( i_sample_number == I64C(0xffffffffffffffff) ) return 0;
866 if( p_sys->b_stream_info )
867 i_sample_number *= p_sys->stream_info.min_blocksize;
873 if( i_blocksize_hint )
875 int i_val1 = p_buf[i_header++];
876 if( i_blocksize_hint == 7 )
878 int i_val2 = p_buf[i_header++];
879 i_val1 = (i_val1 << 8) | i_val2;
881 i_blocksize = i_val1 + 1;
884 /* Read sample rate */
885 if( i_sample_rate_hint )
887 int i_val1 = p_buf[i_header++];
888 if( i_sample_rate_hint != 12 )
890 int i_val2 = p_buf[i_header++];
891 i_val1 = (i_val1 << 8) | i_val2;
893 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
894 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
895 else *pi_sample_rate = i_val1 * 10;
898 /* Check the CRC-8 byte */
899 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
907 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
908 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
910 uint64_t i_result = 0;
913 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
918 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
920 i_result = p_buf[0] & 0x1F;
923 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
925 i_result = p_buf[0] & 0x0F;
928 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
930 i_result = p_buf[0] & 0x07;
933 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
935 i_result = p_buf[0] & 0x03;
938 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
940 i_result = p_buf[0] & 0x01;
943 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
949 return I64C(0xffffffffffffffff);
952 for( j = 1; j <= i; j++ )
954 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
956 return I64C(0xffffffffffffffff);
959 i_result |= (p_buf[j] & 0x3F);
966 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
967 static uint8_t const flac_crc8_table[256] = {
968 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
969 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
970 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
971 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
972 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
973 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
974 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
975 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
976 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
977 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
978 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
979 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
980 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
981 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
982 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
983 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
984 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
985 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
986 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
987 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
988 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
989 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
990 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
991 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
992 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
993 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
994 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
995 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
996 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
997 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
998 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
999 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1002 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
1007 crc = flac_crc8_table[crc ^ *data++];
1012 /*****************************************************************************
1013 * encoder_sys_t : flac encoder descriptor
1014 *****************************************************************************/
1015 struct encoder_sys_t
1022 int i_samples_delay;
1025 FLAC__int32 *p_buffer;
1033 FLAC__StreamEncoder *p_flac;
1034 FLAC__StreamMetadata_StreamInfo stream_info;
1042 #define STREAMINFO_SIZE 38
1044 static block_t *Encode( encoder_t *, aout_buffer_t * );
1046 static FLAC__StreamEncoderWriteStatus
1047 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1048 const FLAC__byte buffer[],
1049 unsigned bytes, unsigned samples,
1050 unsigned current_frame, void *client_data );
1052 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1053 const FLAC__StreamMetadata *metadata,
1054 void *client_data );
1056 /*****************************************************************************
1057 * OpenEncoder: probe the encoder and return score
1058 *****************************************************************************/
1059 static int OpenEncoder( vlc_object_t *p_this )
1061 encoder_t *p_enc = (encoder_t *)p_this;
1062 encoder_sys_t *p_sys;
1064 if( p_enc->fmt_out.i_codec != VLC_FOURCC('f','l','a','c') &&
1067 return VLC_EGENERIC;
1070 /* Allocate the memory needed to store the decoder's structure */
1071 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
1073 msg_Err( p_enc, "out of memory" );
1074 return VLC_EGENERIC;
1076 p_enc->p_sys = p_sys;
1077 p_enc->pf_encode_audio = Encode;
1078 p_enc->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
1080 p_sys->i_headers = 0;
1081 p_sys->p_buffer = 0;
1082 p_sys->i_buffer = 0;
1083 p_sys->i_samples_delay = 0;
1085 /* Create flac encoder */
1086 p_sys->p_flac = FLAC__stream_encoder_new();
1088 FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
1089 FLAC__stream_encoder_set_channels( p_sys->p_flac,
1090 p_enc->fmt_in.audio.i_channels );
1091 FLAC__stream_encoder_set_sample_rate( p_sys->p_flac,
1092 p_enc->fmt_in.audio.i_rate );
1093 FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
1094 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
1096 FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
1097 EncoderWriteCallback );
1098 FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
1099 EncoderMetadataCallback );
1100 FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
1102 /* Get and store the STREAMINFO metadata block as a p_extra */
1104 FLAC__stream_encoder_init( p_sys->p_flac );
1109 /****************************************************************************
1110 * Encode: the whole thing
1111 ****************************************************************************
1112 * This function spits out ogg packets.
1113 ****************************************************************************/
1114 static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1116 encoder_sys_t *p_sys = p_enc->p_sys;
1120 p_sys->i_pts = p_aout_buf->start_date -
1121 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1122 (mtime_t)p_enc->fmt_in.audio.i_rate;
1124 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1126 /* Convert samples to FLAC__int32 */
1127 if( p_sys->i_buffer < p_aout_buf->i_nb_bytes * 2 )
1130 realloc( p_sys->p_buffer, p_aout_buf->i_nb_bytes * 2 );
1131 p_sys->i_buffer = p_aout_buf->i_nb_bytes * 2;
1134 for( i = 0 ; i < p_aout_buf->i_nb_bytes / 2 ; i++ )
1136 p_sys->p_buffer[i]= ((int16_t *)p_aout_buf->p_buffer)[i];
1139 FLAC__stream_encoder_process_interleaved( p_sys->p_flac, p_sys->p_buffer,
1140 p_aout_buf->i_nb_samples );
1142 p_chain = p_sys->p_chain;
1148 /*****************************************************************************
1149 * CloseEncoder: encoder destruction
1150 *****************************************************************************/
1151 static void CloseEncoder( vlc_object_t *p_this )
1153 encoder_t *p_enc = (encoder_t *)p_this;
1154 encoder_sys_t *p_sys = p_enc->p_sys;
1156 FLAC__stream_encoder_delete( p_sys->p_flac );
1158 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1162 /*****************************************************************************
1163 * EncoderMetadataCallback: called by libflac to output metadata
1164 *****************************************************************************/
1165 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1166 const FLAC__StreamMetadata *metadata,
1169 encoder_t *p_enc = (encoder_t *)client_data;
1171 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1175 /*****************************************************************************
1176 * EncoderWriteCallback: called by libflac to output encoded samples
1177 *****************************************************************************/
1178 static FLAC__StreamEncoderWriteStatus
1179 EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
1180 const FLAC__byte buffer[],
1181 unsigned bytes, unsigned samples,
1182 unsigned current_frame, void *client_data )
1184 encoder_t *p_enc = (encoder_t *)client_data;
1185 encoder_sys_t *p_sys = p_enc->p_sys;
1190 if( p_sys->i_headers == 1 )
1192 msg_Dbg( p_enc, "Writing STREAMINFO: %i", bytes );
1194 /* Backup the STREAMINFO metadata block */
1195 p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 4;
1196 p_enc->fmt_out.p_extra = malloc( STREAMINFO_SIZE + 4 );
1197 memcpy( p_enc->fmt_out.p_extra, "fLaC", 4 );
1198 memcpy( ((uint8_t *)p_enc->fmt_out.p_extra) + 4, buffer,
1201 /* Fake this as the last metadata block */
1202 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1205 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
1208 p_block = block_New( p_enc, bytes );
1209 memcpy( p_block->p_buffer, buffer, bytes );
1211 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1213 p_sys->i_samples_delay -= samples;
1215 p_block->i_length = (mtime_t)1000000 *
1216 (mtime_t)samples / (mtime_t)p_enc->fmt_in.audio.i_rate;
1219 p_sys->i_pts += p_block->i_length;
1221 block_ChainAppend( &p_sys->p_chain, p_block );
1223 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;