[vlc-devel] [PATCH 1/2] input: add input_SetTime and input_SetPosition
Thomas Guillem
thomas at gllm.fr
Thu Jun 21 09:19:15 CEST 2018
On Thu, Jun 21, 2018, at 09:09, Rémi Denis-Courmont wrote:
> Can't input controls be extended so we don't need a malloc and a new
> union here?
I guess so.
>
> Le 19 juin 2018 15:58:30 GMT+03:00, Zhao Zhili
> <quinkblack at foxmail.com> a écrit :>> ---
>>
>> include/vlc_input.h | 4 ++
>>
>> src/input/input.c | 93 +++++++++++++++++++++++++++++++++++-----------
>>>> src/input/input_internal.h | 1 -
>>
>> src/input/var.c | 8 ++--
>>
>> src/libvlccore.sym | 2 +
>>
>> 5 files changed, 81 insertions(+), 27 deletions(-)
>>
>>
>>
>> diff --git a/include/vlc_input.h b/include/vlc_input.h
>>
>> index 16c566a..1d24fd1 100644
>>
>> --- a/include/vlc_input.h
>>
>> +++ b/include/vlc_input.h
>>
>> @@ -514,6 +514,10 @@ VLC_API int input_Control( input_thread_t *, int
>> i_query, ... );
>>>>
>>
>> VLC_API void input_Close( input_thread_t * );
>>
>>
>>
>> +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 );
>>>> +
>>
>> /**
>>
>> * Create a new input_thread_t and start it.
>>
>> *
>>
>> diff --git a/src/input/input.c b/src/input/input.c
>>
>> index a413683..a8ae021 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).
>>>> */
>>
>> @@ -616,30 +656,28 @@ static int MainLoopTryRepeat( input_thread_t
>> *p_input )
>>>> var_SetInteger( p_input, "input-repeat", i_repeat );
>>
>> }
>>
>>
>>
>> + input_thread_private_t *priv = input_priv(p_input);
>>
>> /* Seek to start title/seekpoint */
>>
>> - val.i_int = input_priv(p_input)->master->i_title_start -
>>
>> - input_priv(p_input)->master->i_title_offset;
>>
>> - if( val.i_int < 0 || val.i_int >= input_priv(p_input)->master-
>> >i_title )
>>>> + val.i_int = priv->master->i_title_start - priv->master-
>> >i_title_offset;
>>>> + if( val.i_int < 0 || val.i_int >= priv->master->i_title )
>>
>> val.i_int = 0;
>>
>> input_ControlPush( p_input,
>>
>> INPUT_CONTROL_SET_TITLE, &val );
>>
>>
>>
>> - val.i_int = input_priv(p_input)->master->i_seekpoint_start -
>>>> - input_priv(p_input)->master->i_seekpoint_offset;
>>
>> + val.i_int = priv->master->i_seekpoint_start -
>>
>> + priv->master->i_seekpoint_offset;
>>
>> if( val.i_int > 0 /* TODO: check upper boundary */ )
>>
>> input_ControlPush( p_input,
>>
>> INPUT_CONTROL_SET_SEEKPOINT, &val );
>>>>
>>
>> /* Seek to start position */
>>
>> - if( input_priv(p_input)->i_start > 0 )
>>
>> + if( priv->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, priv->i_start, false );
>>
>> }
>>
>> else
>>
>> {
>>
>> - val.f_float = 0.f;
>>
>> - input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &val
>> );
>>>> + input_SetPosition( p_input, 0.0f, false );
>>
>> }
>>
>>
>>
>> return VLC_SUCCESS;
>>
>> @@ -916,20 +954,16 @@ 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 );
>>>> + input_SetTime( p_input, priv->i_start, false );
>>
>> }
>>
>> 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 +1661,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 +1885,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 +1894,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 +1914,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 +1922,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 +1932,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 +1944,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 +2275,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 = false;
>>
>> + 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..15a8af2 100644
>>
>> --- a/src/libvlccore.sym
>>
>> +++ b/src/libvlccore.sym
>>
>> @@ -205,6 +205,8 @@ input_resource_ResetAout
>>
>> input_Start
>>
>> input_Stop
>>
>> input_vaControl
>>
>> +input_SetTime
>>
>> +input_SetPosition
>>
>> vlc_readdir_helper_init
>>
>> vlc_readdir_helper_finish
>>
>> vlc_readdir_helper_additem
>>
>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
> excuser ma brièveté.> _________________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20180621/8a060d1e/attachment.html>
More information about the vlc-devel
mailing list