[vlc-commits] demux: adaptive: return both playback time and duration in same method

Francois Cartegnie git at videolan.org
Fri Jun 10 16:07:22 CEST 2016


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jun  1 16:05:42 2016 +0200| [69bf846cb3862520a5d90d397341a658c86e3922] | committer: Francois Cartegnie

demux: adaptive: return both playback time and duration in same method

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=69bf846cb3862520a5d90d397341a658c86e3922
---

 modules/demux/adaptive/SegmentTracker.cpp          |   11 ++++++---
 .../demux/adaptive/playlist/SegmentInformation.cpp |   26 ++++++++++++--------
 .../demux/adaptive/playlist/SegmentInformation.hpp |    2 +-
 modules/demux/adaptive/playlist/SegmentList.cpp    |   23 +++++++++++------
 modules/demux/adaptive/playlist/SegmentList.h      |    2 +-
 .../demux/adaptive/playlist/SegmentTimeline.cpp    |   17 +++++++++++--
 modules/demux/adaptive/playlist/SegmentTimeline.h  |    1 +
 7 files changed, 56 insertions(+), 26 deletions(-)

diff --git a/modules/demux/adaptive/SegmentTracker.cpp b/modules/demux/adaptive/SegmentTracker.cpp
index 118a417..e0d209b 100644
--- a/modules/demux/adaptive/SegmentTracker.cpp
+++ b/modules/demux/adaptive/SegmentTracker.cpp
@@ -252,10 +252,13 @@ void SegmentTracker::setPositionByNumber(uint64_t segnumber, bool restarted)
 
 mtime_t SegmentTracker::getPlaybackTime() const
 {
-    if(curRepresentation)
-        return curRepresentation->getPlaybackTimeBySegmentNumber(next);
-    else
-        return 0;
+    mtime_t time, duration;
+    if(curRepresentation &&
+       curRepresentation->getPlaybackTimeDurationBySegmentNumber(next, &time, &duration))
+    {
+        return time;
+    }
+    return 0;
 }
 
 mtime_t SegmentTracker::getMinAheadTime() const
diff --git a/modules/demux/adaptive/playlist/SegmentInformation.cpp b/modules/demux/adaptive/playlist/SegmentInformation.cpp
index e1a65a0..51e33a0 100644
--- a/modules/demux/adaptive/playlist/SegmentInformation.cpp
+++ b/modules/demux/adaptive/playlist/SegmentInformation.cpp
@@ -329,31 +329,36 @@ bool SegmentInformation::getSegmentNumberByTime(mtime_t time, uint64_t *ret) con
         return false;
 }
 
-mtime_t SegmentInformation::getPlaybackTimeBySegmentNumber(uint64_t number) const
+bool SegmentInformation::getPlaybackTimeDurationBySegmentNumber(uint64_t number,
+                                                                mtime_t *time, mtime_t *duration) const
 {
     SegmentList *segList;
     MediaSegmentTemplate *mediaTemplate;
-    mtime_t time = 0;
+
     if( (mediaTemplate = inheritSegmentTemplate()) )
     {
         uint64_t timescale = mediaTemplate->inheritTimescale();
+        stime_t stime, sduration;
         if(mediaTemplate->segmentTimeline.Get())
         {
-            time = mediaTemplate->segmentTimeline.Get()->
-                    getScaledPlaybackTimeByElementNumber(number);
+            mediaTemplate->segmentTimeline.Get()->
+                getScaledPlaybackTimeDurationBySegmentNumber(number, &stime, &sduration);
         }
         else
         {
-            time = number * mediaTemplate->duration.Get();
+            stime = number * mediaTemplate->duration.Get();
+            sduration = mediaTemplate->duration.Get();
         }
-        time = CLOCK_FREQ * time / timescale;
+        *time = CLOCK_FREQ * stime / timescale;
+        *duration = CLOCK_FREQ * sduration / timescale;
+        return true;
     }
     else if ( (segList = inheritSegmentList()) )
     {
-        time = segList->getPlaybackTimeBySegmentNumber(number);
+        return segList->getPlaybackTimeDurationBySegmentNumber(number, time, duration);
     }
 
-    return time;
+    return false;
 }
 
 SegmentInformation * SegmentInformation::getChildByID(const ID &id)
