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

Thomas Guillem thomas at gllm.fr
Fri Dec 18 10:33:09 UTC 2020


Ping, OK with the last version of this set ?

On Thu, Dec 17, 2020, at 10:52, 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 0b90d3e5ae6..ecf8face777 100644
> --- a/src/input/decoder.c
> +++ b/src/input/decoder.c
> @@ -1535,21 +1535,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 )
> @@ -1557,6 +1565,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:
> @@ -1564,26 +1573,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:
> @@ -1593,12 +1611,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;
>  }
>  
>  /**
> @@ -1662,24 +1683,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