X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fflac.c;h=d7130dc3dec31f2f4f84e6cb52829082a0741573;hb=731c247b2348f81296c623684dff5fa6bb39105e;hp=0fb3d011c7f91467cffae2590f24596d44561653;hpb=9aba8655bc20754bddd83c3733059c6846145826;p=vlc diff --git a/modules/codec/flac.c b/modules/codec/flac.c index 0fb3d011c7..d7130dc3de 100644 --- a/modules/codec/flac.c +++ b/modules/codec/flac.c @@ -161,6 +161,8 @@ static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder, static void Interleave32( int32_t *p_out, const int32_t * const *pp_in, int i_nb_channels, int i_samples ); +static void Interleave24( int8_t *p_out, const int32_t * const *pp_in, + int i_nb_channels, int i_samples ); static void Interleave16( int16_t *p_out, const int32_t * const *pp_in, int i_nb_channels, int i_samples ); @@ -174,29 +176,29 @@ static uint8_t flac_crc8( const uint8_t *data, unsigned len ); /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); +vlc_module_begin () - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_ACODEC ); - add_shortcut( "flac" ); + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_ACODEC ) + add_shortcut( "flac" ) #ifdef USE_LIBFLAC - set_description( N_("Flac audio decoder") ); - set_capability( "decoder", 100 ); - set_callbacks( OpenDecoder, CloseDecoder ); + set_description( N_("Flac audio decoder") ) + set_capability( "decoder", 100 ) + set_callbacks( OpenDecoder, CloseDecoder ) - add_submodule(); - set_description( N_("Flac audio encoder") ); - set_capability( "encoder", 100 ); - set_callbacks( OpenEncoder, CloseEncoder ); + add_submodule () + set_description( N_("Flac audio encoder") ) + set_capability( "encoder", 100 ) + set_callbacks( OpenEncoder, CloseEncoder ) - add_submodule(); + add_submodule () #endif - set_description( N_("Flac audio packetizer") ); - set_capability( "packetizer", 100 ); - set_callbacks( OpenPacketizer, CloseDecoder ); + set_description( N_("Flac audio packetizer") ) + set_capability( "packetizer", 100 ) + set_callbacks( OpenPacketizer, CloseDecoder ) -vlc_module_end(); +vlc_module_end () /***************************************************************************** * OpenDecoder: probe the decoder and return score @@ -386,7 +388,7 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) p_sys->i_state = STATE_NOSYNC; block_BytestreamFlush( &p_sys->bytestream ); } -// aout_DateSet( &p_sys->end_date, 0 ); + aout_DateSet( &p_sys->end_date, 0 ); block_Release( *pp_block ); return NULL; } @@ -408,6 +410,8 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) else if( !aout_DateGet( &p_sys->end_date ) ) { /* The first PTS is as good as anything else. */ + p_sys->i_rate = p_dec->fmt_out.audio.i_rate; + aout_DateInit( &p_sys->end_date, p_sys->i_rate ); aout_DateSet( &p_sys->end_date, (*pp_block)->i_pts ); } @@ -617,7 +621,7 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder, decoder_sys_t *p_sys = p_dec->p_sys; p_sys->p_aout_buffer = - p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize ); + decoder_NewAudioBuffer( p_dec, frame->header.blocksize ); if( p_sys->p_aout_buffer == NULL ) return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; @@ -628,6 +632,10 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder, Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer, frame->header.channels, frame->header.blocksize ); break; + case 24: + Interleave24( (int8_t *)p_sys->p_aout_buffer->p_buffer, buffer, + frame->header.channels, frame->header.blocksize ); + break; default: Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer, frame->header.channels, frame->header.blocksize ); @@ -662,6 +670,9 @@ static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder, case 16: p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE; break; + case 24: + p_dec->fmt_out.i_codec = AOUT_FMT_S24_NE; + break; default: msg_Dbg( p_dec, "strange bit/sample value: %d", metadata->data.stream_info.bits_per_sample ); @@ -737,6 +748,28 @@ static void Interleave32( int32_t *p_out, const int32_t * const *pp_in, } } } + +static void Interleave24( int8_t *p_out, const int32_t * const *pp_in, + int i_nb_channels, int i_samples ) +{ + int i, j; + for ( j = 0; j < i_samples; j++ ) + { + for ( i = 0; i < i_nb_channels; i++ ) + { +#ifdef WORDS_BIGENDIAN + p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 16) & 0xff; + p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff; + p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 0 ) & 0xff; +#else + p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 16) & 0xff; + p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff; + p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 0 ) & 0xff; +#endif + } + } +} + static void Interleave16( int16_t *p_out, const int32_t * const *pp_in, int i_nb_channels, int i_samples ) { @@ -827,7 +860,8 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf, { decoder_sys_t *p_sys = p_dec->p_sys; int i_header, i_temp, i_read; - int i_blocksize = 0, i_blocksize_hint = 0, i_sample_rate_hint = 0; + unsigned i_blocksize = 0; + int i_blocksize_hint = 0, i_sample_rate_hint = 0; uint64_t i_sample_number = 0; bool b_variable_blocksize = ( p_sys->b_stream_info &&