[vlc-commits] input: change rate argument

Thomas Guillem git at videolan.org
Fri Feb 15 16:38:07 CET 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Feb 15 15:38:39 2019 +0100| [6df5d5db51d473596a0c19c364fc5520e390d2ee] | committer: Thomas Guillem

input: change rate argument

Use a float and inverse it.

Before, the int rate value for a 4x speed was 250 (INPUT_RATE_DEFAULT / 250 =
4.f).  Now, for a 4x speed, the float value will be 4.f.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6df5d5db51d473596a0c19c364fc5520e390d2ee
---

 include/vlc_demux.h          |  4 +--
 modules/access/live555.cpp   | 12 ++++----
 modules/demux/subtitle.c     |  2 +-
 src/input/es_out_timeshift.c |  2 +-
 src/input/event.h            |  4 +--
 src/input/input.c            | 69 +++++++++++++++++++++-----------------------
 src/input/input_internal.h   |  6 ++--
 src/input/player.c           |  2 +-
 src/input/var.c              |  1 -
 9 files changed, 49 insertions(+), 53 deletions(-)

diff --git a/include/vlc_demux.h b/include/vlc_demux.h
index 401260b1b5..11cfc6e1b9 100644
--- a/include/vlc_demux.h
+++ b/include/vlc_demux.h
@@ -236,8 +236,8 @@ enum demux_query_e
      * (using DEMUX_SET_RATE). */
     DEMUX_CAN_CONTROL_RATE,     /* arg1= bool*pb_rate */
     /* DEMUX_SET_RATE is called only if DEMUX_CAN_CONTROL_RATE has returned true.
-     * It should return the value really used in *pi_rate */
-    DEMUX_SET_RATE,             /* arg1= int*pi_rate                                        can fail */
+     * It should return the value really used in *p_rate */
+    DEMUX_SET_RATE,             /* arg1= float*p_rate res=can fail */
 
     /** Checks whether the stream is actually a playlist, rather than a real
      * stream.
diff --git a/modules/access/live555.cpp b/modules/access/live555.cpp
index 0ac4cac7ff..d72a8fbd96 100644
--- a/modules/access/live555.cpp
+++ b/modules/access/live555.cpp
@@ -1647,8 +1647,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
 
         case DEMUX_SET_RATE:
         {
-            int *pi_int;
-            double f_scale, f_old_scale;
+            float *pf_scale, f_scale;
+            double f_old_scale;
 
             if( !p_sys->rtsp || (p_sys->f_npt_length <= 0) ||
                 !(p_sys->capabilities & CAP_RATE_CONTROL) )
@@ -1668,8 +1668,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
              * Scale < 0 value indicates rewind
              */
 
-            pi_int = va_arg( args, int * );
-            f_scale = (double)INPUT_RATE_DEFAULT / (*pi_int);
+            pf_scale = va_arg( args, float * );
+            f_scale = *pf_scale;
             f_old_scale = p_sys->ms->scale();
 
             /* Passing -1 for the start and end time will mean liveMedia won't
@@ -1696,8 +1696,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             p_sys->i_pcr = VLC_TICK_INVALID;
             p_sys->f_npt = 0.0;
 
-            *pi_int = (int)( INPUT_RATE_DEFAULT / p_sys->ms->scale() );
-            msg_Dbg( p_demux, "PLAY with new Scale %0.2f (%d)", p_sys->ms->scale(), (*pi_int) );
+            *pf_scale = p_sys->ms->scale() ;
+            msg_Dbg( p_demux, "PLAY with new Scale %0.2f", p_sys->ms->scale() );
             return VLC_SUCCESS;
         }
 
diff --git a/modules/demux/subtitle.c b/modules/demux/subtitle.c
index 84a2ccafa5..c715402da4 100644
--- a/modules/demux/subtitle.c
+++ b/modules/demux/subtitle.c
@@ -808,7 +808,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             *va_arg( args, bool * ) = true;
             return VLC_SUCCESS;
         case DEMUX_SET_RATE:
-            p_sys->f_rate = (double)INPUT_RATE_DEFAULT / *va_arg( args, int * );
+            p_sys->f_rate = *va_arg( args, float * );
             ResetCurrentIndex( p_demux );
             return VLC_SUCCESS;
         case DEMUX_SET_NEXT_DEMUX_TIME:
diff --git a/src/input/es_out_timeshift.c b/src/input/es_out_timeshift.c
index 3e5b07c8f2..ee51662b3f 100644
--- a/src/input/es_out_timeshift.c
+++ b/src/input/es_out_timeshift.c
@@ -1057,7 +1057,7 @@ static void *TsRun( void *p_data )
 
             if( !es_out_SetRate( p_ts->p_out, p_ts->rate_source, p_ts->rate ) )
             {
-                vlc_value_t val = { .i_int = INPUT_RATE_DEFAULT / p_ts->rate };
+                vlc_value_t val = { .f_float = p_ts->rate };
                 /* Warn back input
                  * FIXME it is perfectly safe BUT it is ugly as it may hide a
                  * rate change requested by user */
