[vlc-commits] decoder: fix race in spu_new_buffer

Thomas Guillem git at videolan.org
Fri Mar 20 16:10:20 CET 2015


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Mar 18 09:16:44 2015 +0000| [90fc091360a6cdfcd7f2d6a244f505bdc2280b4c] | committer: Jean-Baptiste Kempf

decoder: fix race in spu_new_buffer

There is a race when starting video with subtitles at a given position (via
--start-time).

If all decoders are flushed early, the video decoder may not have created the
Vout via the decoder_NewPicture call. In that case, spu_new_buffer will be
blocking for 6 seconds. Indeed, spu_new_buffer can block for maximum 6 seconds
when it's waiting for a Vout.

To solve this race, abort spu_new_buffer if decoder is flushing.

How to reproduce the race condition:
./vlc --start-time 3600 <video_with_subtitles>

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=90fc091360a6cdfcd7f2d6a244f505bdc2280b4c
---

 src/input/decoder.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index 8e1a658..b5ac464 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -2192,7 +2192,8 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
 
     while( i_attempts-- )
     {
-        if( DecoderIsExitRequested( p_dec ) || p_dec->b_error )
+        if( DecoderIsExitRequested( p_dec ) || DecoderIsFlushing( p_dec )
+         || p_dec->b_error )
             break;
 
         p_vout = input_resource_HoldVout( p_owner->p_resource );



More information about the vlc-commits mailing list