vlc | branch: master | Francois Cartegnie <[email protected]> | Fri May 17 10:18:23 2019 +0200| [e0d303ebbb75158d748e72347d8c9aa5e5a94b76] | committer: Francois Cartegnie
demux: adaptive: start buffering on demux only Because of race condition in Init(), the es_out isn't set up between demux pf_open() & pf_demux() calls and ES selection is then totally impossible. Randomly broke streams depending on thread speed & buffering. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e0d303ebbb75158d748e72347d8c9aa5e5a94b76 --- modules/demux/adaptive/PlaylistManager.cpp | 17 ++++++++++++++++- modules/demux/adaptive/PlaylistManager.h | 2 ++ modules/demux/adaptive/adaptive.cpp | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/demux/adaptive/PlaylistManager.cpp b/modules/demux/adaptive/PlaylistManager.cpp index 50629cfe48..7b0d54026a 100644 --- a/modules/demux/adaptive/PlaylistManager.cpp +++ b/modules/demux/adaptive/PlaylistManager.cpp @@ -142,7 +142,7 @@ bool PlaylistManager::setupPeriod() return true; } -bool PlaylistManager::start() +bool PlaylistManager::init() { if(!conManager && !(conManager = @@ -160,6 +160,14 @@ bool PlaylistManager::start() updateControlsContentType(); updateControlsPosition(); + return true; +} + +bool PlaylistManager::start() +{ + if(b_thread || !conManager) + return false; + b_thread = !vlc_clone(&thread, managerThread, static_cast<void *>(this), VLC_THREAD_PRIORITY_INPUT); if(!b_thread) @@ -170,6 +178,11 @@ bool PlaylistManager::start() return true; } +bool PlaylistManager::started() const +{ + return b_thread; +} + void PlaylistManager::stop() { if(b_thread) @@ -401,6 +414,8 @@ bool PlaylistManager::reactivateStream(AbstractStream *stream) int PlaylistManager::demux_callback(demux_t *p_demux) { PlaylistManager *manager = reinterpret_cast<PlaylistManager *>(p_demux->p_sys); + if(!manager->started() && !manager->start()) + return VLC_DEMUXER_EOF; return manager->doDemux(DEMUX_INCREMENT); } diff --git a/modules/demux/adaptive/PlaylistManager.h b/modules/demux/adaptive/PlaylistManager.h index e0e3c899ed..43261ef9b2 100644 --- a/modules/demux/adaptive/PlaylistManager.h +++ b/modules/demux/adaptive/PlaylistManager.h @@ -52,7 +52,9 @@ namespace adaptive AbstractAdaptationLogic::LogicType type ); virtual ~PlaylistManager (); + bool init(); bool start(); + bool started() const; void stop(); AbstractStream::buffering_status bufferize(vlc_tick_t, vlc_tick_t, vlc_tick_t); diff --git a/modules/demux/adaptive/adaptive.cpp b/modules/demux/adaptive/adaptive.cpp index 5c5a63d7ba..d6424b0e69 100644 --- a/modules/demux/adaptive/adaptive.cpp +++ b/modules/demux/adaptive/adaptive.cpp @@ -223,7 +223,7 @@ static int Open(vlc_object_t *p_obj) } } - if(!p_manager || !p_manager->start()) + if(!p_manager || !p_manager->init()) { delete p_manager; return VLC_EGENERIC; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
