[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