vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Jan 14 14:04:12 2021 +0100| [f8ac5e2c52f85d5e85d3b74de5aae9be321c74d7] | committer: Francois Cartegnie
demux: adaptive: enable pause > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f8ac5e2c52f85d5e85d3b74de5aae9be321c74d7 --- modules/demux/adaptive/PlaylistManager.cpp | 34 +++++++++++++++++++++++++++++- modules/demux/adaptive/PlaylistManager.h | 2 ++ modules/demux/adaptive/Streams.cpp | 10 +++++++++ modules/demux/adaptive/Streams.hpp | 1 + 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/modules/demux/adaptive/PlaylistManager.cpp b/modules/demux/adaptive/PlaylistManager.cpp index 9f007892bc..66a7af3357 100644 --- a/modules/demux/adaptive/PlaylistManager.cpp +++ b/modules/demux/adaptive/PlaylistManager.cpp @@ -374,6 +374,16 @@ bool PlaylistManager::setPosition(vlc_tick_t time) return ret; } +void PlaylistManager::setLivePause(bool b) +{ + if(!started()) + return; + + for(AbstractStream* st : streams) + if(st->isValid() && !st->isDisabled()) + st->setLivePause(b); +} + bool PlaylistManager::needsUpdate() const { return playlist->needsUpdates() && @@ -541,7 +551,29 @@ int PlaylistManager::doControl(int i_query, va_list args) case DEMUX_SET_PAUSE_STATE: { vlc_mutex_locker locker(&cached.lock); - return cached.b_live ? VLC_EGENERIC : VLC_SUCCESS; + bool b_pause = (bool)va_arg(args, int); + if(playlist->isLive()) + { + setBufferingRunState(false); /* stop downloader first */ + vlc_tick_t now = vlc_tick_now(); + if(b_pause) + { + setLivePause(true); + pause_start = now; + msg_Dbg(p_demux,"Buffering and playback paused. No timeshift support."); + } + else + { + setLivePause(false); + msg_Dbg(p_demux,"Resuming buffering/playback after %" PRId64 "ms", + MS_FROM_VLC_TICK(now-pause_start)); + es_out_Control(p_demux->out, ES_OUT_RESET_PCR); + } + setBufferingRunState(true); + demux.i_nzpcr = VLC_TICK_INVALID; + cached.lastupdate = 0; + } + return VLC_SUCCESS; } case DEMUX_GET_TIME: diff --git a/modules/demux/adaptive/PlaylistManager.h b/modules/demux/adaptive/PlaylistManager.h index e1ab594e46..32b9c691e1 100644 --- a/modules/demux/adaptive/PlaylistManager.h +++ b/modules/demux/adaptive/PlaylistManager.h @@ -76,6 +76,7 @@ namespace adaptive virtual int doControl(int, va_list); virtual int doDemux(vlc_tick_t); + void setLivePause(bool); virtual bool setPosition(vlc_tick_t); vlc_tick_t getResumeTime() const; vlc_tick_t getFirstDTS() const; @@ -142,6 +143,7 @@ namespace adaptive bool b_thread; bool b_buffering; bool b_canceled; + vlc_tick_t pause_start; }; } diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index 3928a01d34..9cf5be89c2 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -317,6 +317,16 @@ bool AbstractStream::isDisabled() const return disabled; } +void AbstractStream::setLivePause(bool b) +{ + vlc_mutex_locker locker(&lock); + if(!b) + { + segmentTracker->setPosition(segmentTracker->getStartPosition(), + !demuxer || demuxer->needsRestartOnSeek()); + } +} + bool AbstractStream::decodersDrained() { return fakeEsOut()->decodersDrained(); diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp index 2b961416f7..325c65c036 100644 --- a/modules/demux/adaptive/Streams.hpp +++ b/modules/demux/adaptive/Streams.hpp @@ -69,6 +69,7 @@ namespace adaptive virtual bool reactivate(vlc_tick_t); bool isDisabled() const; bool isValid() const; + void setLivePause(bool); enum class Status { Eof = 0, /* prioritized */ Discontinuity, _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
