[vlc-devel] [RFC V2 1/2] input: add input_SetTime and input_SetPosition

Rémi Denis-Courmont remi at remlab.net
Tue Jun 19 11:09:04 CEST 2018


Does the setting even make sense and is anybody using it? To me, this feels really like a per-call parameter, not a setting.

Le 19 juin 2018 10:14:42 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>I think this patches goes to the right direction (getting ride of
>variable callback to control the input).
>One question, should the "input-fast-seek" var should be fetched only
>one time when the input is created ?
>
>On Fri, Jun 15, 2018, at 14:57, Zhao Zhili wrote:
>> ---
>>  include/vlc_input.h        |  4 +++
>>  src/input/input.c          | 83
>+++++++++++++++++++++++++++++++++++++---------
>>  src/input/input_internal.h |  1 -
>>  src/input/var.c            |  8 ++---
>>  src/libvlccore.sym         |  2 ++
>>  5 files changed, 77 insertions(+), 21 deletions(-)
>> 
>> diff --git a/include/vlc_input.h b/include/vlc_input.h
>> index 16c566a..7e04713 100644
>> --- a/include/vlc_input.h
>> +++ b/include/vlc_input.h
>> @@ -512,6 +512,10 @@ VLC_API int input_vaControl( input_thread_t *,
>int 
>> i_query, va_list  );
>>  
>>  VLC_API int input_Control( input_thread_t *, int i_query, ...  );
>>  
>> +VLC_API int input_SetTime( input_thread_t *, mtime_t i_time, bool 
>> b_fast );
>> +
>> +VLC_API int input_SetPosition( input_thread_t *, float f_position,
>bool 
>> b_fast );
>> +
>>  VLC_API void input_Close( input_thread_t * );
>>  
>>  /**
>> diff --git a/src/input/input.c b/src/input/input.c
>> index a413683..9003d61 100644
>> --- a/src/input/input.c
>> +++ b/src/input/input.c
>> @@ -227,6 +227,46 @@ void input_Close( input_thread_t *p_input )
>>      vlc_object_release( p_input );
>>  }
>>  
>> +typedef struct input_seek_params_t {
>> +    bool b_fast;
>> +    union {
>> +        mtime_t i_time;
>> +        float f_position;
>> +    };
>> +} input_seek_params_t;
>> +
>> +int input_SetTime( input_thread_t *p_input, mtime_t i_time, bool
>b_fast )
>> +{
>> +    vlc_value_t val;
>> +    input_seek_params_t *param;
>> +
>> +    param = malloc( sizeof(*param) );
>> +    if( unlikely(param == NULL) )
>> +        return VLC_ENOMEM;
>> +
>> +    param->b_fast = b_fast;
>> +    param->i_time = i_time;
>> +    val.p_address = param;
>> +    input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &val );
>> +    return VLC_SUCCESS;
>> +}
>> +
>> +int input_SetPosition( input_thread_t *p_input, float f_position,
>bool b_fast )
>> +{
>> +    vlc_value_t val;
>> +    input_seek_params_t *param;
>> +
>> +    param = malloc( sizeof(*param) );
>> +    if( unlikely(param == NULL) )
>> +        return VLC_ENOMEM;
>> +
>> +    param->b_fast = b_fast;
>> +    param->f_position = f_position;
>> +    val.p_address = param;
>> +    input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &val );
>> +    return VLC_SUCCESS;
>> +}
>> +
>>  /**
>>   * Input destructor (called when the object's refcount reaches 0).
>>   */
>> @@ -630,16 +670,15 @@ static int MainLoopTryRepeat( input_thread_t
>*p_input )
>>          input_ControlPush( p_input,
>>                             INPUT_CONTROL_SET_SEEKPOINT, &val );
>>  
>> +    bool b_fast_seek = var_GetBool( p_input, "input-fast-seek" );
>>      /* Seek to start position */
>>      if( input_priv(p_input)->i_start > 0 )
>>      {
>> -        val.i_int = input_priv(p_input)->i_start;
>> -        input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &val );
>> +        input_SetTime( p_input, input_priv(p_input)->i_start,
>b_fast_seek );
>>      }
>>      else
>>      {
>> -        val.f_float = 0.f;
>> -        input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &val
>);
>> +        input_SetPosition( p_input, 0.0f, b_fast_seek );
>>      }
>>  
>>      return VLC_SUCCESS;
>> @@ -916,20 +955,17 @@ static void StartTitle( input_thread_t *
>p_input )
>>  
>>      if( priv->i_start > 0 )
>>      {
>> -        vlc_value_t s;
>> -
>>          msg_Dbg( p_input, "starting at time: %"PRId64"s",
>>                   priv->i_start / CLOCK_FREQ );
>>  
>> -        s.i_int = priv->i_start;
>> -        input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &s );
>> +        bool b_fast_seek = var_GetBool( p_input, "input-fast-seek"
>);
>> +        input_SetTime( p_input, priv->i_start, b_fast_seek );
>>      }
>>      if( priv->i_stop > 0 && priv->i_stop <= priv->i_start )
>>      {
>>          msg_Warn( p_input, "invalid stop-time ignored" );
>>          priv->i_stop = 0;
>>      }
>> -    priv->b_fast_seek = var_GetBool( p_input, "input-fast-seek" );
>>  }
>>  
>>  static int SlaveCompare(const void *a, const void *b)
>> @@ -1627,6 +1663,8 @@ static void ControlRelease( int i_type,
>vlc_value_t val )
>>      case INPUT_CONTROL_SET_VIEWPOINT:
>>      case INPUT_CONTROL_SET_INITIAL_VIEWPOINT:
>>      case INPUT_CONTROL_UPDATE_VIEWPOINT:
>> +    case INPUT_CONTROL_SET_TIME:
>> +    case INPUT_CONTROL_SET_POSITION:
>>          free( val.p_address );
>>          break;
>>      case INPUT_CONTROL_SET_RENDERER:
>> @@ -1849,7 +1887,8 @@ static bool Control( input_thread_t *p_input,
>>                  break;
>>              }
>>  
>> -            float f_pos = val.f_float;
>> +            input_seek_params_t *param = val.p_address;
>> +            float f_pos = param->f_position;
>>              if( f_pos < 0.f )
>>                  f_pos = 0.f;
>>              else if( f_pos > 1.f )
>> @@ -1857,7 +1896,7 @@ static bool Control( input_thread_t *p_input,
>>              /* Reset the decoders states and clock sync (before
>calling 
>> the demuxer */
>>              es_out_Control( input_priv(p_input)->p_es_out, 
>> ES_OUT_RESET_PCR );
>>              if( demux_Control( input_priv(p_input)->master->p_demux,
>
>> DEMUX_SET_POSITION,
>> -                               (double) f_pos, !input_priv(p_input)-
>> >b_fast_seek ) )
>> +                               (double) f_pos, !param->b_fast ) )
>>              {
>>                  msg_Err( p_input, "INPUT_CONTROL_SET_POSITION "
>>                           "%2.1f%% failed", (double)(f_pos * 100.f)
>);
>> @@ -1877,6 +1916,7 @@ static bool Control( input_thread_t *p_input,
>>          {
>>              int64_t i_time;
>>              int i_ret;
>> +            input_seek_params_t *param;
>>  
>>              if( input_priv(p_input)->b_recording )
>>              {
>> @@ -1884,7 +1924,8 @@ static bool Control( input_thread_t *p_input,
>>                  break;
>>              }
>>  
>> -            i_time = val.i_int;
>> +            param = val.p_address;
>> +            i_time = param->i_time;
>>              if( i_time < 0 )
>>                  i_time = 0;
>>  
>> @@ -1893,7 +1934,7 @@ static bool Control( input_thread_t *p_input,
>>  
>>              i_ret = demux_Control( input_priv(p_input)->master-
>> >p_demux,
>>                                     DEMUX_SET_TIME, i_time,
>> -                                   !input_priv(p_input)->b_fast_seek
>);
>> +                                   !param->b_fast );
>>              if( i_ret )
>>              {
>>                  int64_t i_length;
>> @@ -1905,7 +1946,7 @@ static bool Control( input_thread_t *p_input,
>>                      double f_pos = (double)i_time /
>(double)i_length;
>>                      i_ret = demux_Control(
>input_priv(p_input)->master-
>> >p_demux,
>>                                              DEMUX_SET_POSITION,
>f_pos,
>> -                                            !input_priv(p_input)-
>> >b_fast_seek );
>> +                                            !param->b_fast );
>>                  }
>>              }
>>              if( i_ret )
>> @@ -2236,8 +2277,18 @@ static bool Control( input_thread_t *p_input,
>>                  break;
>>              }
>>  
>> -            val.i_int = time_offset;
>> -            b_force_update = Control( p_input,
>INPUT_CONTROL_SET_TIME, 
>> val );
>> +            vlc_value_t seek_val;
>> +            input_seek_params_t *param;
>> +
>> +            param = malloc( sizeof(*param) );
>> +            if( unlikely(param == NULL) )
>> +                break;
>> +
>> +            param->b_fast = var_GetBool( p_input, "input-fast-seek"
>);
>> +            param->i_time = time_offset;
>> +            seek_val.p_address = param;
>> +
>> +            b_force_update = Control( p_input,
>INPUT_CONTROL_SET_TIME, 
>> seek_val );
>>              break;
>>          }
>>          case INPUT_CONTROL_SET_RENDERER:
>> diff --git a/src/input/input_internal.h b/src/input/input_internal.h
>> index c0b8ae4..bc38a09 100644
>> --- a/src/input/input_internal.h
>> +++ b/src/input/input_internal.h
>> @@ -106,7 +106,6 @@ typedef struct input_thread_private_t
>>      mtime_t     i_start;    /* :start-time,0 by default */
>>      mtime_t     i_stop;     /* :stop-time, 0 if none */
>>      mtime_t     i_time;     /* Current time */
>> -    bool        b_fast_seek;/* :input-fast-seek */
>>  
>>      /* Output */
>>      bool            b_out_pace_control; /* XXX Move it ot es_sout ?
>*/
>> diff --git a/src/input/var.c b/src/input/var.c
>> index 04c8cb0..717ae74 100644
>> --- a/src/input/var.c
>> +++ b/src/input/var.c
>> @@ -593,8 +593,8 @@ static int PositionCallback( vlc_object_t
>*p_this, 
>> char const *psz_cmd,
>>          var_Change( p_input, "time", VLC_VAR_SETVALUE, val );
>>      }
>>  
>> -    input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &newval
>);
>> -    return VLC_SUCCESS;
>> +    return input_SetPosition( p_input, newval.f_float,
>> +                              var_GetBool( p_input,
>"input-fast-seek" ) );
>>  }
>>  
>>  static int TimeCallback( vlc_object_t *p_this, char const *psz_cmd,
>> @@ -618,8 +618,8 @@ static int TimeCallback( vlc_object_t *p_this,
>char 
>> const *psz_cmd,
>>          var_SetInteger( p_input, "intf-event", INPUT_EVENT_POSITION
>);
>>      }
>>  
>> -    input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &newval );
>> -    return VLC_SUCCESS;
>> +    return input_SetTime( p_input, newval.i_int,
>> +                          var_GetBool( p_input, "input-fast-seek" )
>);
>>  }
>>  
>>  static int TimeOffsetCallback( vlc_object_t *obj, char const
>*varname,
>> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
>> index e32a686..f9418b1 100644
>> --- a/src/libvlccore.sym
>> +++ b/src/libvlccore.sym
>> @@ -202,6 +202,8 @@ input_resource_GetAout
>>  input_resource_HoldAout
>>  input_resource_PutAout
>>  input_resource_ResetAout
>> +input_SetPosition
>> +input_SetTime
>>  input_Start
>>  input_Stop
>>  input_vaControl
>> -- 
>> 2.9.5
>> 
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20180619/af144f85/attachment.html>


More information about the vlc-devel mailing list