diff options
author | chriszero <zerov83@gmail.com> | 2015-01-18 20:27:16 +0100 |
---|---|---|
committer | chriszero <zerov83@gmail.com> | 2015-01-18 20:27:16 +0100 |
commit | 8d7655c7eb7086a56b7722908291c163d596843d (patch) | |
tree | 61181d40ebc59a3155bc53748a9096f302cf6116 | |
parent | d3777dd6bcb11ceea85eca91e670d7872ba7b1ea (diff) | |
download | vdr-plugin-plex-8d7655c7eb7086a56b7722908291c163d596843d.tar.gz vdr-plugin-plex-8d7655c7eb7086a56b7722908291c163d596843d.tar.bz2 |
Implemented skip backwards/forward. Key Green/Yellow
-rw-r--r-- | Plexservice.cpp | 9 | ||||
-rw-r--r-- | Plexservice.h | 4 | ||||
-rw-r--r-- | hlsPlayer.cpp | 53 | ||||
-rw-r--r-- | hlsPlayer.h | 7 | ||||
-rw-r--r-- | hlsPlayerControl.cpp | 10 |
5 files changed, 61 insertions, 22 deletions
diff --git a/Plexservice.cpp b/Plexservice.cpp index 710cef0..ce803c3 100644 --- a/Plexservice.cpp +++ b/Plexservice.cpp @@ -298,15 +298,16 @@ std::string Plexservice::encode(std::string message) } -std::string Plexservice::GetUniversalTranscodeUrl(Video* video) +std::string Plexservice::GetUniversalTranscodeUrl(Video* video, int offset, PlexServer* server) { + PlexServer* pSrv = server ? server : video->m_pServer; std::stringstream params; params << "/video/:/transcode/universal/start.m3u8?"; - params << "path=" << encode(pServer->GetUri() + video->m_sKey); + params << "path=" << encode(pSrv->GetUri() + video->m_sKey); params << "&mediaIndex=0"; params << "&partIndex=0"; params << "&protocol=hls"; - params << "&offset=0"; + params << "&offset=" << offset; params << "&fastSeek=1"; params << "&directPlay=0"; params << "&directStream=1"; @@ -319,7 +320,7 @@ std::string Plexservice::GetUniversalTranscodeUrl(Video* video) params << "&session=" << encode(Config::GetInstance().GetUUID()); // TODO: generate Random SessionID - return pServer->GetUri() + params.str(); + return pSrv->GetUri() + params.str(); } } diff --git a/Plexservice.h b/Plexservice.h index ba16ccf..6bd3c33 100644 --- a/Plexservice.h +++ b/Plexservice.h @@ -59,12 +59,12 @@ public: void Authenticate(); //void DiscoverFirstServer(); PlexServer* GetServer(); - std::string GetUniversalTranscodeUrl(Video* video); + static std::string GetUniversalTranscodeUrl(Video* video, int offset = 0, PlexServer* server = 0); static MediaContainer* GetMediaContainer(std::string fullUrl); protected: - std::string encode(std::string message); + static std::string encode(std::string message); private: Poco::Mutex m_mutex; diff --git a/hlsPlayer.cpp b/hlsPlayer.cpp index 812d93c..08cc717 100644 --- a/hlsPlayer.cpp +++ b/hlsPlayer.cpp @@ -6,6 +6,8 @@ #include <pcrecpp.h> +#include "Plexservice.h" + //--- cHlsSegmentLoader cHlsSegmentLoader::cHlsSegmentLoader(std::string startm3u8) @@ -43,8 +45,7 @@ void cHlsSegmentLoader::Action(void) if( false == LoadIndexList() ) { esyslog("[plex]LoadIndexList failed!"); } - } - else { + } else { esyslog("[plex]LoadStartList failed!"); return; } @@ -56,7 +57,7 @@ void cHlsSegmentLoader::Action(void) isyslog("[plex]%s Create Ringbuffer %d MB", __FUNCTION__, estSize*3); m_pRingbuffer = new cRingBufferLinear(m_ringBufferSize, 2*TS_SIZE); - + while(Running()) { DoLoad(); cCondWait::SleepMs(3); @@ -98,8 +99,7 @@ bool cHlsSegmentLoader::LoadIndexList(void) } if(m_indexParser.TargetDuration > 3) { m_segmentsToBuffer = 1; - } - else { + } else { m_segmentsToBuffer = 2; } } @@ -280,6 +280,8 @@ cHlsPlayer::cHlsPlayer(std::string startm3u8, plexclient::Video* Video) { m_pSegmentLoader = new cHlsSegmentLoader(startm3u8); m_pVideo = Video; + m_timeOffset = 0; + m_doJump = false; } cHlsPlayer::~cHlsPlayer() @@ -294,7 +296,21 @@ void cHlsPlayer::Action(void) m_pSegmentLoader->Start(); while (Running()) { - if(m_pSegmentLoader->BufferFilled()) { + if(m_doJump && m_pSegmentLoader) { + DeviceFreeze(); + int currentOffset = DeviceGetSTC() / (100 * 1000); + m_pSegmentLoader->StopLoader(); + delete m_pSegmentLoader; + + std::string uri = plexclient::Plexservice::GetUniversalTranscodeUrl(m_pVideo, m_jumpOffset); + m_timeOffset = m_jumpOffset; + m_doJump = false; + + m_pSegmentLoader = new cHlsSegmentLoader(uri); + m_pSegmentLoader->Start(); + DeviceClear(); + DevicePlay(); + } else if(m_pSegmentLoader && m_pSegmentLoader->BufferFilled()) { DoPlay(); } else { // Pause @@ -307,11 +323,11 @@ bool cHlsPlayer::DoPlay(void) { cPoller Poller; if(DevicePoll(Poller, 10)) { - LOCK_THREAD; + cMutexLock lock(&s_mutex); // Handle running out of packets. Buffer-> Play-> Pause-> Buffer-> Play - for(int i = 0; i < 100; i++) { + for(int i = 0; i < 10; i++) { // Get a pointer to start of the data and the number of avaliable bytes int bytesAvaliable = 0; uchar* toPlay = m_pSegmentLoader->m_pRingbuffer->Get(bytesAvaliable); @@ -341,6 +357,7 @@ bool cHlsPlayer::GetIndex(int& Current, int& Total, bool SnapToIFrame) long stc = DeviceGetSTC(); Total = m_pVideo->m_pMedia->m_lDuration / 1000 * FramesPerSecond(); // milliseconds Current = stc / (100 * 1000) * FramesPerSecond(); // 100ns per Tick + Current += m_timeOffset; // apply offset return true; } @@ -358,7 +375,7 @@ void cHlsPlayer::Pause(void) if (playMode == pmPause) { Play(); } else { - LOCK_THREAD; + cMutexLock lock(&s_mutex); DeviceFreeze(); playMode = pmPause; @@ -369,7 +386,7 @@ void cHlsPlayer::Play(void) { dsyslog("[plex]%s", __FUNCTION__); if (playMode != pmPlay) { - LOCK_THREAD; + cMutexLock lock(&s_mutex); DevicePlay(); playMode = pmPlay; @@ -385,10 +402,24 @@ void cHlsPlayer::Stop(void) { if (m_pSegmentLoader) m_pSegmentLoader->StopLoader(); - Cancel(1); + Cancel(0); } double cHlsPlayer::FramesPerSecond(void) { return m_pVideo->m_pMedia->m_VideoFrameRate ? m_pVideo->m_pMedia->m_VideoFrameRate : DEFAULTFRAMESPERSECOND; } + +void cHlsPlayer::JumpRelative(int seconds) +{ + long stc = DeviceGetSTC(); + int current = stc / (100 * 1000); + JumpTo(current + seconds); +} + +void cHlsPlayer::JumpTo(int seconds) +{ + if(seconds < 0) seconds = 0; + m_jumpOffset = seconds; + m_doJump = true; +} diff --git a/hlsPlayer.h b/hlsPlayer.h index 20b58e5..353f0b9 100644 --- a/hlsPlayer.h +++ b/hlsPlayer.h @@ -68,6 +68,11 @@ class cHlsPlayer : public cPlayer, cThread private: cHlsSegmentLoader* m_pSegmentLoader; plexclient::Video* m_pVideo; + cMutex s_mutex; + + int m_jumpOffset; + int m_timeOffset; + bool m_doJump; int m_videoLenght; int m_actualSegment; @@ -95,6 +100,8 @@ public: void Play(void); void Stop(void); bool Active(void); + void JumpTo(int seconds); + void JumpRelative(int seconds); }; diff --git a/hlsPlayerControl.cpp b/hlsPlayerControl.cpp index 6e4a250..5144649 100644 --- a/hlsPlayerControl.cpp +++ b/hlsPlayerControl.cpp @@ -11,9 +11,7 @@ cControl* cHlsPlayerControl::Create(plexclient::Video* Video) if(!Video->m_pServer) return NULL; - plexclient::Plexservice service(Video->m_pServer); - service.Authenticate(); - std::string transcodeUri = service.GetUniversalTranscodeUrl(Video); + std::string transcodeUri = plexclient::Plexservice::GetUniversalTranscodeUrl(Video); cHlsPlayerControl* playerControl = new cHlsPlayerControl(new cHlsPlayer(transcodeUri, Video), Video); playerControl->m_title = Video->m_sTitle; @@ -118,11 +116,13 @@ eOSState cHlsPlayerControl::ProcessKey(eKeys Key) break; case kGreen|k_Repeat: case kGreen: - //SkipSeconds(-60); + Hide(); + player->JumpRelative(-600); break; case kYellow|k_Repeat: case kYellow: - //SkipSeconds( 60); + Hide(); + player->JumpRelative(600); break; case kStop: case kBlue: |