vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Wed Dec 10 12:36:55 2014 +0100| [a8a3c8e423bf325b63154887cad0f87dfeeac616] | committer: Francois Cartegnie
stream_filter: dash: add support for SegmentLess representations > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a8a3c8e423bf325b63154887cad0f87dfeeac616 --- modules/stream_filter/dash/mpd/IsoffMainParser.cpp | 38 +++++++++++++++----- modules/stream_filter/dash/mpd/IsoffMainParser.h | 4 +-- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/modules/stream_filter/dash/mpd/IsoffMainParser.cpp b/modules/stream_filter/dash/mpd/IsoffMainParser.cpp index e2f2242..4f751a2 100644 --- a/modules/stream_filter/dash/mpd/IsoffMainParser.cpp +++ b/modules/stream_filter/dash/mpd/IsoffMainParser.cpp @@ -110,17 +110,39 @@ void IsoffMainParser::setRepresentations (Node *adaptationSetNode, Adaptation if(repNode->hasAttribute("mimeType")) currentRepresentation->setMimeType(repNode->getAttributeValue("mimeType")); - this->setSegmentBase(repNode, this->currentRepresentation); - this->setSegmentList(repNode, this->currentRepresentation); + std::vector<Node *> segmentBase = DOMHelper::getElementByTagName(repNode, "SegmentBase", false); + std::vector<Node *> segmentList = DOMHelper::getElementByTagName(repNode, "SegmentList", false); + + setSegmentBase(segmentBase, currentRepresentation); + setSegmentList(segmentList, currentRepresentation); + + if(segmentBase.empty() && segmentList.empty()) + { + /* unranged & segment less representation, add fake segment */ + SegmentList *list = new SegmentList(); + Segment *seg = new Segment(currentRepresentation); + if(list && seg) + { + list->addSegment(seg); + currentRepresentation->setSegmentList(list); + } + else + { + delete seg; + delete list; + } + } + adaptationSet->addRepresentation(this->currentRepresentation); } } -void IsoffMainParser::setSegmentBase (dash::xml::Node *repNode, Representation *rep) +void IsoffMainParser::setSegmentBase (std::vector<Node *> &segmentBase, Representation *rep) { - std::vector<Node *> segmentBase = DOMHelper::getElementByTagName(repNode, "SegmentBase", false); + if(segmentBase.empty()) + return; - if(segmentBase.front()->hasAttribute("indexRange")) + else if(segmentBase.front()->hasAttribute("indexRange")) { SegmentList *list = new SegmentList(); Segment *seg; @@ -151,17 +173,15 @@ void IsoffMainParser::setSegmentBase (dash::xml::Node *repNode, Represent rep->setSegmentBase(base); } } - else if(!segmentBase.empty()) + else { SegmentBase *base = new SegmentBase(); setInitSegment(segmentBase.front(), base); rep->setSegmentBase(base); } } -void IsoffMainParser::setSegmentList (dash::xml::Node *repNode, Representation *rep) +void IsoffMainParser::setSegmentList (std::vector<Node *> &segmentList, Representation *rep) { - std::vector<Node *> segmentList = DOMHelper::getElementByTagName(repNode, "SegmentList", false); - if(segmentList.size() > 0) { SegmentList *list = new SegmentList(); diff --git a/modules/stream_filter/dash/mpd/IsoffMainParser.h b/modules/stream_filter/dash/mpd/IsoffMainParser.h index 01ada0c..a5a1cad 100644 --- a/modules/stream_filter/dash/mpd/IsoffMainParser.h +++ b/modules/stream_filter/dash/mpd/IsoffMainParser.h @@ -53,8 +53,8 @@ namespace dash void setMPDAttributes (); void setAdaptationSets (dash::xml::Node *periodNode, Period *period); void setRepresentations (dash::xml::Node *adaptationSetNode, AdaptationSet *adaptationSet); - void setSegmentBase (dash::xml::Node *repNode, Representation *rep); - void setSegmentList (dash::xml::Node *repNode, Representation *rep); + void setSegmentBase (std::vector<xml::Node *> &, Representation *rep); + void setSegmentList (std::vector<xml::Node *> &, Representation *rep); void setInitSegment (dash::xml::Node *segBaseNode, SegmentBase *base); void setSegments (dash::xml::Node *segListNode, SegmentList *list); }; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits