<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style>
</head>
<body><div><br></div>
<div>On Thu, Jun 21, 2018, at 09:09, Rémi Denis-Courmont wrote:<br></div>
<blockquote type="cite"><div>Can't input controls be extended so we don't need a malloc and a new union here?<br></div>
</blockquote><div><br></div>
<div>I guess so.<br></div>
<div><br></div>
<blockquote type="cite"><div><br></div>
<div defang_data-gmailquote="yes"><div>Le 19 juin 2018 15:58:30 GMT+03:00, Zhao Zhili <quinkblack@foxmail.com> a écrit :<br></div>
<blockquote defang_data-gmailquote="yes" style="margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:0.8ex;border-left-color:rgb(204, 204, 204);border-left-style:solid;border-left-width:1px;padding-left:1ex;"><pre><div>---<br></div>
<div> include/vlc_input.h        |  4 ++<br></div>
<div> src/input/input.c          | 93 +++++++++++++++++++++++++++++++++++-----------<br></div>
<div> src/input/input_internal.h |  1 -<br></div>
<div> src/input/var.c            |  8 ++--<br></div>
<div> src/libvlccore.sym         |  2 +<br></div>
<div> 5 files changed, 81 insertions(+), 27 deletions(-)<br></div>
<div><br></div>
<div>diff --git a/include/vlc_input.h b/include/vlc_input.h<br></div>
<div>index 16c566a..1d24fd1 100644<br></div>
<div>--- a/include/vlc_input.h<br></div>
<div>+++ b/include/vlc_input.h<br></div>
<div>@@ -514,6 +514,10 @@ VLC_API int input_Control( input_thread_t *, int i_query, ...  );<br></div>
<div> <br></div>
<div> VLC_API void input_Close( input_thread_t * );<br></div>
<div> <br></div>
<div>+VLC_API int input_SetTime( input_thread_t *, mtime_t i_time, bool b_fast );<br></div>
<div>+<br></div>
<div>+VLC_API int input_SetPosition( input_thread_t *, float f_position, bool b_fast );<br></div>
<div>+<br></div>
<div> /**<br></div>
<div>  * Create a new input_thread_t and start it.<br></div>
<div>  *<br></div>
<div>diff --git a/src/input/input.c b/src/input/input.c<br></div>
<div>index a413683..a8ae021 100644<br></div>
<div>--- a/src/input/input.c<br></div>
<div>+++ b/src/input/input.c<br></div>
<div>@@ -227,6 +227,46 @@ void input_Close( input_thread_t *p_input )<br></div>
<div>     vlc_object_release( p_input );<br></div>
<div> }<br></div>
<div> <br></div>
<div>+typedef struct input_seek_params_t {<br></div>
<div>+    bool b_fast;<br></div>
<div>+    union {<br></div>
<div>+        mtime_t i_time;<br></div>
<div>+        float f_position;<br></div>
<div>+    };<br></div>
<div>+} input_seek_params_t;<br></div>
<div>+<br></div>
<div>+int input_SetTime( input_thread_t *p_input, mtime_t i_time, bool b_fast )<br></div>
<div>+{<br></div>
<div>+    vlc_value_t val;<br></div>
<div>+    input_seek_params_t *param;<br></div>
<div>+<br></div>
<div>+    param = malloc( sizeof(*param) );<br></div>
<div>+    if( unlikely(param == NULL) )<br></div>
<div>+        return VLC_ENOMEM;<br></div>
<div>+<br></div>
<div>+    param->b_fast = b_fast;<br></div>
<div>+    param->i_time = i_time;<br></div>
<div>+    val.p_address = param;<br></div>
<div>+    input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &val );<br></div>
<div>+    return VLC_SUCCESS;<br></div>
<div>+}<br></div>
<div>+<br></div>
<div>+int input_SetPosition( input_thread_t *p_input, float f_position, bool b_fast )<br></div>
<div>+{<br></div>
<div>+    vlc_value_t val;<br></div>
<div>+    input_seek_params_t *param;<br></div>
<div>+<br></div>
<div>+    param = malloc( sizeof(*param) );<br></div>
<div>+    if( unlikely(param == NULL) )<br></div>
<div>+        return VLC_ENOMEM;<br></div>
<div>+<br></div>
<div>+    param->b_fast = b_fast;<br></div>
<div>+    param->f_position = f_position;<br></div>
<div>+    val.p_address = param;<br></div>
<div>+    input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &val );<br></div>
<div>+    return VLC_SUCCESS;<br></div>
<div>+}<br></div>
<div>+<br></div>
<div> /**<br></div>
<div>  * Input destructor (called when the object's refcount reaches 0).<br></div>
<div>  */<br></div>
<div>@@ -616,30 +656,28 @@ static int MainLoopTryRepeat( input_thread_t *p_input )<br></div>
<div>         var_SetInteger( p_input, "input-repeat", i_repeat );<br></div>
<div>     }<br></div>
<div> <br></div>
<div>+    input_thread_private_t *priv = input_priv(p_input);<br></div>
<div>     /* Seek to start title/seekpoint */<br></div>
<div>-    val.i_int = input_priv(p_input)->master->i_title_start -<br></div>
<div>-        input_priv(p_input)->master->i_title_offset;<br></div>
<div>-    if( val.i_int < 0 || val.i_int >= input_priv(p_input)->master->i_title )<br></div>
<div>+    val.i_int = priv->master->i_title_start - priv->master->i_title_offset;<br></div>
<div>+    if( val.i_int < 0 || val.i_int >= priv->master->i_title )<br></div>
<div>         val.i_int = 0;<br></div>
<div>     input_ControlPush( p_input,<br></div>
<div>                        INPUT_CONTROL_SET_TITLE, &val );<br></div>
<div> <br></div>
<div>-    val.i_int = input_priv(p_input)->master->i_seekpoint_start -<br></div>
<div>-        input_priv(p_input)->master->i_seekpoint_offset;<br></div>
<div>+    val.i_int = priv->master->i_seekpoint_start -<br></div>
<div>+                priv->master->i_seekpoint_offset;<br></div>
<div>     if( val.i_int > 0 /* TODO: check upper boundary */ )<br></div>
<div>         input_ControlPush( p_input,<br></div>
<div>                            INPUT_CONTROL_SET_SEEKPOINT, &val );<br></div>
<div> <br></div>
<div>     /* Seek to start position */<br></div>
<div>-    if( input_priv(p_input)->i_start > 0 )<br></div>
<div>+    if( priv->i_start > 0 )<br></div>
<div>     {<br></div>
<div>-        val.i_int = input_priv(p_input)->i_start;<br></div>
<div>-        input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &val );<br></div>
<div>+        input_SetTime( p_input, priv->i_start, false );<br></div>
<div>     }<br></div>
<div>     else<br></div>
<div>     {<br></div>
<div>-        val.f_float = 0.f;<br></div>
<div>-        input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &val );<br></div>
<div>+        input_SetPosition( p_input, 0.0f, false );<br></div>
<div>     }<br></div>
<div> <br></div>
<div>     return VLC_SUCCESS;<br></div>
<div>@@ -916,20 +954,16 @@ static void StartTitle( input_thread_t * p_input )<br></div>
<div> <br></div>
<div>     if( priv->i_start > 0 )<br></div>
<div>     {<br></div>
<div>-        vlc_value_t s;<br></div>
<div>-<br></div>
<div>         msg_Dbg( p_input, "starting at time: %"PRId64"s",<br></div>
<div>                  priv->i_start / CLOCK_FREQ );<br></div>
<div> <br></div>
<div>-        s.i_int = priv->i_start;<br></div>
<div>-        input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &s );<br></div>
<div>+        input_SetTime( p_input, priv->i_start, false );<br></div>
<div>     }<br></div>
<div>     if( priv->i_stop > 0 && priv->i_stop <= priv->i_start )<br></div>
<div>     {<br></div>
<div>         msg_Warn( p_input, "invalid stop-time ignored" );<br></div>
<div>         priv->i_stop = 0;<br></div>
<div>     }<br></div>
<div>-    priv->b_fast_seek = var_GetBool( p_input, "input-fast-seek" );<br></div>
<div> }<br></div>
<div> <br></div>
<div> static int SlaveCompare(const void *a, const void *b)<br></div>
<div>@@ -1627,6 +1661,8 @@ static void ControlRelease( int i_type, vlc_value_t val )<br></div>
<div>     case INPUT_CONTROL_SET_VIEWPOINT:<br></div>
<div>     case INPUT_CONTROL_SET_INITIAL_VIEWPOINT:<br></div>
<div>     case INPUT_CONTROL_UPDATE_VIEWPOINT:<br></div>
<div>+    case INPUT_CONTROL_SET_TIME:<br></div>
<div>+    case INPUT_CONTROL_SET_POSITION:<br></div>
<div>         free( val.p_address );<br></div>
<div>         break;<br></div>
<div>     case INPUT_CONTROL_SET_RENDERER:<br></div>
<div>@@ -1849,7 +1885,8 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>                 break;<br></div>
<div>             }<br></div>
<div> <br></div>
<div>-            float f_pos = val.f_float;<br></div>
<div>+            input_seek_params_t *param = val.p_address;<br></div>
<div>+            float f_pos = param->f_position;<br></div>
<div>             if( f_pos < 0.f )<br></div>
<div>                 f_pos = 0.f;<br></div>
<div>             else if( f_pos > 1.f )<br></div>
<div>@@ -1857,7 +1894,7 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>             /* Reset the decoders states and clock sync (before calling the demuxer */<br></div>
<div>             es_out_Control( input_priv(p_input)->p_es_out, ES_OUT_RESET_PCR );<br></div>
<div>             if( demux_Control( input_priv(p_input)->master->p_demux, DEMUX_SET_POSITION,<br></div>
<div>-                               (double) f_pos, !input_priv(p_input)->b_fast_seek ) )<br></div>
<div>+                               (double) f_pos, !param->b_fast ) )<br></div>
<div>             {<br></div>
<div>                 msg_Err( p_input, "INPUT_CONTROL_SET_POSITION "<br></div>
<div>                          "%2.1f%% failed", (double)(f_pos * 100.f) );<br></div>
<div>@@ -1877,6 +1914,7 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>         {<br></div>
<div>             int64_t i_time;<br></div>
<div>             int i_ret;<br></div>
<div>+            input_seek_params_t *param;<br></div>
<div> <br></div>
<div>             if( input_priv(p_input)->b_recording )<br></div>
<div>             {<br></div>
<div>@@ -1884,7 +1922,8 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>                 break;<br></div>
<div>             }<br></div>
<div> <br></div>
<div>-            i_time = val.i_int;<br></div>
<div>+            param = val.p_address;<br></div>
<div>+            i_time = param->i_time;<br></div>
<div>             if( i_time < 0 )<br></div>
<div>                 i_time = 0;<br></div>
<div> <br></div>
<div>@@ -1893,7 +1932,7 @@ static bool Control( input_thread_t *p_input,<br></div>
<div> <br></div>
<div>             i_ret = demux_Control( input_priv(p_input)->master->p_demux,<br></div>
<div>                                    DEMUX_SET_TIME, i_time,<br></div>
<div>-                                   !input_priv(p_input)->b_fast_seek );<br></div>
<div>+                                   !param->b_fast );<br></div>
<div>             if( i_ret )<br></div>
<div>             {<br></div>
<div>                 int64_t i_length;<br></div>
<div>@@ -1905,7 +1944,7 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>                     double f_pos = (double)i_time / (double)i_length;<br></div>
<div>                     i_ret = demux_Control( input_priv(p_input)->master->p_demux,<br></div>
<div>                                             DEMUX_SET_POSITION, f_pos,<br></div>
<div>-                                            !input_priv(p_input)->b_fast_seek );<br></div>
<div>+                                            !param->b_fast );<br></div>
<div>                 }<br></div>
<div>             }<br></div>
<div>             if( i_ret )<br></div>
<div>@@ -2236,8 +2275,18 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>                 break;<br></div>
<div>             }<br></div>
<div> <br></div>
<div>-            val.i_int = time_offset;<br></div>
<div>-            b_force_update = Control( p_input, INPUT_CONTROL_SET_TIME, val );<br></div>
<div>+            vlc_value_t seek_val;<br></div>
<div>+            input_seek_params_t *param;<br></div>
<div>+<br></div>
<div>+            param = malloc( sizeof(*param) );<br></div>
<div>+            if( unlikely(param == NULL) )<br></div>
<div>+                break;<br></div>
<div>+<br></div>
<div>+            param->b_fast = false;<br></div>
<div>+            param->i_time = time_offset;<br></div>
<div>+            seek_val.p_address = param;<br></div>
<div>+<br></div>
<div>+            b_force_update = Control( p_input, INPUT_CONTROL_SET_TIME, seek_val );<br></div>
<div>             break;<br></div>
<div>         }<br></div>
<div>         case INPUT_CONTROL_SET_RENDERER:<br></div>
<div>diff --git a/src/input/input_internal.h b/src/input/input_internal.h<br></div>
<div>index c0b8ae4..bc38a09 100644<br></div>
<div>--- a/src/input/input_internal.h<br></div>
<div>+++ b/src/input/input_internal.h<br></div>
<div>@@ -106,7 +106,6 @@ typedef struct input_thread_private_t<br></div>
<div>     mtime_t     i_start;    /* :start-time,0 by default */<br></div>
<div>     mtime_t     i_stop;     /* :stop-time, 0 if none */<br></div>
<div>     mtime_t     i_time;     /* Current time */<br></div>
<div>-    bool        b_fast_seek;/* :input-fast-seek */<br></div>
<div> <br></div>
<div>     /* Output */<br></div>
<div>     bool            b_out_pace_control; /* XXX Move it ot es_sout ? */<br></div>
<div>diff --git a/src/input/var.c b/src/input/var.c<br></div>
<div>index 04c8cb0..717ae74 100644<br></div>
<div>--- a/src/input/var.c<br></div>
<div>+++ b/src/input/var.c<br></div>
<div>@@ -593,8 +593,8 @@ static int PositionCallback( vlc_object_t *p_this, char const *psz_cmd,<br></div>
<div>         var_Change( p_input, "time", VLC_VAR_SETVALUE, val );<br></div>
<div>     }<br></div>
<div> <br></div>
<div>-    input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &newval );<br></div>
<div>-    return VLC_SUCCESS;<br></div>
<div>+    return input_SetPosition( p_input, newval.f_float,<br></div>
<div>+                              var_GetBool( p_input, "input-fast-seek" ) );<br></div>
<div> }<br></div>
<div> <br></div>
<div> static int TimeCallback( vlc_object_t *p_this, char const *psz_cmd,<br></div>
<div>@@ -618,8 +618,8 @@ static int TimeCallback( vlc_object_t *p_this, char const *psz_cmd,<br></div>
<div>         var_SetInteger( p_input, "intf-event", INPUT_EVENT_POSITION );<br></div>
<div>     }<br></div>
<div> <br></div>
<div>-    input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &newval );<br></div>
<div>-    return VLC_SUCCESS;<br></div>
<div>+    return input_SetTime( p_input, newval.i_int,<br></div>
<div>+                          var_GetBool( p_input, "input-fast-seek" ) );<br></div>
<div> }<br></div>
<div> <br></div>
<div> static int TimeOffsetCallback( vlc_object_t *obj, char const *varname,<br></div>
<div>diff --git a/src/libvlccore.sym b/src/libvlccore.sym<br></div>
<div>index e32a686..15a8af2 100644<br></div>
<div>--- a/src/libvlccore.sym<br></div>
<div>+++ b/src/libvlccore.sym<br></div>
<div>@@ -205,6 +205,8 @@ input_resource_ResetAout<br></div>
<div> input_Start<br></div>
<div> input_Stop<br></div>
<div> input_vaControl<br></div>
<div>+input_SetTime<br></div>
<div>+input_SetPosition<br></div>
<div> vlc_readdir_helper_init<br></div>
<div> vlc_readdir_helper_finish<br></div>
<div> vlc_readdir_helper_additem<br></div>
</pre></blockquote></div>
<div><br></div>
<div>--<br></div>
<div> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté. <br></div>
<div><u>_______________________________________________</u><br></div>
<div>vlc-devel mailing list<br></div>
<div>To unsubscribe or modify your subscription options:<br></div>
<div><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></div>
</blockquote><div><br></div>
</body>
</html>