1 /*****************************************************************************
2 * flac.c: flac decoder/packetizer/encoder module making use of libflac
3 *****************************************************************************
4 * Copyright (C) 1999-2001 the VideoLAN team
7 * Authors: Gildas Bazin <gbazin@videolan.org>
8 * Sigmund Augdal Helberg <dnumgis@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
35 #include <vlc_codec.h>
38 #ifdef HAVE_FLAC_STREAM_DECODER_H
39 # include <FLAC/stream_decoder.h>
40 # include <FLAC/stream_encoder.h>
44 #include <vlc_block_helper.h>
47 #define MAX_FLAC_HEADER_SIZE 16
49 #if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT >= 8
50 # define USE_NEW_FLAC_API
53 /*****************************************************************************
54 * decoder_sys_t : FLAC decoder descriptor
55 *****************************************************************************/
63 block_bytestream_t bytestream
;
66 * Input/Output properties
69 aout_buffer_t
*p_aout_buffer
;
75 FLAC__StreamDecoder
*p_flac
;
76 FLAC__StreamMetadata_StreamInfo stream_info
;
80 unsigned min_blocksize
, max_blocksize
;
81 unsigned min_framesize
, max_framesize
;
84 unsigned bits_per_sample
;
96 int i_frame_size
, i_frame_length
, i_bits_per_sample
;
97 unsigned int i_rate
, i_channels
, i_channels_conf
;
110 static const int pi_channels_maps
[7] =
114 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
,
115 AOUT_CHAN_CENTER
| AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
,
116 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
117 | AOUT_CHAN_REARRIGHT
,
118 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_CENTER
119 | AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARRIGHT
,
120 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_CENTER
121 | AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARRIGHT
| AOUT_CHAN_LFE
124 /*****************************************************************************
126 *****************************************************************************/
127 static int OpenDecoder ( vlc_object_t
* );
128 static int OpenPacketizer( vlc_object_t
* );
129 static void CloseDecoder ( vlc_object_t
* );
132 static int OpenEncoder ( vlc_object_t
* );
133 static void CloseEncoder ( vlc_object_t
* );
137 static aout_buffer_t
*DecodeBlock( decoder_t
*, block_t
** );
139 static block_t
*PacketizeBlock( decoder_t
*, block_t
** );
141 static int SyncInfo( decoder_t
*, uint8_t *, unsigned int *, unsigned int *,
142 unsigned int *,int * );
146 static FLAC__StreamDecoderReadStatus
147 DecoderReadCallback( const FLAC__StreamDecoder
*decoder
,
148 FLAC__byte buffer
[], unsigned *bytes
, void *client_data
);
150 static FLAC__StreamDecoderWriteStatus
151 DecoderWriteCallback( const FLAC__StreamDecoder
*decoder
,
152 const FLAC__Frame
*frame
,
153 const FLAC__int32
*const buffer
[], void *client_data
);
155 static void DecoderMetadataCallback( const FLAC__StreamDecoder
*decoder
,
156 const FLAC__StreamMetadata
*metadata
,
158 static void DecoderErrorCallback( const FLAC__StreamDecoder
*decoder
,
159 FLAC__StreamDecoderErrorStatus status
,
162 static void Interleave32( int32_t *p_out
, const int32_t * const *pp_in
,
163 const int *pi_order
, int i_nb_channels
, int i_samples
);
164 static void Interleave24( int8_t *p_out
, const int32_t * const *pp_in
,
165 const int *pi_order
, int i_nb_channels
, int i_samples
);
166 static void Interleave16( int16_t *p_out
, const int32_t * const *pp_in
,
167 const int *pi_order
, int i_nb_channels
, int i_samples
);
169 static void decoder_state_error( decoder_t
*p_dec
,
170 FLAC__StreamDecoderState state
);
173 static uint64_t read_utf8( const uint8_t *p_buf
, int *pi_read
);
174 static uint8_t flac_crc8( const uint8_t *data
, unsigned len
);
176 /*****************************************************************************
178 *****************************************************************************/
181 set_category( CAT_INPUT
)
182 set_subcategory( SUBCAT_INPUT_ACODEC
)
183 add_shortcut( "flac" )
186 set_description( N_("Flac audio decoder") )
187 set_capability( "decoder", 100 )
188 set_callbacks( OpenDecoder
, CloseDecoder
)
191 add_shortcut( "flac" )
192 set_description( N_("Flac audio encoder") )
193 set_capability( "encoder", 100 )
194 set_callbacks( OpenEncoder
, CloseEncoder
)
197 add_shortcut( "flac" )
199 set_description( N_("Flac audio packetizer") )
200 set_capability( "packetizer", 100 )
201 set_callbacks( OpenPacketizer
, CloseDecoder
)
205 /*****************************************************************************
206 * OpenDecoder: probe the decoder and return score
207 *****************************************************************************/
208 static int OpenDecoder( vlc_object_t
*p_this
)
210 decoder_t
*p_dec
= (decoder_t
*)p_this
;
211 decoder_sys_t
*p_sys
;
213 if( p_dec
->fmt_in
.i_codec
!= VLC_CODEC_FLAC
)
218 /* Allocate the memory needed to store the decoder's structure */
219 if( ( p_dec
->p_sys
= p_sys
= malloc(sizeof(*p_sys
)) ) == NULL
)
223 date_Set( &p_sys
->end_date
, 0 );
224 p_sys
->i_state
= STATE_NOSYNC
;
225 p_sys
->b_stream_info
= false;
227 p_sys
->i_pts
= VLC_TS_INVALID
;
228 p_sys
->bytestream
= block_BytestreamInit();
231 /* Take care of flac init */
232 if( !(p_sys
->p_flac
= FLAC__stream_decoder_new()) )
234 msg_Err( p_dec
, "FLAC__stream_decoder_new() failed" );
239 #ifdef USE_NEW_FLAC_API
240 if( FLAC__stream_decoder_init_stream( p_sys
->p_flac
,
246 DecoderWriteCallback
,
247 DecoderMetadataCallback
,
248 DecoderErrorCallback
,
250 != FLAC__STREAM_DECODER_INIT_STATUS_OK
)
252 msg_Err( p_dec
, "FLAC__stream_decoder_init_stream() failed" );
253 FLAC__stream_decoder_delete( p_sys
->p_flac
);
258 FLAC__stream_decoder_set_read_callback( p_sys
->p_flac
,
259 DecoderReadCallback
);
260 FLAC__stream_decoder_set_write_callback( p_sys
->p_flac
,
261 DecoderWriteCallback
);
262 FLAC__stream_decoder_set_metadata_callback( p_sys
->p_flac
,
263 DecoderMetadataCallback
);
264 FLAC__stream_decoder_set_error_callback( p_sys
->p_flac
,
265 DecoderErrorCallback
);
266 FLAC__stream_decoder_set_client_data( p_sys
->p_flac
, p_dec
);
268 FLAC__stream_decoder_init( p_sys
->p_flac
);
272 /* Set output properties */
273 p_dec
->fmt_out
.i_cat
= AUDIO_ES
;
274 p_dec
->fmt_out
.i_codec
= VLC_CODEC_FL32
;
278 p_dec
->pf_decode_audio
= DecodeBlock
;
284 static int OpenPacketizer( vlc_object_t
*p_this
)
286 decoder_t
*p_dec
= (decoder_t
*)p_this
;
287 es_format_t es_save
= p_dec
->fmt_out
;
291 es_format_Copy( &p_dec
->fmt_out
, &p_dec
->fmt_in
);
293 i_ret
= OpenDecoder( p_this
);
294 p_dec
->pf_decode_audio
= NULL
;
295 p_dec
->pf_packetize
= PacketizeBlock
;
297 /* Set output properties */
298 p_dec
->fmt_out
.i_codec
= VLC_CODEC_FLAC
;
300 if( i_ret
!= VLC_SUCCESS
)
302 es_format_Clean( &p_dec
->fmt_out
);
303 p_dec
->fmt_out
= es_save
;
308 /*****************************************************************************
309 * CloseDecoder: flac decoder destruction
310 *****************************************************************************/
311 static void CloseDecoder( vlc_object_t
*p_this
)
313 decoder_t
*p_dec
= (decoder_t
*)p_this
;
314 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
317 FLAC__stream_decoder_finish( p_sys
->p_flac
);
318 FLAC__stream_decoder_delete( p_sys
->p_flac
);
321 free( p_sys
->p_block
);
325 /*****************************************************************************
326 * ProcessHeader: process Flac header.
327 *****************************************************************************/
328 static void ProcessHeader( decoder_t
*p_dec
)
330 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
333 if( !p_dec
->fmt_in
.i_extra
) return;
335 /* Decode STREAMINFO */
336 msg_Dbg( p_dec
, "decode STREAMINFO" );
337 p_sys
->p_block
= block_New( p_dec
, p_dec
->fmt_in
.i_extra
);
338 memcpy( p_sys
->p_block
->p_buffer
, p_dec
->fmt_in
.p_extra
,
339 p_dec
->fmt_in
.i_extra
);
340 FLAC__stream_decoder_process_until_end_of_metadata( p_sys
->p_flac
);
341 msg_Dbg( p_dec
, "STREAMINFO decoded" );
346 if( !p_dec
->fmt_in
.i_extra
) return;
348 bs_init( &bs
, p_dec
->fmt_in
.p_extra
, p_dec
->fmt_in
.i_extra
);
350 p_sys
->stream_info
.min_blocksize
= bs_read( &bs
, 16 );
351 p_sys
->stream_info
.max_blocksize
= bs_read( &bs
, 16 );
353 p_sys
->stream_info
.min_framesize
= bs_read( &bs
, 24 );
354 p_sys
->stream_info
.max_framesize
= bs_read( &bs
, 24 );
356 p_sys
->stream_info
.sample_rate
= bs_read( &bs
, 20 );
357 p_sys
->stream_info
.channels
= bs_read( &bs
, 3 ) + 1;
358 p_sys
->stream_info
.bits_per_sample
= bs_read( &bs
, 5 ) + 1;
361 if( !p_sys
->b_stream_info
) return;
363 if( p_dec
->fmt_out
.i_codec
== VLC_CODEC_FLAC
)
365 p_dec
->fmt_out
.i_extra
= p_dec
->fmt_in
.i_extra
;
366 p_dec
->fmt_out
.p_extra
= xrealloc( p_dec
->fmt_out
.p_extra
,
367 p_dec
->fmt_out
.i_extra
);
368 memcpy( p_dec
->fmt_out
.p_extra
,
369 p_dec
->fmt_in
.p_extra
, p_dec
->fmt_out
.i_extra
);
373 /****************************************************************************
374 * PacketizeBlock: the whole thing
375 ****************************************************************************
376 * This function is called just after the thread is launched.
377 ****************************************************************************/
378 static block_t
*PacketizeBlock( decoder_t
*p_dec
, block_t
**pp_block
)
380 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
381 uint8_t p_header
[MAX_FLAC_HEADER_SIZE
];
382 block_t
*p_sout_block
;
384 if( !pp_block
|| !*pp_block
) return NULL
;
386 if( (*pp_block
)->i_flags
&(BLOCK_FLAG_DISCONTINUITY
|BLOCK_FLAG_CORRUPTED
) )
388 if( (*pp_block
)->i_flags
&BLOCK_FLAG_CORRUPTED
)
390 p_sys
->i_state
= STATE_NOSYNC
;
391 block_BytestreamEmpty( &p_sys
->bytestream
);
393 date_Set( &p_sys
->end_date
, 0 );
394 block_Release( *pp_block
);
398 if( !p_sys
->b_stream_info
) ProcessHeader( p_dec
);
400 if( p_sys
->stream_info
.channels
> 6 )
402 msg_Err( p_dec
, "This stream uses too many audio channels" );
406 if( !date_Get( &p_sys
->end_date
) && (*pp_block
)->i_pts
<= VLC_TS_INVALID
)
408 /* We've just started the stream, wait for the first PTS. */
409 block_Release( *pp_block
);
412 else if( !date_Get( &p_sys
->end_date
) )
414 /* The first PTS is as good as anything else. */
415 p_sys
->i_rate
= p_dec
->fmt_out
.audio
.i_rate
;
416 date_Init( &p_sys
->end_date
, p_sys
->i_rate
, 1 );
417 date_Set( &p_sys
->end_date
, (*pp_block
)->i_pts
);
420 block_BytestreamPush( &p_sys
->bytestream
, *pp_block
);
424 switch( p_sys
->i_state
)
427 while( block_PeekBytes( &p_sys
->bytestream
, p_header
, 2 )
430 if( p_header
[0] == 0xFF && p_header
[1] == 0xF8 )
432 p_sys
->i_state
= STATE_SYNC
;
435 block_SkipByte( &p_sys
->bytestream
);
437 if( p_sys
->i_state
!= STATE_SYNC
)
439 block_BytestreamFlush( &p_sys
->bytestream
);
446 /* New frame, set the Presentation Time Stamp */
447 p_sys
->i_pts
= p_sys
->bytestream
.p_block
->i_pts
;
448 if( p_sys
->i_pts
> VLC_TS_INVALID
&&
449 p_sys
->i_pts
!= date_Get( &p_sys
->end_date
) )
451 date_Set( &p_sys
->end_date
, p_sys
->i_pts
);
453 p_sys
->i_state
= STATE_HEADER
;
456 /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
457 if( block_PeekBytes( &p_sys
->bytestream
, p_header
,
458 MAX_FLAC_HEADER_SIZE
) != VLC_SUCCESS
)
464 /* Check if frame is valid and get frame info */
465 p_sys
->i_frame_length
= SyncInfo( p_dec
, p_header
,
467 &p_sys
->i_channels_conf
,
469 &p_sys
->i_bits_per_sample
);
470 if( !p_sys
->i_frame_length
)
472 msg_Dbg( p_dec
, "emulated sync word" );
473 block_SkipByte( &p_sys
->bytestream
);
474 p_sys
->i_state
= STATE_NOSYNC
;
477 if( p_sys
->i_rate
!= p_dec
->fmt_out
.audio
.i_rate
)
479 p_dec
->fmt_out
.audio
.i_rate
= p_sys
->i_rate
;
480 date_Init( &p_sys
->end_date
, p_sys
->i_rate
, 1 );
481 date_Set( &p_sys
->end_date
, p_sys
->i_pts
);
483 p_sys
->i_state
= STATE_NEXT_SYNC
;
484 p_sys
->i_frame_size
= 1;
486 case STATE_NEXT_SYNC
:
487 /* TODO: If pp_block == NULL, flush the buffer without checking the
490 /* Check if next expected frame contains the sync word */
491 while( block_PeekOffsetBytes( &p_sys
->bytestream
,
492 p_sys
->i_frame_size
, p_header
,
493 MAX_FLAC_HEADER_SIZE
)
496 if( p_header
[0] == 0xFF && p_header
[1] == 0xF8 )
498 /* Check if frame is valid and get frame info */
500 SyncInfo( p_dec
, p_header
,
502 &p_sys
->i_channels_conf
,
504 &p_sys
->i_bits_per_sample
);
508 p_sys
->i_state
= STATE_SEND_DATA
;
512 p_sys
->i_frame_size
++;
515 if( p_sys
->i_state
!= STATE_SEND_DATA
)
521 case STATE_SEND_DATA
:
522 p_sout_block
= block_New( p_dec
, p_sys
->i_frame_size
);
524 /* Copy the whole frame into the buffer. When we reach this point
525 * we already know we have enough data available. */
526 block_GetBytes( &p_sys
->bytestream
, p_sout_block
->p_buffer
,
527 p_sys
->i_frame_size
);
529 /* Make sure we don't reuse the same pts twice */
530 if( p_sys
->i_pts
== p_sys
->bytestream
.p_block
->i_pts
)
531 p_sys
->i_pts
= p_sys
->bytestream
.p_block
->i_pts
= VLC_TS_INVALID
;
533 /* So p_block doesn't get re-added several times */
534 *pp_block
= block_BytestreamPop( &p_sys
->bytestream
);
536 p_sys
->i_state
= STATE_NOSYNC
;
538 /* Date management */
539 p_sout_block
->i_pts
=
540 p_sout_block
->i_dts
= date_Get( &p_sys
->end_date
);
541 date_Increment( &p_sys
->end_date
, p_sys
->i_frame_length
);
542 p_sout_block
->i_length
=
543 date_Get( &p_sys
->end_date
) - p_sout_block
->i_pts
;
553 /****************************************************************************
554 * DecodeBlock: the whole thing
555 ****************************************************************************/
556 static aout_buffer_t
*DecodeBlock( decoder_t
*p_dec
, block_t
**pp_block
)
558 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
560 if( !pp_block
|| !*pp_block
) return NULL
;
562 p_sys
->p_aout_buffer
= 0;
563 if( ( p_sys
->p_block
= PacketizeBlock( p_dec
, pp_block
) ) )
565 if( !FLAC__stream_decoder_process_single( p_sys
->p_flac
) )
567 decoder_state_error( p_dec
,
568 FLAC__stream_decoder_get_state( p_sys
->p_flac
) );
569 FLAC__stream_decoder_flush( p_dec
->p_sys
->p_flac
);
572 /* If the decoder is in the "aborted" state,
573 * FLAC__stream_decoder_process_single() won't return an error. */
574 if( FLAC__stream_decoder_get_state(p_dec
->p_sys
->p_flac
)
575 == FLAC__STREAM_DECODER_ABORTED
)
577 FLAC__stream_decoder_flush( p_dec
->p_sys
->p_flac
);
580 block_Release( p_sys
->p_block
);
581 p_sys
->p_block
= NULL
;
584 return p_sys
->p_aout_buffer
;
587 /*****************************************************************************
588 * DecoderReadCallback: called by libflac when it needs more data
589 *****************************************************************************/
590 static FLAC__StreamDecoderReadStatus
591 DecoderReadCallback( const FLAC__StreamDecoder
*decoder
, FLAC__byte buffer
[],
592 unsigned *bytes
, void *client_data
)
595 decoder_t
*p_dec
= (decoder_t
*)client_data
;
596 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
598 if( p_sys
->p_block
&& p_sys
->p_block
->i_buffer
)
600 *bytes
= __MIN(*bytes
, (unsigned)p_sys
->p_block
->i_buffer
);
601 memcpy( buffer
, p_sys
->p_block
->p_buffer
, *bytes
);
602 p_sys
->p_block
->i_buffer
-= *bytes
;
603 p_sys
->p_block
->p_buffer
+= *bytes
;
608 return FLAC__STREAM_DECODER_READ_STATUS_ABORT
;
611 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE
;
614 /*****************************************************************************
615 * DecoderWriteCallback: called by libflac to output decoded samples
616 *****************************************************************************/
617 static FLAC__StreamDecoderWriteStatus
618 DecoderWriteCallback( const FLAC__StreamDecoder
*decoder
,
619 const FLAC__Frame
*frame
,
620 const FLAC__int32
*const buffer
[], void *client_data
)
622 /* XXX it supposes our internal format is WG4 */
623 static const int ppi_reorder
[1+8][8] = {
630 { 0, 1, 4, 5, 2, 3 },
632 { 0, 1, 6, 2, 3, 4, 5 }, /* 7.0 Unspecified by flac */
633 { 0, 1, 6, 7, 2, 3, 4, 5 }, /* 7.1 Unspecified by flac */
637 decoder_t
*p_dec
= (decoder_t
*)client_data
;
638 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
640 if( p_dec
->fmt_out
.audio
.i_channels
<= 0 ||
641 p_dec
->fmt_out
.audio
.i_channels
> 8 )
642 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
;
643 const int * const pi_reorder
= ppi_reorder
[p_dec
->fmt_out
.audio
.i_channels
];
645 p_sys
->p_aout_buffer
=
646 decoder_NewAudioBuffer( p_dec
, frame
->header
.blocksize
);
648 if( p_sys
->p_aout_buffer
== NULL
)
649 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
;
651 switch( frame
->header
.bits_per_sample
)
654 Interleave16( (int16_t *)p_sys
->p_aout_buffer
->p_buffer
, buffer
, pi_reorder
,
655 frame
->header
.channels
, frame
->header
.blocksize
);
658 Interleave24( (int8_t *)p_sys
->p_aout_buffer
->p_buffer
, buffer
, pi_reorder
,
659 frame
->header
.channels
, frame
->header
.blocksize
);
662 Interleave32( (int32_t *)p_sys
->p_aout_buffer
->p_buffer
, buffer
, pi_reorder
,
663 frame
->header
.channels
, frame
->header
.blocksize
);
666 /* Date management (already done by packetizer) */
667 p_sys
->p_aout_buffer
->i_pts
= p_sys
->p_block
->i_pts
;
668 p_sys
->p_aout_buffer
->i_length
= p_sys
->p_block
->i_length
;
670 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
;
673 /*****************************************************************************
674 * DecoderMetadataCallback: called by libflac to when it encounters metadata
675 *****************************************************************************/
676 static void DecoderMetadataCallback( const FLAC__StreamDecoder
*decoder
,
677 const FLAC__StreamMetadata
*metadata
,
681 decoder_t
*p_dec
= (decoder_t
*)client_data
;
682 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
684 if( p_dec
->pf_decode_audio
)
686 switch( metadata
->data
.stream_info
.bits_per_sample
)
689 p_dec
->fmt_out
.i_codec
= VLC_CODEC_S8
;
692 p_dec
->fmt_out
.i_codec
= VLC_CODEC_S16N
;
695 p_dec
->fmt_out
.i_codec
= VLC_CODEC_S24N
;
698 msg_Dbg( p_dec
, "strange bit/sample value: %d",
699 metadata
->data
.stream_info
.bits_per_sample
);
700 p_dec
->fmt_out
.i_codec
= VLC_CODEC_FI32
;
705 /* Setup the format */
706 p_dec
->fmt_out
.audio
.i_rate
= metadata
->data
.stream_info
.sample_rate
;
707 p_dec
->fmt_out
.audio
.i_channels
= metadata
->data
.stream_info
.channels
;
708 p_dec
->fmt_out
.audio
.i_physical_channels
=
709 p_dec
->fmt_out
.audio
.i_original_channels
=
710 pi_channels_maps
[metadata
->data
.stream_info
.channels
];
711 p_dec
->fmt_out
.audio
.i_bitspersample
=
712 metadata
->data
.stream_info
.bits_per_sample
;
714 date_Init( &p_sys
->end_date
, p_dec
->fmt_out
.audio
.i_rate
, 1 );
716 msg_Dbg( p_dec
, "channels:%d samplerate:%d bitspersamples:%d",
717 p_dec
->fmt_out
.audio
.i_channels
, p_dec
->fmt_out
.audio
.i_rate
,
718 p_dec
->fmt_out
.audio
.i_bitspersample
);
720 p_sys
->b_stream_info
= true;
721 p_sys
->stream_info
= metadata
->data
.stream_info
;
726 /*****************************************************************************
727 * DecoderErrorCallback: called when the libflac decoder encounters an error
728 *****************************************************************************/
729 static void DecoderErrorCallback( const FLAC__StreamDecoder
*decoder
,
730 FLAC__StreamDecoderErrorStatus status
,
734 decoder_t
*p_dec
= (decoder_t
*)client_data
;
738 case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC
:
739 msg_Warn( p_dec
, "an error in the stream caused the decoder to "
740 "lose synchronization." );
742 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER
:
743 msg_Err( p_dec
, "the decoder encountered a corrupted frame header." );
745 case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH
:
746 msg_Err( p_dec
, "frame's data did not match the CRC in the "
750 msg_Err( p_dec
, "got decoder error: %d", status
);
753 FLAC__stream_decoder_flush( p_dec
->p_sys
->p_flac
);
757 /*****************************************************************************
758 * Interleave: helper function to interleave channels
759 *****************************************************************************/
760 static void Interleave32( int32_t *p_out
, const int32_t * const *pp_in
,
761 const int pi_index
[],
762 int i_nb_channels
, int i_samples
)
765 for ( j
= 0; j
< i_samples
; j
++ )
767 for ( i
= 0; i
< i_nb_channels
; i
++ )
769 p_out
[j
* i_nb_channels
+ i
] = pp_in
[pi_index
[i
]][j
];
774 static void Interleave24( int8_t *p_out
, const int32_t * const *pp_in
,
775 const int pi_index
[],
776 int i_nb_channels
, int i_samples
)
779 for ( j
= 0; j
< i_samples
; j
++ )
781 for ( i
= 0; i
< i_nb_channels
; i
++ )
783 const int i_index
= pi_index
[i
];
784 #ifdef WORDS_BIGENDIAN
785 p_out
[3*(j
* i_nb_channels
+ i
)+0] = (pp_in
[i_index
][j
] >> 16) & 0xff;
786 p_out
[3*(j
* i_nb_channels
+ i
)+1] = (pp_in
[i_index
][j
] >> 8 ) & 0xff;
787 p_out
[3*(j
* i_nb_channels
+ i
)+2] = (pp_in
[i_index
][j
] >> 0 ) & 0xff;
789 p_out
[3*(j
* i_nb_channels
+ i
)+2] = (pp_in
[i_index
][j
] >> 16) & 0xff;
790 p_out
[3*(j
* i_nb_channels
+ i
)+1] = (pp_in
[i_index
][j
] >> 8 ) & 0xff;
791 p_out
[3*(j
* i_nb_channels
+ i
)+0] = (pp_in
[i_index
][j
] >> 0 ) & 0xff;
797 static void Interleave16( int16_t *p_out
, const int32_t * const *pp_in
,
798 const int pi_index
[],
799 int i_nb_channels
, int i_samples
)
802 for ( j
= 0; j
< i_samples
; j
++ )
804 for ( i
= 0; i
< i_nb_channels
; i
++ )
806 p_out
[j
* i_nb_channels
+ i
] = (int32_t)(pp_in
[pi_index
[i
]][j
]);
811 /*****************************************************************************
812 * decoder_state_error: print meaningful error messages
813 *****************************************************************************/
814 static void decoder_state_error( decoder_t
*p_dec
,
815 FLAC__StreamDecoderState state
)
819 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
:
820 msg_Dbg( p_dec
, "the decoder is ready to search for metadata." );
822 case FLAC__STREAM_DECODER_READ_METADATA
:
823 msg_Dbg( p_dec
, "the decoder is ready to or is in the process of "
824 "reading metadata." );
826 case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC
:
827 msg_Dbg( p_dec
, "the decoder is ready to or is in the process of "
828 "searching for the frame sync code." );
830 case FLAC__STREAM_DECODER_READ_FRAME
:
831 msg_Dbg( p_dec
, "the decoder is ready to or is in the process of "
832 "reading a frame." );
834 case FLAC__STREAM_DECODER_END_OF_STREAM
:
835 msg_Dbg( p_dec
, "the decoder has reached the end of the stream." );
837 #ifdef USE_NEW_FLAC_API
838 case FLAC__STREAM_DECODER_OGG_ERROR
:
839 msg_Err( p_dec
, "error occurred in the Ogg layer." );
841 case FLAC__STREAM_DECODER_SEEK_ERROR
:
842 msg_Err( p_dec
, "error occurred while seeking." );
845 case FLAC__STREAM_DECODER_ABORTED
:
846 msg_Warn( p_dec
, "the decoder was aborted by the read callback." );
848 #ifndef USE_NEW_FLAC_API
849 case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM
:
850 msg_Warn( p_dec
, "the decoder encountered reserved fields in use "
854 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR
:
855 msg_Err( p_dec
, "error when allocating memory." );
857 #ifndef USE_NEW_FLAC_API
858 case FLAC__STREAM_DECODER_ALREADY_INITIALIZED
:
859 msg_Err( p_dec
, "FLAC__stream_decoder_init() was called when the "
860 "decoder was already initialized, usually because "
861 "FLAC__stream_decoder_finish() was not called." );
863 case FLAC__STREAM_DECODER_INVALID_CALLBACK
:
864 msg_Err( p_dec
, "FLAC__stream_decoder_init() was called without "
865 "all callbacks being set." );
868 case FLAC__STREAM_DECODER_UNINITIALIZED
:
869 msg_Err( p_dec
, "decoder in uninitialized state." );
872 msg_Warn(p_dec
, "unknown error" );
877 /*****************************************************************************
878 * SyncInfo: parse FLAC sync info
879 *****************************************************************************/
880 static int SyncInfo( decoder_t
*p_dec
, uint8_t *p_buf
,
881 unsigned int * pi_channels
,
882 unsigned int * pi_channels_conf
,
883 unsigned int * pi_sample_rate
,
884 int * pi_bits_per_sample
)
886 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
887 int i_header
, i_temp
, i_read
;
888 unsigned i_blocksize
= 0;
889 int i_blocksize_hint
= 0, i_sample_rate_hint
= 0;
890 uint64_t i_sample_number
= 0;
892 bool b_variable_blocksize
= ( p_sys
->b_stream_info
&&
893 p_sys
->stream_info
.min_blocksize
!= p_sys
->stream_info
.max_blocksize
);
894 bool b_fixed_blocksize
= ( p_sys
->b_stream_info
&&
895 p_sys
->stream_info
.min_blocksize
== p_sys
->stream_info
.max_blocksize
);
898 if( p_buf
[0] != 0xFF || p_buf
[1] != 0xF8 ) return 0;
900 /* Check there is no emulated sync code in the rest of the header */
901 if( p_buf
[2] == 0xff || p_buf
[3] == 0xFF ) return 0;
903 /* Find blocksize (framelength) */
904 switch( i_temp
= p_buf
[2] >> 4 )
907 if( b_fixed_blocksize
)
908 i_blocksize
= p_sys
->stream_info
.min_blocksize
;
909 else return 0; /* We can't do anything with this */
920 i_blocksize
= 576 << (i_temp
- 2);
925 i_blocksize_hint
= i_temp
;
936 i_blocksize
= 256 << (i_temp
- 8);
940 /* Find samplerate */
941 switch( i_temp
= p_buf
[2] & 0x0f )
944 if( p_sys
->b_stream_info
)
945 *pi_sample_rate
= p_sys
->stream_info
.sample_rate
;
946 else return 0; /* We can't do anything with this */
956 *pi_sample_rate
= 8000;
960 *pi_sample_rate
= 16000;
964 *pi_sample_rate
= 22050;
968 *pi_sample_rate
= 24000;
972 *pi_sample_rate
= 32000;
976 *pi_sample_rate
= 44100;
980 *pi_sample_rate
= 48000;
984 *pi_sample_rate
= 96000;
990 i_sample_rate_hint
= i_temp
;
998 i_temp
= (unsigned)(p_buf
[3] >> 4);
1002 int i_channel_assignment
; /* ??? */
1004 switch( i_temp
& 7 )
1007 i_channel_assignment
= FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE
;
1010 i_channel_assignment
= FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE
;
1013 i_channel_assignment
= FLAC__CHANNEL_ASSIGNMENT_MID_SIDE
;
1025 *pi_channels
= i_temp
+ 1;
1026 *pi_channels_conf
= pi_channels_maps
[ *pi_channels
];
1029 /* Find bits per sample */
1030 switch( i_temp
= (unsigned)(p_buf
[3] & 0x0e) >> 1 )
1033 if( p_sys
->b_stream_info
)
1034 *pi_bits_per_sample
= p_sys
->stream_info
.bits_per_sample
;
1040 *pi_bits_per_sample
= 8;
1044 *pi_bits_per_sample
= 12;
1048 *pi_bits_per_sample
= 16;
1052 *pi_bits_per_sample
= 20;
1056 *pi_bits_per_sample
= 24;
1065 /* Zero padding bit */
1066 if( p_buf
[3] & 0x01 ) return 0;
1068 /* End of fixed size header */
1071 /* Find Sample/Frame number */
1072 if( i_blocksize_hint
&& b_variable_blocksize
)
1074 i_sample_number
= read_utf8( &p_buf
[i_header
++], &i_read
);
1075 if( i_sample_number
== INT64_C(0xffffffffffffffff) ) return 0;
1079 i_sample_number
= read_utf8( &p_buf
[i_header
++], &i_read
);
1080 if( i_sample_number
== INT64_C(0xffffffffffffffff) ) return 0;
1082 if( p_sys
->b_stream_info
)
1083 i_sample_number
*= p_sys
->stream_info
.min_blocksize
;
1088 /* Read blocksize */
1089 if( i_blocksize_hint
)
1091 int i_val1
= p_buf
[i_header
++];
1092 if( i_blocksize_hint
== 7 )
1094 int i_val2
= p_buf
[i_header
++];
1095 i_val1
= (i_val1
<< 8) | i_val2
;
1097 i_blocksize
= i_val1
+ 1;
1100 /* Read sample rate */
1101 if( i_sample_rate_hint
)
1103 int i_val1
= p_buf
[i_header
++];
1104 if( i_sample_rate_hint
!= 12 )
1106 int i_val2
= p_buf
[i_header
++];
1107 i_val1
= (i_val1
<< 8) | i_val2
;
1109 if( i_sample_rate_hint
== 12 ) *pi_sample_rate
= i_val1
* 1000;
1110 else if( i_sample_rate_hint
== 13 ) *pi_sample_rate
= i_val1
;
1111 else *pi_sample_rate
= i_val1
* 10;
1114 /* Check the CRC-8 byte */
1115 if( flac_crc8( p_buf
, i_header
) != p_buf
[i_header
] )
1120 /* Sanity check using stream info header when possible */
1121 if( p_sys
->b_stream_info
)
1123 if( i_blocksize
< p_sys
->stream_info
.min_blocksize
||
1124 i_blocksize
> p_sys
->stream_info
.max_blocksize
)
1130 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
1131 static uint64_t read_utf8( const uint8_t *p_buf
, int *pi_read
)
1133 uint64_t i_result
= 0;
1136 if( !(p_buf
[0] & 0x80) ) /* 0xxxxxxx */
1138 i_result
= p_buf
[0];
1141 else if( p_buf
[0] & 0xC0 && !(p_buf
[0] & 0x20) ) /* 110xxxxx */
1143 i_result
= p_buf
[0] & 0x1F;
1146 else if( p_buf
[0] & 0xE0 && !(p_buf
[0] & 0x10) ) /* 1110xxxx */
1148 i_result
= p_buf
[0] & 0x0F;
1151 else if( p_buf
[0] & 0xF0 && !(p_buf
[0] & 0x08) ) /* 11110xxx */
1153 i_result
= p_buf
[0] & 0x07;
1156 else if( p_buf
[0] & 0xF8 && !(p_buf
[0] & 0x04) ) /* 111110xx */
1158 i_result
= p_buf
[0] & 0x03;
1161 else if( p_buf
[0] & 0xFC && !(p_buf
[0] & 0x02) ) /* 1111110x */
1163 i_result
= p_buf
[0] & 0x01;
1166 else if( p_buf
[0] & 0xFE && !(p_buf
[0] & 0x01) ) /* 11111110 */
1172 return INT64_C(0xffffffffffffffff);
1175 for( j
= 1; j
<= i
; j
++ )
1177 if( !(p_buf
[j
] & 0x80) || (p_buf
[j
] & 0x40) ) /* 10xxxxxx */
1179 return INT64_C(0xffffffffffffffff);
1182 i_result
|= (p_buf
[j
] & 0x3F);
1189 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
1190 static const uint8_t flac_crc8_table
[256] = {
1191 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1192 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1193 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1194 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1195 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
1196 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
1197 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
1198 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
1199 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
1200 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
1201 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
1202 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
1203 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
1204 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
1205 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
1206 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
1207 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
1208 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
1209 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
1210 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
1211 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
1212 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
1213 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
1214 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
1215 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
1216 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
1217 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
1218 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
1219 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
1220 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
1221 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
1222 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
1225 static uint8_t flac_crc8( const uint8_t *data
, unsigned len
)
1230 crc
= flac_crc8_table
[crc
^ *data
++];
1236 /*****************************************************************************
1237 * encoder_sys_t : flac encoder descriptor
1238 *****************************************************************************/
1239 struct encoder_sys_t
1246 int i_samples_delay
;
1249 FLAC__int32
*p_buffer
;
1250 unsigned int i_buffer
;
1257 FLAC__StreamEncoder
*p_flac
;
1258 FLAC__StreamMetadata_StreamInfo stream_info
;
1266 #define STREAMINFO_SIZE 38
1268 static block_t
*Encode( encoder_t
*, aout_buffer_t
* );
1270 static FLAC__StreamEncoderWriteStatus
1271 EncoderWriteCallback( const FLAC__StreamEncoder
*encoder
,
1272 const FLAC__byte buffer
[],
1273 unsigned bytes
, unsigned samples
,
1274 unsigned current_frame
, void *client_data
);
1276 static void EncoderMetadataCallback( const FLAC__StreamEncoder
*encoder
,
1277 const FLAC__StreamMetadata
*metadata
,
1278 void *client_data
);
1280 /*****************************************************************************
1281 * OpenEncoder: probe the encoder and return score
1282 *****************************************************************************/
1283 static int OpenEncoder( vlc_object_t
*p_this
)
1285 encoder_t
*p_enc
= (encoder_t
*)p_this
;
1286 encoder_sys_t
*p_sys
;
1288 if( p_enc
->fmt_out
.i_codec
!= VLC_CODEC_FLAC
&&
1291 return VLC_EGENERIC
;
1294 /* Allocate the memory needed to store the decoder's structure */
1295 if( ( p_sys
= (encoder_sys_t
*)malloc(sizeof(encoder_sys_t
)) ) == NULL
)
1297 p_enc
->p_sys
= p_sys
;
1298 p_enc
->pf_encode_audio
= Encode
;
1299 p_enc
->fmt_out
.i_codec
= VLC_CODEC_FLAC
;
1301 p_sys
->i_headers
= 0;
1302 p_sys
->p_buffer
= 0;
1303 p_sys
->i_buffer
= 0;
1304 p_sys
->i_samples_delay
= 0;
1306 /* Create flac encoder */
1307 if( !(p_sys
->p_flac
= FLAC__stream_encoder_new()) )
1309 msg_Err( p_enc
, "FLAC__stream_encoder_new() failed" );
1311 return VLC_EGENERIC
;
1314 FLAC__stream_encoder_set_streamable_subset( p_sys
->p_flac
, 1 );
1315 FLAC__stream_encoder_set_channels( p_sys
->p_flac
,
1316 p_enc
->fmt_in
.audio
.i_channels
);
1317 FLAC__stream_encoder_set_sample_rate( p_sys
->p_flac
,
1318 p_enc
->fmt_in
.audio
.i_rate
);
1319 FLAC__stream_encoder_set_bits_per_sample( p_sys
->p_flac
, 16 );
1320 p_enc
->fmt_in
.i_codec
= VLC_CODEC_S16N
;
1322 /* Get and store the STREAMINFO metadata block as a p_extra */
1325 #ifdef USE_NEW_FLAC_API
1326 if( FLAC__stream_encoder_init_stream( p_sys
->p_flac
,
1327 EncoderWriteCallback
,
1330 EncoderMetadataCallback
,
1332 != FLAC__STREAM_ENCODER_INIT_STATUS_OK
)
1334 msg_Err( p_enc
, "FLAC__stream_encoder_init_stream() failed" );
1335 FLAC__stream_encoder_delete( p_sys
->p_flac
);
1337 return VLC_EGENERIC
;
1340 FLAC__stream_encoder_set_write_callback( p_sys
->p_flac
,
1341 EncoderWriteCallback
);
1342 FLAC__stream_encoder_set_metadata_callback( p_sys
->p_flac
,
1343 EncoderMetadataCallback
);
1344 FLAC__stream_encoder_set_client_data( p_sys
->p_flac
, p_enc
);
1346 FLAC__stream_encoder_init( p_sys
->p_flac
);
1352 /****************************************************************************
1353 * Encode: the whole thing
1354 ****************************************************************************
1355 * This function spits out ogg packets.
1356 ****************************************************************************/
1357 static block_t
*Encode( encoder_t
*p_enc
, aout_buffer_t
*p_aout_buf
)
1359 encoder_sys_t
*p_sys
= p_enc
->p_sys
;
1363 p_sys
->i_pts
= p_aout_buf
->i_pts
-
1364 (mtime_t
)1000000 * (mtime_t
)p_sys
->i_samples_delay
/
1365 (mtime_t
)p_enc
->fmt_in
.audio
.i_rate
;
1367 p_sys
->i_samples_delay
+= p_aout_buf
->i_nb_samples
;
1369 /* Convert samples to FLAC__int32 */
1370 if( p_sys
->i_buffer
< p_aout_buf
->i_buffer
* 2 )
1373 xrealloc( p_sys
->p_buffer
, p_aout_buf
->i_buffer
* 2 );
1374 p_sys
->i_buffer
= p_aout_buf
->i_buffer
* 2;
1377 for( i
= 0 ; i
< p_aout_buf
->i_buffer
/ 2 ; i
++ )
1379 p_sys
->p_buffer
[i
]= ((int16_t *)p_aout_buf
->p_buffer
)[i
];
1382 FLAC__stream_encoder_process_interleaved( p_sys
->p_flac
, p_sys
->p_buffer
,
1383 p_aout_buf
->i_nb_samples
);
1385 p_chain
= p_sys
->p_chain
;
1391 /*****************************************************************************
1392 * CloseEncoder: encoder destruction
1393 *****************************************************************************/
1394 static void CloseEncoder( vlc_object_t
*p_this
)
1396 encoder_t
*p_enc
= (encoder_t
*)p_this
;
1397 encoder_sys_t
*p_sys
= p_enc
->p_sys
;
1399 FLAC__stream_encoder_delete( p_sys
->p_flac
);
1401 free( p_sys
->p_buffer
);
1405 /*****************************************************************************
1406 * EncoderMetadataCallback: called by libflac to output metadata
1407 *****************************************************************************/
1408 static void EncoderMetadataCallback( const FLAC__StreamEncoder
*encoder
,
1409 const FLAC__StreamMetadata
*metadata
,
1412 VLC_UNUSED(encoder
);
1413 encoder_t
*p_enc
= (encoder_t
*)client_data
;
1415 msg_Err( p_enc
, "MetadataCallback: %i", metadata
->type
);
1419 /*****************************************************************************
1420 * EncoderWriteCallback: called by libflac to output encoded samples
1421 *****************************************************************************/
1422 static FLAC__StreamEncoderWriteStatus
1423 EncoderWriteCallback( const FLAC__StreamEncoder
*encoder
,
1424 const FLAC__byte buffer
[],
1425 unsigned bytes
, unsigned samples
,
1426 unsigned current_frame
, void *client_data
)
1428 VLC_UNUSED(encoder
); VLC_UNUSED(current_frame
);
1429 encoder_t
*p_enc
= (encoder_t
*)client_data
;
1430 encoder_sys_t
*p_sys
= p_enc
->p_sys
;
1435 if( p_sys
->i_headers
== 1 )
1437 msg_Dbg( p_enc
, "Writing STREAMINFO: %i", bytes
);
1439 /* Backup the STREAMINFO metadata block */
1440 p_enc
->fmt_out
.i_extra
= STREAMINFO_SIZE
+ 4;
1441 p_enc
->fmt_out
.p_extra
= xmalloc( STREAMINFO_SIZE
+ 4 );
1442 memcpy( p_enc
->fmt_out
.p_extra
, "fLaC", 4 );
1443 memcpy( ((uint8_t *)p_enc
->fmt_out
.p_extra
) + 4, buffer
,
1446 /* Fake this as the last metadata block */
1447 ((uint8_t*)p_enc
->fmt_out
.p_extra
)[4] |= 0x80;
1450 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
;
1453 p_block
= block_New( p_enc
, bytes
);
1454 memcpy( p_block
->p_buffer
, buffer
, bytes
);
1456 p_block
->i_dts
= p_block
->i_pts
= p_sys
->i_pts
;
1458 p_sys
->i_samples_delay
-= samples
;
1460 p_block
->i_length
= (mtime_t
)1000000 *
1461 (mtime_t
)samples
/ (mtime_t
)p_enc
->fmt_in
.audio
.i_rate
;
1464 p_sys
->i_pts
+= p_block
->i_length
;
1466 block_ChainAppend( &p_sys
->p_chain
, p_block
);
1468 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
;