]> git.sesse.net Git - vlc/commitdiff
demux: dash: compute timelines boundaries
authorFrancois Cartegnie <fcvlcdev@free.fr>
Mon, 12 Jan 2015 18:59:03 +0000 (19:59 +0100)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Mon, 12 Jan 2015 19:21:57 +0000 (20:21 +0100)
modules/demux/dash/mpd/MPD.cpp
modules/demux/dash/mpd/MPD.h
modules/demux/dash/mpd/SegmentTimeline.cpp
modules/demux/dash/mpd/SegmentTimeline.h

index 7baea476a655944b529d923460eda018a25edd63..f55556fa8abf4ed5fc97b011aeca66bb154eb2e5 100644 (file)
@@ -135,6 +135,25 @@ Period* MPD::getNextPeriod(Period *period)
     return NULL;
 }
 
+void MPD::getTimeLinesBoundaries(mtime_t *min, mtime_t *max) const
+{
+    *min = *max = 0;
+    for(size_t i = 0; i < periods.size(); i++)
+    {
+        std::vector<SegmentTimeline *> timelines;
+        periods.at(i)->collectTimelines(&timelines);
+
+        for(size_t j = 0; j < timelines.size(); j++)
+        {
+            const SegmentTimeline *timeline = timelines.at(j);
+            if(timeline->start() > *min)
+                *min = timeline->start();
+            if(!*max || timeline->end() < *max)
+                *max = timeline->end();
+        }
+    }
+}
+
 void MPD::mergeWith(MPD *updatedMPD)
 {
     availabilityEndTime.Set(updatedMPD->availabilityEndTime.Get());
index 8e3e8bda7d7224c122d9922e9f4e66a40477e99d..d3908e1d558cec9605dccfa219cf71f47cfe5f02 100644 (file)
@@ -61,6 +61,7 @@ namespace dash
                 virtual Period*                         getNextPeriod(Period *period);
 
                 void                mergeWith(MPD *);
+                void                getTimeLinesBoundaries(mtime_t *, mtime_t *) const;
 
                 Property<time_t>                    duration;
                 Property<time_t>                    playbackStart;
index d7140c037989b303a5839652065df0b5ce944900..e67cae0cfec00dd57f4b4ca0209117969d245d2a 100644 (file)
@@ -176,6 +176,22 @@ void SegmentTimeline::mergeWith(SegmentTimeline &other)
     }
 }
 
+mtime_t SegmentTimeline::start() const
+{
+    if(elements.empty())
+        return 0;
+    return CLOCK_FREQ * elements.front()->t / inheritTimescale();
+}
+
+mtime_t SegmentTimeline::end() const
+{
+    if(elements.empty())
+        return 0;
+    const Element *last = elements.back();
+    mtime_t scaled = last->t + last->d * (last->r + 1);
+    return CLOCK_FREQ * scaled / inheritTimescale();
+}
+
 SegmentTimeline::Element::Element(mtime_t d_, uint64_t r_, mtime_t t_)
 {
     d = d_;
index fec27712ccb969cc87100de7285e0f4a048b6c99..3d40c18764fcf6fa02ada7e1dd8317e405ee02c2 100644 (file)
@@ -43,6 +43,8 @@ namespace dash
                 mtime_t getScaledPlaybackTimeByElementNumber(uint64_t) const;
                 size_t prune(mtime_t);
                 void mergeWith(SegmentTimeline &);
+                mtime_t start() const;
+                mtime_t end() const;
 
             private:
                 std::list<Element *> elements;