vlc | branch: master | Thomas Guillem <tho...@gllm.fr> | Tue Feb 20 17:52:13 2018 +0100| [ab69d591898af6d64f0c4a75c03cd63d19e175de] | committer: Thomas Guillem
chromecast: fix clock gap when paused This commit try to work arround the internal clock gap caused by input_clock_ChangePause() when the input is paused since the chromecast internal clock won't change when paused. This is far from perfect and can fail in a number of cases. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ab69d591898af6d64f0c4a75c03cd63d19e175de --- modules/stream_out/chromecast/cast.cpp | 7 ++++++ modules/stream_out/chromecast/chromecast.h | 5 ++-- modules/stream_out/chromecast/chromecast_common.h | 2 +- modules/stream_out/chromecast/chromecast_ctrl.cpp | 13 +++++++--- modules/stream_out/chromecast/chromecast_demux.cpp | 28 ++++++++++++++++++---- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/modules/stream_out/chromecast/cast.cpp b/modules/stream_out/chromecast/cast.cpp index 2b683014c3..d0556aea18 100644 --- a/modules/stream_out/chromecast/cast.cpp +++ b/modules/stream_out/chromecast/cast.cpp @@ -317,6 +317,13 @@ static int ProxySend(sout_stream_t *p_stream, sout_stream_id_sys_t *id, return VLC_SUCCESS; } } + + mtime_t pause_delay = p_sys->p_intf->getPauseDelay(); + if( p_buffer->i_pts != VLC_TS_INVALID ) + p_buffer->i_pts -= pause_delay; + if( p_buffer->i_dts != VLC_TS_INVALID ) + p_buffer->i_dts -= pause_delay; + int ret = sout_StreamIdSend(p_stream->p_next, id, p_buffer); if (ret == VLC_SUCCESS && !p_sys->cc_has_input) { diff --git a/modules/stream_out/chromecast/chromecast.h b/modules/stream_out/chromecast/chromecast.h index 35a74e8d44..417ad5b09f 100644 --- a/modules/stream_out/chromecast/chromecast.h +++ b/modules/stream_out/chromecast/chromecast.h @@ -180,6 +180,7 @@ struct intf_sys_t void setPacing(bool do_pace); int pace(); void sendInputEvent(enum cc_input_event event, union cc_input_arg arg); + mtime_t getPauseDelay(); int httpd_file_fill( uint8_t *psz_request, uint8_t **pp_data, int *pi_data ); void interrupt_wake_up(); @@ -189,7 +190,7 @@ private: void processMessage(const castchannel::CastMessage &msg); void queueMessage( QueueableMessages msg ); - void setPauseState(bool paused); + void setPauseState(bool paused, mtime_t delay); bool isFinishedPlaying(); bool isStateError() const; bool isStatePlaying() const; @@ -224,7 +225,7 @@ private: static void send_input_event(void *, enum cc_input_event event, union cc_input_arg arg); static void set_on_paused_changed_cb(void *, on_paused_changed_itf, void *); - static void set_pause_state(void*, bool paused); + static void set_pause_state(void*, bool paused, mtime_t delay); static void set_meta(void*, vlc_meta_t *p_meta); diff --git a/modules/stream_out/chromecast/chromecast_common.h b/modules/stream_out/chromecast/chromecast_common.h index 18487792e0..8b4199fed7 100644 --- a/modules/stream_out/chromecast/chromecast_common.h +++ b/modules/stream_out/chromecast/chromecast_common.h @@ -66,7 +66,7 @@ typedef struct void (*pf_send_input_event)(void*, enum cc_input_event, union cc_input_arg); - void (*pf_set_pause_state)(void*, bool paused); + void (*pf_set_pause_state)(void*, bool paused, mtime_t delay); void (*pf_set_meta)(void*, vlc_meta_t *p_meta); diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp b/modules/stream_out/chromecast/chromecast_ctrl.cpp index 72481d6612..2afcf54238 100644 --- a/modules/stream_out/chromecast/chromecast_ctrl.cpp +++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp @@ -1029,7 +1029,7 @@ void intf_sys_t::setOnPausedChangedCb(on_paused_changed_itf on_paused_changed, m_on_paused_changed_data = on_paused_changed_data; } -void intf_sys_t::setPauseState(bool paused) +void intf_sys_t::setPauseState(bool paused, mtime_t delay) { vlc_mutex_locker locker( &m_lock ); if ( m_mediaSessionId == 0 || paused == m_paused ) @@ -1041,12 +1041,19 @@ void intf_sys_t::setPauseState(bool paused) { m_last_request_id = m_communication.msgPlayerPlay( m_appTransportId, m_mediaSessionId ); + m_pause_delay = delay; } else if ( m_state != Paused ) m_last_request_id = m_communication.msgPlayerPause( m_appTransportId, m_mediaSessionId ); } +mtime_t intf_sys_t::getPauseDelay() +{ + vlc_mutex_locker locker( &m_lock ); + return m_pause_delay; +} + bool intf_sys_t::isFinishedPlaying() { return m_cc_eof || isStateError() || m_state == Stopped; @@ -1143,10 +1150,10 @@ void intf_sys_t::send_input_event(void *pt, enum cc_input_event event, union cc_ return p_this->sendInputEvent(event, arg); } -void intf_sys_t::set_pause_state(void *pt, bool paused) +void intf_sys_t::set_pause_state(void *pt, bool paused, mtime_t delay) { intf_sys_t *p_this = static_cast<intf_sys_t*>(pt); - p_this->setPauseState( paused ); + p_this->setPauseState( paused, delay ); } void intf_sys_t::set_meta(void *pt, vlc_meta_t *p_meta) diff --git a/modules/stream_out/chromecast/chromecast_demux.cpp b/modules/stream_out/chromecast/chromecast_demux.cpp index c1c3f31e2f..23b82879e0 100644 --- a/modules/stream_out/chromecast/chromecast_demux.cpp +++ b/modules/stream_out/chromecast/chromecast_demux.cpp @@ -45,6 +45,8 @@ struct demux_sys_t :p_demux(demux) ,p_renderer(renderer) ,m_enabled( true ) + ,m_pause_date( VLC_TS_INVALID ) + ,m_pause_delay( VLC_TS_INVALID ) { init(); } @@ -166,9 +168,9 @@ struct demux_sys_t cc_input_arg { false } ); } - void setPauseState(bool paused) + void setPauseState(bool paused, mtime_t delay) { - p_renderer->pf_set_pause_state( p_renderer->p_opaque, paused ); + p_renderer->pf_set_pause_state( p_renderer->p_opaque, paused, delay ); } mtime_t getCCTime() @@ -179,7 +181,7 @@ struct demux_sys_t mtime_t cc_time = p_renderer->pf_get_time( p_renderer->p_opaque ); if( cc_time != VLC_TS_INVALID ) - return cc_time - system; + return cc_time - system + m_pause_delay; return VLC_TS_INVALID; } @@ -330,6 +332,7 @@ struct demux_sys_t case DEMUX_SET_POSITION: { + m_pause_delay = m_pause_date = VLC_TS_INVALID; double pos = va_arg( args, double ); /* Force unprecise seek */ @@ -343,6 +346,7 @@ struct demux_sys_t } case DEMUX_SET_TIME: { + m_pause_delay = m_pause_date = VLC_TS_INVALID; mtime_t time = va_arg( args, int64_t ); /* Force unprecise seek */ @@ -362,7 +366,21 @@ struct demux_sys_t int paused = va_arg( ap, int ); va_end( ap ); - setPauseState( paused != 0 ); + if (paused) + { + if (m_pause_date == VLC_TS_INVALID) + m_pause_date = mdate(); + } + else + { + if (m_pause_date != VLC_TS_INVALID) + { + m_pause_delay += mdate() - m_pause_date; + m_pause_date = VLC_TS_INVALID; + } + } + + setPauseState( paused != 0, m_pause_delay ); break; } case DEMUX_SET_ES: @@ -408,6 +426,8 @@ protected: double m_last_pos; mtime_t m_start_time; mtime_t m_last_time; + mtime_t m_pause_date; + mtime_t m_pause_delay; }; static void on_paused_changed_cb( void *data, bool paused ) _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits