[vlc-commits] chromecast: fix clock gap when paused
Thomas Guillem
git at videolan.org
Thu Feb 22 12:00:09 CET 2018
vlc | branch: master | Thomas Guillem <thomas at 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 )
More information about the vlc-commits
mailing list