vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Feb 21 12:36:03 2018 +0100| [7bbd00f21e68b640a5a61ac4a8f9a5f0c9ca0827] | committer: Francois Cartegnie
demux: adaptive: refactor demux creation with factory interface > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7bbd00f21e68b640a5a61ac4a8f9a5f0c9ca0827 --- modules/demux/adaptive/Streams.cpp | 35 ++++++++++++++ modules/demux/adaptive/Streams.hpp | 7 ++- modules/demux/adaptive/plumbing/Demuxer.hpp | 6 +++ modules/demux/dash/DASHStream.cpp | 19 ++------ modules/demux/dash/DASHStream.hpp | 3 +- modules/demux/hls/HLSStreams.cpp | 74 +++++++++++++---------------- modules/demux/hls/HLSStreams.hpp | 3 +- modules/demux/smooth/SmoothStream.cpp | 26 ++-------- modules/demux/smooth/SmoothStream.hpp | 3 +- 9 files changed, 95 insertions(+), 81 deletions(-) diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index 06756fdd01..6bdd2139ae 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -561,6 +561,41 @@ void AbstractStream::setTimeOffset(mtime_t i_offset) } } +AbstractDemuxer * AbstractStream::createDemux(const StreamFormat &format) +{ + AbstractDemuxer *ret = newDemux( p_realdemux, format, + fakeesout->getEsOut(), demuxersource ); + if(ret && !ret->create()) + { + delete ret; + ret = NULL; + } + else commandsqueue->Commit(); + + return ret; +} + +AbstractDemuxer *AbstractStream::newDemux(demux_t *p_realdemux, const StreamFormat &format, + es_out_t *out, AbstractSourceStream *source) const +{ + AbstractDemuxer *ret = NULL; + switch((unsigned)format) + { + case StreamFormat::MP4: + ret = new Demuxer(p_realdemux, "mp4", out, source); + break; + + case StreamFormat::MPEG2TS: + ret = new Demuxer(p_realdemux, "ts", out, source); + break; + + default: + case StreamFormat::UNSUPPORTED: + break; + } + return ret; +} + void AbstractStream::trackerEvent(const SegmentTrackerEvent &event) { switch(event.type) diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp index b6c188d081..0e1ca07b4e 100644 --- a/modules/demux/adaptive/Streams.hpp +++ b/modules/demux/adaptive/Streams.hpp @@ -51,7 +51,8 @@ namespace adaptive class AbstractStream : public ChunksSource, public ExtraFMTInfoInterface, - public SegmentTrackerListenerInterface + public SegmentTrackerListenerInterface, + public DemuxerFactoryInterface { public: AbstractStream(demux_t *); @@ -100,7 +101,9 @@ namespace adaptive bool seekAble() const; virtual void setTimeOffset(mtime_t); virtual block_t *checkBlock(block_t *, bool) = 0; - virtual AbstractDemuxer * createDemux(const StreamFormat &) = 0; + AbstractDemuxer * createDemux(const StreamFormat &); + virtual AbstractDemuxer * newDemux(demux_t *, const StreamFormat &, + es_out_t *, AbstractSourceStream *) const; /* impl */ virtual bool startDemux(); virtual bool restartDemux(); diff --git a/modules/demux/adaptive/plumbing/Demuxer.hpp b/modules/demux/adaptive/plumbing/Demuxer.hpp index 3e9b8b9182..15f79d6da9 100644 --- a/modules/demux/adaptive/plumbing/Demuxer.hpp +++ b/modules/demux/adaptive/plumbing/Demuxer.hpp @@ -81,6 +81,12 @@ namespace adaptive mtime_t length; }; + class DemuxerFactoryInterface + { + public: + virtual AbstractDemuxer * newDemux(demux_t *, const StreamFormat &, + es_out_t *, AbstractSourceStream *) const = 0; + }; } #endif // DEMUXER_HPP diff --git a/modules/demux/dash/DASHStream.cpp b/modules/demux/dash/DASHStream.cpp index 551ae45612..307178de4d 100644 --- a/modules/demux/dash/DASHStream.cpp +++ b/modules/demux/dash/DASHStream.cpp @@ -35,25 +35,23 @@ block_t * DASHStream::checkBlock(block_t *p_block, bool) return p_block; } -AbstractDemuxer * DASHStream::createDemux(const StreamFormat &format) +AbstractDemuxer *DASHStream::newDemux(demux_t *p_realdemux, const StreamFormat &format, + es_out_t *out, AbstractSourceStream *source) const { AbstractDemuxer *ret = NULL; switch((unsigned)format) { case StreamFormat::MP4: - ret = new Demuxer(p_realdemux, "mp4", fakeesout->getEsOut(), demuxersource); - break; - case StreamFormat::MPEG2TS: - ret = new Demuxer(p_realdemux, "ts", fakeesout->getEsOut(), demuxersource); + ret = AbstractStream::newDemux(p_realdemux, format, out, source); break; case StreamFormat::WEBVTT: - ret = new SlaveDemuxer(p_realdemux, "webvtt", fakeesout->getEsOut(), demuxersource); + ret = new SlaveDemuxer(p_realdemux, "webvtt", out, source); break; case StreamFormat::TTML: - ret = new SlaveDemuxer(p_realdemux, "ttml", fakeesout->getEsOut(), demuxersource); + ret = new SlaveDemuxer(p_realdemux, "ttml", out, source); break; default: @@ -61,13 +59,6 @@ AbstractDemuxer * DASHStream::createDemux(const StreamFormat &format) break; } - if(ret && !ret->create()) - { - delete ret; - ret = NULL; - } - else commandsqueue->Commit(); - return ret; } diff --git a/modules/demux/dash/DASHStream.hpp b/modules/demux/dash/DASHStream.hpp index b8ba6e5961..946615f51b 100644 --- a/modules/demux/dash/DASHStream.hpp +++ b/modules/demux/dash/DASHStream.hpp @@ -33,7 +33,8 @@ namespace dash protected: virtual block_t *checkBlock(block_t *, bool); /* impl */ - virtual AbstractDemuxer * createDemux(const StreamFormat &); /* impl */ + virtual AbstractDemuxer * newDemux(demux_t *, const StreamFormat &, + es_out_t *, AbstractSourceStream *) const; /* reimpl */ }; class DASHStreamFactory : public AbstractStreamFactory diff --git a/modules/demux/hls/HLSStreams.cpp b/modules/demux/hls/HLSStreams.cpp index c54c7fee27..3f5d4dccb5 100644 --- a/modules/demux/hls/HLSStreams.cpp +++ b/modules/demux/hls/HLSStreams.cpp @@ -67,47 +67,6 @@ void HLSStream::setTimeOffset(mtime_t i_offset) AbstractStream::setTimeOffset(i_offset); } -AbstractDemuxer * HLSStream::createDemux(const StreamFormat &format) -{ - AbstractDemuxer *ret = NULL; - switch((unsigned)format) - { - - case StreamFormat::PACKEDAAC: - ret = new Demuxer(p_realdemux, "aac", fakeesout->getEsOut(), demuxersource); - break; - - case StreamFormat::MPEG2TS: - ret = new Demuxer(p_realdemux, "ts", fakeesout->getEsOut(), demuxersource); - if(ret) - ret->setCanDetectSwitches(false); /* HLS and unique PAT/PMT versions */ - break; - - case StreamFormat::MP4: - ret = new Demuxer(p_realdemux, "mp4", fakeesout->getEsOut(), demuxersource); - break; - - case StreamFormat::WEBVTT: - ret = new Demuxer(p_realdemux, "webvttstream", fakeesout->getEsOut(), demuxersource); - if(ret) - ret->setRestartsOnEachSegment(true); - break; - - default: - case StreamFormat::UNSUPPORTED: - break; - } - - if(ret && !ret->create()) - { - delete ret; - ret = NULL; - } - else commandsqueue->Commit(); - - return ret; -} - int HLSStream::ParseID3PrivTag(const uint8_t *p_payload, size_t i_payload) { if(i_payload == 53 && @@ -163,6 +122,39 @@ block_t * HLSStream::checkBlock(block_t *p_block, bool b_first) return p_block; } +AbstractDemuxer *HLSStream::newDemux(demux_t *p_realdemux, const StreamFormat &format, + es_out_t *out, AbstractSourceStream *source) const +{ + AbstractDemuxer *ret = NULL; + switch((unsigned)format) + { + case StreamFormat::PACKEDAAC: + ret = new Demuxer(p_realdemux, "aac", out, source); + break; + + case StreamFormat::MPEG2TS: + ret = new Demuxer(p_realdemux, "ts", out, source); + if(ret) + ret->setCanDetectSwitches(false); /* HLS and unique PAT/PMT versions */ + break; + + case StreamFormat::MP4: + ret = AbstractStream::newDemux(p_realdemux, format, out, source); + break; + + case StreamFormat::WEBVTT: + ret = new Demuxer(p_realdemux, "webvttstream", out, source); + if(ret) + ret->setRestartsOnEachSegment(true); + break; + + default: + case StreamFormat::UNSUPPORTED: + break; + } + return ret; +} + AbstractStream * HLSStreamFactory::create(demux_t *realdemux, const StreamFormat &, SegmentTracker *tracker, AbstractConnectionManager *manager) const { diff --git a/modules/demux/hls/HLSStreams.hpp b/modules/demux/hls/HLSStreams.hpp index ab067f71b8..669c54cdfe 100644 --- a/modules/demux/hls/HLSStreams.hpp +++ b/modules/demux/hls/HLSStreams.hpp @@ -33,9 +33,10 @@ namespace hls virtual ~HLSStream(); protected: - virtual AbstractDemuxer * createDemux(const StreamFormat &); /* reimpl */ virtual void setTimeOffset(mtime_t); /* reimpl */ virtual block_t *checkBlock(block_t *, bool); /* reimpl */ + virtual AbstractDemuxer * newDemux(demux_t *, const StreamFormat &, + es_out_t *, AbstractSourceStream *) const; /* reimpl */ private: static int ID3TAG_Parse_Handler(uint32_t, const uint8_t *, size_t, void *); diff --git a/modules/demux/smooth/SmoothStream.cpp b/modules/demux/smooth/SmoothStream.cpp index 01864c1432..7ebe886c88 100644 --- a/modules/demux/smooth/SmoothStream.cpp +++ b/modules/demux/smooth/SmoothStream.cpp @@ -31,28 +31,12 @@ SmoothStream::SmoothStream(demux_t *demux) { } -AbstractDemuxer * SmoothStream::createDemux(const StreamFormat &format) +AbstractDemuxer *SmoothStream::newDemux(demux_t *p_realdemux, const StreamFormat &format, + es_out_t *out, AbstractSourceStream *source) const { - AbstractDemuxer *ret = NULL; - switch((unsigned)format) - { - case StreamFormat::MP4: - ret = new Demuxer(p_realdemux, "mp4", fakeesout->getEsOut(), demuxersource); - break; - - default: - case StreamFormat::UNSUPPORTED: - break; - } - - if(ret && !ret->create()) - { - delete ret; - ret = NULL; - } - else commandsqueue->Commit(); - - return ret; + if((unsigned)format != StreamFormat::MP4) + return NULL; + return AbstractStream::newDemux(p_realdemux, format, out, source); } block_t * SmoothStream::checkBlock(block_t *p_block, bool) diff --git a/modules/demux/smooth/SmoothStream.hpp b/modules/demux/smooth/SmoothStream.hpp index d3af79fdb7..69fdfba18d 100644 --- a/modules/demux/smooth/SmoothStream.hpp +++ b/modules/demux/smooth/SmoothStream.hpp @@ -32,8 +32,9 @@ namespace smooth SmoothStream(demux_t *); protected: - virtual AbstractDemuxer * createDemux(const StreamFormat &); /* impl */ virtual block_t *checkBlock(block_t *, bool) /* impl */; + virtual AbstractDemuxer * newDemux(demux_t *, const StreamFormat &, + es_out_t *, AbstractSourceStream *) const; /* reimpl */ }; class SmoothStreamFactory : public AbstractStreamFactory _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
