vlc | branch: master | Francois Cartegnie <[email protected]> | Fri Jul 27 12:45:31 2018 +0200| [58a26f0d7d52e7ec4478dff8fda338445fefb54e] | committer: Francois Cartegnie
demux: adaptive: allow to force access for some segments > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=58a26f0d7d52e7ec4478dff8fda338445fefb54e --- modules/demux/adaptive/http/Chunk.cpp | 12 ++++---- modules/demux/adaptive/http/Chunk.h | 10 +++---- modules/demux/adaptive/http/ConnectionParams.hpp | 14 ++++++++- modules/demux/adaptive/http/HTTPConnection.cpp | 34 ++++++++++++++++++++-- modules/demux/adaptive/http/HTTPConnection.hpp | 11 +++++++ .../demux/adaptive/http/HTTPConnectionManager.cpp | 5 +--- 6 files changed, 68 insertions(+), 18 deletions(-) diff --git a/modules/demux/adaptive/http/Chunk.cpp b/modules/demux/adaptive/http/Chunk.cpp index 36e911ed56..a4269e31fc 100644 --- a/modules/demux/adaptive/http/Chunk.cpp +++ b/modules/demux/adaptive/http/Chunk.cpp @@ -127,7 +127,7 @@ block_t * AbstractChunk::read(size_t size) } HTTPChunkSource::HTTPChunkSource(const std::string& url, AbstractConnectionManager *manager, - const adaptive::ID &id) : + const adaptive::ID &id, bool access) : AbstractChunkSource(), connection (NULL), connManager (manager), @@ -136,6 +136,7 @@ HTTPChunkSource::HTTPChunkSource(const std::string& url, AbstractConnectionManag prepared = false; eof = false; sourceid = id; + setUseAccess(access); if(!init(url)) eof = true; } @@ -149,6 +150,7 @@ HTTPChunkSource::~HTTPChunkSource() bool HTTPChunkSource::init(const std::string &url) { params = ConnectionParams(url); + params.setUseAccess(usesAccess()); if(params.getScheme() != "http" && params.getScheme() != "https") return false; @@ -272,8 +274,8 @@ block_t * HTTPChunkSource::readBlock() } HTTPChunkBufferedSource::HTTPChunkBufferedSource(const std::string& url, AbstractConnectionManager *manager, - const adaptive::ID &sourceid) : - HTTPChunkSource(url, manager, sourceid), + const adaptive::ID &sourceid, bool access) : + HTTPChunkSource(url, manager, sourceid, access), p_head (NULL), pp_tail (&p_head), buffered (0) @@ -490,8 +492,8 @@ block_t * HTTPChunkBufferedSource::read(size_t readsize) } HTTPChunk::HTTPChunk(const std::string &url, AbstractConnectionManager *manager, - const adaptive::ID &id): - AbstractChunk(new HTTPChunkSource(url, manager, id)) + const adaptive::ID &id, bool access): + AbstractChunk(new HTTPChunkSource(url, manager, id, access)) { } diff --git a/modules/demux/adaptive/http/Chunk.h b/modules/demux/adaptive/http/Chunk.h index 8470696457..3bf3b44263 100644 --- a/modules/demux/adaptive/http/Chunk.h +++ b/modules/demux/adaptive/http/Chunk.h @@ -82,11 +82,12 @@ namespace adaptive block_t * doRead(size_t, bool); }; - class HTTPChunkSource : public AbstractChunkSource + class HTTPChunkSource : public AbstractChunkSource, + public BackendPrefInterface { public: HTTPChunkSource(const std::string &url, AbstractConnectionManager *, - const ID &); + const ID &, bool = false); virtual ~HTTPChunkSource(); virtual block_t * readBlock (); /* impl */ @@ -116,7 +117,7 @@ namespace adaptive public: HTTPChunkBufferedSource(const std::string &url, AbstractConnectionManager *, - const ID &); + const ID &, bool = false); virtual ~HTTPChunkBufferedSource(); virtual block_t * readBlock (); /* reimpl */ virtual block_t * read (size_t); /* reimpl */ @@ -145,12 +146,11 @@ namespace adaptive { public: HTTPChunk(const std::string &url, AbstractConnectionManager *, - const ID &); + const ID &, bool = false); virtual ~HTTPChunk(); virtual void onDownload (block_t **) {} /* impl */ }; - } } diff --git a/modules/demux/adaptive/http/ConnectionParams.hpp b/modules/demux/adaptive/http/ConnectionParams.hpp index 9381e396b7..e8cf5cec7c 100644 --- a/modules/demux/adaptive/http/ConnectionParams.hpp +++ b/modules/demux/adaptive/http/ConnectionParams.hpp @@ -29,7 +29,19 @@ namespace adaptive { class Transport; - class ConnectionParams + class BackendPrefInterface + { + /* Design Hack for now to force fallback on regular access + * through hybrid connection factory */ + public: + BackendPrefInterface() { useaccess = false; } + bool usesAccess() const { return useaccess; } + void setUseAccess(bool b) { useaccess = b; } + private: + bool useaccess; + }; + + class ConnectionParams : public BackendPrefInterface { public: ConnectionParams(); diff --git a/modules/demux/adaptive/http/HTTPConnection.cpp b/modules/demux/adaptive/http/HTTPConnection.cpp index 54087a17d7..dbfdc3bf70 100644 --- a/modules/demux/adaptive/http/HTTPConnection.cpp +++ b/modules/demux/adaptive/http/HTTPConnection.cpp @@ -89,7 +89,7 @@ HTTPConnection::~HTTPConnection() bool HTTPConnection::canReuse(const ConnectionParams ¶ms_) const { - if( !available ) + if( !available || params_.usesAccess() ) return false; char *psz_proxy_url = vlc_getProxyUrl(params_.getUrl().c_str()); @@ -481,9 +481,9 @@ void StreamUrlConnection::reset() bytesRange = BytesRange(); } -bool StreamUrlConnection::canReuse(const ConnectionParams &) const +bool StreamUrlConnection::canReuse(const ConnectionParams ¶ms) const { - return available; + return available && params.usesAccess(); } int StreamUrlConnection::request(const std::string &path, const BytesRange &range) @@ -623,3 +623,31 @@ AbstractConnection * StreamUrlConnectionFactory::createConnection(vlc_object_t * { return new (std::nothrow) StreamUrlConnection(p_object); } + +ConnectionFactory::ConnectionFactory( AuthStorage *authstorage ) +{ + native = new NativeConnectionFactory( authstorage ); + streamurl = new StreamUrlConnectionFactory(); +} + +ConnectionFactory::~ConnectionFactory() +{ + delete native; + delete streamurl; +} + +AbstractConnection * ConnectionFactory::createConnection(vlc_object_t *p_object, + const ConnectionParams ¶ms) +{ + bool b_streamurl = var_InheritBool(p_object, "adaptive-use-access"); + if(!b_streamurl && !params.usesAccess()) + { + return native->createConnection(p_object, params); + } + else + { + ConnectionParams paramsaccess = params; + paramsaccess.setUseAccess(true); + return streamurl->createConnection(p_object, paramsaccess); + } +} diff --git a/modules/demux/adaptive/http/HTTPConnection.hpp b/modules/demux/adaptive/http/HTTPConnection.hpp index 19dec29a44..c95ce15798 100644 --- a/modules/demux/adaptive/http/HTTPConnection.hpp +++ b/modules/demux/adaptive/http/HTTPConnection.hpp @@ -153,6 +153,17 @@ namespace adaptive virtual ~StreamUrlConnectionFactory() {} virtual AbstractConnection * createConnection(vlc_object_t *, const ConnectionParams &); }; + + class ConnectionFactory : public AbstractConnectionFactory + { + public: + ConnectionFactory( AuthStorage * ); + virtual ~ConnectionFactory(); + virtual AbstractConnection * createConnection(vlc_object_t *, const ConnectionParams &); + private: + NativeConnectionFactory *native; + StreamUrlConnectionFactory *streamurl; + }; } } diff --git a/modules/demux/adaptive/http/HTTPConnectionManager.cpp b/modules/demux/adaptive/http/HTTPConnectionManager.cpp index 2efa6d8343..020df8364e 100644 --- a/modules/demux/adaptive/http/HTTPConnectionManager.cpp +++ b/modules/demux/adaptive/http/HTTPConnectionManager.cpp @@ -73,10 +73,7 @@ HTTPConnectionManager::HTTPConnectionManager (vlc_object_t *p_object_, AuthSt vlc_mutex_init(&lock); downloader = new (std::nothrow) Downloader(); downloader->start(); - if(var_InheritBool(p_object, "adaptive-use-access")) - factory = new (std::nothrow) StreamUrlConnectionFactory(); - else - factory = new (std::nothrow) NativeConnectionFactory( storage ); + factory = new ConnectionFactory(storage); } HTTPConnectionManager::~HTTPConnectionManager () _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
