[vlc-devel] [PATCH] decoder: unblock broken decoders when flushing

Ludovic Fauvet etix at videolan.org
Mon Oct 27 12:48:40 CET 2014


On Mon, Oct 27, 2014, at 12:41, Thomas Guillem wrote:
> MediaCodec or iomx with direct rendering can be stuck waiting for an
> output
> buffer when video is paused since output buffers are released by vout.
> 
> A previous hack was made in order to fix a deadlock when theses broken
> decoders
> were stuck and when exit was requested. These decoders returned an
> invalid
> picture after a small delay, then DecoderIsExitRequested in
> DecoderDecodeVideo
> was checked and these decoders could be exited without blocking.
> 
> This previous hack didn't fix a deadlock when video was flushed on pause.
> Indeed, when stuck, these broken decoders are feed with the same block.
> Therefore they won't receive a new block containing the FLUSH flags and
> they
> will be stuck returning an invalid picture.
> 
> One way to fix this deadlock is to also check for DecoderIsFlushing in
> order to
> break the DecoderDecodeVideo loop. If this loop is broken, the
> DecoderProcess
> function will terminate, and a new block containing the FLUSH flags will
> be
> given to the decoder.
> 
> (fixes #12397)
> ---
>  src/input/decoder.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/input/decoder.c b/src/input/decoder.c
> index 972522a..03fc21b 100644
> --- a/src/input/decoder.c
> +++ b/src/input/decoder.c
> @@ -1202,7 +1202,7 @@ static void DecoderDecodeAudio( decoder_t *p_dec,
> block_t *p_block )
>      }
>      else while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block ))
>      )
>      {
> -        if( DecoderIsExitRequested( p_dec ) )
> +        if( DecoderIsExitRequested( p_dec ) || DecoderIsFlushing( p_dec
> ) )
>          {
>              /* It prevent freezing VLC in case of broken decoder */
>              block_Release( p_aout_buf );
> @@ -1371,7 +1371,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec,
> block_t *p_block )
>      while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) )
>      {
>          vout_thread_t  *p_vout = p_owner->p_vout;
> -        if( DecoderIsExitRequested( p_dec ) )
> +        if( DecoderIsExitRequested( p_dec ) || DecoderIsFlushing( p_dec
> ) )
>          {
>              /* It prevent freezing VLC in case of broken decoder */
>              vout_ReleasePicture( p_vout, p_pic );
> -- 
> 2.1.0

LGTM.

-- 
Ludovic Fauvet
www.videolan.org



More information about the vlc-devel mailing list