@@ -424,8 +429,9 @@ void SegmentInformation::pruneBySegmentNumber(uint64_t num)
 
 uint64_t SegmentInformation::translateSegmentNumber(uint64_t num, const SegmentInformation *from) const
 {
-    mtime_t time = from->getPlaybackTimeBySegmentNumber(num);
-    getSegmentNumberByTime(time, &num);
+    mtime_t time, duration;
+    if( from->getPlaybackTimeDurationBySegmentNumber(num, &time, &duration) )
+        getSegmentNumberByTime(time, &num);
     return num;
 }
 
diff --git a/modules/demux/adaptive/playlist/SegmentInformation.hpp b/modules/demux/adaptive/playlist/SegmentInformation.hpp
index 859af00..4284076 100644
--- a/modules/demux/adaptive/playlist/SegmentInformation.hpp
+++ b/modules/demux/adaptive/playlist/SegmentInformation.hpp
@@ -78,7 +78,7 @@ namespace adaptive
                 ISegment * getSegment(SegmentInfoType, uint64_t = 0) const;
                 ISegment * getNextSegment(SegmentInfoType, uint64_t, uint64_t *, bool *) const;
                 bool getSegmentNumberByTime(mtime_t, uint64_t *) const;
-                mtime_t getPlaybackTimeBySegmentNumber(uint64_t) const;
+                bool getPlaybackTimeDurationBySegmentNumber(uint64_t, mtime_t *, mtime_t *) const;
                 uint64_t getLiveStartSegmentNumber(uint64_t) const;
                 virtual void mergeWith(SegmentInformation *, mtime_t);
                 virtual void mergeWithTimeline(SegmentTimeline *); /* ! don't use with global merge */
diff --git a/modules/demux/adaptive/playlist/SegmentList.cpp b/modules/demux/adaptive/playlist/SegmentList.cpp
index 3b8ef81..dd37036 100644
--- a/modules/demux/adaptive/playlist/SegmentList.cpp
+++ b/modules/demux/adaptive/playlist/SegmentList.cpp
@@ -125,18 +125,21 @@ bool SegmentList::getSegmentNumberByScaledTime(stime_t time, uint64_t *ret) cons
     return SegmentInfoCommon::getSegmentNumberByScaledTime(allsubsegments, time, ret);
 }
 
-mtime_t SegmentList::getPlaybackTimeBySegmentNumber(uint64_t number)
+bool SegmentList::getPlaybackTimeDurationBySegmentNumber(uint64_t number,
+                                                         mtime_t *time, mtime_t *dur) const
 {
+    *time = *dur = VLC_TS_INVALID;
+
     if(segments.empty())
-        return VLC_TS_INVALID;
+        return false;
 
     const uint64_t timescale = inheritTimescale();
     const ISegment *first = segments.front();
     if(first->getSequenceNumber() > number)
-        return VLC_TS_INVALID;
+        return false;
 
-    stime_t time = first->startTime.Get();
-    std::vector<ISegment *>::iterator it = segments.begin();
+    *time = first->startTime.Get();
+    std::vector<ISegment *>::const_iterator it = segments.begin();
     for(it = segments.begin(); it != segments.end(); ++it)
     {
         const ISegment *seg = *it;
@@ -147,13 +150,17 @@ mtime_t SegmentList::getPlaybackTimeBySegmentNumber(uint64_t number)
         }
         else if(seg->duration.Get())
         {
-            time += seg->duration.Get();
+            *time += seg->duration.Get();
+            *dur = seg->duration.Get();
         }
         else
         {
-            time += duration.Get();
+            *time += duration.Get();
+            *dur = duration.Get();
         }
     }
 
