vlc/vlc-1.2 | branch: master | Hugo Beauzée-Luyssen <beauz...@gmail.com> | Sat Dec 24 14:31:04 2011 +0100| [09ffaf1884fcff969ef8442db5ea5bbeddec3245] | committer: Jean-Baptiste Kempf
dash: Reworking SemgentInfo parsing Elements/attributes are now parsed once, and not everytime a getter is called. Also, mandatory elements are now checked, also at parsing time. Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> (cherry picked from commit b412a1269212314e3e76dc1b0ee42e09164ad1b0) Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc/vlc-1.2.git/?a=commit;h=09ffaf1884fcff969ef8442db5ea5bbeddec3245 --- modules/stream_filter/dash/mpd/BasicCMParser.cpp | 51 ++++++++++++++++----- modules/stream_filter/dash/mpd/BasicCMParser.h | 4 +- modules/stream_filter/dash/mpd/SegmentInfo.cpp | 26 +++++++---- modules/stream_filter/dash/mpd/SegmentInfo.h | 10 +++-- 4 files changed, 64 insertions(+), 27 deletions(-) diff --git a/modules/stream_filter/dash/mpd/BasicCMParser.cpp b/modules/stream_filter/dash/mpd/BasicCMParser.cpp index 6c37dc8..339406a 100644 --- a/modules/stream_filter/dash/mpd/BasicCMParser.cpp +++ b/modules/stream_filter/dash/mpd/BasicCMParser.cpp @@ -30,6 +30,9 @@ #include <cstdlib> #include <sstream> +#include <vlc_common.h> +#include <vlc_strings.h> + using namespace dash::mpd; using namespace dash::xml; @@ -133,9 +136,12 @@ void BasicCMParser::setRepresentations (Node *root, Group *group) if ( it != attributes.end() ) this->handleDependencyId( rep, group, it->second ); - this->setSegmentInfo(representations.at(i), rep); - if ( rep->getSegmentInfo() && rep->getSegmentInfo()->getSegments().size() > 0 ) - group->addRepresentation(rep); + if ( this->setSegmentInfo(representations.at(i), rep) == false ) + { + delete rep; + continue ; + } + group->addRepresentation(rep); } } @@ -154,39 +160,60 @@ void BasicCMParser::handleDependencyId( Representation *rep, const Group *gro } } -void BasicCMParser::setSegmentInfo (Node *root, Representation *rep) +bool BasicCMParser::setSegmentInfo (Node *root, Representation *rep) { Node *segmentInfo = DOMHelper::getFirstChildElementByName( root, "SegmentInfo"); if ( segmentInfo ) { - SegmentInfo *info = new SegmentInfo( segmentInfo->getAttributes() ); + const std::map<std::string, std::string> attr = segmentInfo->getAttributes(); + + SegmentInfo *info = new SegmentInfo(); + //Init segment is not mandatory. this->setInitSegment( segmentInfo, info ); - this->setSegments(segmentInfo, info ); + //If we don't have any segment, there's no point keeping this SegmentInfo. + if ( this->setSegments(segmentInfo, info ) == false ) + { + delete info; + return false; + } + std::map<std::string, std::string>::const_iterator it; + it = attr.find( "duration" ); + if ( it != attr.end() ) + info->setDuration( str_duration( it->second.c_str() ) ); + rep->setSegmentInfo(info); + return true; } + return false; } void BasicCMParser::setInitSegment (Node *root, SegmentInfo *info) { - std::vector<Node *> initSeg = DOMHelper::getChildElementByTagName(root, "InitialisationSegmentURL"); + const std::vector<Node *> initSeg = DOMHelper::getChildElementByTagName(root, "InitialisationSegmentURL"); - for(size_t i = 0; i < initSeg.size(); i++) + if ( initSeg.size() > 1 ) + std::cerr << "There could be at most one InitialisationSegmentURL per SegmentInfo" + " other InitialisationSegmentURL will be dropped." << std::endl; + if ( initSeg.size() == 1 ) { - InitSegment *seg = new InitSegment(initSeg.at(i)->getAttributes()); - info->setInitSegment(seg); - return; + InitSegment *seg = new InitSegment( initSeg.at(0)->getAttributes() ); + info->setInitSegment( seg ); } } -void BasicCMParser::setSegments (Node *root, SegmentInfo *info) + +bool BasicCMParser::setSegments (Node *root, SegmentInfo *info) { std::vector<Node *> segments = DOMHelper::getElementByTagName(root, "Url", false); + if ( segments.size() == 0 ) + return false; for(size_t i = 0; i < segments.size(); i++) { Segment *seg = new Segment(segments.at(i)->getAttributes()); info->addSegment(seg); } + return true; } MPD* BasicCMParser::getMPD () { diff --git a/modules/stream_filter/dash/mpd/BasicCMParser.h b/modules/stream_filter/dash/mpd/BasicCMParser.h index 2c867dc..dbc80eb 100644 --- a/modules/stream_filter/dash/mpd/BasicCMParser.h +++ b/modules/stream_filter/dash/mpd/BasicCMParser.h @@ -61,9 +61,9 @@ namespace dash void setPeriods (dash::xml::Node *root); void setGroups (dash::xml::Node *root, Period *period); void setRepresentations (dash::xml::Node *root, Group *group); - void setSegmentInfo (dash::xml::Node *root, Representation *rep); + bool setSegmentInfo (dash::xml::Node *root, Representation *rep); void setInitSegment (dash::xml::Node *root, SegmentInfo *info); - void setSegments (dash::xml::Node *root, SegmentInfo *info); + bool setSegments (dash::xml::Node *root, SegmentInfo *info); void setMPDBaseUrl (dash::xml::Node *root); bool parseCommonAttributesElements( dash::xml::Node *node, CommonAttributesElements *common ) const; }; diff --git a/modules/stream_filter/dash/mpd/SegmentInfo.cpp b/modules/stream_filter/dash/mpd/SegmentInfo.cpp index c7d7126..6c60142 100644 --- a/modules/stream_filter/dash/mpd/SegmentInfo.cpp +++ b/modules/stream_filter/dash/mpd/SegmentInfo.cpp @@ -30,9 +30,9 @@ using namespace dash::mpd; using namespace dash::exception; -SegmentInfo::SegmentInfo( const std::map<std::string,std::string>& attr) : - attributes( attr ), - initSeg( NULL ) +SegmentInfo::SegmentInfo() : + initSeg( NULL ), + duration( -1 ) { } @@ -44,14 +44,16 @@ SegmentInfo::~SegmentInfo () delete(this->initSeg); } -InitSegment* SegmentInfo::getInitSegment () throw(ElementNotPresentException) +InitSegment* SegmentInfo::getInitSegment() const { - if(this->initSeg == NULL) - throw ElementNotPresentException(); - return this->initSeg; } +void SegmentInfo::setInitSegment( InitSegment *initSeg ) +{ + this->initSeg = initSeg; +} + const std::vector<Segment*>& SegmentInfo::getSegments () const { return this->segments; @@ -62,7 +64,13 @@ void SegmentInfo::addSegment (Segment *seg) this->segments.push_back(seg); } -void SegmentInfo::setInitSegment (InitSegment *initSeg) +time_t SegmentInfo::getDuration() const { - this->initSeg = initSeg; + return this->duration; +} + +void SegmentInfo::setDuration( time_t duration ) +{ + if ( duration >= 0 ) + this->duration = duration; } diff --git a/modules/stream_filter/dash/mpd/SegmentInfo.h b/modules/stream_filter/dash/mpd/SegmentInfo.h index 120ec14..b96a054 100644 --- a/modules/stream_filter/dash/mpd/SegmentInfo.h +++ b/modules/stream_filter/dash/mpd/SegmentInfo.h @@ -40,17 +40,19 @@ namespace dash class SegmentInfo { public: - SegmentInfo ( const std::map<std::string, std::string>& attr); + SegmentInfo (); virtual ~SegmentInfo (); - InitSegment* getInitSegment () throw(dash::exception::ElementNotPresentException); + InitSegment* getInitSegment() const; + void setInitSegment( InitSegment *seg ); + time_t getDuration() const; + void setDuration( time_t duration ); const std::vector<Segment *>& getSegments () const; - void setInitSegment (InitSegment *initSeg); void addSegment (Segment *seg); private: - std::map<std::string, std::string> attributes; InitSegment *initSeg; + time_t duration; std::vector<Segment *> segments; }; } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org http://mailman.videolan.org/listinfo/vlc-commits