vlc | branch: master | Francois Cartegnie <[email protected]> | Thu May 21 00:16:16 2015 +0200| [0e9444523a6ec1b1f1364ec7884470d9d7d30d0a] | committer: Francois Cartegnie
demux: adaptative: add stream factory > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0e9444523a6ec1b1f1364ec7884470d9d7d30d0a --- modules/demux/adaptative/PlaylistManager.cpp | 5 +++- modules/demux/adaptative/PlaylistManager.h | 4 +++ modules/demux/adaptative/Streams.cpp | 34 ++++++++++++++++---------- modules/demux/adaptative/Streams.hpp | 16 +++++++++++- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/modules/demux/adaptative/PlaylistManager.cpp b/modules/demux/adaptative/PlaylistManager.cpp index ed1f2bb..1828435 100644 --- a/modules/demux/adaptative/PlaylistManager.cpp +++ b/modules/demux/adaptative/PlaylistManager.cpp @@ -52,6 +52,7 @@ PlaylistManager::PlaylistManager( AbstractPlaylist *pl, conManager ( NULL ), logicType ( type ), playlist ( pl ), + streamOutputFactory( NULL ), stream ( stream ), nextPlaylistupdate ( 0 ) { @@ -90,11 +91,13 @@ bool PlaylistManager::start(demux_t *demux) } SegmentTracker *tracker = new (std::nothrow) SegmentTracker(logic, playlist); + DefaultStreamOutputFactory defaultfactory; try { if(!tracker) throw VLC_ENOMEM; - streams[type]->create(demux, logic, tracker); + streams[type]->create(demux, logic, tracker, + (streamOutputFactory) ? *streamOutputFactory : defaultfactory ); } catch (int) { delete streams[type]; delete logic; diff --git a/modules/demux/adaptative/PlaylistManager.h b/modules/demux/adaptative/PlaylistManager.h index aea0419..8b4ef50 100644 --- a/modules/demux/adaptative/PlaylistManager.h +++ b/modules/demux/adaptative/PlaylistManager.h @@ -41,6 +41,8 @@ namespace adaptative using namespace logic; using namespace http; + class AbstractStreamFactory; + class PlaylistManager { public: @@ -60,11 +62,13 @@ namespace adaptative virtual bool updatePlaylist(); protected: + /* local factories */ virtual AbstractAdaptationLogic *createLogic(AbstractAdaptationLogic::LogicType); HTTPConnectionManager *conManager; AbstractAdaptationLogic::LogicType logicType; AbstractPlaylist *playlist; + AbstractStreamOutputFactory *streamOutputFactory; stream_t *stream; Stream *streams[StreamTypeCount]; mtime_t nextPlaylistupdate; diff --git a/modules/demux/adaptative/Streams.cpp b/modules/demux/adaptative/Streams.cpp index af656c2..ea55c33 100644 --- a/modules/demux/adaptative/Streams.cpp +++ b/modules/demux/adaptative/Streams.cpp @@ -90,20 +90,10 @@ StreamFormat Stream::mimeToFormat(const std::string &mime) return format; } -void Stream::create(demux_t *demux, AbstractAdaptationLogic *logic, SegmentTracker *tracker) +void Stream::create(demux_t *demux, AbstractAdaptationLogic *logic, + SegmentTracker *tracker, AbstractStreamOutputFactory &factory) { - switch(format) - { - case StreamFormat::MP4: - output = new MP4StreamOutput(demux); - break; - case StreamFormat::MPEG2TS: - output = new MPEG2TSStreamOutput(demux); - break; - default: - throw VLC_EBADVAR; - break; - } + output = factory.create(demux, format); adaptationLogic = logic; segmentTracker = tracker; } @@ -452,6 +442,24 @@ void AbstractStreamOutput::esOutDestroy(es_out_t *fakees) } /* !Static callbacks */ +AbstractStreamOutput *DefaultStreamOutputFactory::create(demux_t *demux, int format) const +{ + switch(format) + { + case StreamFormat::MP4: + return new MP4StreamOutput(demux); + + case StreamFormat::MPEG2TS: + return new MPEG2TSStreamOutput(demux); + + default: + throw VLC_EBADVAR; + break; + } + return NULL; +} + + MP4StreamOutput::MP4StreamOutput(demux_t *demux) : AbstractStreamOutput(demux) { diff --git a/modules/demux/adaptative/Streams.hpp b/modules/demux/adaptative/Streams.hpp index 370976e..cf02869 100644 --- a/modules/demux/adaptative/Streams.hpp +++ b/modules/demux/adaptative/Streams.hpp @@ -46,6 +46,7 @@ namespace adaptative class AbstractStreamOutput; + class AbstractStreamOutputFactory; using namespace http; using namespace logic; @@ -59,7 +60,8 @@ namespace adaptative bool operator==(const Stream &) const; static StreamType mimeToType(const std::string &mime); static StreamFormat mimeToFormat(const std::string &mime); - void create(demux_t *, AbstractAdaptationLogic *, SegmentTracker *); + void create(demux_t *, AbstractAdaptationLogic *, + SegmentTracker *, AbstractStreamOutputFactory &); bool isEOF() const; mtime_t getPCR() const; int getGroup() const; @@ -127,6 +129,18 @@ namespace adaptative void sendToDecoderUnlocked(mtime_t); }; + class AbstractStreamOutputFactory + { + public: + virtual AbstractStreamOutput *create(demux_t*, int streamType) const = 0; + }; + + class DefaultStreamOutputFactory : public AbstractStreamOutputFactory + { + public: + virtual AbstractStreamOutput *create(demux_t*, int streamType) const; + }; + class MP4StreamOutput : public AbstractStreamOutput { public: _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
