[vlc-commits] decoder: change rate argument
Thomas Guillem
git at videolan.org
Fri Feb 15 16:38:05 CET 2019
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Feb 15 14:56:14 2019 +0100| [32bd267e4b90cca96c61634a8a48df737e0f4e8a] | committer: Thomas Guillem
decoder: 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=32bd267e4b90cca96c61634a8a48df737e0f4e8a
---
src/input/decoder.c | 34 ++++++++++++++++------------------
src/input/es_out.c | 2 +-
2 files changed, 17 insertions(+), 19 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index bd32275df0..bde6b90898 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -68,7 +68,7 @@ struct decoder_owner
input_thread_t *p_input;
input_resource_t*p_resource;
input_clock_t *p_clock;
- int i_last_rate;
+ float last_rate;
int i_spu_channel;
int64_t i_spu_order;
@@ -798,7 +798,7 @@ static inline void DecoderUpdatePreroll( vlc_tick_t *pi_preroll, const block_t *
}
static void DecoderFixTs( decoder_t *p_dec, vlc_tick_t *pi_ts0, vlc_tick_t *pi_ts1,
- vlc_tick_t *pi_duration, int *pi_rate, vlc_tick_t i_ts_bound )
+ vlc_tick_t *pi_duration, float *p_rate, vlc_tick_t i_ts_bound )
{
struct decoder_owner *p_owner = dec_get_owner( p_dec );
input_clock_t *p_clock = 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;
- float rate;
+ float rate = 1.f;
if( *pi_ts0 != VLC_TICK_INVALID )
{
@@ -834,18 +834,16 @@ static void DecoderFixTs( decoder_t *p_dec, vlc_tick_t *pi_ts0, vlc_tick_t *pi_t
{
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 )
*pi_ts1 += 1;
if( pi_duration )
- *pi_duration = ( *pi_duration * i_rate + INPUT_RATE_DEFAULT-1 )
- / INPUT_RATE_DEFAULT;
+ *pi_duration = ( *pi_duration / rate ) + 0.999f;
- if( pi_rate )
- *pi_rate = i_rate;
+ if( p_rate )
+ *p_rate = rate;
}
#ifdef ENABLE_SOUT
@@ -1099,9 +1097,9 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
}
const bool b_dated = p_picture->date != VLC_TICK_INVALID;
- int i_rate = INPUT_RATE_DEFAULT;
+ float rate = 1.f;
DecoderFixTs( p_dec, &p_picture->date, NULL, NULL,
- &i_rate, DECODER_BOGUS_VIDEO_DELAY );
+ &rate, DECODER_BOGUS_VIDEO_DELAY );
vlc_mutex_unlock( &p_owner->lock );
@@ -1119,11 +1117,11 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
if( p_picture->b_force || p_picture->date != VLC_TICK_INVALID )
/* FIXME: VLC_TICK_INVALID -- verify video_output */
{
- if( i_rate != p_owner->i_last_rate || b_first_after_wait )
+ if( rate != p_owner->last_rate || b_first_after_wait )
{
/* Be sure to not display old picture after our own */
vout_Flush( p_vout, p_picture->date );
- p_owner->i_last_rate = i_rate;
+ p_owner->last_rate = rate;
}
else if( p_picture->b_still )
{
@@ -1266,18 +1264,18 @@ static void DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio,
}
/* */
- int i_rate = INPUT_RATE_DEFAULT;
+ float rate = 1.f;
DecoderWaitUnblock( p_dec );
DecoderFixTs( p_dec, &p_audio->i_pts, NULL, &p_audio->i_length,
- &i_rate, AOUT_MAX_ADVANCE_TIME );
+ &rate, AOUT_MAX_ADVANCE_TIME );
vlc_mutex_unlock( &p_owner->lock );
audio_output_t *p_aout = p_owner->p_aout;
if( p_aout != NULL && p_audio->i_pts != VLC_TICK_INVALID
- && i_rate >= INPUT_RATE_DEFAULT/AOUT_MAX_INPUT_RATE
- && i_rate <= INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE
+ && rate >= 1 / (float) AOUT_MAX_INPUT_RATE
+ && rate <= AOUT_MAX_INPUT_RATE
&& !DecoderTimedWait( p_dec, p_audio->i_pts - AOUT_MAX_PREPARE_TIME ) )
{
int status = aout_DecPlay( p_aout, p_audio );
@@ -1632,7 +1630,7 @@ static void OutputChangeRate( decoder_t *p_dec, float rate )
break;
case AUDIO_ES:
if( p_owner->p_aout != NULL )
- aout_DecChangeRate( p_owner->p_aout, rate );
+ aout_DecChangeRate( p_owner->p_aout, 1 / rate );
break;
case SPU_ES:
break;
@@ -1838,7 +1836,7 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent,
p_dec = &p_owner->dec;
p_owner->i_preroll_end = (vlc_tick_t)INT64_MIN;
- p_owner->i_last_rate = INPUT_RATE_DEFAULT;
+ p_owner->last_rate = 1.f;
p_owner->p_input = p_input;
p_owner->p_resource = p_resource;
p_owner->p_aout = NULL;
diff --git a/src/input/es_out.c b/src/input/es_out.c
index d6aaa8fda1..511b19a8d4 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -686,7 +686,7 @@ static void EsOutChangeRate( es_out_t *out, float rate )
foreach_es_then_es_slaves(es)
if( es->p_dec != NULL )
- input_DecoderChangeRate( es->p_dec, 1.f / rate );
+ input_DecoderChangeRate( es->p_dec, rate );
}
static void EsOutChangePosition( es_out_t *out )
More information about the vlc-commits
mailing list