[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:07:40 CEST 2018


I'd use vlc_ prefix for new entry points, probably.

Le 15 juin 2018 15:57:52 GMT+03:00, Zhao Zhili <quinkblack at foxmail.com> a écrit :
>---
> 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

-- 
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/1e2a0d3d/attachment.html>


More information about the vlc-devel mailing list