vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Wed Nov 26 22:25:04 2014 +0100| [e9a42b2dffa3c606a38ee90b3b8ecd54bb58843b] | committer: Francois Cartegnie
stream_filter: dash: use dedicated segment classes and improve debug > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e9a42b2dffa3c606a38ee90b3b8ecd54bb58843b --- modules/stream_filter/dash/mpd/BasicCMParser.cpp | 7 +- modules/stream_filter/dash/mpd/IsoffMainParser.cpp | 9 ++- modules/stream_filter/dash/mpd/Segment.cpp | 74 +++++++++++++++----- modules/stream_filter/dash/mpd/Segment.h | 33 +++++++-- 4 files changed, 97 insertions(+), 26 deletions(-) diff --git a/modules/stream_filter/dash/mpd/BasicCMParser.cpp b/modules/stream_filter/dash/mpd/BasicCMParser.cpp index 6470716..d02839b 100644 --- a/modules/stream_filter/dash/mpd/BasicCMParser.cpp +++ b/modules/stream_filter/dash/mpd/BasicCMParser.cpp @@ -369,7 +369,12 @@ Segment* BasicCMParser::parseSegment( Node* node, bool init ) seg = new SegmentTemplate( runtimeToken, this->currentRepresentation ); } else - seg = new Segment( this->currentRepresentation, init ); + { + if ( init ) + seg = new InitSegment( currentRepresentation ); + else + seg = new Segment( currentRepresentation ); + } if ( url.find( this->p_stream->psz_access ) != 0 ) //Relative url url = this->url + url; seg->setSourceUrl( url ); diff --git a/modules/stream_filter/dash/mpd/IsoffMainParser.cpp b/modules/stream_filter/dash/mpd/IsoffMainParser.cpp index 9f9f53b..0a15f1a 100644 --- a/modules/stream_filter/dash/mpd/IsoffMainParser.cpp +++ b/modules/stream_filter/dash/mpd/IsoffMainParser.cpp @@ -123,17 +123,22 @@ void IsoffMainParser::setSegmentBase (dash::xml::Node *repNode, Represent if(segmentBase.front()->hasAttribute("indexRange")) { SegmentList *list = new SegmentList(); - Segment *seg = new Segment(rep); + Segment *seg; size_t start = 0, end = 0; if (std::sscanf(segmentBase.front()->getAttributeValue("indexRange").c_str(), "%"PRIu64"-%"PRIu64, &start, &end) == 2) { + seg = new IndexSegment(rep); seg->setByteRange(start, end); list->addSegment(seg); /* index must be before data, so data starts at index end */ seg = new Segment(rep); seg->setByteRange(end + 1, 0); } + else + { + seg = new Segment(rep); + } list->addSegment(seg); rep->setSegmentList(list); @@ -174,7 +179,7 @@ void IsoffMainParser::setInitSegment (dash::xml::Node *segBaseNode, Segme if(initSeg.size() > 0) { - Segment *seg = new Segment( currentRepresentation, true ); + Segment *seg = new InitSegment( currentRepresentation ); seg->setSourceUrl(initSeg.at(0)->getAttributeValue("sourceURL")); if(initSeg.at(0)->hasAttribute("range")) diff --git a/modules/stream_filter/dash/mpd/Segment.cpp b/modules/stream_filter/dash/mpd/Segment.cpp index 24cf130..1dc20e8 100644 --- a/modules/stream_filter/dash/mpd/Segment.cpp +++ b/modules/stream_filter/dash/mpd/Segment.cpp @@ -38,12 +38,17 @@ ISegment::ISegment(const ICanonicalUrl *parent): startByte (0), endByte (0) { + debugName = "Segment"; +} +dash::http::Chunk * ISegment::getChunk() +{ + return new SegmentChunk(this); } dash::http::Chunk* ISegment::toChunk() { - Chunk *chunk = new SegmentChunk(this); + Chunk *chunk = getChunk(); if (!chunk) return NULL; @@ -75,11 +80,15 @@ void ISegment::setByteRange(size_t start, size_t end) std::string ISegment::toString() const { - return std::string(" Segment url=").append(getUrlSegment()); + std::stringstream ss(" "); + ss << debugName << " url=" << getUrlSegment(); + if(startByte!=endByte) + ss << " @" << startByte << ".." << endByte; + return ss.str(); } ISegment::SegmentChunk::SegmentChunk(ISegment *segment_) : - Chunk() + dash::http::Chunk() { segment = segment_; } @@ -89,11 +98,9 @@ void ISegment::SegmentChunk::onDownload(void *, size_t) } -Segment::Segment(Representation *parent, bool isinit, bool tosplit) : +Segment::Segment(Representation *parent) : ISegment(parent), - parentRepresentation( parent ), - init( isinit ), - needssplit( tosplit ) + parentRepresentation( parent ) { assert( parent != NULL ); if ( parent->getSegmentInfo() != NULL && parent->getSegmentInfo()->getDuration() >= 0 ) @@ -115,14 +122,28 @@ void Segment::setSourceUrl ( const std::string &url ) this->sourceUrl = url; } -bool Segment::needsSplit() const +Representation *Segment::getRepresentation() const { - return needssplit; + return parentRepresentation; } -Representation *Segment::getRepresentation() const + +std::string Segment::toString() const { - return parentRepresentation; + if (subsegments.empty()) + { + return ISegment::toString(); + } + else + { + std::string ret; + std::vector<SubSegment *>::const_iterator l; + for(l = subsegments.begin(); l != subsegments.end(); l++) + { + ret.append( (*l)->toString() ); + } + return ret; + } } std::string Segment::getUrlSegment() const @@ -157,19 +178,38 @@ std::vector<ISegment*> Segment::subSegments() return list; } -std::string Segment::toString() const +InitSegment::InitSegment(Representation *parent) : + Segment(parent) +{ + debugName = "InitSegment"; +} + +IndexSegment::IndexSegment(Representation *parent) : + Segment(parent) +{ + debugName = "IndexSegment"; +} + +dash::http::Chunk * IndexSegment::getChunk() +{ + return new IndexSegmentChunk(this); +} + +IndexSegment::IndexSegmentChunk::IndexSegmentChunk(ISegment *segment) + : SegmentChunk(segment) +{ + +} + +void IndexSegment::IndexSegmentChunk::onDownload(void *buffer, size_t size) { - if (init) - return std::string(" InitSeg url=") - .append(getUrlSegment()); - else - return ISegment::toString(); } SubSegment::SubSegment(Segment *main, size_t start, size_t end) : ISegment(main), parent(main) { setByteRange(start, end); + debugName = "SubSegment"; } std::string SubSegment::getUrlSegment() const diff --git a/modules/stream_filter/dash/mpd/Segment.h b/modules/stream_filter/dash/mpd/Segment.h index 404471c..7c94124 100644 --- a/modules/stream_filter/dash/mpd/Segment.h +++ b/modules/stream_filter/dash/mpd/Segment.h @@ -60,6 +60,7 @@ namespace dash protected: size_t startByte; size_t endByte; + std::string debugName; class SegmentChunk : public dash::http::Chunk { @@ -67,33 +68,53 @@ namespace dash SegmentChunk(ISegment *segment); virtual void onDownload(void *, size_t); - private: + protected: ISegment *segment; }; + + virtual dash::http::Chunk * getChunk(); }; class Segment : public ISegment { public: - Segment( Representation *parent, bool isinit = false, bool tosplit = false ); + Segment( Representation *parent ); ~Segment(); virtual void setSourceUrl( const std::string &url ); - virtual bool needsSplit() const; virtual std::string getUrlSegment() const; /* impl */ virtual dash::http::Chunk* toChunk(); virtual std::vector<ISegment*> subSegments(); - virtual std::string toString() const; virtual Representation* getRepresentation() const; protected: Representation* parentRepresentation; - bool init; - bool needssplit; std::vector<SubSegment *> subsegments; std::string sourceUrl; int size; }; + class InitSegment : public Segment + { + public: + InitSegment( Representation *parent ); + }; + + class IndexSegment : public Segment + { + public: + IndexSegment( Representation *parent ); + + protected: + class IndexSegmentChunk : public SegmentChunk + { + public: + IndexSegmentChunk(ISegment *segment); + virtual void onDownload(void *, size_t); + }; + + virtual dash::http::Chunk * getChunk(); + }; + class SubSegment : public ISegment { public: _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits