summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchriszero <zerov83@gmail.com>2015-01-18 20:27:16 +0100
committerchriszero <zerov83@gmail.com>2015-01-18 20:27:16 +0100
commit8d7655c7eb7086a56b7722908291c163d596843d (patch)
tree61181d40ebc59a3155bc53748a9096f302cf6116
parentd3777dd6bcb11ceea85eca91e670d7872ba7b1ea (diff)
downloadvdr-plugin-plex-8d7655c7eb7086a56b7722908291c163d596843d.tar.gz
vdr-plugin-plex-8d7655c7eb7086a56b7722908291c163d596843d.tar.bz2
Implemented skip backwards/forward. Key Green/Yellow
-rw-r--r--Plexservice.cpp9
-rw-r--r--Plexservice.h4
-rw-r--r--hlsPlayer.cpp53
-rw-r--r--hlsPlayer.h7
-rw-r--r--hlsPlayerControl.cpp10
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: