Qt: simplify playlist item deletion
[vlc.git] / modules / codec / flac.c
blob3e4acbca769c034c431a127d29d833d3118f9a6e
1 /*****************************************************************************
2 * flac.c: flac decoder/packetizer/encoder module making use of libflac
3 *****************************************************************************
4 * Copyright (C) 1999-2001 the VideoLAN team
5 * $Id$
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 /*****************************************************************************
26 * Preamble
27 *****************************************************************************/
29 #ifdef HAVE_CONFIG_H
30 # include "config.h"
31 #endif
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
35 #include <vlc_codec.h>
36 #include <vlc_aout.h>
38 #ifdef HAVE_FLAC_STREAM_DECODER_H
39 # include <FLAC/stream_decoder.h>
40 # include <FLAC/stream_encoder.h>
41 # define USE_LIBFLAC
42 #endif
44 #include <vlc_block_helper.h>
45 #include <vlc_bits.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
51 #endif
53 /*****************************************************************************
54 * decoder_sys_t : FLAC decoder descriptor
55 *****************************************************************************/
56 struct decoder_sys_t
59 * Input properties
61 int i_state;
63 block_bytestream_t bytestream;
66 * Input/Output properties
68 block_t *p_block;
69 aout_buffer_t *p_aout_buffer;
72 * FLAC properties
74 #ifdef USE_LIBFLAC
75 FLAC__StreamDecoder *p_flac;
76 FLAC__StreamMetadata_StreamInfo stream_info;
77 #else
78 struct
80 unsigned min_blocksize, max_blocksize;
81 unsigned min_framesize, max_framesize;
82 unsigned sample_rate;
83 unsigned channels;
84 unsigned bits_per_sample;
86 } stream_info;
87 #endif
88 bool b_stream_info;
91 * Common properties
93 date_t end_date;
94 mtime_t i_pts;
96 int i_frame_size, i_frame_length, i_bits_per_sample;
97 unsigned int i_rate, i_channels, i_channels_conf;
100 enum {
102 STATE_NOSYNC,
103 STATE_SYNC,
104 STATE_HEADER,
105 STATE_NEXT_SYNC,
106 STATE_GET_DATA,
107 STATE_SEND_DATA
110 static const int pi_channels_maps[7] =
113 AOUT_CHAN_CENTER,
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 /*****************************************************************************
125 * Local prototypes
126 *****************************************************************************/
127 static int OpenDecoder ( vlc_object_t * );
128 static int OpenPacketizer( vlc_object_t * );
129 static void CloseDecoder ( vlc_object_t * );
131 #ifdef USE_LIBFLAC
132 static int OpenEncoder ( vlc_object_t * );
133 static void CloseEncoder ( vlc_object_t * );
134 #endif
136 #ifdef USE_LIBFLAC
137 static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
138 #endif
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 * );
145 #ifdef USE_LIBFLAC
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,
157 void *client_data );
158 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
159 FLAC__StreamDecoderErrorStatus status,
160 void *client_data);
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 );
171 #endif
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 /*****************************************************************************
177 * Module descriptor
178 *****************************************************************************/
179 vlc_module_begin ()
181 set_category( CAT_INPUT )
182 set_subcategory( SUBCAT_INPUT_ACODEC )
183 add_shortcut( "flac" )
185 #ifdef USE_LIBFLAC
186 set_description( N_("Flac audio decoder") )
187 set_capability( "decoder", 100 )
188 set_callbacks( OpenDecoder, CloseDecoder )
190 add_submodule ()
191 add_shortcut( "flac" )
192 set_description( N_("Flac audio encoder") )
193 set_capability( "encoder", 100 )
194 set_callbacks( OpenEncoder, CloseEncoder )
196 add_submodule ()
197 add_shortcut( "flac" )
198 #endif
199 set_description( N_("Flac audio packetizer") )
200 set_capability( "packetizer", 100 )
201 set_callbacks( OpenPacketizer, CloseDecoder )
203 vlc_module_end ()
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 )
215 return VLC_EGENERIC;
218 /* Allocate the memory needed to store the decoder's structure */
219 if( ( p_dec->p_sys = p_sys = malloc(sizeof(*p_sys)) ) == NULL )
220 return VLC_ENOMEM;
222 /* Misc init */
223 date_Set( &p_sys->end_date, 0 );
224 p_sys->i_state = STATE_NOSYNC;
225 p_sys->b_stream_info = false;
226 p_sys->p_block=NULL;
227 p_sys->i_pts = VLC_TS_INVALID;
228 p_sys->bytestream = block_BytestreamInit();
230 #ifdef USE_LIBFLAC
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" );
235 free( p_sys );
236 return VLC_EGENERIC;
239 #ifdef USE_NEW_FLAC_API
240 if( FLAC__stream_decoder_init_stream( p_sys->p_flac,
241 DecoderReadCallback,
242 NULL,
243 NULL,
244 NULL,
245 NULL,
246 DecoderWriteCallback,
247 DecoderMetadataCallback,
248 DecoderErrorCallback,
249 p_dec )
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 );
254 free( p_sys );
255 return VLC_EGENERIC;
257 #else
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 );
269 #endif
270 #endif
272 /* Set output properties */
273 p_dec->fmt_out.i_cat = AUDIO_ES;
274 p_dec->fmt_out.i_codec = VLC_CODEC_FL32;
276 /* Set callbacks */
277 #ifdef USE_LIBFLAC
278 p_dec->pf_decode_audio = DecodeBlock;
279 #endif
281 return VLC_SUCCESS;
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;
288 int i_ret;
290 /* */
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;
305 return i_ret;
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;
316 #ifdef USE_LIBFLAC
317 FLAC__stream_decoder_finish( p_sys->p_flac );
318 FLAC__stream_decoder_delete( p_sys->p_flac );
319 #endif
321 free( p_sys->p_block );
322 free( p_sys );
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;
332 #ifdef USE_LIBFLAC
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" );
343 #else
344 bs_t bs;
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;
359 #endif
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 );
395 return NULL;
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" );
403 return NULL;
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 );
410 return NULL;
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 );
422 while( 1 )
424 switch( p_sys->i_state )
426 case STATE_NOSYNC:
427 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
428 == VLC_SUCCESS )
430 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
432 p_sys->i_state = STATE_SYNC;
433 break;
435 block_SkipByte( &p_sys->bytestream );
437 if( p_sys->i_state != STATE_SYNC )
439 block_BytestreamFlush( &p_sys->bytestream );
441 /* Need more data */
442 return NULL;
445 case STATE_SYNC:
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;
455 case 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 )
460 /* Need more data */
461 return NULL;
464 /* Check if frame is valid and get frame info */
465 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
466 &p_sys->i_channels,
467 &p_sys->i_channels_conf,
468 &p_sys->i_rate,
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;
475 break;
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
488 * next sync word */
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 )
494 == VLC_SUCCESS )
496 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
498 /* Check if frame is valid and get frame info */
499 int i_frame_length =
500 SyncInfo( p_dec, p_header,
501 &p_sys->i_channels,
502 &p_sys->i_channels_conf,
503 &p_sys->i_rate,
504 &p_sys->i_bits_per_sample );
506 if( i_frame_length )
508 p_sys->i_state = STATE_SEND_DATA;
509 break;
512 p_sys->i_frame_size++;
515 if( p_sys->i_state != STATE_SEND_DATA )
517 /* Need more data */
518 return NULL;
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;
545 return p_sout_block;
549 return NULL;
552 #ifdef USE_LIBFLAC
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 )
594 VLC_UNUSED(decoder);
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;
605 else
607 *bytes = 0;
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] = {
624 {-1},
625 { 0, },
626 { 0, 1 },
627 { 0, 1, 2 },
628 { 0, 1, 2, 3 },
629 { 0, 1, 3, 4, 2 },
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 */
636 VLC_UNUSED(decoder);
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 )
653 case 16:
654 Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer, pi_reorder,
655 frame->header.channels, frame->header.blocksize );
656 break;
657 case 24:
658 Interleave24( (int8_t *)p_sys->p_aout_buffer->p_buffer, buffer, pi_reorder,
659 frame->header.channels, frame->header.blocksize );
660 break;
661 default:
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,
678 void *client_data )
680 VLC_UNUSED(decoder);
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 )
688 case 8:
689 p_dec->fmt_out.i_codec = VLC_CODEC_S8;
690 break;
691 case 16:
692 p_dec->fmt_out.i_codec = VLC_CODEC_S16N;
693 break;
694 case 24:
695 p_dec->fmt_out.i_codec = VLC_CODEC_S24N;
696 break;
697 default:
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;
701 break;
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;
723 return;
726 /*****************************************************************************
727 * DecoderErrorCallback: called when the libflac decoder encounters an error
728 *****************************************************************************/
729 static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
730 FLAC__StreamDecoderErrorStatus status,
731 void *client_data )
733 VLC_UNUSED(decoder);
734 decoder_t *p_dec = (decoder_t *)client_data;
736 switch( status )
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." );
741 break;
742 case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
743 msg_Err( p_dec, "the decoder encountered a corrupted frame header." );
744 break;
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 "
747 "footer." );
748 break;
749 default:
750 msg_Err( p_dec, "got decoder error: %d", status );
753 FLAC__stream_decoder_flush( p_dec->p_sys->p_flac );
754 return;
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 )
764 int i, j;
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 )
778 int i, j;
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;
788 #else
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;
792 #endif
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 )
801 int i, j;
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 )
817 switch ( state )
819 case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
820 msg_Dbg( p_dec, "the decoder is ready to search for metadata." );
821 break;
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." );
825 break;
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." );
829 break;
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." );
833 break;
834 case FLAC__STREAM_DECODER_END_OF_STREAM:
835 msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
836 break;
837 #ifdef USE_NEW_FLAC_API
838 case FLAC__STREAM_DECODER_OGG_ERROR:
839 msg_Err( p_dec, "error occurred in the Ogg layer." );
840 break;
841 case FLAC__STREAM_DECODER_SEEK_ERROR:
842 msg_Err( p_dec, "error occurred while seeking." );
843 break;
844 #endif
845 case FLAC__STREAM_DECODER_ABORTED:
846 msg_Warn( p_dec, "the decoder was aborted by the read callback." );
847 break;
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 "
851 "in the stream." );
852 break;
853 #endif
854 case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
855 msg_Err( p_dec, "error when allocating memory." );
856 break;
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." );
862 break;
863 case FLAC__STREAM_DECODER_INVALID_CALLBACK:
864 msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
865 "all callbacks being set." );
866 break;
867 #endif
868 case FLAC__STREAM_DECODER_UNINITIALIZED:
869 msg_Err( p_dec, "decoder in uninitialized state." );
870 break;
871 default:
872 msg_Warn(p_dec, "unknown error" );
875 #endif
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 );
897 /* Check syncword */
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 )
906 case 0:
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 */
910 break;
912 case 1:
913 i_blocksize = 192;
914 break;
916 case 2:
917 case 3:
918 case 4:
919 case 5:
920 i_blocksize = 576 << (i_temp - 2);
921 break;
923 case 6:
924 case 7:
925 i_blocksize_hint = i_temp;
926 break;
928 case 8:
929 case 9:
930 case 10:
931 case 11:
932 case 12:
933 case 13:
934 case 14:
935 case 15:
936 i_blocksize = 256 << (i_temp - 8);
937 break;
940 /* Find samplerate */
941 switch( i_temp = p_buf[2] & 0x0f )
943 case 0:
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 */
947 break;
949 case 1:
950 case 2:
951 case 3:
952 return 0;
953 break;
955 case 4:
956 *pi_sample_rate = 8000;
957 break;
959 case 5:
960 *pi_sample_rate = 16000;
961 break;
963 case 6:
964 *pi_sample_rate = 22050;
965 break;
967 case 7:
968 *pi_sample_rate = 24000;
969 break;
971 case 8:
972 *pi_sample_rate = 32000;
973 break;
975 case 9:
976 *pi_sample_rate = 44100;
977 break;
979 case 10:
980 *pi_sample_rate = 48000;
981 break;
983 case 11:
984 *pi_sample_rate = 96000;
985 break;
987 case 12:
988 case 13:
989 case 14:
990 i_sample_rate_hint = i_temp;
991 break;
993 case 15:
994 return 0;
997 /* Find channels */
998 i_temp = (unsigned)(p_buf[3] >> 4);
999 if( i_temp & 8 )
1001 #ifdef USE_LIBFLAC
1002 int i_channel_assignment; /* ??? */
1004 switch( i_temp & 7 )
1006 case 0:
1007 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
1008 break;
1009 case 1:
1010 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
1011 break;
1012 case 2:
1013 i_channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
1014 break;
1015 default:
1016 return 0;
1017 break;
1019 #endif
1021 *pi_channels = 2;
1023 else
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 )
1032 case 0:
1033 if( p_sys->b_stream_info )
1034 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
1035 else
1036 return 0;
1037 break;
1039 case 1:
1040 *pi_bits_per_sample = 8;
1041 break;
1043 case 2:
1044 *pi_bits_per_sample = 12;
1045 break;
1047 case 4:
1048 *pi_bits_per_sample = 16;
1049 break;
1051 case 5:
1052 *pi_bits_per_sample = 20;
1053 break;
1055 case 6:
1056 *pi_bits_per_sample = 24;
1057 break;
1059 case 3:
1060 case 7:
1061 return 0;
1062 break;
1065 /* Zero padding bit */
1066 if( p_buf[3] & 0x01 ) return 0;
1068 /* End of fixed size header */
1069 i_header = 4;
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;
1077 else
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;
1086 i_header += i_read;
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] )
1117 return 0;
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 )
1125 return 0;
1127 return i_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;
1134 unsigned i, j;
1136 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
1138 i_result = p_buf[0];
1139 i = 0;
1141 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
1143 i_result = p_buf[0] & 0x1F;
1144 i = 1;
1146 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
1148 i_result = p_buf[0] & 0x0F;
1149 i = 2;
1151 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
1153 i_result = p_buf[0] & 0x07;
1154 i = 3;
1156 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
1158 i_result = p_buf[0] & 0x03;
1159 i = 4;
1161 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
1163 i_result = p_buf[0] & 0x01;
1164 i = 5;
1166 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
1168 i_result = 0;
1169 i = 6;
1171 else {
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);
1181 i_result <<= 6;
1182 i_result |= (p_buf[j] & 0x3F);
1185 *pi_read = i;
1186 return i_result;
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 )
1227 uint8_t crc = 0;
1229 while(len--)
1230 crc = flac_crc8_table[crc ^ *data++];
1232 return crc;
1235 #ifdef USE_LIBFLAC
1236 /*****************************************************************************
1237 * encoder_sys_t : flac encoder descriptor
1238 *****************************************************************************/
1239 struct encoder_sys_t
1242 * Input properties
1244 int i_headers;
1246 int i_samples_delay;
1247 int i_channels;
1249 FLAC__int32 *p_buffer;
1250 unsigned int i_buffer;
1252 block_t *p_chain;
1255 * FLAC properties
1257 FLAC__StreamEncoder *p_flac;
1258 FLAC__StreamMetadata_StreamInfo stream_info;
1261 * Common properties
1263 mtime_t i_pts;
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 &&
1289 !p_enc->b_force )
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 )
1296 return VLC_ENOMEM;
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" );
1310 free( p_sys );
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 */
1323 p_sys->p_chain = 0;
1325 #ifdef USE_NEW_FLAC_API
1326 if( FLAC__stream_encoder_init_stream( p_sys->p_flac,
1327 EncoderWriteCallback,
1328 NULL,
1329 NULL,
1330 EncoderMetadataCallback,
1331 p_enc )
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 );
1336 free( p_sys );
1337 return VLC_EGENERIC;
1339 #else
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 );
1347 #endif
1349 return VLC_SUCCESS;
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;
1360 block_t *p_chain;
1361 unsigned int i;
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 )
1372 p_sys->p_buffer =
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;
1386 p_sys->p_chain = 0;
1388 return 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 );
1402 free( p_sys );
1405 /*****************************************************************************
1406 * EncoderMetadataCallback: called by libflac to output metadata
1407 *****************************************************************************/
1408 static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
1409 const FLAC__StreamMetadata *metadata,
1410 void *client_data )
1412 VLC_UNUSED(encoder);
1413 encoder_t *p_enc = (encoder_t *)client_data;
1415 msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
1416 return;
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;
1431 block_t *p_block;
1433 if( samples == 0 )
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,
1444 STREAMINFO_SIZE );
1446 /* Fake this as the last metadata block */
1447 ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
1449 p_sys->i_headers++;
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;
1463 /* Update pts */
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;
1470 #endif