vlc | branch: master | Francois Cartegnie <[email protected]> | Mon Jul 4 12:10:06 2016 +0200| [64f08bdf9caadb10cb737616d0c88b4965666a35] | committer: Francois Cartegnie
demux: adaptive: add drain (GET_EMPTY) Required to correctly switch to another period, as we disable es on period end. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=64f08bdf9caadb10cb737616d0c88b4965666a35 --- modules/demux/adaptive/PlaylistManager.cpp | 24 ++++++++++++++++++++++++ modules/demux/adaptive/PlaylistManager.h | 2 ++ modules/demux/adaptive/Streams.cpp | 9 +++++---- modules/demux/adaptive/Streams.hpp | 1 + modules/demux/adaptive/plumbing/FakeESOut.cpp | 19 +++++++++++++++++++ modules/demux/adaptive/plumbing/FakeESOut.hpp | 1 + 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/modules/demux/adaptive/PlaylistManager.cpp b/modules/demux/adaptive/PlaylistManager.cpp index 95a27ef..cb05910 100644 --- a/modules/demux/adaptive/PlaylistManager.cpp +++ b/modules/demux/adaptive/PlaylistManager.cpp @@ -195,6 +195,30 @@ AbstractStream::status PlaylistManager::demux(mtime_t *pi_nzbarrier, bool send) return i_return; } +void PlaylistManager::drain() +{ + for(;;) + { + bool b_drained = true; + std::vector<AbstractStream *>::iterator it; + for(it=streams.begin(); it!=streams.end(); ++it) + { + AbstractStream *st = *it; + + if (st->isDisabled()) + continue; + + b_drained &= st->drain(); + } + + if(b_drained) + break; + + msleep(20*1000); /* ugly, but we have no way to get feedback */ + } + es_out_Control(p_demux->out, ES_OUT_RESET_PCR); +} + mtime_t PlaylistManager::getPCR() const { mtime_t pcr = VLC_TS_INVALID; diff --git a/modules/demux/adaptive/PlaylistManager.h b/modules/demux/adaptive/PlaylistManager.h index 2124dba..b059eb9 100644 --- a/modules/demux/adaptive/PlaylistManager.h +++ b/modules/demux/adaptive/PlaylistManager.h @@ -54,6 +54,8 @@ namespace adaptive bool start(); AbstractStream::status demux(mtime_t *, bool); + void drain(); + virtual bool needsUpdate() const; virtual bool updatePlaylist(); virtual void scheduleNextUpdate(); diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index d1860e0..03cac14 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -224,6 +224,11 @@ bool AbstractStream::isDisabled() const return disabled; } +bool AbstractStream::drain() +{ + return fakeesout->drain(); +} + AbstractStream::status AbstractStream::demux(mtime_t nz_deadline, bool send) { /* Ensure it is configured */ @@ -279,10 +284,6 @@ AbstractStream::status AbstractStream::demux(mtime_t nz_deadline, bool send) commandsqueue->setFlush(); return AbstractStream::status_buffering; } - - commandsqueue->Commit(); - if(commandsqueue->isEmpty()) - return AbstractStream::status_eof; } else if(nz_deadline + VLC_TS_0 > getBufferingLevel()) /* need to read more */ { diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp index 73823dc..b3163c2 100644 --- a/modules/demux/adaptive/Streams.hpp +++ b/modules/demux/adaptive/Streams.hpp @@ -76,6 +76,7 @@ namespace adaptive status_buffering_ahead, /* Special case for live waiting new segments */ status_demuxed} status; status demux(mtime_t, bool); + bool drain(); virtual bool setPosition(mtime_t, bool); mtime_t getPlaybackTime() const; void runUpdates(); diff --git a/modules/demux/adaptive/plumbing/FakeESOut.cpp b/modules/demux/adaptive/plumbing/FakeESOut.cpp index bb53dbc..6b77f50 100644 --- a/modules/demux/adaptive/plumbing/FakeESOut.cpp +++ b/modules/demux/adaptive/plumbing/FakeESOut.cpp @@ -237,6 +237,25 @@ bool FakeESOut::hasSelectedEs() const return b_selected; } +bool FakeESOut::drain() +{ + bool b_drained = true; + std::list<FakeESOutID *>::const_iterator it; + vlc_mutex_lock(&lock); + for( it=fakeesidlist.begin(); it!=fakeesidlist.end(); ++it ) + { + FakeESOutID *esID = *it; + if( esID->realESID() ) + { + bool b_empty; + es_out_Control( real_es_out, ES_OUT_GET_EMPTY, &b_empty ); + b_drained &= b_empty; + } + } + vlc_mutex_unlock(&lock); + return b_drained; +} + bool FakeESOut::restarting() const { vlc_mutex_lock(const_cast<vlc_mutex_t *>(&lock)); diff --git a/modules/demux/adaptive/plumbing/FakeESOut.hpp b/modules/demux/adaptive/plumbing/FakeESOut.hpp index d678046..e3ca81b 100644 --- a/modules/demux/adaptive/plumbing/FakeESOut.hpp +++ b/modules/demux/adaptive/plumbing/FakeESOut.hpp @@ -43,6 +43,7 @@ namespace adaptive void setTimestampOffset( mtime_t ); size_t esCount() const; bool hasSelectedEs() const; + bool drain(); bool restarting() const; void setExtraInfoProvider( ExtraFMTInfoInterface * ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
