From 14529c484736e23f1e8b380a0c39e5a05a2063c6 Mon Sep 17 00:00:00 2001 From: Francois Cartegnie <fcvlcdev@free.fr> Date: Mon, 6 Jul 2020 18:41:22 +0200 Subject: [PATCH] demux: adaptive: check active streams and don't deselect last --- modules/demux/adaptive/PlaylistManager.cpp | 17 ++++++++++++++++- modules/demux/adaptive/PlaylistManager.h | 1 + modules/demux/adaptive/Streams.cpp | 12 ++++++++---- modules/demux/adaptive/Streams.hpp | 4 ++-- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/modules/demux/adaptive/PlaylistManager.cpp b/modules/demux/adaptive/PlaylistManager.cpp index bb1ad764b62e..3a268b6351fb 100644 --- a/modules/demux/adaptive/PlaylistManager.cpp +++ b/modules/demux/adaptive/PlaylistManager.cpp @@ -252,7 +252,10 @@ AbstractStream::buffering_status PlaylistManager::bufferize(vlc_tick_t i_nzdeadl /* initial */ } - AbstractStream::buffering_status i_ret = st->bufferize(i_nzdeadline, i_min_buffering, i_extra_buffering); + AbstractStream::buffering_status i_ret = st->bufferize(i_nzdeadline, + i_min_buffering, + i_extra_buffering, + getActiveStreamsCount() <= 1); if(i_return != AbstractStream::buffering_ongoing) /* Buffering streams need to keep going */ { if(i_ret > i_return) @@ -343,6 +346,18 @@ vlc_tick_t PlaylistManager::getFirstDTS() const return mindts; } +unsigned PlaylistManager::getActiveStreamsCount() const +{ + unsigned count = 0; + std::vector<AbstractStream *>::const_iterator it; + for(it=streams.begin(); it!=streams.end(); ++it) + { + if((*it)->isValid() && !(*it)->isDisabled()) + count++; + } + return count; +} + bool PlaylistManager::setPosition(vlc_tick_t time) { bool ret = true; diff --git a/modules/demux/adaptive/PlaylistManager.h b/modules/demux/adaptive/PlaylistManager.h index 6d0f6e15c589..b925d38efd90 100644 --- a/modules/demux/adaptive/PlaylistManager.h +++ b/modules/demux/adaptive/PlaylistManager.h @@ -77,6 +77,7 @@ namespace adaptive virtual bool setPosition(vlc_tick_t); vlc_tick_t getResumeTime() const; vlc_tick_t getFirstDTS() const; + unsigned getActiveStreamsCount() const; virtual vlc_tick_t getFirstPlaybackTime() const; vlc_tick_t getCurrentDemuxTime() const; diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index 6ba934425dc3..4876894444c4 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -302,14 +302,18 @@ vlc_tick_t AbstractStream::getDemuxedAmount() const } AbstractStream::buffering_status AbstractStream::bufferize(vlc_tick_t nz_deadline, - vlc_tick_t i_min_buffering, vlc_tick_t i_extra_buffering) + vlc_tick_t i_min_buffering, + vlc_tick_t i_extra_buffering, + bool b_keep_alive) { - last_buffer_status = doBufferize(nz_deadline, i_min_buffering, i_extra_buffering); + last_buffer_status = doBufferize(nz_deadline, i_min_buffering, i_extra_buffering, b_keep_alive); return last_buffer_status; } AbstractStream::buffering_status AbstractStream::doBufferize(vlc_tick_t nz_deadline, - vlc_tick_t i_min_buffering, vlc_tick_t i_extra_buffering) + vlc_tick_t i_min_buffering, + vlc_tick_t i_extra_buffering, + bool b_keep_alive) { vlc_mutex_lock(&lock); @@ -321,7 +325,7 @@ AbstractStream::buffering_status AbstractStream::doBufferize(vlc_tick_t nz_deadl } /* Disable streams that are not selected (alternate streams) */ - if(esCount() && !isSelected() && !fakeEsOut()->restarting()) + if(esCount() && !isSelected() && !fakeEsOut()->restarting() && !b_keep_alive) { setDisabled(true); segmentTracker->reset(); diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp index e942f1dcc72a..04c4596931d3 100644 --- a/modules/demux/adaptive/Streams.hpp +++ b/modules/demux/adaptive/Streams.hpp @@ -82,7 +82,7 @@ namespace adaptive buffering_ongoing, buffering_lessthanmin, } buffering_status; - buffering_status bufferize(vlc_tick_t, vlc_tick_t, vlc_tick_t); + buffering_status bufferize(vlc_tick_t, vlc_tick_t, vlc_tick_t, bool = false); buffering_status getLastBufferStatus() const; vlc_tick_t getDemuxedAmount() const; status dequeue(vlc_tick_t, vlc_tick_t *); @@ -137,7 +137,7 @@ namespace adaptive private: void declaredCodecs(); - buffering_status doBufferize(vlc_tick_t, vlc_tick_t, vlc_tick_t); + buffering_status doBufferize(vlc_tick_t, vlc_tick_t, vlc_tick_t, bool); buffering_status last_buffer_status; bool valid; bool disabled; -- GitLab