Commit a801b6b7 authored by Felix Abecassis's avatar Felix Abecassis Committed by Jean-Baptiste Kempf

input: waiting and flushing states should be mutually exclusive

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

(cherry picked from commit a1603d9e69629a8168f5babce3388307bb677341)
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 38331417
...@@ -937,6 +937,7 @@ static void DecoderFlush( decoder_t *p_dec ) ...@@ -937,6 +937,7 @@ static void DecoderFlush( decoder_t *p_dec )
/* Empty the fifo */ /* Empty the fifo */
block_FifoEmpty( p_owner->p_fifo ); block_FifoEmpty( p_owner->p_fifo );
p_owner->b_waiting = false;
/* Monitor for flush end */ /* Monitor for flush end */
p_owner->b_flushing = true; p_owner->b_flushing = true;
vlc_cond_signal( &p_owner->wait_request ); vlc_cond_signal( &p_owner->wait_request );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment