if(this->adaptationLogic->isBufferBased())
this->receiver->OnSegmentBufferStateChanged(fillstateInPercent, maxC);
}
-void DASHManager::fetchMPD()
-{
- this->multimediaStream->fetchMPD();
-}
void setTargetDownloadingTime(double);
MediaObject* getSegment();
void onBufferStateChanged(BufferType type, uint32_t fillstateInPercent, int maxC);
- void fetchMPD();
private:
float beta;
isLooping (false),
beta (beta),
drop (drop),
- bufferingThread (NULL),
- mpdFetcherThread (NULL)
+ bufferingThread (NULL)
{
readMax = 32768;
readBuffer = (uint8_t*)malloc(sizeof(uint8_t)*readMax);
this->isBuffering = false;
return false;
}
- //if dynamic, set up the fetching loop
- if(!strcmp(this->mpdWrapper->getType().c_str(), "dynamic"))
- {
- this->mpdFetcherThread = createThreadPortable(DoMPDFetching, this);
- if(this->mpdFetcherThread == NULL)
- {
- std::cout << "mpd Fetcher thread is NULL. Need to think of how to handle this?" << std::endl;
- }
- }
return true;
}
void DASHReceiver::Stop()
JoinThread(this->bufferingThread);
destroyThreadPortable(this->bufferingThread);
}
- if(this->mpdFetcherThread != NULL)
- {
- JoinThread(this->mpdFetcherThread);
- destroyThreadPortable(this->mpdFetcherThread);
- }
}
MediaObject* DASHReceiver::GetNextSegment ()
return NULL;
}
-void* DASHReceiver::DoMPDFetching (void* receiver)
-{
- DASHReceiver* dashReceiver = (DASHReceiver*) receiver;
- uint32_t currTime = TimeResolver::getCurrentTimeInSec();
- uint32_t publishedTime = dashReceiver->mpdWrapper->getFetchTime();
-// To avoid clock synchronisation issues: using fetching time instead of publish time
-// uint32_t publishedTime = TimeResolver::getUTCDateTimeInSec(dashReceiver->mpdWrapper->getPublishTime());
- uint32_t period = TimeResolver::getDurationInSec(dashReceiver->mpdWrapper->getMinimumUpdatePeriod());
- while(dashReceiver->isBuffering)
- {
- while(dashReceiver->isBuffering && currTime < publishedTime + period)
- {
- usleep(((publishedTime + period) - currTime) * 1000000);
- currTime = TimeResolver::getCurrentTimeInSec();
- }
- dashReceiver->observer->fetchMPD();
- publishedTime = dashReceiver->mpdWrapper->getFetchTime();
-// publishedTime = TimeResolver::getUTCDateTimeInSec(dashReceiver->mpdWrapper->getPublishTime());
- period = TimeResolver::getDurationInSec(dashReceiver->mpdWrapper->getMinimumUpdatePeriod());
- }
-}
-
//can Push video to buffer in the renderer
bool DASHReceiver::CanPush ()
{
IICNConnection *conn;
IICNConnection *initConn;
THREAD_HANDLE bufferingThread;
- THREAD_HANDLE mpdFetcherThread;
bool isBuffering;
bool icn;
double icnAlpha;
void DownloadInitSegmentWithoutLock();
bool InitSegmentExists(int rep);
static void* DoBuffering(void *receiver);
- static void* DoMPDFetching(void * data);
};
}
}
libl4::transport::ConsumerSocket &c = this->hTTPClientConnection->getConsumer();
bool configFile = false;
//CHECK if we are not going to override the configuration file. (if !autotune)
- if(FILE *fp = fopen("/usr/local/etc/hicn-consumer.conf", "r"))
+ if(FILE *fp = fopen("/usr/etc/consumer.conf", "r"))
{
fclose(fp);
configFile = true;
virtual void notifyQualityDownloading (uint32_t quality) = 0;
virtual bool canPush() = 0;
virtual int getBufferLevel() = 0;
- virtual void fetchMPD() = 0;
};
}
}
virtual void notifyQualityDownloading(uint32_t quality) = 0;
virtual bool canPush() = 0;
virtual int getBufferLevel() = 0;
- virtual void fetchMPD() = 0;
};
}
}
virtual void notifyQualityDownloading(uint32_t quality) = 0;
virtual bool canPush() = 0;
virtual int getBufferLevel() = 0;
- virtual void fetchMPD() = 0;
};
}
}
eos (false),
playing (false),
noDecoding (nodecoding),
- mpdWrapper (NULL)
+ mpdWrapper (NULL),
+ mpdFetcherThread (NULL)
{
InitializeCriticalSection (&this->monitorMutex);
InitializeCriticalSection (&this->monitorBufferMutex);
}
this->started = true;
this->playing = true;
+
+ if(!strcmp(this->mpdWrapper->getType().c_str(), "dynamic"))
+ {
+ this->mpdFetcherThread = createThreadPortable(DoMPDFetching, this);
+ if(this->mpdFetcherThread == NULL)
+ {
+ std::cout << "mpd Fetcher thread is NULL. Need to think of how to handle this?" << std::endl;
+ }
+ }
LeaveCriticalSection(&this->monitorMutex);
}
Debug("VIDEO STOPPED\n");
this->mpdWrapper->reInit(viper::managers::StreamType::VIDEO);
this->mpdWrapper->reInit(viper::managers::StreamType::AUDIO);
+ if(this->mpdFetcherThread != NULL)
+ {
+ JoinThread(this->mpdFetcherThread);
+ destroyThreadPortable(this->mpdFetcherThread);
+ }
}
void MultimediaManager::stopVideo()
{
return this->segmentDuration;
}
+
+static void* MultimediaManager::DoMPDFetching (void* data)
+{
+ MultimediaManager *manager = (MultimediaManager*) data;
+ uint32_t currTime = TimeResolver::getCurrentTimeInSec();
+ uint32_t publishedTime = manager->mpdWrapper->getFetchTime();
+// To avoid clock synchronisation issues: using fetching time instead of publish time
+// uint32_t publishedTime = TimeResolver::getUTCDateTimeInSec(dashReceiver->mpdWrapper->getPublishTime());
+ uint32_t periodUpdate = TimeResolver::getDurationInSec(manager->mpdWrapper->getMinimumUpdatePeriod());
+ while(manager->isStarted())
+ {
+ while(manager->isStarted() && currTime < publishedTime + periodUpdate)
+ {
+ usleep(((publishedTime + periodUpdate) - currTime) * 1000000);
+ currTime = TimeResolver::getCurrentTimeInSec();
+ }
+ manager->fetchMPD();
+ publishedTime = manager->mpdWrapper->getFetchTime();
+// publishedTime = TimeResolver::getUTCDateTimeInSec(dashReceiver->mpdWrapper->getPublishTime());
+ periodUpdate = TimeResolver::getDurationInSec(manager->mpdWrapper->getMinimumUpdatePeriod());
+ }
+}
double frameRate;
THREAD_HANDLE videoRendererHandle;
THREAD_HANDLE audioRendererHandle;
+ THREAD_HANDLE mpdFetcherThread;
bool isVideoRendering;
bool isAudioRendering;
bool eos;
void notifyAudioSegmentBufferObservers (uint32_t fillstateInPercent);
void updateMPD ();
void updateMPDICN ();
+ static void* DoMPDFetching (void* manager);
};
}
}
{
this->dashManager->onBufferStateChanged(libdash::framework::buffer::VIDEO, bufferfill, maxC);
}
-
-void MultimediaStream::fetchMPD()
-{
- for(size_t i=0; i < this->observers.size(); i++)
- {
- this->observers.at(i)->fetchMPD();
- }
-}
bool isICN();
void shouldAbort();
void setTargetDownloadingTime(double);
- void fetchMPD();
private:
float beta;