vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Sep 23 13:02:00 2015 +0200| [0e9356ef434ac235c3d1a6cc3a85c94a75ab179e] | committer: Francois Cartegnie
demux: adaptative: add streamoutput recycling > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0e9356ef434ac235c3d1a6cc3a85c94a75ab179e --- modules/demux/adaptative/plumbing/StreamOutput.cpp | 20 ++++++++++++++++---- modules/demux/adaptative/plumbing/StreamOutput.hpp | 6 ++++-- modules/demux/dash/DASHManager.cpp | 15 +++++++++++---- modules/demux/dash/DASHManager.h | 2 +- modules/demux/hls/HLSStreams.cpp | 18 ++++++++++++------ modules/demux/hls/HLSStreams.hpp | 6 ++++-- 6 files changed, 48 insertions(+), 19 deletions(-) diff --git a/modules/demux/adaptative/plumbing/StreamOutput.cpp b/modules/demux/adaptative/plumbing/StreamOutput.cpp index 37bb944..c19425a 100644 --- a/modules/demux/adaptative/plumbing/StreamOutput.cpp +++ b/modules/demux/adaptative/plumbing/StreamOutput.cpp @@ -48,7 +48,8 @@ AbstractStreamOutput::~AbstractStreamOutput() { } -BaseStreamOutput::BaseStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name) : +BaseStreamOutput::BaseStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name, + AbstractStreamOutput *recycled) : AbstractStreamOutput(demux, format) { this->name = name; @@ -57,7 +58,18 @@ BaseStreamOutput::BaseStreamOutput(demux_t *demux, const StreamFormat &format, c CommandsFactory *factory = new CommandsFactory(); - fakeesout = new (std::nothrow) FakeESOut( realdemux->out, factory ); + /* Try to recycle compatible output if any */ + BaseStreamOutput *my_recycled = dynamic_cast<BaseStreamOutput *>(recycled); + if(my_recycled) + { + fakeesout = my_recycled->fakeesout; + my_recycled->fakeesout = NULL; + } + else + { + fakeesout = new (std::nothrow) FakeESOut( realdemux->out, factory ); + } + if (!fakeesout) { delete factory; @@ -75,7 +87,8 @@ BaseStreamOutput::~BaseStreamOutput() if (demuxstream) stream_Delete(demuxstream); - delete fakeesout; + if(fakeesout) + delete fakeesout; } mtime_t BaseStreamOutput::getPCR() const @@ -163,4 +176,3 @@ void BaseStreamOutput::fillExtraFMTInfo( es_format_t *p_fmt ) const if(!p_fmt->psz_description && !description.empty()) p_fmt->psz_description = strdup(description.c_str()); } - diff --git a/modules/demux/adaptative/plumbing/StreamOutput.hpp b/modules/demux/adaptative/plumbing/StreamOutput.hpp index 083a765..97d22ef 100644 --- a/modules/demux/adaptative/plumbing/StreamOutput.hpp +++ b/modules/demux/adaptative/plumbing/StreamOutput.hpp @@ -67,7 +67,8 @@ namespace adaptative { public: virtual ~AbstractStreamOutputFactory() {} - virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const = 0; + virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &, + AbstractStreamOutput * = NULL ) const = 0; }; class BaseStreamOutput : public AbstractStreamOutput, @@ -76,7 +77,8 @@ namespace adaptative friend class BaseStreamOutputEsOutControlPCRCommand; public: - BaseStreamOutput(demux_t *, const StreamFormat &, const std::string &); + BaseStreamOutput(demux_t *, const StreamFormat &, const std::string &, + AbstractStreamOutput * = NULL); virtual ~BaseStreamOutput(); virtual void pushBlock(block_t *, bool); /* reimpl */ virtual mtime_t getPCR() const; /* reimpl */ diff --git a/modules/demux/dash/DASHManager.cpp b/modules/demux/dash/DASHManager.cpp index be942ba..dc18481 100644 --- a/modules/demux/dash/DASHManager.cpp +++ b/modules/demux/dash/DASHManager.cpp @@ -48,18 +48,25 @@ using namespace dash::mpd; using namespace adaptative::logic; -AbstractStreamOutput *DASHStreamOutputFactory::create(demux_t *demux, const StreamFormat &format) const +AbstractStreamOutput *DASHStreamOutputFactory::create(demux_t *demux, const StreamFormat &format, + AbstractStreamOutput *recycled) const { + AbstractStreamOutput *ret = NULL; unsigned fmt = format; switch(fmt) { case DASHStreamFormat::MP4: - return new BaseStreamOutput(demux, format, "mp4"); + ret = new BaseStreamOutput(demux, format, "mp4", recycled); + break; case DASHStreamFormat::MPEG2TS: - return new BaseStreamOutput(demux, format, "ts"); + ret = new BaseStreamOutput(demux, format, "ts", recycled); + break; } - return NULL; + + delete recycled; + + return ret; } DASHManager::DASHManager(demux_t *demux_, MPD *mpd, diff --git a/modules/demux/dash/DASHManager.h b/modules/demux/dash/DASHManager.h index b86b627..e89998d 100644 --- a/modules/demux/dash/DASHManager.h +++ b/modules/demux/dash/DASHManager.h @@ -37,7 +37,7 @@ namespace dash class DASHStreamOutputFactory : public AbstractStreamOutputFactory { public: - virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const; + virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &, AbstractStreamOutput * = NULL) const; }; class DASHManager : public PlaylistManager diff --git a/modules/demux/hls/HLSStreams.cpp b/modules/demux/hls/HLSStreams.cpp index 999750d..cadcc06 100644 --- a/modules/demux/hls/HLSStreams.cpp +++ b/modules/demux/hls/HLSStreams.cpp @@ -23,28 +23,34 @@ using namespace hls; -AbstractStreamOutput *HLSStreamOutputFactory::create(demux_t *demux, const StreamFormat &format) const +AbstractStreamOutput *HLSStreamOutputFactory::create(demux_t *demux, const StreamFormat &format, + AbstractStreamOutput *recycled) const { + AbstractStreamOutput *ret = NULL; unsigned fmt = format; switch(fmt) { case HLSStreamFormat::PACKEDAAC: - return new HLSPackedStreamOutput(demux, format, "any"); + ret = new HLSPackedStreamOutput(demux, format, "any", recycled); break; case HLSStreamFormat::UNKNOWN: case HLSStreamFormat::MPEG2TS: - return new BaseStreamOutput(demux, format, "ts"); + ret = new BaseStreamOutput(demux, format, "ts", recycled); case HLSStreamFormat::UNSUPPORTED: default: break; } - return NULL; + + delete recycled; + + return ret; } -HLSPackedStreamOutput::HLSPackedStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name) : - BaseStreamOutput(demux, format, name) +HLSPackedStreamOutput::HLSPackedStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name, + AbstractStreamOutput *recycled) : + BaseStreamOutput(demux, format, name, recycled) { b_timestamps_offset_set = false; } diff --git a/modules/demux/hls/HLSStreams.hpp b/modules/demux/hls/HLSStreams.hpp index bdf3da1..1e0b8ba 100644 --- a/modules/demux/hls/HLSStreams.hpp +++ b/modules/demux/hls/HLSStreams.hpp @@ -33,13 +33,15 @@ namespace hls class HLSStreamOutputFactory : public AbstractStreamOutputFactory { public: - virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const; + virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &, + AbstractStreamOutput * = NULL) const; }; class HLSPackedStreamOutput : public BaseStreamOutput { public: - HLSPackedStreamOutput(demux_t *, const StreamFormat &, const std::string &); + HLSPackedStreamOutput(demux_t *, const StreamFormat &, const std::string &, + AbstractStreamOutput * = NULL); virtual void pushBlock(block_t *, bool); /* reimpl */ virtual void setPosition(mtime_t); /* reimpl */ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
