Commit d4820d9c authored by Christophe Mutricy's avatar Christophe Mutricy

New FLAC API compatibility. Backport of [18855] and [18858]

parent 20872735
...@@ -8,6 +8,7 @@ Michel Lespinasse <walken at zoy.org> - AC3 decoder, MPEG audio and video decode ...@@ -8,6 +8,7 @@ Michel Lespinasse <walken at zoy.org> - AC3 decoder, MPEG audio and video decode
The VideoLAN team would like to thank the following contributors: The VideoLAN team would like to thank the following contributors:
Adam Sampson <ats @t offog d0t org> - libFLAC >= 1.1.3 API support
Alex Antropoff <alant at transtelecom dot md> - RFC3016 (LATM) RTP packetizer extension Alex Antropoff <alant at transtelecom dot md> - RFC3016 (LATM) RTP packetizer extension
Alexander Didebulidze <alexander.didebulidze at stusta dot mhn dot de> - Georgian localization Alexander Didebulidze <alexander.didebulidze at stusta dot mhn dot de> - Georgian localization
Alexander Gall <gall at switch dot ch> - Solaris fixes and CDDB fixes Alexander Gall <gall at switch dot ch> - Solaris fixes and CDDB fixes
......
...@@ -40,6 +40,10 @@ ...@@ -40,6 +40,10 @@
#define MAX_FLAC_HEADER_SIZE 16 #define MAX_FLAC_HEADER_SIZE 16
#if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT >= 8
# define USE_NEW_FLAC_API
#endif
/***************************************************************************** /*****************************************************************************
* decoder_sys_t : FLAC decoder descriptor * decoder_sys_t : FLAC decoder descriptor
*****************************************************************************/ *****************************************************************************/
...@@ -225,6 +229,25 @@ static int OpenDecoder( vlc_object_t *p_this ) ...@@ -225,6 +229,25 @@ static int OpenDecoder( vlc_object_t *p_this )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
#ifdef USE_NEW_FLAC_API
if( FLAC__stream_decoder_init_stream( p_sys->p_flac,
DecoderReadCallback,
NULL,
NULL,
NULL,
NULL,
DecoderWriteCallback,
DecoderMetadataCallback,
DecoderErrorCallback,
p_dec )
!= FLAC__STREAM_DECODER_INIT_STATUS_OK )
{
msg_Err( p_dec, "FLAC__stream_decoder_init_stream() failed" );
FLAC__stream_decoder_delete( p_sys->p_flac );
free( p_sys );
return VLC_EGENERIC;
}
#else
FLAC__stream_decoder_set_read_callback( p_sys->p_flac, FLAC__stream_decoder_set_read_callback( p_sys->p_flac,
DecoderReadCallback ); DecoderReadCallback );
FLAC__stream_decoder_set_write_callback( p_sys->p_flac, FLAC__stream_decoder_set_write_callback( p_sys->p_flac,
...@@ -236,6 +259,7 @@ static int OpenDecoder( vlc_object_t *p_this ) ...@@ -236,6 +259,7 @@ 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
#endif #endif
/* Set output properties */ /* Set output properties */
...@@ -734,16 +758,27 @@ static void decoder_state_error( decoder_t *p_dec, ...@@ -734,16 +758,27 @@ static void decoder_state_error( decoder_t *p_dec,
case FLAC__STREAM_DECODER_END_OF_STREAM: case FLAC__STREAM_DECODER_END_OF_STREAM:
msg_Dbg( p_dec, "the decoder has reached the end of the stream." ); msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
break; break;
#ifdef USE_NEW_FLAC_API
case FLAC__STREAM_DECODER_OGG_ERROR:
msg_Err( p_dec, "error occurred in the Ogg layer." );
break;
case FLAC__STREAM_DECODER_SEEK_ERROR:
msg_Err( p_dec, "error occurred while seeking." );
break;
#endif
case FLAC__STREAM_DECODER_ABORTED: case FLAC__STREAM_DECODER_ABORTED:
msg_Warn( p_dec, "the decoder was aborted by the read callback." ); msg_Warn( p_dec, "the decoder was aborted by the read callback." );
break; break;
#ifndef USE_NEW_FLAC_API
case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM: case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
msg_Warn( p_dec, "the decoder encountered reserved fields in use " msg_Warn( p_dec, "the decoder encountered reserved fields in use "
"in the stream." ); "in the stream." );
break; break;
#endif
case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR: case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
msg_Err( p_dec, "error when allocating memory." ); msg_Err( p_dec, "error when allocating memory." );
break; break;
#ifndef USE_NEW_FLAC_API
case FLAC__STREAM_DECODER_ALREADY_INITIALIZED: case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the " msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
"decoder was already initialized, usually because " "decoder was already initialized, usually because "
...@@ -753,6 +788,7 @@ static void decoder_state_error( decoder_t *p_dec, ...@@ -753,6 +788,7 @@ static void decoder_state_error( decoder_t *p_dec,
msg_Err( p_dec, "FLAC__stream_decoder_init() was called without " msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
"all callbacks being set." ); "all callbacks being set." );
break; break;
#endif
case FLAC__STREAM_DECODER_UNINITIALIZED: case FLAC__STREAM_DECODER_UNINITIALIZED:
msg_Err( p_dec, "decoder in uninitialized state." ); msg_Err( p_dec, "decoder in uninitialized state." );
break; break;
...@@ -1187,7 +1223,12 @@ static int OpenEncoder( vlc_object_t *p_this ) ...@@ -1187,7 +1223,12 @@ static int OpenEncoder( vlc_object_t *p_this )
p_sys->i_samples_delay = 0; p_sys->i_samples_delay = 0;
/* Create flac encoder */ /* Create flac encoder */
p_sys->p_flac = FLAC__stream_encoder_new(); if( !(p_sys->p_flac = FLAC__stream_encoder_new()) )
{
msg_Err( p_enc, "FLAC__stream_encoder_new() failed" );
free( p_sys );
return VLC_EGENERIC;
}
FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 ); FLAC__stream_encoder_set_streamable_subset( p_sys->p_flac, 1 );
FLAC__stream_encoder_set_channels( p_sys->p_flac, FLAC__stream_encoder_set_channels( p_sys->p_flac,
...@@ -1197,15 +1238,32 @@ static int OpenEncoder( vlc_object_t *p_this ) ...@@ -1197,15 +1238,32 @@ static int OpenEncoder( vlc_object_t *p_this )
FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 ); FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE; p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
/* Get and store the STREAMINFO metadata block as a p_extra */
p_sys->p_chain = 0;
#ifdef USE_NEW_FLAC_API
if( FLAC__stream_encoder_init_stream( p_sys->p_flac,
EncoderWriteCallback,
NULL,
NULL,
EncoderMetadataCallback,
p_enc )
!= FLAC__STREAM_ENCODER_INIT_STATUS_OK )
{
msg_Err( p_enc, "FLAC__stream_encoder_init_stream() failed" );
FLAC__stream_encoder_delete( p_sys->p_flac );
free( p_sys );
return VLC_EGENERIC;
}
#else
FLAC__stream_encoder_set_write_callback( p_sys->p_flac, FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
EncoderWriteCallback ); EncoderWriteCallback );
FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac, FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
EncoderMetadataCallback ); EncoderMetadataCallback );
FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc ); FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
/* Get and store the STREAMINFO metadata block as a p_extra */
p_sys->p_chain = 0;
FLAC__stream_encoder_init( p_sys->p_flac ); FLAC__stream_encoder_init( p_sys->p_flac );
#endif
return VLC_SUCCESS; return VLC_SUCCESS;
} }
......
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