vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Thu May 3 16:38:10 2018 +0300| [843a9b24097d7db615da06022b1bfb6881a1a7f4] | committer: Rémi Denis-Courmont
decoder: add input_DecoderChangeRate() > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=843a9b24097d7db615da06022b1bfb6881a1a7f4 --- src/input/decoder.c | 32 +++++++++++++++++++++++++++++--- src/input/decoder.h | 9 +++++++++ src/input/es_out.c | 20 +++++++++++++++++--- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/input/decoder.c b/src/input/decoder.c index 50d3d779cd..94b07533a8 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -111,8 +111,9 @@ struct decoder_owner_sys_t /* -- Theses variables need locking on read *and* write -- */ /* Preroll */ int64_t i_preroll_end; - /* Pause */ + /* Pause & Rate */ mtime_t pause_date; + float rate; unsigned frames_countdown; bool paused; @@ -1186,8 +1187,6 @@ static int DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, && i_rate <= INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE && !DecoderTimedWait( p_dec, p_audio->i_pts - AOUT_MAX_PREPARE_TIME ) ) { - aout_DecChangeRate( p_aout, ((float)i_rate) / 1000.f ); - int status = aout_DecPlay( p_aout, p_audio ); if( status == AOUT_DEC_CHANGED ) { @@ -1536,6 +1535,7 @@ static void *DecoderThread( void *p_data ) { decoder_t *p_dec = (decoder_t *)p_data; decoder_owner_sys_t *p_owner = p_dec->p_owner; + float rate = 1.f; bool paused = false; /* The decoder's main loop */ @@ -1585,6 +1585,21 @@ static void *DecoderThread( void *p_data ) continue; } + if( rate != p_owner->rate ) + { + int canc = vlc_savecancel(); + + rate = p_owner->rate; + vlc_fifo_Unlock( p_owner->p_fifo ); + + msg_Dbg( p_dec, "changing rate: %f", rate ); + if( p_owner->p_aout != NULL ) + aout_DecChangeRate( p_owner->p_aout, rate ); + + vlc_restorecancel( canc ); + vlc_fifo_Lock( p_owner->p_fifo ); + } + if( p_owner->paused && p_owner->frames_countdown == 0 ) { /* Wait for resumption from pause */ p_owner->b_idle = true; @@ -1684,6 +1699,7 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent, p_owner->b_fmt_description = false; p_owner->p_description = NULL; + p_owner->rate = 1.f; p_owner->paused = false; p_owner->pause_date = VLC_TS_INVALID; p_owner->frames_countdown = 0; @@ -2272,6 +2288,16 @@ void input_DecoderChangePause( decoder_t *p_dec, bool b_paused, mtime_t i_date ) vlc_fifo_Unlock( p_owner->p_fifo ); } +void input_DecoderChangeRate( decoder_t *dec, float rate ) +{ + decoder_owner_sys_t *owner = dec->p_owner; + + vlc_fifo_Lock( owner->p_fifo ); + owner->rate = rate; + vlc_fifo_Signal( owner->p_fifo ); + vlc_fifo_Unlock( owner->p_fifo ); +} + void input_DecoderChangeDelay( decoder_t *p_dec, mtime_t i_delay ) { decoder_owner_sys_t *p_owner = p_dec->p_owner; diff --git a/src/input/decoder.h b/src/input/decoder.h index ccfe8ecd05..eecd68499d 100644 --- a/src/input/decoder.h +++ b/src/input/decoder.h @@ -39,6 +39,15 @@ decoder_t *input_DecoderNew( input_thread_t *, es_format_t *, input_clock_t *, void input_DecoderChangePause( decoder_t *, bool b_paused, mtime_t i_date ); /** + * Changes the decoder rate. + * + * This function changes rate of the intended playback speed to nominal speed. + * \param dec decoder + * \param rate playback rate (default is 1) + */ +void input_DecoderChangeRate( decoder_t *dec, float rate ); + +/** * This function changes the delay. */ void input_DecoderChangeDelay( decoder_t *, mtime_t i_delay ); diff --git a/src/input/es_out.c b/src/input/es_out.c index e0c0594a27..b424ea418d 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -588,9 +588,18 @@ static void EsOutChangePause( es_out_t *out, bool b_paused, mtime_t i_date ) static void EsOutChangeRate( es_out_t *out, int i_rate ) { es_out_sys_t *p_sys = out->p_sys; + float rate = (float)i_rate / (float)INPUT_RATE_DEFAULT; p_sys->i_rate = i_rate; EsOutProgramsChangeRate( out ); + + for( int i = 0; i < p_sys->i_es; i++ ) + { + es_out_id_t *es = p_sys->es[i]; + + if( es->p_dec != NULL ) + input_DecoderChangeRate( es->p_dec, rate ); + } } static void EsOutChangePosition( es_out_t *out ) @@ -1683,12 +1692,16 @@ static void EsCreateDecoder( es_out_t *out, es_out_id_t *p_es ) { es_out_sys_t *p_sys = out->p_sys; input_thread_t *p_input = p_sys->p_input; + decoder_t *dec; - p_es->p_dec = input_DecoderNew( p_input, &p_es->fmt, p_es->p_pgrm->p_input_clock, input_priv(p_input)->p_sout ); - if( p_es->p_dec ) + dec = input_DecoderNew( p_input, &p_es->fmt, p_es->p_pgrm->p_input_clock, + input_priv(p_input)->p_sout ); + if( dec != NULL ) { + input_DecoderChangeRate( dec, p_sys->i_rate ); + if( p_sys->b_buffering ) - input_DecoderStartWait( p_es->p_dec ); + input_DecoderStartWait( dec ); if( !p_es->p_master && p_sys->p_sout_record ) { @@ -1697,6 +1710,7 @@ static void EsCreateDecoder( es_out_t *out, es_out_id_t *p_es ) input_DecoderStartWait( p_es->p_dec_record ); } } + p_es->p_dec = dec; EsOutDecoderChangeDelay( out, p_es ); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