-    return VLC_TS_0 + CLOCK_FREQ * time / timescale;
+    *time = VLC_TS_0 + CLOCK_FREQ * *time / timescale;
+    *dur = VLC_TS_0 + CLOCK_FREQ * *dur / timescale;
+    return true;
 }
diff --git a/modules/demux/adaptive/playlist/SegmentList.h b/modules/demux/adaptive/playlist/SegmentList.h
index 879f1e4..815daeb 100644
--- a/modules/demux/adaptive/playlist/SegmentList.h
+++ b/modules/demux/adaptive/playlist/SegmentList.h
@@ -48,7 +48,7 @@ namespace adaptive
                 void                    pruneBySegmentNumber(uint64_t);
                 void                    pruneByPlaybackTime(mtime_t);
                 bool                    getSegmentNumberByScaledTime(stime_t, uint64_t *) const;
-                mtime_t                 getPlaybackTimeBySegmentNumber(uint64_t);
+                bool                    getPlaybackTimeDurationBySegmentNumber(uint64_t, mtime_t *, mtime_t *) const;
 
             private:
                 std::vector<ISegment *>  segments;
diff --git a/modules/demux/adaptive/playlist/SegmentTimeline.cpp b/modules/demux/adaptive/playlist/SegmentTimeline.cpp
index c8f6632..dc6a9a1 100644
--- a/modules/demux/adaptive/playlist/SegmentTimeline.cpp
+++ b/modules/demux/adaptive/playlist/SegmentTimeline.cpp
@@ -112,9 +112,11 @@ uint64_t SegmentTimeline::getElementNumberByScaledPlaybackTime(stime_t scaled) c
     return prevnumber;
 }
 
-stime_t SegmentTimeline::getScaledPlaybackTimeByElementNumber(uint64_t number) const
+bool SegmentTimeline::getScaledPlaybackTimeDurationBySegmentNumber(uint64_t number,
+                                                                   stime_t *time, stime_t *duration) const
 {
     stime_t totalscaledtime = 0;
+    stime_t lastduration = 0;
 
     std::list<Element *>::const_iterator it;
     for(it = elements.begin(); it != elements.end(); ++it)
@@ -127,6 +129,8 @@ stime_t SegmentTimeline::getScaledPlaybackTimeByElementNumber(uint64_t number) c
             totalscaledtime = el->t;
         }
 
+        lastduration = el->d;
+
         if(number <= el->number)
             break;
 
@@ -139,7 +143,16 @@ stime_t SegmentTimeline::getScaledPlaybackTimeByElementNumber(uint64_t number) c
         totalscaledtime += (el->d * (el->r + 1));
     }
 
-    return totalscaledtime;
+    *time = totalscaledtime;
+    *duration = lastduration;
+    return true;
+}
+
+stime_t SegmentTimeline::getScaledPlaybackTimeByElementNumber(uint64_t number) const
+{
+    stime_t time, duration;
+    (void) getScaledPlaybackTimeDurationBySegmentNumber(number, &time, &duration);
+    return time;
 }
 
 uint64_t SegmentTimeline::maxElementNumber() const
diff --git a/modules/demux/adaptive/playlist/SegmentTimeline.h b/modules/demux/adaptive/playlist/SegmentTimeline.h
index 2bfc049..4094963 100644
--- a/modules/demux/adaptive/playlist/SegmentTimeline.h
+++ b/modules/demux/adaptive/playlist/SegmentTimeline.h
@@ -42,6 +42,7 @@ namespace adaptive
                 virtual ~SegmentTimeline();
                 void addElement(uint64_t, stime_t d, uint64_t r = 0, stime_t t = 0);
                 uint64_t getElementNumberByScaledPlaybackTime(stime_t) const;
+                bool    getScaledPlaybackTimeDurationBySegmentNumber(uint64_t, mtime_t *, mtime_t *) const;
                 stime_t getScaledPlaybackTimeByElementNumber(uint64_t) const;
                 stime_t getMinAheadScaledTime(uint64_t) const;
                 uint64_t maxElementNumber() const;



More information about the vlc-commits mailing list