From 50f7bdc9745a95caee1121e52f0fb670df8056ce Mon Sep 17 00:00:00 2001
From: Laurent Aimar <fenrir@videolan.org>
Date: Sat, 20 Sep 2003 13:50:14 +0000
Subject: [PATCH]  * input: added position-offset and time-offset for relative
 seeking.  (Untested)

---
 src/input/input.c | 40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/input/input.c b/src/input/input.c
index 3964e63bc66a..7536a126abbd 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -4,7 +4,7 @@
  * decoders.
  *****************************************************************************
  * Copyright (C) 1998-2002 VideoLAN
- * $Id: input.c,v 1.241 2003/09/15 18:05:13 fenrir Exp $
+ * $Id: input.c,v 1.242 2003/09/20 13:50:14 fenrir Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -119,13 +119,15 @@ input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
     /* play status */
 
     /* position variable */
-    var_Create( p_input, "position",  VLC_VAR_FLOAT );  /* position 0.0 -> 1.0 */
+    var_Create( p_input, "position",  VLC_VAR_FLOAT );  /* position 0.0->1.0 */
+    var_Create( p_input, "position-offset",  VLC_VAR_FLOAT );  /* relative */
     val.f_float = 0.0;
     var_Change( p_input, "position", VLC_VAR_SETVALUE, &val, NULL );
     var_AddCallback( p_input, "position", PositionCallback, NULL );
 
     /* time variable */
     var_Create( p_input, "time",  VLC_VAR_TIME );
+    var_Create( p_input, "time-offset",  VLC_VAR_TIME );    /* relative */
     val.i_time = 0;
     var_Change( p_input, "time", VLC_VAR_SETVALUE, &val, NULL );
     var_AddCallback( p_input, "time", TimeCallback, NULL );
@@ -1189,14 +1191,27 @@ static int PositionCallback( vlc_object_t *p_this, char const *psz_cmd,
                              vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
     input_thread_t *p_input = (input_thread_t *)p_this;
+    int64_t i_offset;
 
     msg_Warn( p_input, "cmd=%s old=%f new=%f",
               psz_cmd,
               oldval.f_float, newval.f_float );
 
     vlc_mutex_lock( &p_input->stream.stream_lock );
-    p_input->stream.p_selected_area->i_seek =
-        (int64_t)( newval.f_float * (double)p_input->stream.p_selected_area->i_size );
+    i_offset = (int64_t)( newval.f_float *
+                          (double)p_input->stream.p_selected_area->i_size );
+    if( !strcmp( psz_cmd, "position-offset" ) )
+    {
+        p_input->stream.p_selected_area->i_seek += i_offset;
+    }
+    else
+    {
+        p_input->stream.p_selected_area->i_seek = i_offset;
+    }
+    if( p_input->stream.p_selected_area->i_seek < 0 )
+    {
+        p_input->stream.p_selected_area->i_seek = 0;
+    }
     vlc_mutex_unlock( &p_input->stream.stream_lock );
 
     return VLC_SUCCESS;
@@ -1206,15 +1221,28 @@ static int TimeCallback    ( vlc_object_t *p_this, char const *psz_cmd,
                              vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
     input_thread_t *p_input = (input_thread_t *)p_this;
+    int64_t i_offset;
 
     /* FIXME TODO FIXME */
     msg_Warn( p_input, "cmd=%s old=%lld new=%lld",
               psz_cmd,
               oldval.i_time, newval.i_time );
 
+
     vlc_mutex_lock( &p_input->stream.stream_lock );
-    p_input->stream.p_selected_area->i_seek =
-        newval.i_time / 1000000 * 50 * p_input->stream.i_mux_rate;
+    i_offset = newval.i_time / 1000000 * 50 * p_input->stream.i_mux_rate;
+    if( !strcmp( psz_cmd, "time-offset" ) )
+    {
+        p_input->stream.p_selected_area->i_seek += i_offset;
+    }
+    else
+    {
+        p_input->stream.p_selected_area->i_seek = i_offset;
+    }
+    if( p_input->stream.p_selected_area->i_seek < 0 )
+    {
+        p_input->stream.p_selected_area->i_seek = 0;
+    }
     vlc_mutex_unlock( &p_input->stream.stream_lock );
 
     return VLC_SUCCESS;
-- 
GitLab