vlc | branch: master | Thomas Guillem <[email protected]> | Fri Feb 15 12:52:59 2019 +0100| [e94cc7fe638540fbff5f2645e40116b41a3cb4a5] | committer: Thomas Guillem
input_clock: 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=e94cc7fe638540fbff5f2645e40116b41a3cb4a5 --- src/clock/input_clock.c | 36 ++++++++++++++++-------------------- src/clock/input_clock.h | 10 +++++----- src/input/decoder.c | 9 +++++---- src/input/es_out.c | 12 ++++++------ 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/clock/input_clock.c b/src/clock/input_clock.c index cf490622f3..3729c74e03 100644 --- a/src/clock/input_clock.c +++ b/src/clock/input_clock.c @@ -139,7 +139,7 @@ struct input_clock_t /* Current modifiers */ bool b_paused; - int i_rate; + float rate; vlc_tick_t i_pts_delay; vlc_tick_t i_pause_date; }; @@ -152,7 +152,7 @@ static vlc_tick_t ClockGetTsOffset( input_clock_t * ); /***************************************************************************** * input_clock_New: create a new clock *****************************************************************************/ -input_clock_t *input_clock_New( int i_rate ) +input_clock_t *input_clock_New( float rate ) { input_clock_t *cl = malloc( sizeof(*cl) ); if( !cl ) @@ -176,7 +176,7 @@ input_clock_t *input_clock_New( int i_rate ) for( int i = 0; i < INPUT_CLOCK_LATE_COUNT; i++ ) cl->late.pi_value[i] = 0; - cl->i_rate = i_rate; + cl->rate = rate; cl->i_pts_delay = 0; cl->b_paused = false; cl->i_pause_date = VLC_TICK_INVALID; @@ -308,7 +308,7 @@ void input_clock_Reset( input_clock_t *cl ) /***************************************************************************** * input_clock_ChangeRate: *****************************************************************************/ -void input_clock_ChangeRate( input_clock_t *cl, int i_rate ) +void input_clock_ChangeRate( input_clock_t *cl, float rate ) { vlc_mutex_lock( &cl->lock ); @@ -316,9 +316,9 @@ void input_clock_ChangeRate( input_clock_t *cl, int i_rate ) { /* Move the reference point (as if we were playing at the new rate * from the start */ - cl->ref.i_system = cl->last.i_system - (cl->last.i_system - cl->ref.i_system) * i_rate / cl->i_rate; + cl->ref.i_system = cl->last.i_system - (cl->last.i_system - cl->ref.i_system) / rate * cl->rate; } - cl->i_rate = i_rate; + cl->rate = rate; vlc_mutex_unlock( &cl->lock ); } @@ -369,14 +369,14 @@ vlc_tick_t input_clock_GetWakeup( input_clock_t *cl ) * input_clock_ConvertTS *****************************************************************************/ int input_clock_ConvertTS( vlc_object_t *p_object, input_clock_t *cl, - int *pi_rate, vlc_tick_t *pi_ts0, vlc_tick_t *pi_ts1, + float *p_rate, vlc_tick_t *pi_ts0, vlc_tick_t *pi_ts1, vlc_tick_t i_ts_bound ) { assert( pi_ts0 ); vlc_mutex_lock( &cl->lock ); - if( pi_rate ) - *pi_rate = cl->i_rate; + if( p_rate ) + *p_rate = cl->rate; if( !cl->b_has_reference ) { @@ -390,7 +390,7 @@ int input_clock_ConvertTS( vlc_object_t *p_object, input_clock_t *cl, } /* */ - const vlc_tick_t i_ts_buffering = cl->i_buffering_duration * cl->i_rate / INPUT_RATE_DEFAULT; + const vlc_tick_t i_ts_buffering = cl->i_buffering_duration / cl->rate; const vlc_tick_t i_ts_delay = cl->i_pts_delay + ClockGetTsOffset( cl ); /* */ @@ -427,15 +427,13 @@ int input_clock_ConvertTS( vlc_object_t *p_object, input_clock_t *cl, /***************************************************************************** * input_clock_GetRate: Return current rate *****************************************************************************/ -int input_clock_GetRate( input_clock_t *cl ) +float input_clock_GetRate( input_clock_t *cl ) { - int i_rate; - vlc_mutex_lock( &cl->lock ); - i_rate = cl->i_rate; + float rate = cl->rate; vlc_mutex_unlock( &cl->lock ); - return i_rate; + return rate; } int input_clock_GetState( input_clock_t *cl, @@ -570,8 +568,7 @@ static vlc_tick_t ClockStreamToSystem( input_clock_t *cl, vlc_tick_t i_stream ) if( !cl->b_has_reference ) return VLC_TICK_INVALID; - return ( i_stream - cl->ref.i_stream ) * cl->i_rate / INPUT_RATE_DEFAULT + - cl->ref.i_system; + return ( i_stream - cl->ref.i_stream ) / cl->rate + cl->ref.i_system; } /***************************************************************************** @@ -582,8 +579,7 @@ static vlc_tick_t ClockStreamToSystem( input_clock_t *cl, vlc_tick_t i_stream ) static vlc_tick_t ClockSystemToStream( input_clock_t *cl, vlc_tick_t i_system ) { assert( cl->b_has_reference ); - return ( i_system - cl->ref.i_system ) * INPUT_RATE_DEFAULT / cl->i_rate + - cl->ref.i_stream; + return ( i_system - cl->ref.i_system ) * cl->rate + cl->ref.i_stream; } /** @@ -592,6 +588,6 @@ static vlc_tick_t ClockSystemToStream( input_clock_t *cl, vlc_tick_t i_system ) */ static vlc_tick_t ClockGetTsOffset( input_clock_t *cl ) { - return cl->i_pts_delay * ( cl->i_rate - INPUT_RATE_DEFAULT ) / INPUT_RATE_DEFAULT; + return cl->i_pts_delay * ( 1.0f / cl->rate - 1.0f ); } diff --git a/src/clock/input_clock.h b/src/clock/input_clock.h index b9b508c968..1ec2a45895 100644 --- a/src/clock/input_clock.h +++ b/src/clock/input_clock.h @@ -39,7 +39,7 @@ typedef struct input_clock_t input_clock_t; * This function creates a new input_clock_t. * You must use input_clock_Delete to delete it once unused. */ -input_clock_t *input_clock_New( int i_rate ); +input_clock_t *input_clock_New( float rate ); /** * This function destroys a input_clock_t created by input_clock_New. @@ -72,7 +72,7 @@ vlc_tick_t input_clock_GetWakeup( input_clock_t * ); /** * This functions allows changing the actual reading speed. */ -void input_clock_ChangeRate( input_clock_t *, int i_rate ); +void input_clock_ChangeRate( input_clock_t *, float rate ); /** * This function allows changing the pause status. @@ -96,7 +96,7 @@ void input_clock_ChangeSystemOrigin( input_clock_t *, bool b_absolute, vlc_ti /** * This function converts a pair of timestamp from stream clock to system clock. * - * If pi_rate is provided it will be filled with the rate value used for + * If p_rate is provided it will be filled with the rate value used for * the conversion. * p_ts0 is a pointer to a timestamp to be converted (in place) and must be non NULL. * p_ts1 is a pointer to a timestamp to be converted (in place) and can be NULL. @@ -107,13 +107,13 @@ void input_clock_ChangeSystemOrigin( input_clock_t *, bool b_absolute, vlc_ti * this case, *p_ts0 and *p_ts1 will hold an invalid timestamp. * Otherwise it will return VLC_SUCCESS. */ -int input_clock_ConvertTS( vlc_object_t *, input_clock_t *, int *pi_rate, +int input_clock_ConvertTS( vlc_object_t *, input_clock_t *, float *p_rate, vlc_tick_t *pi_ts0, vlc_tick_t *pi_ts1, vlc_tick_t i_ts_bound ); /** * This function returns the current rate. */ -int input_clock_GetRate( input_clock_t * ); +float input_clock_GetRate( input_clock_t * ); /** * This function returns current clock state or VLC_EGENERIC if there is not a diff --git a/src/input/decoder.c b/src/input/decoder.c index 51b509dbad..bd32275df0 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -711,7 +711,7 @@ static float DecoderGetDisplayRate( decoder_t *p_dec ) if( !p_owner->p_clock ) return 1.f; - return input_clock_GetRate( p_owner->p_clock ) / (float) INPUT_RATE_DEFAULT; + return input_clock_GetRate( p_owner->p_clock ); } /***************************************************************************** @@ -811,7 +811,7 @@ static void DecoderFixTs( decoder_t *p_dec, vlc_tick_t *pi_ts0, vlc_tick_t *pi_t return; const bool b_ephemere = pi_ts1 && *pi_ts0 == *pi_ts1; - int i_rate; + float rate; if( *pi_ts0 != VLC_TICK_INVALID ) { @@ -820,7 +820,7 @@ static void DecoderFixTs( decoder_t *p_dec, vlc_tick_t *pi_ts0, vlc_tick_t *pi_t *pi_ts1 += i_es_delay; if( i_ts_bound != INT64_MAX ) i_ts_bound += i_es_delay; - if( input_clock_ConvertTS( VLC_OBJECT(p_dec), p_clock, &i_rate, pi_ts0, pi_ts1, i_ts_bound ) ) { + if( input_clock_ConvertTS( VLC_OBJECT(p_dec), p_clock, &rate, pi_ts0, pi_ts1, i_ts_bound ) ) { const char *psz_name = module_get_name( p_dec->p_module, false ); if( pi_ts1 != NULL ) msg_Err(p_dec, "Could not convert timestamps %"PRId64 @@ -832,8 +832,9 @@ static void DecoderFixTs( decoder_t *p_dec, vlc_tick_t *pi_ts0, vlc_tick_t *pi_t } else { - i_rate = input_clock_GetRate( p_clock ); + rate = input_clock_GetRate( p_clock ); } + const int i_rate = INPUT_RATE_DEFAULT / rate; /* Do not create ephemere data because of rounding errors */ if( !b_ephemere && pi_ts1 && *pi_ts1 != VLC_TICK_INVALID && *pi_ts0 == *pi_ts1 ) diff --git a/src/input/es_out.c b/src/input/es_out.c index 4767003747..4a3f8c6e75 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -679,7 +679,7 @@ static void EsOutChangePause( es_out_t *out, bool b_paused, vlc_tick_t i_date ) static void EsOutChangeRate( es_out_t *out, int i_rate ) { es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); - float rate = (float)i_rate / (float)INPUT_RATE_DEFAULT; + const float rate = (float)i_rate / (float)INPUT_RATE_DEFAULT; es_out_id_t *es; p_sys->i_rate = i_rate; @@ -879,9 +879,10 @@ 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, p_sys->i_rate); + input_clock_ChangeRate(pgrm->p_input_clock, rate); } static void EsOutFrameNext( es_out_t *out ) @@ -938,13 +939,12 @@ static void EsOutFrameNext( es_out_t *out ) p_sys->i_buffering_extra_stream = p_sys->i_buffering_extra_initial; } - const int i_rate = input_clock_GetRate( p_sys->p_pgrm->p_input_clock ); + const float rate = input_clock_GetRate( p_sys->p_pgrm->p_input_clock ); p_sys->b_buffering = true; p_sys->i_buffering_extra_system += i_duration; p_sys->i_buffering_extra_stream = p_sys->i_buffering_extra_initial + - ( p_sys->i_buffering_extra_system - p_sys->i_buffering_extra_initial ) * - INPUT_RATE_DEFAULT / i_rate; + ( p_sys->i_buffering_extra_system - p_sys->i_buffering_extra_initial ) * rate; p_sys->i_preroll_end = -1; p_sys->i_prev_stream_level = -1; @@ -1113,7 +1113,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( p_sys->i_rate ); + p_pgrm->p_input_clock = input_clock_New( INPUT_RATE_DEFAULT / p_sys->i_rate ); if( !p_pgrm->p_input_clock ) { free( p_pgrm ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