diff --git a/src/input/event.h b/src/input/event.h
index 0f0aa0d606..5da39053d2 100644
--- a/src/input/event.h
+++ b/src/input/event.h
@@ -83,11 +83,11 @@ static inline void input_SendEventStatistics(input_thread_t *p_input,
     });
 }
 
-static inline void input_SendEventRate(input_thread_t *p_input, int i_rate)
+static inline void input_SendEventRate(input_thread_t *p_input, float rate)
 {
     input_SendEvent(p_input, &(struct vlc_input_event) {
         .type = INPUT_EVENT_RATE,
-        .rate = (float)INPUT_RATE_DEFAULT / (float)i_rate,
+        .rate = rate,
     });
 }
 
diff --git a/src/input/input.c b/src/input/input.c
index cf4f179b03..08f55c0470 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -352,7 +352,7 @@ static input_thread_t *Create( vlc_object_t *p_parent,
     priv->is_stopped = false;
     priv->b_recording = false;
     priv->b_thumbnailing = b_thumbnailing;
-    priv->i_rate = INPUT_RATE_DEFAULT;
+    priv->rate = 1.f;
     memset( &priv->bookmark, 0, sizeof(priv->bookmark) );
     TAB_INIT( priv->i_bookmark, priv->pp_bookmark );
     TAB_INIT( priv->i_attachment, priv->attachment );
@@ -508,7 +508,7 @@ static input_thread_t *Create( vlc_object_t *p_parent,
     else
         priv->stats = NULL;
 
-    priv->p_es_out_display = input_EsOutNew( p_input, INPUT_RATE_DEFAULT / (float) priv->i_rate );
+    priv->p_es_out_display = input_EsOutNew( p_input, priv->rate );
     priv->p_es_out = NULL;
 
     /* Set the destructor when we are sure we are initialized */
@@ -1008,9 +1008,9 @@ static void RequestSubRate( input_thread_t *p_input, float f_slave_fps )
     input_thread_private_t *priv = input_priv(p_input);
     const float f_fps = input_priv(p_input)->master->f_fps;
     if( f_fps > 1.f && f_slave_fps > 1.f )
-        priv->i_slave_subs_rate = INPUT_RATE_DEFAULT / ( f_fps / f_slave_fps );
-    else if ( priv->i_slave_subs_rate != 0 )
-        priv->i_slave_subs_rate = INPUT_RATE_DEFAULT;
+        priv->slave_subs_rate = f_fps / f_slave_fps;
+    else if ( priv->slave_subs_rate != 0 )
+        priv->slave_subs_rate = 1.f;
 }
 
 static void SetSubtitlesOptions( input_thread_t *p_input )
@@ -1354,8 +1354,7 @@ static int Init( input_thread_t * p_input )
 #endif
 
     /* Create es out */
-    priv->p_es_out = input_EsOutTimeshiftNew( p_input, priv->p_es_out_display,
-                                              INPUT_RATE_DEFAULT / (float) priv->i_rate );
+    priv->p_es_out = input_EsOutTimeshiftNew( p_input, priv->p_es_out_display, priv->rate );
     if( priv->p_es_out == NULL )
         goto error;
 
@@ -1388,7 +1387,7 @@ static int Init( input_thread_t * p_input )
         double f_rate = var_GetFloat( p_input, "rate" );
         if( f_rate != 0.0 && f_rate != 1.0 )
         {
-            vlc_value_t val = { .i_int = INPUT_RATE_DEFAULT / f_rate };
+            vlc_value_t val = { .f_float = f_rate };
             input_ControlPushHelper( p_input, INPUT_CONTROL_SET_RATE, &val );
         }
     }
