[vlc-devel] [PATCH 3/3] decoder: delay controls when output is not started

Steve Lhomme robux4 at ycbcr.xyz
Thu Dec 17 06:59:07 UTC 2020


OK

On 2020-12-16 18:34, Thomas Guillem wrote:
> This fixes rate and delay ignored if the command is sent before the
> output is started.
> 
> The "continue" is removed from the loop in order to avoid
> DecoderThread_Change*() busy loop.
> 
> We don't need to delay the pause control since an output can't start
> paused. Indeed, if paused, the decoder thread won't process any inputs
> and the output won't be started.
> ---
>   src/input/decoder.c | 37 +++++++++++++++++++++++++++++--------
>   1 file changed, 29 insertions(+), 8 deletions(-)
> 
> diff --git a/src/input/decoder.c b/src/input/decoder.c
> index 488998fc35e..d3fc48d0318 100644
> --- a/src/input/decoder.c
> +++ b/src/input/decoder.c
> @@ -1532,21 +1532,29 @@ static void DecoderThread_ChangePause( vlc_input_decoder_t *p_owner, bool paused
>       }
>   }
>   
> -static void DecoderThread_ChangeRate( vlc_input_decoder_t *p_owner, float rate )
> +static int DecoderThread_ChangeRate( vlc_input_decoder_t *p_owner, float rate )
>   {
>       decoder_t *p_dec = &p_owner->dec;
>   
> +    int ret = VLC_EGENERIC;
> +
>       msg_Dbg( p_dec, "changing rate: %f", rate );
>       vlc_mutex_lock( &p_owner->lock );
>       switch( p_dec->fmt_out.i_cat )
>       {
>           case VIDEO_ES:
>               if( p_owner->p_vout != NULL && p_owner->vout_started )
> +            {
>                   vout_ChangeRate( p_owner->p_vout, rate );
> +                ret = VLC_SUCCESS;
> +            }
>               break;
>           case AUDIO_ES:
>               if( p_owner->p_aout != NULL )
> +            {
>                   aout_DecChangeRate( p_owner->p_aout, rate );
> +                ret = VLC_SUCCESS;
> +            }
>               break;
>           case SPU_ES:
>               if( p_owner->p_vout != NULL )
> @@ -1554,6 +1562,7 @@ static void DecoderThread_ChangeRate( vlc_input_decoder_t *p_owner, float rate )
>                   assert(p_owner->i_spu_channel != VOUT_SPU_CHANNEL_INVALID);
>                   vout_ChangeSpuRate(p_owner->p_vout, p_owner->i_spu_channel,
>                                      rate );
> +                ret = VLC_SUCCESS;
>               }
>               break;
>           default:
> @@ -1561,26 +1570,35 @@ static void DecoderThread_ChangeRate( vlc_input_decoder_t *p_owner, float rate )
>       }
>       p_owner->output_rate = rate;
>       vlc_mutex_unlock( &p_owner->lock );
> +
> +    return ret;
>   }
>   
> -static void DecoderThread_ChangeDelay( vlc_input_decoder_t *p_owner, vlc_tick_t delay )
> +static int DecoderThread_ChangeDelay( vlc_input_decoder_t *p_owner, vlc_tick_t delay )
>   {
>       decoder_t *p_dec = &p_owner->dec;
>   
>       msg_Dbg( p_dec, "changing delay: %"PRId64, delay );
>   
> +    int ret = VLC_EGENERIC;
>       switch( p_dec->fmt_out.i_cat )
>       {
>           case VIDEO_ES:
>               vlc_mutex_lock( &p_owner->lock );
>               if( p_owner->p_vout != NULL && p_owner->vout_started )
> +            {
>                   vout_ChangeDelay( p_owner->p_vout, delay );
> +                ret = VLC_SUCCESS;
> +            }
>               vlc_mutex_unlock( &p_owner->lock );
>               break;
>           case AUDIO_ES:
>               vlc_mutex_lock( &p_owner->lock );
>               if( p_owner->p_aout != NULL )
> +            {
>                   aout_DecChangeDelay( p_owner->p_aout, delay );
> +                ret = VLC_SUCCESS;
> +            }
>               vlc_mutex_unlock( &p_owner->lock );
>               break;
>           case SPU_ES:
> @@ -1590,12 +1608,15 @@ static void DecoderThread_ChangeDelay( vlc_input_decoder_t *p_owner, vlc_tick_t
>                   assert(p_owner->i_spu_channel != VOUT_SPU_CHANNEL_INVALID);
>                   vout_ChangeSpuDelay(p_owner->p_vout, p_owner->i_spu_channel,
>                                       delay);
> +                ret = VLC_SUCCESS;
>               }
>               vlc_mutex_unlock( &p_owner->lock );
>               break;
>           default:
>               vlc_assert_unreachable();
>       }
> +
> +    return ret;
>   }
>   
>   /**
> @@ -1659,24 +1680,24 @@ static void *DecoderThread( void *p_data )
>   
>           if( rate != p_owner->request_rate )
>           {
> -            rate = p_owner->request_rate;
> +            float request_rate = p_owner->request_rate;
>               vlc_fifo_Unlock( p_owner->p_fifo );
>   
> -            DecoderThread_ChangeRate( p_owner, rate );
> +            if( DecoderThread_ChangeRate( p_owner, request_rate ) == VLC_SUCCESS)
> +                rate = request_rate;
>   
>               vlc_fifo_Lock( p_owner->p_fifo );
> -            continue;
>           }
>   
>           if( delay != p_owner->delay )
>           {
> -            delay = p_owner->delay;
> +            float request_delay = p_owner->delay;
>               vlc_fifo_Unlock( p_owner->p_fifo );
>   
> -            DecoderThread_ChangeDelay( p_owner, delay );
> +            if( DecoderThread_ChangeDelay( p_owner, request_delay ) == VLC_SUCCESS )
> +                delay = request_delay;
>   
>               vlc_fifo_Lock( p_owner->p_fifo );
> -            continue;
>           }
>   
>           if( p_owner->paused && p_owner->frames_countdown == 0 )
> -- 
> 2.29.2
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list