X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fflac.c;h=c348a426bdc2080a35ab8543a7a6867997ab46cc;hb=e811fe62a60e62f2666d913c20bc1e7f88e5a59c;hp=837b75f7ad6622d42cfd02dcfb10074680caed88;hpb=86352fc87a075258c0343585ce36aa6f2018da29;p=vlc diff --git a/modules/codec/flac.c b/modules/codec/flac.c index 837b75f7ad..c348a426bd 100644 --- a/modules/codec/flac.c +++ b/modules/codec/flac.c @@ -26,6 +26,9 @@ * Preamble *****************************************************************************/ +/* workaround libflac overriding assert.h system header */ +#define assert(x) do {} while(0) + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -35,8 +38,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -55,6 +58,7 @@ struct decoder_sys_t */ block_t *p_block; aout_buffer_t *p_aout_buffer; + date_t end_date; /* * FLAC properties @@ -272,6 +276,10 @@ static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_sys->p_block = *pp_block; *pp_block = NULL; + if( p_sys->p_block->i_pts > VLC_TS_INVALID && + p_sys->p_block->i_pts != date_Get( &p_sys->end_date ) ) + date_Set( &p_sys->end_date, p_sys->p_block->i_pts ); + p_sys->p_aout_buffer = 0; if( !FLAC__stream_decoder_process_single( p_sys->p_flac ) ) @@ -351,6 +359,9 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder, if( p_dec->fmt_out.audio.i_channels <= 0 || p_dec->fmt_out.audio.i_channels > 8 ) return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + if( date_Get( &p_sys->end_date ) <= VLC_TS_INVALID ) + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + const int * const pi_reorder = ppi_reorder[p_dec->fmt_out.audio.i_channels]; p_sys->p_aout_buffer = @@ -375,8 +386,10 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder, } /* Date management (already done by packetizer) */ - p_sys->p_aout_buffer->i_pts = p_sys->p_block->i_pts; - p_sys->p_aout_buffer->i_length = p_sys->p_block->i_length; + p_sys->p_aout_buffer->i_pts = date_Get( &p_sys->end_date ); + p_sys->p_aout_buffer->i_length = + date_Increment( &p_sys->end_date, frame->header.blocksize ) - + p_sys->p_aout_buffer->i_pts; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } @@ -429,7 +442,8 @@ static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder, p_sys->b_stream_info = true; p_sys->stream_info = metadata->data.stream_info; - return; + date_Init( &p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1 ); + date_Set( &p_sys->end_date, VLC_TS_INVALID ); } /*****************************************************************************