aboutsummaryrefslogtreecommitdiffstats
path: root/MPD
diff options
context:
space:
mode:
Diffstat (limited to 'MPD')
-rw-r--r--MPD/AbstractRepresentationStream.cpp14
-rw-r--r--MPD/AbstractRepresentationStream.h4
-rw-r--r--MPD/IRepresentationStream.h2
-rw-r--r--MPD/SegmentTemplateStream.cpp44
-rw-r--r--MPD/SegmentTemplateStream.h4
5 files changed, 63 insertions, 5 deletions
diff --git a/MPD/AbstractRepresentationStream.cpp b/MPD/AbstractRepresentationStream.cpp
index 449c6aa8..346938f4 100644
--- a/MPD/AbstractRepresentationStream.cpp
+++ b/MPD/AbstractRepresentationStream.cpp
@@ -46,7 +46,8 @@ uint32_t AbstractRepresentationStream::getFirstSegmentNumber()
uint32_t availStT = TimeResolver::getUTCDateTimeInSec(this->mpd->GetAvailabilityStarttime());
uint32_t duration = this->getAverageSegmentDuration();
uint32_t timeshift = TimeResolver::getDurationInSec(this->mpd->GetTimeShiftBufferDepth());
- return (currTime - duration - availStT - timeshift ) / duration;
+ uint32_t timescale = this->getTimescale();
+ return (double)((double)currTime - (double)availStT - (double)timeshift ) < 0? 0 : (currTime - availStT - timeshift );
}
return 0;
}
@@ -59,7 +60,8 @@ uint32_t AbstractRepresentationStream::getCurrentSegmentNumber()
uint32_t duration = this->getAverageSegmentDuration();
uint32_t availStT = TimeResolver::getUTCDateTimeInSec(this->mpd->GetAvailabilityStarttime());
- return (currTime - duration - availStT) / duration;
+ return (double)((double)currTime - (double)availStT) < 0 ? 0 : (currTime - availStT);
+ // return (currTime - duration - availStT) / duration;
}
return 0;
}
@@ -82,3 +84,11 @@ uint32_t AbstractRepresentationStream::getAverageSegmentDuration()
{
return 1;
}
+uint32_t AbstractRepresentationStream::getTimescale ()
+{
+ return 1;
+}
+void AbstractRepresentationStream::setSegmentOffset (uint32_t offset)
+{
+ this->segmentOffset = offset;
+}
diff --git a/MPD/AbstractRepresentationStream.h b/MPD/AbstractRepresentationStream.h
index e0f354b4..4728e366 100644
--- a/MPD/AbstractRepresentationStream.h
+++ b/MPD/AbstractRepresentationStream.h
@@ -46,6 +46,9 @@ public:
virtual uint32_t getLastSegmentNumber();
virtual uint32_t getAverageSegmentDuration();
+ virtual uint32_t getTimescale();
+ virtual void setSegmentOffset(uint32_t offset);
+
protected:
virtual void setBaseUrls(const std::vector<dash::mpd::IBaseUrl *> baseurls);
@@ -54,6 +57,7 @@ protected:
dash::mpd::IPeriod *period;
dash::mpd::IAdaptationSet *adaptationSet;
dash::mpd::IRepresentation *representation;
+ uint32_t segmentOffset;
};
}
}
diff --git a/MPD/IRepresentationStream.h b/MPD/IRepresentationStream.h
index 370c84ed..31f83d54 100644
--- a/MPD/IRepresentationStream.h
+++ b/MPD/IRepresentationStream.h
@@ -43,6 +43,8 @@ public:
virtual uint32_t getCurrentSegmentNumber() = 0;
virtual uint32_t getLastSegmentNumber() = 0;
virtual uint32_t getAverageSegmentDuration() = 0;
+ virtual void setSegmentOffset(uint32_t offset) = 0;
+
};
}
}
diff --git a/MPD/SegmentTemplateStream.cpp b/MPD/SegmentTemplateStream.cpp
index f0f475e6..66004294 100644
--- a/MPD/SegmentTemplateStream.cpp
+++ b/MPD/SegmentTemplateStream.cpp
@@ -19,6 +19,8 @@ SegmentTemplateStream::SegmentTemplateStream(IMPD *mpd, IPeriod *period, IAdapta
{
this->baseUrls = BaseUrlResolver::resolveBaseUrl(mpd, period, adaptationSet, 0, 0, 0);
this->segmentTemplate = findSegmentTemplate();
+ this->inSync = false;
+ this->currentSegment = 0;
calculateSegmentStartTimes();
}
SegmentTemplateStream::~SegmentTemplateStream()
@@ -54,9 +56,36 @@ ISegment* SegmentTemplateStream::getMediaSegment(size_t segmentNumber)
/* time-based template */
if (this->segmentTemplate->GetSegmentTimeline())
{
- if (this->segmentStartTimes.size() > segmentNumber)
- return this->segmentTemplate->GetMediaSegmentFromTime(baseUrls, representation->GetId(), representation->GetBandwidth(), this->segmentStartTimes.at(segmentNumber));
+ if(this->inSync)
+ {
+ this->currentSegment++;
+ if(this->currentSegment < this->segmentStartTimes.size())
+ return this->segmentTemplate->GetMediaSegmentFromTime(baseUrls, representation->GetId(), representation->GetBandwidth(), this->segmentStartTimes.at(this->currentSegment));
+ else
+ return NULL;
+ }
+
+ //Look for the start point of segment, ie: the closest lowest to segmentNumber
+ //adding segment offset
+ segmentNumber = segmentNumber + this->segmentOffset;
+ size_t prevSegNumber = 0;
+ size_t segNumber = 0;
+ for(segNumber = 0; segNumber < this->segmentStartTimes.size(); segNumber++)
+ {
+ if(this->segmentStartTimes.at(segNumber)/this->getTimescale() > segmentNumber)
+ {
+ segNumber = prevSegNumber;
+ break;
+ }
+ prevSegNumber = segNumber;
+ }
+ if(segNumber != this->segmentStartTimes.size())
+ {
+ this->inSync = true;
+ this->currentSegment = segNumber;
+ return this->segmentTemplate->GetMediaSegmentFromTime(baseUrls, representation->GetId(), representation->GetBandwidth(), this->segmentStartTimes.at(this->currentSegment));
+ }
return NULL;
}
@@ -98,10 +127,16 @@ uint32_t SegmentTemplateStream::getSize()
return numberOfSegments;
}
+uint32_t SegmentTemplateStream::getTimescale ()
+{
+ return this->segmentTemplate->GetTimescale();
+}
+
uint32_t SegmentTemplateStream::getAverageSegmentDuration()
{
/* TODO calculate average segment durations for SegmentTimeline */
- return this->segmentTemplate->GetDuration();
+ return this->averageDuration;
+// return this->segmentTemplate->GetDuration();
}
ISegmentTemplate* SegmentTemplateStream::findSegmentTemplate()
@@ -127,6 +162,7 @@ void SegmentTemplateStream::calculateSegmentStartTimes()
uint32_t segStartTime = 0;
uint32_t segDuration = 0;
size_t repeatCount = 0;
+ uint32_t totalDuration = 0;
numOfTimelines = this->segmentTemplate->GetSegmentTimeline()->GetTimelines().size();
@@ -135,6 +171,7 @@ void SegmentTemplateStream::calculateSegmentStartTimes()
repeatCount = this->segmentTemplate->GetSegmentTimeline()->GetTimelines().at(i)->GetRepeatCount();
segStartTime = this->segmentTemplate->GetSegmentTimeline()->GetTimelines().at(i)->GetStartTime();
segDuration = this->segmentTemplate->GetSegmentTimeline()->GetTimelines().at(i)->GetDuration();
+ totalDuration = totalDuration + segDuration;
if (repeatCount > 0)
{
@@ -155,4 +192,5 @@ void SegmentTemplateStream::calculateSegmentStartTimes()
this->segmentStartTimes.push_back(segStartTime);
}
}
+ this->averageDuration = totalDuration / numOfTimelines;
}
diff --git a/MPD/SegmentTemplateStream.h b/MPD/SegmentTemplateStream.h
index ea85ab1a..f27b77fb 100644
--- a/MPD/SegmentTemplateStream.h
+++ b/MPD/SegmentTemplateStream.h
@@ -38,6 +38,7 @@ public:
virtual RepresentationStreamType getStreamType();
virtual uint32_t getSize();
virtual uint32_t getAverageSegmentDuration();
+ virtual uint32_t getTimescale();
private:
dash::mpd::ISegmentTemplate* findSegmentTemplate();
@@ -45,6 +46,9 @@ private:
dash::mpd::ISegmentTemplate *segmentTemplate;
std::vector<uint32_t> segmentStartTimes;
+ uint32_t averageDuration;
+ bool inSync;
+ uint32_t currentSegment;
};
}
}