[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