]> git.sesse.net Git - vlc/commitdiff
stream_filter: dash: support Base/Range only segments
authorFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 20 Nov 2014 12:09:14 +0000 (13:09 +0100)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 18 Dec 2014 20:23:49 +0000 (21:23 +0100)
modules/stream_filter/dash/mpd/IsoffMainParser.cpp

index f303beb2596371dace48100ac383ec4aea888d55..c82a795b573df4fb188b908c6a31e93c9529fa4b 100644 (file)
@@ -29,6 +29,8 @@
 #include "IsoffMainParser.h"
 #include "xml/DOMHelper.h"
 #include <vlc_strings.h>
+#include <vlc_stream.h>
+#include <cstdio>
 
 using namespace dash::mpd;
 using namespace dash::xml;
@@ -105,14 +107,41 @@ void    IsoffMainParser::setRepresentations (Node *adaptationSetNode, Adaptation
         adaptationSet->addRepresentation(this->currentRepresentation);
     }
 }
+
 void    IsoffMainParser::setSegmentBase     (dash::xml::Node *repNode, Representation *rep)
 {
     std::vector<Node *> segmentBase = DOMHelper::getElementByTagName(repNode, "SegmentBase", false);
 
-    if(segmentBase.size() > 0)
+    if(segmentBase.front()->hasAttribute("indexRange"))
+    {
+        SegmentList *list = new SegmentList();
+        Segment *seg = new Segment(rep);
+
+        size_t start = 0, end = 0;
+        if (std::sscanf(segmentBase.front()->getAttributeValue("indexRange").c_str(), "%"PRIu64"-%"PRIu64, &start, &end) == 2)
+        {
+            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);
+        }
+
+        list->addSegment(seg);
+        rep->setSegmentList(list);
+
+        std::vector<Node *> initSeg = DOMHelper::getElementByTagName(segmentBase.front(), "Initialization", false);
+        if(!initSeg.empty())
+        {
+            SegmentBase *base = new SegmentBase();
+            setInitSegment(segmentBase.front(), base);
+            rep->setSegmentBase(base);
+        }
+    }
+    else if(!segmentBase.empty())
     {
         SegmentBase *base = new SegmentBase();
-        this->setInitSegment(segmentBase.at(0), base);
+        setInitSegment(segmentBase.front(), base);
         rep->setSegmentBase(base);
     }
 }