Commit 531ff90d authored by Gildas Bazin's avatar Gildas Bazin

* modules/codec/flac.c, configure.ac: FLAC packetizer doesn't depend on libflac anymore.

parent df35e6cc
...@@ -975,8 +975,8 @@ dnl ...@@ -975,8 +975,8 @@ dnl
dnl default modules dnl default modules
dnl dnl
VLC_ADD_PLUGINS([dummy logger memcpy]) VLC_ADD_PLUGINS([dummy logger memcpy])
VLC_ADD_PLUGINS([mpgv mpga m4v m4a h264 ps pva avi asf aac mp4 rawdv nsv real aiff mjpeg demuxdump]) VLC_ADD_PLUGINS([mpgv mpga m4v m4a h264 ps pva avi asf aac mp4 rawdv nsv real aiff mjpeg demuxdump flac])
VLC_ADD_PLUGINS([cvdsub svcdsub spudec subsdec dvbsub mpeg_audio lpcm a52 dts cinepak]) VLC_ADD_PLUGINS([cvdsub svcdsub spudec subsdec dvbsub mpeg_audio lpcm a52 dts cinepak flacdec])
VLC_ADD_PLUGINS([deinterlace invert adjust transform distort clone crop motionblur]) VLC_ADD_PLUGINS([deinterlace invert adjust transform distort clone crop motionblur])
VLC_ADD_PLUGINS([fixed32tofloat32 fixed32tos16 s16tofixed32 u8tofixed32]) VLC_ADD_PLUGINS([fixed32tofloat32 fixed32tos16 s16tofixed32 u8tofixed32])
VLC_ADD_PLUGINS([trivial_resampler ugly_resampler]) VLC_ADD_PLUGINS([trivial_resampler ugly_resampler])
...@@ -2418,7 +2418,6 @@ AC_ARG_ENABLE(flac, ...@@ -2418,7 +2418,6 @@ AC_ARG_ENABLE(flac,
if test "${enable_flac}" = "yes" if test "${enable_flac}" = "yes"
then then
AC_CHECK_HEADERS(FLAC/stream_decoder.h, [ AC_CHECK_HEADERS(FLAC/stream_decoder.h, [
VLC_ADD_PLUGINS([flac flacdec])
VLC_ADD_LDFLAGS([flacdec],[-lFLAC]) VLC_ADD_LDFLAGS([flacdec],[-lFLAC])
],[]) ],[])
fi fi
......
...@@ -29,10 +29,14 @@ ...@@ -29,10 +29,14 @@
#include <vlc/vlc.h> #include <vlc/vlc.h>
#include <vlc/decoder.h> #include <vlc/decoder.h>
#include <FLAC/stream_decoder.h> #ifdef HAVE_FLAC_STREAM_DECODER_H
#include <FLAC/stream_encoder.h> # include <FLAC/stream_decoder.h>
# include <FLAC/stream_encoder.h>
# define USE_LIBFLAC
#endif
#include "vlc_block_helper.h" #include "vlc_block_helper.h"
#include "vlc_bits.h"
#define MAX_FLAC_HEADER_SIZE 16 #define MAX_FLAC_HEADER_SIZE 16
...@@ -57,10 +61,21 @@ struct decoder_sys_t ...@@ -57,10 +61,21 @@ struct decoder_sys_t
/* /*
* FLAC properties * FLAC properties
*/ */
#ifdef USE_LIBFLAC
FLAC__StreamDecoder *p_flac; FLAC__StreamDecoder *p_flac;
vlc_bool_t b_stream_info;
FLAC__StreamMetadata_StreamInfo stream_info; FLAC__StreamMetadata_StreamInfo stream_info;
#else
struct
{
unsigned min_blocksize, max_blocksize;
unsigned min_framesize, max_framesize;
unsigned sample_rate;
unsigned channels;
unsigned bits_per_sample;
} stream_info;
#endif
vlc_bool_t b_stream_info;
/* /*
* Common properties * Common properties
...@@ -101,15 +116,20 @@ static int OpenDecoder ( vlc_object_t * ); ...@@ -101,15 +116,20 @@ static int OpenDecoder ( vlc_object_t * );
static int OpenPacketizer( vlc_object_t * ); static int OpenPacketizer( vlc_object_t * );
static void CloseDecoder ( vlc_object_t * ); static void CloseDecoder ( vlc_object_t * );
#ifdef USE_LIBFLAC
static int OpenEncoder ( vlc_object_t * ); static int OpenEncoder ( vlc_object_t * );
static void CloseEncoder ( vlc_object_t * ); static void CloseEncoder ( vlc_object_t * );
#endif
#ifdef USE_LIBFLAC
static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** ); static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
#endif
static block_t *PacketizeBlock( decoder_t *, block_t ** ); static block_t *PacketizeBlock( decoder_t *, block_t ** );
static int SyncInfo( decoder_t *, uint8_t *, int *, int *, int *,int * ); static int SyncInfo( decoder_t *, uint8_t *, int *, int *, int *,int * );
#ifdef USE_LIBFLAC
static FLAC__StreamDecoderReadStatus static FLAC__StreamDecoderReadStatus
DecoderReadCallback( const FLAC__StreamDecoder *decoder, DecoderReadCallback( const FLAC__StreamDecoder *decoder,
FLAC__byte buffer[], unsigned *bytes, void *client_data ); FLAC__byte buffer[], unsigned *bytes, void *client_data );
...@@ -133,6 +153,7 @@ static void Interleave16( int16_t *p_out, const int32_t * const *pp_in, ...@@ -133,6 +153,7 @@ static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
static void decoder_state_error( decoder_t *p_dec, static void decoder_state_error( decoder_t *p_dec,
FLAC__StreamDecoderState state ); FLAC__StreamDecoderState state );
#endif
static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read ); static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read );
static uint8_t flac_crc8( const uint8_t *data, unsigned len ); static uint8_t flac_crc8( const uint8_t *data, unsigned len );
...@@ -145,20 +166,22 @@ vlc_module_begin(); ...@@ -145,20 +166,22 @@ vlc_module_begin();
set_category( CAT_INPUT ); set_category( CAT_INPUT );
set_subcategory( SUBCAT_INPUT_ACODEC ); set_subcategory( SUBCAT_INPUT_ACODEC );
#ifdef USE_LIBFLAC
set_description( _("Flac audio decoder") ); set_description( _("Flac audio decoder") );
set_capability( "decoder", 100 ); set_capability( "decoder", 100 );
set_callbacks( OpenDecoder, CloseDecoder ); set_callbacks( OpenDecoder, CloseDecoder );
add_submodule();
set_description( _("Flac audio packetizer") );
set_capability( "packetizer", 100 );
set_callbacks( OpenPacketizer, CloseDecoder );
add_submodule(); add_submodule();
set_description( _("Flac audio encoder") ); set_description( _("Flac audio encoder") );
set_capability( "encoder", 100 ); set_capability( "encoder", 100 );
set_callbacks( OpenEncoder, CloseEncoder ); set_callbacks( OpenEncoder, CloseEncoder );
add_submodule();
#endif
set_description( _("Flac audio packetizer") );
set_capability( "packetizer", 100 );
set_callbacks( OpenPacketizer, CloseDecoder );
add_shortcut( "flac" ); add_shortcut( "flac" );
vlc_module_end(); vlc_module_end();
...@@ -190,6 +213,7 @@ static int OpenDecoder( vlc_object_t *p_this ) ...@@ -190,6 +213,7 @@ static int OpenDecoder( vlc_object_t *p_this )
p_sys->bytestream = block_BytestreamInit( p_dec ); p_sys->bytestream = block_BytestreamInit( p_dec );
#ifdef USE_LIBFLAC
/* Take care of flac init */ /* Take care of flac init */
if( !(p_sys->p_flac = FLAC__stream_decoder_new()) ) if( !(p_sys->p_flac = FLAC__stream_decoder_new()) )
{ {
...@@ -209,13 +233,16 @@ static int OpenDecoder( vlc_object_t *p_this ) ...@@ -209,13 +233,16 @@ static int OpenDecoder( vlc_object_t *p_this )
FLAC__stream_decoder_set_client_data( p_sys->p_flac, p_dec ); FLAC__stream_decoder_set_client_data( p_sys->p_flac, p_dec );
FLAC__stream_decoder_init( p_sys->p_flac ); FLAC__stream_decoder_init( p_sys->p_flac );
#endif
/* Set output properties */ /* Set output properties */
p_dec->fmt_out.i_cat = AUDIO_ES; p_dec->fmt_out.i_cat = AUDIO_ES;
p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2'); p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
/* Set callbacks */ /* Set callbacks */
#ifdef USE_LIBFLAC
p_dec->pf_decode_audio = DecodeBlock; p_dec->pf_decode_audio = DecodeBlock;
#endif
p_dec->pf_packetize = PacketizeBlock; p_dec->pf_packetize = PacketizeBlock;
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -239,6 +266,23 @@ static int OpenPacketizer( vlc_object_t *p_this ) ...@@ -239,6 +266,23 @@ static int OpenPacketizer( vlc_object_t *p_this )
return i_ret; return i_ret;
} }
/*****************************************************************************
* CloseDecoder: flac decoder destruction
*****************************************************************************/
static void CloseDecoder( vlc_object_t *p_this )
{
decoder_t *p_dec = (decoder_t *)p_this;
decoder_sys_t *p_sys = p_dec->p_sys;
#ifdef USE_LIBFLAC
FLAC__stream_decoder_finish( p_sys->p_flac );
FLAC__stream_decoder_delete( p_sys->p_flac );
#endif
if( p_sys->p_block ) free( p_sys->p_block );
free( p_sys );
}
/***************************************************************************** /*****************************************************************************
* ProcessHeader: processe Flac header. * ProcessHeader: processe Flac header.
*****************************************************************************/ *****************************************************************************/
...@@ -246,6 +290,7 @@ static void ProcessHeader( decoder_t *p_dec ) ...@@ -246,6 +290,7 @@ static void ProcessHeader( decoder_t *p_dec )
{ {
decoder_sys_t *p_sys = p_dec->p_sys; decoder_sys_t *p_sys = p_dec->p_sys;
#ifdef USE_LIBFLAC
if( !p_dec->fmt_in.i_extra ) return; if( !p_dec->fmt_in.i_extra ) return;
/* Decode STREAMINFO */ /* Decode STREAMINFO */
...@@ -256,6 +301,24 @@ static void ProcessHeader( decoder_t *p_dec ) ...@@ -256,6 +301,24 @@ static void ProcessHeader( decoder_t *p_dec )
FLAC__stream_decoder_process_until_end_of_metadata( p_sys->p_flac ); FLAC__stream_decoder_process_until_end_of_metadata( p_sys->p_flac );
msg_Dbg( p_dec, "STREAMINFO decoded" ); msg_Dbg( p_dec, "STREAMINFO decoded" );
#else
bs_t bs;
if( !p_dec->fmt_in.i_extra ) return;
bs_init( &bs, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra );
p_sys->stream_info.min_blocksize = bs_read( &bs, 16 );
p_sys->stream_info.max_blocksize = bs_read( &bs, 16 );
p_sys->stream_info.min_framesize = bs_read( &bs, 24 );
p_sys->stream_info.max_framesize = bs_read( &bs, 24 );
p_sys->stream_info.sample_rate = bs_read( &bs, 20 );
p_sys->stream_info.channels = bs_read( &bs, 3 ) + 1;
p_sys->stream_info.bits_per_sample = bs_read( &bs, 5 ) + 1;
#endif
if( !p_sys->b_stream_info ) return; if( !p_sys->b_stream_info ) return;
if( p_dec->fmt_out.i_codec == VLC_FOURCC('f','l','a','c') ) if( p_dec->fmt_out.i_codec == VLC_FOURCC('f','l','a','c') )
...@@ -431,6 +494,7 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -431,6 +494,7 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
return NULL; return NULL;
} }
#ifdef USE_LIBFLAC
/**************************************************************************** /****************************************************************************
* DecodeBlock: the whole thing * DecodeBlock: the whole thing
****************************************************************************/ ****************************************************************************/
...@@ -465,20 +529,6 @@ static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -465,20 +529,6 @@ static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
return p_sys->p_aout_buffer; return p_sys->p_aout_buffer;
} }
/*****************************************************************************
* CloseDecoder: flac decoder destruction
*****************************************************************************/
static void CloseDecoder( vlc_object_t *p_this )
{
decoder_t *p_dec = (decoder_t *)p_this;
decoder_sys_t *p_sys = p_dec->p_sys;
FLAC__stream_decoder_finish( p_sys->p_flac );
FLAC__stream_decoder_delete( p_sys->p_flac );
if( p_sys->p_block ) free( p_sys->p_block );
free( p_sys );
}
/***************************************************************************** /*****************************************************************************
* DecoderReadCallback: called by libflac when it needs more data * DecoderReadCallback: called by libflac when it needs more data
*****************************************************************************/ *****************************************************************************/
...@@ -697,6 +747,7 @@ static void decoder_state_error( decoder_t *p_dec, ...@@ -697,6 +747,7 @@ static void decoder_state_error( decoder_t *p_dec,
msg_Err(p_dec, "unknown error" ); msg_Err(p_dec, "unknown error" );
} }
} }
#endif
/***************************************************************************** /*****************************************************************************
* SyncInfo: parse FLAC sync info * SyncInfo: parse FLAC sync info
...@@ -819,9 +870,9 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf, ...@@ -819,9 +870,9 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
i_temp = (unsigned)(p_buf[3] >> 4); i_temp = (unsigned)(p_buf[3] >> 4);
if( i_temp & 8 ) if( i_temp & 8 )
{ {
#ifdef USE_LIBFLAC
int i_channel_assignment; /* ??? */ int i_channel_assignment; /* ??? */
*pi_channels = 2;
switch( i_temp & 7 ) switch( i_temp & 7 )
{ {
case 0: case 0:
...@@ -837,6 +888,9 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf, ...@@ -837,6 +888,9 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
return 0; return 0;
break; break;
} }
#endif
*pi_channels = 2;
} }
else else
{ {
...@@ -1043,6 +1097,7 @@ static uint8_t flac_crc8( const uint8_t *data, unsigned len ) ...@@ -1043,6 +1097,7 @@ static uint8_t flac_crc8( const uint8_t *data, unsigned len )
return crc; return crc;
} }
#ifdef USE_LIBFLAC
/***************************************************************************** /*****************************************************************************
* encoder_sys_t : flac encoder descriptor * encoder_sys_t : flac encoder descriptor
*****************************************************************************/ *****************************************************************************/
...@@ -1256,3 +1311,4 @@ EncoderWriteCallback( const FLAC__StreamEncoder *encoder, ...@@ -1256,3 +1311,4 @@ EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
} }
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment