vlc/vlc-1.2 | branch: master | Hugo Beauzée-Luyssen <beauz...@gmail.com> | Fri Dec 30 15:09:32 2011 +0100| [92c43bb6f045a701714aedd06ebc06f828b60dac] | committer: Jean-Baptiste Kempf
dash: Parsing SegmentInfoDefault & SegmentTimeline elements. Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> (cherry picked from commit 6502b3a0c8e16ec4f2216fe037b0a1bd82de979c) Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc/vlc-1.2.git/?a=commit;h=92c43bb6f045a701714aedd06ebc06f828b60dac --- modules/stream_filter/dash/mpd/BasicCMParser.cpp | 98 ++++++++++++++++++++-- modules/stream_filter/dash/mpd/BasicCMParser.h | 5 +- modules/stream_filter/dash/mpd/Group.cpp | 11 +++ modules/stream_filter/dash/mpd/Group.h | 5 + 4 files changed, 109 insertions(+), 10 deletions(-) diff --git a/modules/stream_filter/dash/mpd/BasicCMParser.cpp b/modules/stream_filter/dash/mpd/BasicCMParser.cpp index ae7d4dc..d72334b 100644 --- a/modules/stream_filter/dash/mpd/BasicCMParser.cpp +++ b/modules/stream_filter/dash/mpd/BasicCMParser.cpp @@ -27,6 +27,8 @@ #include "BasicCMParser.h" #include "mpd/ContentDescription.h" +#include "mpd/SegmentInfoDefault.h" +#include "mpd/SegmentTimeline.h" #include <cstdlib> #include <sstream> @@ -149,6 +151,90 @@ void BasicCMParser::setPeriods (Node *root) } } +void BasicCMParser::parseSegmentTimeline(Node *node, SegmentInfoCommon *segmentInfo) +{ + Node* segmentTimelineNode = DOMHelper::getFirstChildElementByName( node, "SegmentTimeline" ); + if ( segmentTimelineNode ) + { + SegmentTimeline *segmentTimeline = new SegmentTimeline; + std::vector<Node*> sNodes = DOMHelper::getChildElementByTagName( segmentTimelineNode, "S" ); + std::vector<Node*>::const_iterator it = sNodes.begin(); + std::vector<Node*>::const_iterator end = sNodes.end(); + + while ( it != end ) + { + SegmentTimeline::Element* s = new SegmentTimeline::Element; + const std::map<std::string, std::string> sAttr = (*it)->getAttributes(); + std::map<std::string, std::string>::const_iterator sIt; + + sIt = sAttr.find( "t" ); + if ( sIt == sAttr.end() ) + { + std::cerr << "'t' attribute is mandatory for every SegmentTimeline/S element" << std::endl; + delete s; + ++it; + continue ; + } + s->t = atoll( sIt->second.c_str() ); + sIt = sAttr.find( "d" ); + if ( sIt == sAttr.end() ) + { + std::cerr << "'d' attribute is mandatory for every SegmentTimeline/S element" << std::endl; + delete s; + ++it; + continue ; + } + s->d = atoll( sIt->second.c_str() ); + sIt = sAttr.find( "r" ); + if ( sIt != sAttr.end() ) + s->r = atoi( sIt->second.c_str() ); + segmentTimeline->addElement( s ); + ++it; + } + segmentInfo->setSegmentTimeline( segmentTimeline ); + } +} + +void BasicCMParser::parseSegmentInfoCommon(Node *node, SegmentInfoCommon *segmentInfo) +{ + const std::map<std::string, std::string> attr = node->getAttributes(); + + const std::vector<Node*> baseUrls = DOMHelper::getChildElementByTagName( node, "BaseURL" ); + if ( baseUrls.size() > 0 ) + { + std::vector<Node*>::const_iterator it = baseUrls.begin(); + std::vector<Node*>::const_iterator end = baseUrls.end(); + while ( it != end ) + { + segmentInfo->appendBaseURL( (*it)->getText() ); + ++it; + } + } + std::map<std::string, std::string>::const_iterator it = attr.begin(); + + this->setInitSegment( node, segmentInfo ); + it = attr.find( "duration" ); + if ( it != attr.end() ) + segmentInfo->setDuration( str_duration( it->second.c_str() ) ); + it = attr.find( "startIndex" ); + if ( it != attr.end() ) + segmentInfo->setStartIndex( atoi( it->second.c_str() ) ); + this->parseSegmentTimeline( node, segmentInfo ); +} + +void BasicCMParser::parseSegmentInfoDefault(Node *node, Group *group) +{ + Node* segmentInfoDefaultNode = DOMHelper::getFirstChildElementByName( node, "SegmentInfoDefault" ); + + if ( segmentInfoDefaultNode != NULL ) + { + SegmentInfoDefault* segInfoDef = new SegmentInfoDefault; + this->parseSegmentInfoCommon( segmentInfoDefaultNode, segInfoDef ); + + group->setSegmentInfoDefault( segInfoDef ); + } +} + void BasicCMParser::setGroups (Node *root, Period *period) { std::vector<Node *> groups = DOMHelper::getElementByTagName(root, "Group", false); @@ -261,19 +347,13 @@ bool BasicCMParser::setSegmentInfo (Node *root, Representation *rep) const std::map<std::string, std::string> attr = segmentInfo->getAttributes(); SegmentInfo *info = new SegmentInfo(); - //Init segment is not mandatory. - this->setInitSegment( segmentInfo, info ); + this->parseSegmentInfoCommon( 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; } @@ -316,7 +396,7 @@ ProgramInformation* BasicCMParser::parseProgramInformation() return pInfo; } -void BasicCMParser::setInitSegment (Node *root, SegmentInfo *info) +void BasicCMParser::setInitSegment (Node *root, SegmentInfoCommon *info) { const std::vector<Node *> initSeg = DOMHelper::getChildElementByTagName(root, "InitialisationSegmentURL"); @@ -327,7 +407,7 @@ void BasicCMParser::setInitSegment (Node *root, SegmentInfo *info) { Segment *seg = new Segment(); parseSegment( seg, initSeg.at(0)->getAttributes() ); - info->setInitSegment( seg ); + info->setInitialisationSegment( seg ); } } diff --git a/modules/stream_filter/dash/mpd/BasicCMParser.h b/modules/stream_filter/dash/mpd/BasicCMParser.h index 0d3328a..e76f577 100644 --- a/modules/stream_filter/dash/mpd/BasicCMParser.h +++ b/modules/stream_filter/dash/mpd/BasicCMParser.h @@ -57,11 +57,14 @@ namespace dash private: bool setMPD (); void setPeriods (dash::xml::Node *root); + void parseSegmentTimeline( xml::Node* node, SegmentInfoCommon *segmentInfo ); + void parseSegmentInfoCommon( xml::Node* node, SegmentInfoCommon *segmentInfo ); + void parseSegmentInfoDefault( xml::Node* node, Group* group ); void setGroups (dash::xml::Node *root, Period *period); void parseTrickMode( dash::xml::Node *node, Representation *repr ); void setRepresentations (dash::xml::Node *root, Group *group); bool setSegmentInfo (dash::xml::Node *root, Representation *rep); - void setInitSegment (dash::xml::Node *root, SegmentInfo *info); + void setInitSegment (dash::xml::Node *root, SegmentInfoCommon *info); bool setSegments (dash::xml::Node *root, SegmentInfo *info); void setMPDBaseUrl (dash::xml::Node *root); void parseContentDescriptor( xml::Node *node, const std::string &name, diff --git a/modules/stream_filter/dash/mpd/Group.cpp b/modules/stream_filter/dash/mpd/Group.cpp index cd1bd1e..0723396 100644 --- a/modules/stream_filter/dash/mpd/Group.cpp +++ b/modules/stream_filter/dash/mpd/Group.cpp @@ -68,6 +68,17 @@ const Representation *Group::getRepresentationById(const std::string &id) const return NULL; } +const SegmentInfoDefault *Group::getSegmentInfoDefault() const +{ + return this->segmentInfoDefault; +} + +void Group::setSegmentInfoDefault(const SegmentInfoDefault *seg) +{ + if ( seg != NULL ) + this->segmentInfoDefault = seg; +} + void Group::addRepresentation (Representation *rep) { this->representations.push_back(rep); diff --git a/modules/stream_filter/dash/mpd/Group.h b/modules/stream_filter/dash/mpd/Group.h index 11ab414..a4e7985 100644 --- a/modules/stream_filter/dash/mpd/Group.h +++ b/modules/stream_filter/dash/mpd/Group.h @@ -36,6 +36,8 @@ namespace dash { namespace mpd { + class SegmentInfoDefault; + class Group : public CommonAttributesElements { public: @@ -46,12 +48,15 @@ namespace dash void setSubsegmentAlignmentFlag( bool alignment ); std::vector<Representation *> getRepresentations (); const Representation* getRepresentationById ( const std::string &id ) const; + const SegmentInfoDefault* getSegmentInfoDefault() const; + void setSegmentInfoDefault( const SegmentInfoDefault* seg ); void addRepresentation( Representation *rep ); private: bool subsegmentAlignmentFlag; std::vector<Representation *> representations; + const SegmentInfoDefault* segmentInfoDefault; }; } } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org http://mailman.videolan.org/listinfo/vlc-commits