From: RĂ©mi Denis-Courmont Date: Sat, 21 Mar 2015 17:09:31 +0000 (+0200) Subject: decoder: add input_DecoderDrain() X-Git-Url: https://git.sesse.net/?p=vlc;a=commitdiff_plain;h=132f872d78a5f489908a0b108cd3f3544a9cf0f7 decoder: add input_DecoderDrain() --- diff --git a/include/vlc_input.h b/include/vlc_input.h index a6ea43296f..5b05ce87bb 100644 --- a/include/vlc_input.h +++ b/include/vlc_input.h @@ -617,6 +617,7 @@ static inline int input_ModifyPcrSystem( input_thread_t *p_input, bool b_absolut VLC_API decoder_t * input_DecoderCreate( vlc_object_t *, const es_format_t *, input_resource_t * ) VLC_USED; VLC_API void input_DecoderDelete( decoder_t * ); VLC_API void input_DecoderDecode( decoder_t *, block_t *, bool b_do_pace ); +VLC_API void input_DecoderDrain( decoder_t * ); VLC_API void input_DecoderFlush( decoder_t * ); /** diff --git a/src/input/decoder.c b/src/input/decoder.c index 703ddd0fbe..65dc51154a 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1925,6 +1925,24 @@ bool input_DecoderIsEmpty( decoder_t * p_dec ) return b_empty; } +/** + * Signals that there are no further blocks to decode, and requests that the + * decoder drain all pending buffers. This is used to ensure that all + * intermediate buffers empty and no samples get lost at the end of the stream. + * + * @note The function does not actually wait for draining. It just signals that + * draining should be performed once the decoder has emptied FIFO. + */ +void input_DecoderDrain( decoder_t *p_dec ) +{ + block_t *p_block = block_Alloc(0); + if( unlikely(p_block == NULL) ) + return; + + p_block->i_flags |= BLOCK_FLAG_CORE_EOS; + input_DecoderDecode( p_dec, p_block, false ); +} + static void DecoderFlush( decoder_t *p_dec ) { decoder_owner_sys_t *p_owner = p_dec->p_owner; @@ -1951,7 +1969,7 @@ static void DecoderFlush( decoder_t *p_dec ) /** * Requests that the decoder immediately discard all pending buffers. - * This is useful at end of stream, when seeking or when deselecting a stream. + * This is useful when seeking or when deselecting a stream. */ void input_DecoderFlush( decoder_t *p_dec ) { diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 3cc89b56f8..1b39c0e575 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -177,6 +177,7 @@ input_CreateFilename input_DecoderCreate input_DecoderDelete input_DecoderDecode +input_DecoderDrain input_DecoderFlush input_GetItem input_item_AddInfo