diff options
author | Jacques Samain <jsamain+fdio@cisco.com> | 2017-07-25 15:32:54 +0200 |
---|---|---|
committer | Jacques Samain <jsamain+fdio@cisco.com> | 2017-07-25 15:32:54 +0200 |
commit | 0e275345e28c34f2c6b91a75f44ac93034ae477c (patch) | |
tree | 0b94ec17f395fce7ae1015200d45bd61ce0112a8 /MPD/SegmentTemplateStream.cpp | |
parent | ce4d018aa8185da0bbf5445eaf54d88700f1a381 (diff) |
Handling live MPDs with variable segments duration
Change-Id: I074d8863a9afb47815e47bf663b87e7f663890b9
Signed-off-by: Jacques Samain <jsamain+fdio@cisco.com>
Diffstat (limited to 'MPD/SegmentTemplateStream.cpp')
-rw-r--r-- | MPD/SegmentTemplateStream.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/MPD/SegmentTemplateStream.cpp b/MPD/SegmentTemplateStream.cpp index ee51cf07..50801896 100644 --- a/MPD/SegmentTemplateStream.cpp +++ b/MPD/SegmentTemplateStream.cpp @@ -64,16 +64,19 @@ ISegment* SegmentTemplateStream::getIndexSegment(size_t segmentNumber) this->segmentTemplate->GetStartNumber() + segmentNumber); } -ISegment* SegmentTemplateStream::getMediaSegment(size_t segmentNumber) +ISegment* SegmentTemplateStream::getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration) { /* time-based template */ if (this->segmentTemplate->GetSegmentTimeline()) {//Get the one at segmentNumber - if(this->segmentStartTimes.size() > segmentNumber) - return this->segmentTemplate->GetMediaSegmentFromTime(baseUrls, representation->GetId(), representation->GetBandwidth(), this->segmentStartTimes.at(segmentNumber)); - else - return NULL; - + if(this->segmentStartTimes.size() > segmentNumber) + { + segmentDuration = (uint64_t)(((float)this->segmentDurationTimes.at(segmentNumber)/(float)this->getTimescale()) * 1000); + return this->segmentTemplate->GetMediaSegmentFromTime(baseUrls, representation->GetId(), representation->GetBandwidth(), this->segmentStartTimes.at(segmentNumber)); + } + else + return NULL; + //The following is to be used if you wish to start directly from the right time /* { if(this->inSync) @@ -110,6 +113,9 @@ ISegment* SegmentTemplateStream::getMediaSegment(size_t segmentNumber) } /* number-based template */ + uint32_t duration = representation->GetSegmentTemplate()->GetDuration(); + uint32_t timescale = representation->GetSegmentTemplate()->GetTimescale(); + segmentDuration = (uint64_t)(((float)duration/(float)timescale) * 1000); return this->segmentTemplate->GetMediaSegmentFromNumber(baseUrls, representation->GetId(), representation->GetBandwidth(), this->segmentTemplate->GetStartNumber() + segmentNumber); @@ -199,6 +205,7 @@ void SegmentTemplateStream::calculateSegmentStartTimes() if (segStartTime > 0) { this->segmentStartTimes.push_back(segStartTime + segDuration * j); + this->segmentDurationTimes.push_back(segDuration); } else { @@ -209,6 +216,7 @@ void SegmentTemplateStream::calculateSegmentStartTimes() else { this->segmentStartTimes.push_back(segStartTime); + this->segmentDurationTimes.push_back(segDuration); } } this->averageDuration = totalDuration / numOfTimelines; @@ -227,7 +235,7 @@ size_t SegmentTemplateStream::getSegmentNumber(uint64_t time) size_t i; for(i = 0; i < this->segmentStartTimes.size(); i ++) { - if(time <= this->segmentStartTimes.at(i)) + if(time < this->segmentStartTimes.at(i)) { break; } |