From: RĂ©mi Denis-Courmont Date: Sat, 21 Mar 2015 15:57:46 +0000 (+0200) Subject: decoder: add input_DecoderFlush() X-Git-Url: https://git.sesse.net/?p=vlc;a=commitdiff_plain;h=7a530806100fd5444b1b873fe8f300613ae5c585 decoder: add input_DecoderFlush() --- diff --git a/include/vlc_input.h b/include/vlc_input.h index c18bea6710..a6ea43296f 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_DecoderFlush( decoder_t * ); /** * This function creates a sane filename path. diff --git a/src/input/decoder.c b/src/input/decoder.c index b5ac4646de..8cb162c4d3 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -514,15 +514,28 @@ void input_DecoderChangeDelay( decoder_t *p_dec, mtime_t i_delay ) vlc_mutex_unlock( &p_owner->lock ); } +/** + * Requests that the decoder immediately discard all pending buffers. + * This is useful at end of stream, when seeking or when deselecting a stream. + */ +void input_DecoderFlush( decoder_t *p_dec ) +{ + decoder_owner_sys_t *p_owner = p_dec->p_owner; + + vlc_mutex_lock( &p_owner->lock ); + DecoderFlush( p_dec ); + vlc_mutex_unlock( &p_owner->lock ); +} + void input_DecoderStartWait( decoder_t *p_dec ) { decoder_owner_sys_t *p_owner = p_dec->p_owner; assert( !p_owner->b_waiting ); - vlc_mutex_lock( &p_owner->lock ); - DecoderFlush( p_dec ); + input_DecoderFlush( p_dec ); + vlc_mutex_lock( &p_owner->lock ); p_owner->b_first = true; p_owner->b_has_data = false; p_owner->b_waiting = true; @@ -579,6 +592,7 @@ void input_DecoderFrameNext( decoder_t *p_dec, mtime_t *pi_duration ) else { /* TODO subtitle should not be flushed */ + p_owner->b_waiting = false; DecoderFlush( p_dec ); } vlc_mutex_unlock( &p_owner->lock ); @@ -942,7 +956,6 @@ static void DecoderFlush( decoder_t *p_dec ) /* Empty the fifo */ block_FifoEmpty( p_owner->p_fifo ); - p_owner->b_waiting = false; /* Monitor for flush end */ p_owner->b_flushing = true; vlc_cond_signal( &p_owner->wait_request ); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 13427baa3a..3cc89b56f8 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -174,9 +174,10 @@ input_Control input_Create input_CreateAndStart input_CreateFilename -input_DecoderDecode -input_DecoderDelete input_DecoderCreate +input_DecoderDelete +input_DecoderDecode +input_DecoderFlush input_GetItem input_item_AddInfo input_item_AddOption