[vlc-devel] [PATCH] input: waiting and flushing states should be mutually exclusive

Rémi Denis-Courmont remi at remlab.net
Tue Sep 2 11:30:33 CEST 2014


Fine with me

Le 2014-09-02 12:00, Felix Abecassis a écrit :
> A crash could occur in the following situation:
> 1) A video decoder is created and starts waiting for the first 
> picture:
>    b_waiting = true, b_first = true
>
> 2) The first picture is received but the decoder is still in waiting 
> mode:
>    b_waiting = true, b_first = false
>
> 3) A second picture is received, the decoder is now waiting in
> DecoderWaitUnblock().
>
> 4) From the input thread, an EOF event is received, 
> EsOutChangePosition is
> called and sets the decoder in flushing mode.
>
> 5) The decoder thread wakes up and exits DecoderWaitUnblock because
> b_flushing is true. However this triggers the assertion in
> DecoderDecodeVideo since we have b_waiting && !b_first.
>
> Fix #11892, #12041
> ---
>  src/input/decoder.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/src/input/decoder.c b/src/input/decoder.c
> index bbcfcf8..d40c7d3 100644
> --- a/src/input/decoder.c
> +++ b/src/input/decoder.c
> @@ -946,6 +946,7 @@ 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 );

-- 
Rémi Denis-Courmont



More information about the vlc-devel mailing list