vlc | branch: master | Thomas Guillem <[email protected]> | Fri Feb 15 14:09:09 2019 +0100| [1bd4f9869e00c1818ed85c03fbe306058ba8bca7] | committer: Thomas Guillem
es_out: change rate argument Inverse and use a float. 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=1bd4f9869e00c1818ed85c03fbe306058ba8bca7 --- src/input/es_out.c | 32 ++++++++++------------- src/input/es_out.h | 10 +++---- src/input/es_out_timeshift.c | 62 ++++++++++++++++++++++---------------------- src/input/input.c | 8 +++--- 4 files changed, 55 insertions(+), 57 deletions(-) diff --git a/src/input/es_out.c b/src/input/es_out.c index 4a3f8c6e75..d6aaa8fda1 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -181,7 +181,7 @@ typedef struct vlc_tick_t i_pts_delay; vlc_tick_t i_pts_jitter; int i_cr_average; - int i_rate; + float rate; /* */ bool b_paused; @@ -314,7 +314,7 @@ static const struct es_out_callbacks es_out_cbs; /***************************************************************************** * input_EsOutNew: *****************************************************************************/ -es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate ) +es_out_t *input_EsOutNew( input_thread_t *p_input, float rate ) { es_out_sys_t *p_sys = calloc( 1, sizeof( *p_sys ) ); if( !p_sys ) @@ -344,7 +344,7 @@ es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate ) p_sys->i_pause_date = -1; - p_sys->i_rate = i_rate; + p_sys->rate = rate; p_sys->b_buffering = true; p_sys->i_preroll_end = -1; @@ -676,18 +676,17 @@ static void EsOutChangePause( es_out_t *out, bool b_paused, vlc_tick_t i_date ) p_sys->i_pause_date = i_date; } -static void EsOutChangeRate( es_out_t *out, int i_rate ) +static void EsOutChangeRate( es_out_t *out, float rate ) { es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); - const float rate = (float)i_rate / (float)INPUT_RATE_DEFAULT; es_out_id_t *es; - p_sys->i_rate = i_rate; + p_sys->rate = rate; EsOutProgramsChangeRate( out ); foreach_es_then_es_slaves(es) if( es->p_dec != NULL ) - input_DecoderChangeRate( es->p_dec, rate ); + input_DecoderChangeRate( es->p_dec, 1.f / rate ); } static void EsOutChangePosition( es_out_t *out ) @@ -879,10 +878,9 @@ static void EsOutProgramsChangeRate( es_out_t *out ) { es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); es_out_pgrm_t *pgrm; - float rate = INPUT_RATE_DEFAULT / (float) p_sys->i_rate; vlc_list_foreach(pgrm, &p_sys->programs, node) - input_clock_ChangeRate(pgrm->p_input_clock, rate); + input_clock_ChangeRate(pgrm->p_input_clock, p_sys->rate); } static void EsOutFrameNext( es_out_t *out ) @@ -987,7 +985,7 @@ static vlc_tick_t EsOutGetBuffering( es_out_t *out ) i_system_duration = vlc_tick_now() - i_system_start; } - const vlc_tick_t i_consumed = i_system_duration * INPUT_RATE_DEFAULT / p_sys->i_rate - i_stream_duration; + const vlc_tick_t i_consumed = i_system_duration * p_sys->rate - i_stream_duration; i_delay = p_sys->i_pts_delay - i_consumed; } if( i_delay < 0 ) @@ -1113,7 +1111,7 @@ static es_out_pgrm_t *EsOutProgramAdd( es_out_t *out, int i_group ) p_pgrm->b_selected = false; p_pgrm->b_scrambled = false; p_pgrm->p_meta = NULL; - p_pgrm->p_input_clock = input_clock_New( INPUT_RATE_DEFAULT / p_sys->i_rate ); + p_pgrm->p_input_clock = input_clock_New( p_sys->rate ); if( !p_pgrm->p_input_clock ) { free( p_pgrm ); @@ -1775,9 +1773,7 @@ static void EsOutCreateDecoder( es_out_t *out, es_out_id_t *p_es ) input_priv(p_input)->p_sout ); if( dec != NULL ) { - float rate = (float)p_sys->i_rate / (float)INPUT_RATE_DEFAULT; - - input_DecoderChangeRate( dec, rate ); + input_DecoderChangeRate( dec, 1 / p_sys->rate ); if( p_sys->b_buffering ) input_DecoderStartWait( dec ); @@ -2951,11 +2947,11 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args ) case ES_OUT_SET_RATE: { - const int i_src_rate = va_arg( args, int ); - const int i_rate = va_arg( args, int ); + const float src_rate = va_arg( args, double ); + const float rate = va_arg( args, double ); - assert( i_src_rate == i_rate ); - EsOutChangeRate( out, i_rate ); + assert( src_rate == rate ); + EsOutChangeRate( out, rate ); return VLC_SUCCESS; } diff --git a/src/input/es_out.h b/src/input/es_out.h index 29007bf707..6760752ddd 100644 --- a/src/input/es_out.h +++ b/src/input/es_out.h @@ -68,7 +68,7 @@ enum es_out_query_private_e ES_OUT_SET_PAUSE_STATE, /* arg1=bool b_source_paused, bool b_paused arg2=vlc_tick_t res=can fail */ /* Set rate */ - ES_OUT_SET_RATE, /* arg1=int i_source_rate arg2=int i_rate res=can fail */ + ES_OUT_SET_RATE, /* arg1=double source_rate arg2=double rate res=can fail */ /* Set next frame */ ES_OUT_SET_FRAME_NEXT, /* res=can fail */ @@ -134,9 +134,9 @@ static inline int es_out_SetPauseState( es_out_t *p_out, bool b_source_paused, b { return es_out_Control( p_out, ES_OUT_SET_PAUSE_STATE, b_source_paused, b_paused, i_date ); } -static inline int es_out_SetRate( es_out_t *p_out, int i_source_rate, int i_rate ) +static inline int es_out_SetRate( es_out_t *p_out, float source_rate, float rate ) { - return es_out_Control( p_out, ES_OUT_SET_RATE, i_source_rate, i_rate ); + return es_out_Control( p_out, ES_OUT_SET_RATE, source_rate, rate ); } static inline int es_out_SetFrameNext( es_out_t *p_out ) { @@ -172,7 +172,7 @@ static inline void es_out_Eos( es_out_t *p_out ) assert( !i_ret ); } -es_out_t *input_EsOutNew( input_thread_t *, int i_rate ); -es_out_t *input_EsOutTimeshiftNew( input_thread_t *, es_out_t *, int i_rate ); +es_out_t *input_EsOutNew( input_thread_t *, float rate ); +es_out_t *input_EsOutTimeshiftNew( input_thread_t *, es_out_t *, float i_rate ); #endif diff --git a/src/input/es_out_timeshift.c b/src/input/es_out_timeshift.c index 8e6de78b87..3e5b07c8f2 100644 --- a/src/input/es_out_timeshift.c +++ b/src/input/es_out_timeshift.c @@ -198,8 +198,8 @@ typedef struct vlc_tick_t i_pause_date; /* */ - int i_rate; - int i_rate_source; + float rate; + float rate_source; vlc_tick_t i_rate_date; vlc_tick_t i_rate_delay; @@ -238,8 +238,8 @@ typedef struct /* */ bool b_input_paused; bool b_input_paused_source; - int i_input_rate; - int i_input_rate_source; + float input_rate; + float input_rate_source; /* */ int i_es; @@ -259,7 +259,7 @@ static int TsPopCmdLocked( ts_thread_t *, ts_cmd_t *, bool b_flush ); static bool TsHasCmd( ts_thread_t * ); static bool TsIsUnused( ts_thread_t * ); static int TsChangePause( ts_thread_t *, bool b_source_paused, bool b_paused, vlc_tick_t i_date ); -static int TsChangeRate( ts_thread_t *, int i_src_rate, int i_rate ); +static int TsChangeRate( ts_thread_t *, float src_rate, float rate ); static void *TsRun( void * ); @@ -298,7 +298,7 @@ static const struct es_out_callbacks es_out_timeshift_cbs; /***************************************************************************** * input_EsOutTimeshiftNew: *****************************************************************************/ -es_out_t *input_EsOutTimeshiftNew( input_thread_t *p_input, es_out_t *p_next_out, int i_rate ) +es_out_t *input_EsOutTimeshiftNew( input_thread_t *p_input, es_out_t *p_next_out, float rate ) { es_out_sys_t *p_sys = malloc( sizeof(*p_sys) ); if( !p_sys ) @@ -310,8 +310,8 @@ es_out_t *input_EsOutTimeshiftNew( input_thread_t *p_input, es_out_t *p_next_out p_sys->b_input_paused = false; p_sys->b_input_paused_source = false; p_sys->p_input = p_input; - p_sys->i_input_rate = i_rate; - p_sys->i_input_rate_source = i_rate; + p_sys->input_rate = rate; + p_sys->input_rate_source = rate; p_sys->p_out = p_next_out; vlc_mutex_init_recursive( &p_sys->lock ); @@ -553,14 +553,14 @@ static int ControlLockedSetPauseState( es_out_t *p_out, bool b_source_paused, bo } return i_ret; } -static int ControlLockedSetRate( es_out_t *p_out, int i_src_rate, int i_rate ) +static int ControlLockedSetRate( es_out_t *p_out, float src_rate, float rate ) { es_out_sys_t *p_sys = container_of(p_out, es_out_sys_t, out); int i_ret; - if( !p_sys->b_delayed && i_src_rate == i_rate ) + if( !p_sys->b_delayed && src_rate == rate ) { - i_ret = es_out_SetRate( p_sys->p_out, i_src_rate, i_rate ); + i_ret = es_out_SetRate( p_sys->p_out, src_rate, rate ); } else { @@ -570,7 +570,7 @@ static int ControlLockedSetRate( es_out_t *p_out, int i_src_rate, int i_rate ) if( !p_sys->b_delayed ) TsStart( p_out ); if( p_sys->b_delayed ) - i_ret = TsChangeRate( p_sys->p_ts, i_src_rate, i_rate ); + i_ret = TsChangeRate( p_sys->p_ts, src_rate, rate ); } else { @@ -584,8 +584,8 @@ static int ControlLockedSetRate( es_out_t *p_out, int i_src_rate, int i_rate ) if( !i_ret ) { - p_sys->i_input_rate_source = i_src_rate; - p_sys->i_input_rate = i_rate; + p_sys->input_rate_source = src_rate; + p_sys->input_rate = rate; } return i_ret; } @@ -707,10 +707,10 @@ static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) } case ES_OUT_SET_RATE: { - const int i_src_rate = va_arg( args, int ); - const int i_rate = va_arg( args, int ); + const float src_rate = va_arg( args, double ); + const float rate = va_arg( args, double ); - return ControlLockedSetRate( p_out, i_src_rate, i_rate ); + return ControlLockedSetRate( p_out, src_rate, rate ); } case ES_OUT_SET_FRAME_NEXT: { @@ -805,8 +805,8 @@ static int TsStart( es_out_t *p_out ) vlc_cond_init( &p_ts->wait ); p_ts->b_paused = p_sys->b_input_paused && !p_sys->b_input_paused_source; p_ts->i_pause_date = p_ts->b_paused ? vlc_tick_now() : -1; - p_ts->i_rate_source = p_sys->i_input_rate_source; - p_ts->i_rate = p_sys->i_input_rate; + p_ts->rate_source = p_sys->input_rate_source; + p_ts->rate = p_sys->input_rate; p_ts->i_rate_date = -1; p_ts->i_rate_delay = 0; p_ts->i_buffering_delay = 0; @@ -933,7 +933,7 @@ static bool TsIsUnused( ts_thread_t *p_ts ) vlc_mutex_lock( &p_ts->lock ); b_unused = !p_ts->b_paused && - p_ts->i_rate == p_ts->i_rate_source && + p_ts->rate == p_ts->rate_source && TsStorageIsEmpty( p_ts->p_storage_r ); vlc_mutex_unlock( &p_ts->lock ); @@ -971,7 +971,7 @@ static int TsChangePause( ts_thread_t *p_ts, bool b_source_paused, bool b_paused vlc_mutex_unlock( &p_ts->lock ); return i_ret; } -static int TsChangeRate( ts_thread_t *p_ts, int i_src_rate, int i_rate ) +static int TsChangeRate( ts_thread_t *p_ts, float src_rate, float rate ) { int i_ret; @@ -980,10 +980,10 @@ static int TsChangeRate( ts_thread_t *p_ts, int i_src_rate, int i_rate ) p_ts->i_rate_date = -1; p_ts->i_rate_delay = 0; - p_ts->i_rate = i_rate; - p_ts->i_rate_source = i_src_rate; + p_ts->rate = rate; + p_ts->rate_source = src_rate; - i_ret = es_out_SetRate( p_ts->p_out, i_rate, i_rate ); + i_ret = es_out_SetRate( p_ts->p_out, rate, rate ); vlc_mutex_unlock( &p_ts->lock ); return i_ret; @@ -1036,28 +1036,28 @@ static void *TsRun( void *p_data ) p_ts->i_rate_date = cmd.i_date; p_ts->i_rate_delay = 0; - if( p_ts->i_rate_source != p_ts->i_rate ) + if( p_ts->rate_source != p_ts->rate ) { const vlc_tick_t i_duration = cmd.i_date - p_ts->i_rate_date; - p_ts->i_rate_delay = i_duration * p_ts->i_rate / p_ts->i_rate_source - i_duration; + p_ts->i_rate_delay = i_duration * p_ts->rate_source / p_ts->rate - i_duration; } - if( p_ts->i_cmd_delay + p_ts->i_rate_delay + p_ts->i_buffering_delay < 0 && p_ts->i_rate != p_ts->i_rate_source ) + if( p_ts->i_cmd_delay + p_ts->i_rate_delay + p_ts->i_buffering_delay < 0 && p_ts->rate != p_ts->rate_source ) { const int canc = vlc_savecancel(); /* Auto reset to rate 1.0 */ - msg_Warn( p_ts->p_input, "es out timeshift: auto reset rate to %d", p_ts->i_rate_source ); + msg_Warn( p_ts->p_input, "es out timeshift: auto reset rate to %f", p_ts->rate_source ); p_ts->i_cmd_delay = 0; p_ts->i_buffering_delay = 0; p_ts->i_rate_delay = 0; p_ts->i_rate_date = -1; - p_ts->i_rate = p_ts->i_rate_source; + p_ts->rate = p_ts->rate_source; - if( !es_out_SetRate( p_ts->p_out, p_ts->i_rate_source, p_ts->i_rate ) ) + if( !es_out_SetRate( p_ts->p_out, p_ts->rate_source, p_ts->rate ) ) { - vlc_value_t val = { .i_int = p_ts->i_rate }; + vlc_value_t val = { .i_int = INPUT_RATE_DEFAULT / 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/input.c b/src/input/input.c index 677a830339..cf4f179b03 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -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, priv->i_rate ); + priv->p_es_out_display = input_EsOutNew( p_input, INPUT_RATE_DEFAULT / (float) priv->i_rate ); priv->p_es_out = NULL; /* Set the destructor when we are sure we are initialized */ @@ -1355,7 +1355,7 @@ static int Init( input_thread_t * p_input ) /* Create es out */ priv->p_es_out = input_EsOutTimeshiftNew( p_input, priv->p_es_out_display, - priv->i_rate ); + INPUT_RATE_DEFAULT / (float) priv->i_rate ); if( priv->p_es_out == NULL ) goto error; @@ -2058,7 +2058,9 @@ static bool Control( input_thread_t *p_input, 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, i_rate_source, i_rate ); + es_out_SetRate( priv->p_es_out, + INPUT_RATE_DEFAULT / (float) i_rate_source, + INPUT_RATE_DEFAULT / (float) i_rate ); } b_force_update = true; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
