From ce4d018aa8185da0bbf5445eaf54d88700f1a381 Mon Sep 17 00:00:00 2001 From: Jacques Samain Date: Mon, 24 Jul 2017 15:11:58 +0200 Subject: moving MPDFetching to MultimediaManager class, DASHReceiver might have two instances (video + audio) Change-Id: Ifae7dab2db80d8b1a17ff7749cdfb879958cfee1 Signed-off-by: Jacques Samain --- Input/DASHManager.cpp | 4 ---- Input/DASHManager.h | 1 - Input/DASHReceiver.cpp | 39 +------------------------------------- Input/DASHReceiver.h | 2 -- Input/ICNConnectionConsumerApi.cpp | 2 +- Input/IDASHManagerObserver.h | 1 - Input/IDASHReceiverObserver.h | 1 - Managers/IStreamObserver.h | 1 - Managers/MultimediaManager.cpp | 39 +++++++++++++++++++++++++++++++++++++- Managers/MultimediaManager.h | 2 ++ Managers/MultimediaStream.cpp | 8 -------- Managers/MultimediaStream.h | 1 - 12 files changed, 42 insertions(+), 59 deletions(-) diff --git a/Input/DASHManager.cpp b/Input/DASHManager.cpp index b3ff8305..0c393353 100644 --- a/Input/DASHManager.cpp +++ b/Input/DASHManager.cpp @@ -160,7 +160,3 @@ void DASHManager::onBufferStateChanged(BufferType type, uint32_t fillstateInPerc if(this->adaptationLogic->isBufferBased()) this->receiver->OnSegmentBufferStateChanged(fillstateInPercent, maxC); } -void DASHManager::fetchMPD() -{ - this->multimediaStream->fetchMPD(); -} diff --git a/Input/DASHManager.h b/Input/DASHManager.h index 4bd301e7..3b9bf005 100644 --- a/Input/DASHManager.h +++ b/Input/DASHManager.h @@ -61,7 +61,6 @@ public: void setTargetDownloadingTime(double); MediaObject* getSegment(); void onBufferStateChanged(BufferType type, uint32_t fillstateInPercent, int maxC); - void fetchMPD(); private: float beta; diff --git a/Input/DASHReceiver.cpp b/Input/DASHReceiver.cpp index 1af8ad05..59514e57 100644 --- a/Input/DASHReceiver.cpp +++ b/Input/DASHReceiver.cpp @@ -42,8 +42,7 @@ DASHReceiver::DASHReceiver (viper::managers::StreamType type, MPDWrappe isLooping (false), beta (beta), drop (drop), - bufferingThread (NULL), - mpdFetcherThread (NULL) + bufferingThread (NULL) { readMax = 32768; readBuffer = (uint8_t*)malloc(sizeof(uint8_t)*readMax); @@ -96,15 +95,6 @@ bool DASHReceiver::Start () 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() @@ -120,11 +110,6 @@ void DASHReceiver::Stop() JoinThread(this->bufferingThread); destroyThreadPortable(this->bufferingThread); } - if(this->mpdFetcherThread != NULL) - { - JoinThread(this->mpdFetcherThread); - destroyThreadPortable(this->mpdFetcherThread); - } } MediaObject* DASHReceiver::GetNextSegment () @@ -351,28 +336,6 @@ void* DASHReceiver::DoBuffering (void *recei 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 () { diff --git a/Input/DASHReceiver.h b/Input/DASHReceiver.h index 9d221ec5..ee2df388 100644 --- a/Input/DASHReceiver.h +++ b/Input/DASHReceiver.h @@ -107,7 +107,6 @@ private: IICNConnection *conn; IICNConnection *initConn; THREAD_HANDLE bufferingThread; - THREAD_HANDLE mpdFetcherThread; bool isBuffering; bool icn; double icnAlpha; @@ -123,7 +122,6 @@ private: void DownloadInitSegmentWithoutLock(); bool InitSegmentExists(int rep); static void* DoBuffering(void *receiver); - static void* DoMPDFetching(void * data); }; } } diff --git a/Input/ICNConnectionConsumerApi.cpp b/Input/ICNConnectionConsumerApi.cpp index e6715e68..84e210cb 100644 --- a/Input/ICNConnectionConsumerApi.cpp +++ b/Input/ICNConnectionConsumerApi.cpp @@ -59,7 +59,7 @@ ICNConnectionConsumerApi::ICNConnectionConsumerApi(double alpha, float beta, flo 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; diff --git a/Input/IDASHManagerObserver.h b/Input/IDASHManagerObserver.h index 57f15726..0f2d95df 100644 --- a/Input/IDASHManagerObserver.h +++ b/Input/IDASHManagerObserver.h @@ -33,7 +33,6 @@ public: virtual void notifyQualityDownloading (uint32_t quality) = 0; virtual bool canPush() = 0; virtual int getBufferLevel() = 0; - virtual void fetchMPD() = 0; }; } } diff --git a/Input/IDASHReceiverObserver.h b/Input/IDASHReceiverObserver.h index f6a2baa1..0a334aa2 100644 --- a/Input/IDASHReceiverObserver.h +++ b/Input/IDASHReceiverObserver.h @@ -28,7 +28,6 @@ public: virtual void notifyQualityDownloading(uint32_t quality) = 0; virtual bool canPush() = 0; virtual int getBufferLevel() = 0; - virtual void fetchMPD() = 0; }; } } diff --git a/Managers/IStreamObserver.h b/Managers/IStreamObserver.h index 1d628d51..31baca68 100644 --- a/Managers/IStreamObserver.h +++ b/Managers/IStreamObserver.h @@ -38,7 +38,6 @@ public: virtual void notifyQualityDownloading(uint32_t quality) = 0; virtual bool canPush() = 0; virtual int getBufferLevel() = 0; - virtual void fetchMPD() = 0; }; } } diff --git a/Managers/MultimediaManager.cpp b/Managers/MultimediaManager.cpp index 23118464..18061238 100644 --- a/Managers/MultimediaManager.cpp +++ b/Managers/MultimediaManager.cpp @@ -41,7 +41,8 @@ MultimediaManager::MultimediaManager(ViperGui *viperGui, int segBufSize, std::st eos (false), playing (false), noDecoding (nodecoding), - mpdWrapper (NULL) + mpdWrapper (NULL), + mpdFetcherThread (NULL) { InitializeCriticalSection (&this->monitorMutex); InitializeCriticalSection (&this->monitorBufferMutex); @@ -237,6 +238,15 @@ void MultimediaManager::start(bool icnEnabled, double icnAlpha, uint32_t nextOff } 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); } @@ -255,6 +265,11 @@ void MultimediaManager::stop() 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() @@ -691,3 +706,25 @@ float MultimediaManager::getSegmentDuration() { 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()); + } +} diff --git a/Managers/MultimediaManager.h b/Managers/MultimediaManager.h index ade2b767..c00ff866 100644 --- a/Managers/MultimediaManager.h +++ b/Managers/MultimediaManager.h @@ -106,6 +106,7 @@ private: double frameRate; THREAD_HANDLE videoRendererHandle; THREAD_HANDLE audioRendererHandle; + THREAD_HANDLE mpdFetcherThread; bool isVideoRendering; bool isAudioRendering; bool eos; @@ -136,6 +137,7 @@ private: void notifyAudioSegmentBufferObservers (uint32_t fillstateInPercent); void updateMPD (); void updateMPDICN (); + static void* DoMPDFetching (void* manager); }; } } diff --git a/Managers/MultimediaStream.cpp b/Managers/MultimediaStream.cpp index 86cde35d..f70eabfb 100644 --- a/Managers/MultimediaStream.cpp +++ b/Managers/MultimediaStream.cpp @@ -198,11 +198,3 @@ void MultimediaStream::notifyBufferChange(uint32_t bufferfill, int maxC) { 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(); - } -} diff --git a/Managers/MultimediaStream.h b/Managers/MultimediaStream.h index 454cca23..52a7ac9d 100644 --- a/Managers/MultimediaStream.h +++ b/Managers/MultimediaStream.h @@ -75,7 +75,6 @@ public: bool isICN(); void shouldAbort(); void setTargetDownloadingTime(double); - void fetchMPD(); private: float beta; -- cgit 1.2.3-korg