BolaAdaptation::BolaAdaptation(viper::managers::StreamType type, MPDWrapper *mpdWrapper, struct AdaptationParameters *params) :
AbstractAdaptationLogic (type, mpdWrapper)
{
- this->bufferMaxSizeSeconds =(double) params->segmentBufferSize * params->segmentDuration;
+ this->segmentDuration = params->segmentDuration;
+ this->bufferMaxSizeSeconds =(double) params->segmentBufferSize * this->segmentDuration;
this->alphaRate = params->Bola_Alpha;
this->bufferTargetSeconds = params->Bola_bufferTargetSeconds;
// return 0; // Check if exit with a message is necessary
}
- // Check if the following is correct XXX Maybe useless
this->totalDuration = TimeResolver::getDurationInSec(this->mpdWrapper->getMediaPresentationDuration());
-// this->segmentDuration = (double) (representations.at(0)->GetSegmentTemplate()->GetDuration() / representations.at(0)->GetSegmentTemplate()->GetTimescale() );
- this->segmentDuration = 2.0;
+ if(!(this->segmentDuration))
+ this->segmentDuration = 2.0;
Debug("Total Duration - BOLA:\t%f\nSegment Duration - BOLA:\t%f\n",this->totalDuration, this->segmentDuration);
// if not correct --> segmentDuration = 2.0;
return this->mpdWrapper->getInitSegmentWithoutLock(type);
}
-MediaObject* DASHReceiver::FindInitSegment (int representation)
+MediaObject* DASHReceiver::FindInitSegment (std::string representation)
{
if (!this->InitSegmentExists(representation))
return NULL;
void DASHReceiver::DownloadInitSegmentWithoutLock ()
{
- int rep = atoi(this->mpdWrapper->getRepresentationIDWithoutLock(type).c_str());
+ std::string rep = this->mpdWrapper->getRepresentationIDWithoutLock(type);
if (this->InitSegmentExists(rep))
return;
void DASHReceiver::DownloadInitSegment ()
{
- int rep = atoi(this->mpdWrapper->getRepresentationID(type).c_str());
+ std::string rep = this->mpdWrapper->getRepresentationID(type);
if (this->InitSegmentExists(rep))
return;
}
}
-bool DASHReceiver::InitSegmentExists (int rep)
+bool DASHReceiver::InitSegmentExists (std::string rep)
{
if (this->initSegments.find(rep) != this->initSegments.end())
return true;
}
m_start_time = std::chrono::system_clock::now();
media->StartDownload(dashReceiver->conn);
-
media->WaitFinished();
bool canPush = dashReceiver->CanPush();
if (canPush && !dashReceiver->PushBack(media))
input::MediaObject* GetSegment(uint32_t segmentNumber);
input::MediaObject* GetInitSegment();
input::MediaObject* GetInitSegmentWithoutLock();
- input::MediaObject* FindInitSegment(int representation);
+ input::MediaObject* FindInitSegment(std::string representation);
uint32_t GetPosition();
void SetPosition(uint32_t segmentNumber);
void SetLooping(bool isLoopinp);
float drop;
bool withFeedBack;
bool isBufferBased;
- std::map<int, MediaObject*> initSegments;
+ std::map<std::string, MediaObject*> initSegments;
libdash::framework::buffer::Buffer<MediaObject> *buffer;
IDASHReceiverObserver *observer;
libdash::framework::mpd::MPDWrapper *mpdWrapper;
void NotifySegmentDownloaded();
void DownloadInitSegment();
void DownloadInitSegmentWithoutLock();
- bool InitSegmentExists(int rep);
+ bool InitSegmentExists(std::string rep);
static void* DoBuffering(void *receiver);
};
}
InitializeCriticalSection (&this->stateLock);
this->representationBandwidth = rep->GetBandwidth();
this->representationHeight = rep->GetHeight();
- this->representationId = atoi(rep->GetId().c_str());
+ this->representationId = rep->GetId();
}
MediaObject::~MediaObject()
return this->representationHeight;
}
-int MediaObject::GetRepresentationID()
+std::string MediaObject::GetRepresentationID()
{
return this->representationId;
}
-void MediaObject::SetFeedBack(bool flag)
+uint64_t MediaObject::GetSegmentDuration()
+{
+ return this->segmentDuration;
+}
+
+void MediaObject::SetSegmentDuration(uint64_t segDuration)
+{
+ this->segmentDuration = segDuration;
+}
+
+void MediaObject::SetFeedBack(bool flag)
{
this->withFeedBack = flag;
}
void SetDASHReceiver(input::DASHReceiver *_dashReceiver);
uint32_t GetRepresentationBandwidth();
uint32_t GetRepresentationHeight();
- int GetRepresentationID();
+ std::string GetRepresentationID();
+ uint64_t GetSegmentDuration();
+ void SetSegmentDuration(uint64_t segmentDuration);
private:
dash::mpd::ISegment *segment;
MediaObject *initSeg;
dash::mpd::IRepresentation *rep;
dash::network::DownloadState state;
- uint64_t bps;
- bool withFeedBack;
+ uint64_t bps;
+ bool withFeedBack;
double dnltime;
input::DASHReceiver *dashReceiver;
adaptation::IAdaptationLogic *adaptationLogic;
mutable CRITICAL_SECTION stateLock;
mutable CONDITION_VARIABLE stateChanged;
- uint32_t representationBandwidth;
- uint32_t representationHeight;
- int representationId;
+ uint32_t representationBandwidth;
+ uint32_t representationHeight;
+ std::string representationId;
+ uint64_t segmentDuration;
};
}
}
virtual dash::mpd::ISegment* getInitializationSegment() = 0;
virtual dash::mpd::ISegment* getIndexSegment(size_t segmentNumber) = 0;
- virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber) = 0;
+ virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration) = 0;
virtual dash::mpd::ISegment* getBitstreamSwitchingSegment() = 0;
virtual RepresentationStreamType getStreamType() = 0;
virtual dash::mpd::ISegment* getInitializationSegment() = 0;
virtual dash::mpd::ISegment* getIndexSegment(size_t segmentNumber) = 0;
- virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber) = 0;
+ virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration) = 0;
virtual dash::mpd::ISegment* getBitstreamSwitchingSegment() = 0;
virtual RepresentationStreamType getStreamType() = 0;
virtual uint32_t getSize() = 0;
representationStream = representations->find(representation)->second;
}
}
- seg = representationStream->getMediaSegment(segmentNumber);
+ uint64_t segDuration = 0;
+ //Returns the segmentDuration in milliseconds
+ seg = representationStream->getMediaSegment(segmentNumber, segDuration);
if(seg != NULL)
{
MediaObject *media = new MediaObject(seg, representation, withFeedBack);
+ media->SetSegmentDuration(segDuration);
segmentNumber++;
switch(type)
{
LeaveCriticalSection(&this->monitorMutex);
return NULL;
}
- seg = representationStream->getMediaSegment(segNum);
+ uint64_t segDuration =0;
+ seg = representationStream->getMediaSegment(segNum, segDuration);
if(seg != NULL)
{
MediaObject *media = new MediaObject(seg, representation);
+ media->SetSegmentDuration(segDuration);
LeaveCriticalSection(&this->monitorMutex);
return media;
}
return NULL;
}
-ISegment* SegmentListStream::getMediaSegment(size_t segmentNumber)
+ISegment* SegmentListStream::getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration)
{
if (this->segmentList->GetSegmentURLs().size() > segmentNumber)
+ {
+ uint32_t duration = representation->GetSegmentList()->GetDuration();
+ uint32_t timescale = representation->GetSegmentList()->GetTimescale();
+ segmentDuration = (uint64_t)(((float)duration/(float)timescale) * 1000);
return this->segmentList->GetSegmentURLs().at(segmentNumber)->ToMediaSegment(this->baseUrls);
-
+ }
return NULL;
}
return NULL;
}
+uint32_t SegmentListStream::getTimescale ()
+{
+ return this->segmentList->GetTimescale();
+}
+
uint32_t SegmentListStream::getAverageSegmentDuration()
{
/* TODO calculate average segment durations for SegmentTimeline */
virtual dash::mpd::ISegment* getInitializationSegment();
virtual dash::mpd::ISegment* getIndexSegment(size_t segmentNumber);
- virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber);
+ virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration);
virtual dash::mpd::ISegment* getBitstreamSwitchingSegment();
virtual RepresentationStreamType getStreamType();
virtual uint32_t getSize();
virtual uint32_t getAverageSegmentDuration();
+ virtual uint32_t getTimescale();
private:
dash::mpd::ISegmentList *findSegmentList();
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)
}
/* 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);
if (segStartTime > 0)
{
this->segmentStartTimes.push_back(segStartTime + segDuration * j);
+ this->segmentDurationTimes.push_back(segDuration);
}
else
{
else
{
this->segmentStartTimes.push_back(segStartTime);
+ this->segmentDurationTimes.push_back(segDuration);
}
}
this->averageDuration = totalDuration / numOfTimelines;
size_t i;
for(i = 0; i < this->segmentStartTimes.size(); i ++)
{
- if(time <= this->segmentStartTimes.at(i))
+ if(time < this->segmentStartTimes.at(i))
{
break;
}
virtual dash::mpd::ISegment* getInitializationSegment();
virtual dash::mpd::ISegment* getIndexSegment(size_t segmentNumber);
- virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber);
+ virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration);
virtual dash::mpd::ISegment* getBitstreamSwitchingSegment();
virtual RepresentationStreamType getStreamType();
virtual uint32_t getSize();
dash::mpd::ISegmentTemplate *segmentTemplate;
std::vector<uint64_t> segmentStartTimes;
+ std::vector<uint64_t> segmentDurationTimes;
uint32_t averageDuration;
bool inSync;
uint32_t currentSegment;
return NULL;
}
-ISegment* SingleMediaSegmentStream::getMediaSegment(size_t segmentNumber)
+ISegment* SingleMediaSegmentStream::getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration)
{
/* segmentNumber equals the desired BaseUrl */
if (this->representation->GetBaseURLs().size() > segmentNumber)
virtual dash::mpd::ISegment* getInitializationSegment();
virtual dash::mpd::ISegment* getIndexSegment(size_t segmentNumber);
- virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber);
+ virtual dash::mpd::ISegment* getMediaSegment(size_t segmentNumber, uint64_t& segmentDuration);
virtual dash::mpd::ISegment* getBitstreamSwitchingSegment();
virtual RepresentationStreamType getStreamType();
{
MultimediaManager *manager = (MultimediaManager*) data;
libdash::framework::input::MediaObject *segment = manager->videoStream->getSegment();
- int segmentDurationInMs = (int)manager->getSegmentDuration();
while(manager->isVideoRendering)
{
if (segment)
webSocketService.start();
this->parameterAdaptation->segmentDuration = this->mpdWrapper->onFirstDownloadMPD(NULL);
this->multimediaManager->setSegmentDuration(this->parameterAdaptation->segmentDuration);
+ //should be in seconds
+ this->parameterAdaptation->segmentDuration = this->parameterAdaptation->segmentDuration / 1000.0;
this->onStartButtonPressed(0,0,0,0,0);
this->multimediaManager->setLooping(this->repeat);
}
this->segment = this->segment + 1;
if( this->segment > 0)
{
- this->bufferDuration += this->segmentDuration;
+ this->bufferDuration += media->GetSegmentDuration();
if(this->bufferDuration - this->position > 3000)
{
}
else
{
- this->bufferDuration += (this->durationMilliseconds - (this->segmentDuration * (this->listSegmentSize - 1)));
+ this->bufferDuration += (this->durationMilliseconds - (media->GetSegmentDuration() * (this->listSegmentSize - 1)));
if(this->bufferDuration - this->position >3000)
{