From 7a530806100fd5444b1b873fe8f300613ae5c585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net> Date: Sat, 21 Mar 2015 17:57:46 +0200 Subject: [PATCH] decoder: add input_DecoderFlush() --- include/vlc_input.h | 1 + src/input/decoder.c | 19 ++++++++++++++++--- src/libvlccore.sym | 5 +++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/vlc_input.h b/include/vlc_input.h index c18bea671090..a6ea43296f7a 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 b5ac4646de10..8cb162c4d3f4 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 13427baa3a12..3cc89b56f8da 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 -- GitLab