@@ -1998,19 +1997,19 @@ static bool Control( input_thread_t *p_input,
         case INPUT_CONTROL_SET_RATE:
         {
             /* Get rate and direction */
-            long long i_rate = llabs( param.val.i_int );
-            int i_rate_sign = param.val.i_int < 0 ? -1 : 1;
+            float rate = fabsf( param.val.f_float );
+            int i_rate_sign = rate < 0 ? -1 : 1;
 
             /* Check rate bound */
-            if( i_rate < INPUT_RATE_MIN )
+            if( rate > INPUT_RATE_DEFAULT / INPUT_RATE_MIN )
             {
-                msg_Dbg( p_input, "cannot set rate faster" );
-                i_rate = INPUT_RATE_MIN;
+                msg_Info( p_input, "cannot set rate faster" );
+                rate = INPUT_RATE_DEFAULT / INPUT_RATE_MIN;
             }
-            else if( i_rate > INPUT_RATE_MAX )
+            else if( rate < INPUT_RATE_DEFAULT / INPUT_RATE_MAX )
             {
-                msg_Dbg( p_input, "cannot set rate slower" );
-                i_rate = INPUT_RATE_MAX;
+                msg_Info( p_input, "cannot set rate slower" );
+                rate = INPUT_RATE_DEFAULT / INPUT_RATE_MAX;
             }
 
             /* Apply direction */
@@ -2019,48 +2018,46 @@ static bool Control( input_thread_t *p_input,
                 if( priv->master->b_rescale_ts )
                 {
                     msg_Dbg( p_input, "cannot set negative rate" );
-                    i_rate = priv->i_rate;
-                    assert( i_rate > 0 );
+                    rate = priv->rate;
+                    assert( rate > 0 );
                 }
                 else
                 {
-                    i_rate *= i_rate_sign;
+                    rate *= i_rate_sign;
                 }
             }
 
-            if( i_rate != INPUT_RATE_DEFAULT &&
+            if( rate != 1.f &&
                 ( ( !priv->b_can_rate_control && !priv->master->b_rescale_ts ) ||
                   ( priv->p_sout && !priv->b_out_pace_control ) ) )
             {
                 msg_Dbg( p_input, "cannot change rate" );
-                i_rate = INPUT_RATE_DEFAULT;
+                rate = 1.f;
             }
-            if( i_rate != priv->i_rate &&
+            if( rate != priv->rate &&
                 !priv->b_can_pace_control && priv->b_can_rate_control )
             {
                 if( !priv->master->b_rescale_ts )
                     es_out_Control( priv->p_es_out, ES_OUT_RESET_PCR );
 
                 if( demux_Control( priv->master->p_demux, DEMUX_SET_RATE,
-                                   &i_rate ) )
+                                   &rate ) )
                 {
                     msg_Warn( p_input, "ACCESS/DEMUX_SET_RATE failed" );
-                    i_rate = priv->i_rate;
+                    rate = priv->rate;
                 }
             }
 
             /* */
-            if( i_rate != priv->i_rate )
+            if( rate != priv->rate )
             {
-                priv->i_rate = i_rate;
-                input_SendEventRate( p_input, i_rate );
+                priv->rate = rate;
+                input_SendEventRate( p_input, rate );
 
                 if( priv->master->b_rescale_ts )
                 {
-                    const int i_rate_source = (priv->b_can_pace_control || priv->b_can_rate_control ) ? i_rate : INPUT_RATE_DEFAULT;
-                    es_out_SetRate( priv->p_es_out,
-                                    INPUT_RATE_DEFAULT / (float) i_rate_source,
-                                    INPUT_RATE_DEFAULT / (float) i_rate );
+                    const float rate_source = (priv->b_can_pace_control || priv->b_can_rate_control ) ? rate : 1.f;
+                    es_out_SetRate( priv->p_es_out, rate_source, rate );
                 }
 
                 b_force_update = true;
@@ -2891,16 +2888,16 @@ static void SlaveDemux( input_thread_t *p_input )
         if( in->b_eof )
             continue;
 
-        if( priv->i_slave_subs_rate != in->i_sub_rate )
+        if( priv->slave_subs_rate != in->sub_rate )
         {
             if( in->b_slave_sub && in->b_can_rate_control )
             {
-                if( in->i_sub_rate != 0 ) /* Don't reset when it's the first time */
+                if( in->sub_rate != 0 ) /* Don't reset when it's the first time */
                     es_out_Control( priv->p_es_out, ES_OUT_RESET_PCR );
-                int i_new_rate = priv->i_slave_subs_rate;
-                demux_Control( in->p_demux, DEMUX_SET_RATE, &i_new_rate );
+                float new_rate = priv->slave_subs_rate;
+                demux_Control( in->p_demux, DEMUX_SET_RATE, &new_rate );
             }
-            in->i_sub_rate = priv->i_slave_subs_rate;
+            in->sub_rate = priv->slave_subs_rate;
         }
 
 
diff --git a/src/input/input_internal.h b/src/input/input_internal.h
index a9a949b9ac..7fd05c0d64 100644
--- a/src/input/input_internal.h
+++ b/src/input/input_internal.h
@@ -70,7 +70,7 @@ typedef struct
 
     /* sub-fps handling */
     bool b_slave_sub;
-    unsigned i_sub_rate;
+    float sub_rate;
 
     /* */
     vlc_tick_t i_pts_delay;
@@ -132,7 +132,7 @@ typedef struct input_thread_private_t
     bool        is_stopped;
     bool        b_recording;
     bool        b_thumbnailing;
-    int         i_rate;
+    float       rate;
 
     /* Playtime configuration and state */
     vlc_tick_t  i_start;    /* :start-time,0 by default */
@@ -179,7 +179,7 @@ typedef struct input_thread_private_t
     /* Slave sources (subs, and others) */
     int            i_slave;
     input_source_t **slave;
-    unsigned i_slave_subs_rate;
+    float          slave_subs_rate;
 
     /* Last ES added */
     enum es_format_category_e i_last_es_cat;
diff --git a/src/input/player.c b/src/input/player.c
index 7fed24f184..63265a7535 100644
--- a/src/input/player.c
+++ b/src/input/player.c
@@ -2357,7 +2357,7 @@ vlc_player_ChangeRate(vlc_player_t *player, float rate)
     if (input)
     {
         input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_RATE,
-            &(vlc_value_t) { .i_int = INPUT_RATE_DEFAULT / rate });
+            &(vlc_value_t) { .f_float = rate });
     }
     else
         vlc_player_SendEvent(player, on_rate_changed, rate);
diff --git a/src/input/var.c b/src/input/var.c
index e98e0bc9f0..7822d66003 100644
--- a/src/input/var.c
+++ b/src/input/var.c
@@ -844,7 +844,6 @@ static int RateCallback( vlc_object_t *p_this, char const *psz_cmd,
     input_thread_t *p_input = (input_thread_t*)p_this;
     VLC_UNUSED(oldval); VLC_UNUSED(p_data); VLC_UNUSED(psz_cmd);
 
-    newval.i_int = INPUT_RATE_DEFAULT / newval.f_float;
     input_ControlPushHelper( p_input, INPUT_CONTROL_SET_RATE, &newval );
 
     return VLC_SUCCESS;



More information about the vlc-commits mailing list