<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style>
</head>
<body><div>I kind of agree here with Rem.<br></div>
<div><br></div>
<div><br></div>
<div>On Thu, 14 Jun 2018, at 13:10, Rémi Denis-Courmont wrote:<br></div>
<blockquote type="cite"><div>It would be far simpler to just add a flag to seek functions.<br></div>
<div><br></div>
<div defang_data-gmailquote="yes"><div>Le 14 juin 2018 14:00:10 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/libvlc_media_player.h | 17 ++++++++++++++---<br></div>
<div> include/vlc_input.h               |  9 +++++++++<br></div>
<div> lib/media_player.c                | 17 +++++++++++++++--<br></div>
<div> src/input/input.c                 | 25 ++++++++++++++++++++++---<br></div>
<div> src/input/var.c                   |  3 +++<br></div>
<div> 5 files changed, 63 insertions(+), 8 deletions(-)<br></div>
<div><br></div>
<div>diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h<br></div>
<div>index 9ef1dde..eb4d0ab 100644<br></div>
<div>--- a/include/vlc/libvlc_media_player.h<br></div>
<div>+++ b/include/vlc/libvlc_media_player.h<br></div>
<div>@@ -780,14 +780,22 @@ LIBVLC_API libvlc_time_t libvlc_media_player_get_length( libvlc_media_player_t *<br></div>
<div>  */<br></div>
<div> LIBVLC_API libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi );<br></div>
<div> <br></div>
<div>+typedef enum libvlc_media_player_seek_mode_t {<br></div>
<div>+    libvlc_seek_mode_auto = 0,<br></div>
<div>+    libvlc_seek_mode_precise,<br></div>
<div>+    libvlc_seek_mode_fast<br></div>
<div>+} libvlc_media_player_seek_mode_t;<br></div>
<div>+<br></div>
<div> /**<br></div>
<div>  * Set the movie time (in ms). This has no effect if no media is being played.<br></div>
<div>- * Not all formats and protocols support this.<br></div>
<div>+ * Not all formats and protocols support this. i_seek_mode is only a hint.<br></div>
<div>  *<br></div>
<div>  * \param p_mi the Media Player<br></div>
<div>+ * \param i_seek_mode values of libvlc_media_player_seek_mode_t<br></div>
<div>  * \param i_time the movie time (in ms).<br></div>
<div>  */<br></div>
<div>-LIBVLC_API void libvlc_media_player_set_time( libvlc_media_player_t *p_mi, libvlc_time_t i_time );<br></div>
<div>+LIBVLC_API void libvlc_media_player_set_time( libvlc_media_player_t *p_mi,<br></div>
<div>+                                              libvlc_time_t i_time, int i_seek_mode );<br></div>
<div> <br></div>
<div> /**<br></div>
<div>  * Get movie position as percentage between 0.0 and 1.0.<br></div>
<div>@@ -801,11 +809,14 @@ LIBVLC_API float libvlc_media_player_get_position( libvlc_media_player_t *p_mi )<br></div>
<div>  * Set movie position as percentage between 0.0 and 1.0.<br></div>
<div>  * This has no effect if playback is not enabled.<br></div>
<div>  * This might not work depending on the underlying input format and protocol.<br></div>
<div>+ * i_seek_mode is only a hint.<br></div>
<div>  *<br></div>
<div>  * \param p_mi the Media Player<br></div>
<div>+ * \param i_seek_mode values of libvlc_media_player_seek_mode_t<br></div>
<div>  * \param f_pos the position<br></div>
<div>  */<br></div>
<div>-LIBVLC_API void libvlc_media_player_set_position( libvlc_media_player_t *p_mi, float f_pos );<br></div>
<div>+LIBVLC_API void libvlc_media_player_set_position( libvlc_media_player_t *p_mi,<br></div>
<div>+                                                  float f_pos, int i_seek_mode );<br></div>
<div> <br></div>
<div> /**<br></div>
<div>  * Set movie chapter (if applicable).<br></div>
<div>diff --git a/include/vlc_input.h b/include/vlc_input.h<br></div>
<div>index 16c566a..ed1f542 100644<br></div>
<div>--- a/include/vlc_input.h<br></div>
<div>+++ b/include/vlc_input.h<br></div>
<div>@@ -490,6 +490,15 @@ enum input_query_e<br></div>
<div>     INPUT_MODIFY_PCR_SYSTEM,/* arg1=int absolute, arg2=mtime_t      res=can fail */<br></div>
<div> };<br></div>
<div> <br></div>
<div>+/**<br></div>
<div>+ * Input seek mode<br></div>
<div>+ */<br></div>
<div>+enum input_seek_mode_e {<br></div>
<div>+    INPUT_SEEK_MODE_AUTO = 0,<br></div>
<div>+    INPUT_SEEK_MODE_PRECISE,<br></div>
<div>+    INPUT_SEEK_MODE_FAST<br></div>
<div>+};<br></div>
<div>+<br></div>
<div> /** @}*/<br></div>
<div> <br></div>
<div> /*****************************************************************************<br></div>
<div>diff --git a/lib/media_player.c b/lib/media_player.c<br></div>
<div>index cd9d3ee..3bd8f07 100644<br></div>
<div>--- a/lib/media_player.c<br></div>
<div>+++ b/lib/media_player.c<br></div>
<div>@@ -1325,8 +1325,14 @@ libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi )<br></div>
<div>     return i_time;<br></div>
<div> }<br></div>
<div> <br></div>
<div>+static_assert(libvlc_seek_mode_auto == (int)INPUT_SEEK_MODE_AUTO &&<br></div>
<div>+        libvlc_seek_mode_precise == (int)INPUT_SEEK_MODE_PRECISE &&<br></div>
<div>+        libvlc_seek_mode_fast == (int)INPUT_SEEK_MODE_FAST,<br></div>
<div>+        "Mismatch between libvlc_media_player_seek_mode_t and input_seek_mode_e");<br></div>
<div>+<br></div>
<div> void libvlc_media_player_set_time( libvlc_media_player_t *p_mi,<br></div>
<div>-                                   libvlc_time_t i_time )<br></div>
<div>+                                   libvlc_time_t i_time,<br></div>
<div>+                                   int i_seek_mode )<br></div>
<div> {<br></div>
<div>     input_thread_t *p_input_thread;<br></div>
<div> <br></div>
<div>@@ -1334,12 +1340,16 @@ void libvlc_media_player_set_time( libvlc_media_player_t *p_mi,<br></div>
<div>     if( !p_input_thread )<br></div>
<div>         return;<br></div>
<div> <br></div>
<div>+    assert(i_seek_mode >= libvlc_seek_mode_auto &&<br></div>
<div>+           i_seek_mode <= libvlc_seek_mode_fast);<br></div>
<div>+    var_SetInteger( p_input_thread, "seek-mode", i_seek_mode );<br></div>
<div>     var_SetInteger( p_input_thread, "time", to_mtime(i_time) );<br></div>
<div>     vlc_object_release( p_input_thread );<br></div>
<div> }<br></div>
<div> <br></div>
<div> void libvlc_media_player_set_position( libvlc_media_player_t *p_mi,<br></div>
<div>-                                       float position )<br></div>
<div>+                                       float position,<br></div>
<div>+                                       int i_seek_mode )<br></div>
<div> {<br></div>
<div>     input_thread_t *p_input_thread;<br></div>
<div> <br></div>
<div>@@ -1347,6 +1357,9 @@ void libvlc_media_player_set_position( libvlc_media_player_t *p_mi,<br></div>
<div>     if( !p_input_thread )<br></div>
<div>         return;<br></div>
<div> <br></div>
<div>+    assert(i_seek_mode >= libvlc_seek_mode_auto &&<br></div>
<div>+           i_seek_mode <= libvlc_seek_mode_fast);<br></div>
<div>+    var_SetInteger( p_input_thread, "seek-mode", i_seek_mode );<br></div>
<div>     var_SetFloat( p_input_thread, "position", position );<br></div>
<div>     vlc_object_release( p_input_thread );<br></div>
<div> }<br></div>
<div>diff --git a/src/input/input.c b/src/input/input.c<br></div>
<div>index a413683..e075be4 100644<br></div>
<div>--- a/src/input/input.c<br></div>
<div>+++ b/src/input/input.c<br></div>
<div>@@ -1854,10 +1854,20 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>                 f_pos = 0.f;<br></div>
<div>             else if( f_pos > 1.f )<br></div>
<div>                 f_pos = 1.f;<br></div>
<div>+<br></div>
<div>+            bool b_precise;<br></div>
<div>+            int seek_mode = var_GetInteger( p_input, "seek-mode" );<br></div>
<div>+            if( seek_mode == INPUT_SEEK_MODE_PRECISE )<br></div>
<div>+                b_precise = true;<br></div>
<div>+            else if( seek_mode == INPUT_SEEK_MODE_FAST )<br></div>
<div>+                b_precise = false;<br></div>
<div>+            else<br></div>
<div>+                b_precise = !input_priv(p_input)->b_fast_seek;<br></div>
<div>+<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, b_precise ) )<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>@@ -1888,12 +1898,21 @@ static bool Control( input_thread_t *p_input,<br></div>
<div>             if( i_time < 0 )<br></div>
<div>                 i_time = 0;<br></div>
<div> <br></div>
<div>+            bool b_precise;<br></div>
<div>+            int seek_mode = var_GetInteger( p_input, "seek-mode" );<br></div>
<div>+            if( seek_mode == INPUT_SEEK_MODE_PRECISE )<br></div>
<div>+                b_precise = true;<br></div>
<div>+            else if( seek_mode == INPUT_SEEK_MODE_FAST )<br></div>
<div>+                b_precise = false;<br></div>
<div>+            else<br></div>
<div>+                b_precise = !input_priv(p_input)->b_fast_seek;<br></div>
<div>+<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> <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>+                                   b_precise );<br></div>
<div>             if( i_ret )<br></div>
<div>             {<br></div>
<div>                 int64_t i_length;<br></div>
<div>@@ -1905,7 +1924,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>+                                            b_precise );<br></div>
<div>                 }<br></div>
<div>             }<br></div>
<div>             if( i_ret )<br></div>
<div>diff --git a/src/input/var.c b/src/input/var.c<br></div>
<div>index 04c8cb0..ea6a961 100644<br></div>
<div>--- a/src/input/var.c<br></div>
<div>+++ b/src/input/var.c<br></div>
<div>@@ -147,6 +147,9 @@ void input_ControlVarInit ( input_thread_t *p_input )<br></div>
<div>     var_Create( p_input, "time", VLC_VAR_INTEGER );<br></div>
<div>     var_Create( p_input, "time-offset", VLC_VAR_INTEGER );    /* relative */<br></div>
<div> <br></div>
<div>+    var_Create( p_input, "seek-mode", VLC_VAR_INTEGER );<br></div>
<div>+    var_SetInteger( p_input, "seek-mode", INPUT_SEEK_MODE_AUTO );<br></div>
<div>+<br></div>
<div>     /* Bookmark */<br></div>
<div>     var_Create( p_input, "bookmark", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND );<br></div>
<div>     var_Change( p_input, "bookmark", VLC_VAR_SETTEXT, _("Bookmark") );<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>
<div id="sig60240713"><div class="signature">--<br></div>
<div class="signature">Jean-Baptiste Kempf -  President<br></div>
<div class="signature">+33 672 704 734<br></div>
<div class="signature"> <br></div>
<div class="signature"><br></div>
</div>
</body>
</html>