// unLock(); - let thread unlock this
}
+void Player::jumpToFrameP(int newFrame)
+{
+ lock();
+ logger->log("Player", Log::DEBUG, "JUMP TO FRAME AND PAUSE %i", newFrame);
+ switchState(S_JUMP_PI, newFrame);
+ unLock();
+}
+
void Player::skipForward(int seconds)
{
lock();
restartAtFrame(jumpFrame);
return;
}
+ case S_JUMP_PI: // to S_JUMP_PI
+ {
+ audio->systemMuteOn();
+ threadStop();
+ vfeed.stop();
+ afeed.stop();
+ demuxer->flush();
+ state = S_PAUSE_I;
+ video->reset();
+ video->play();
+ restartAtFramePI(jumpFrame);
+ return;
+ }
}
}
case S_PAUSE_P: // from S_PAUSE_P -----------------------------------
restartAtFrame(jumpFrame);
return;
}
+ case S_JUMP_PI: // to S_JUMP_PI
+ {
+ audio->systemMuteOn();
+ audio->unPause();
+ threadStop();
+ vfeed.stop();
+ afeed.stop();
+ demuxer->flush();
+ state = S_PAUSE_I;
+ video->reset();
+ video->play();
+ restartAtFramePI(jumpFrame);
+ return;
+ }
}
}
case S_PAUSE_I: // from S_PAUSE_I -----------------------------------
restartAtFrame(jumpFrame);
return;
}
+ case S_JUMP_PI: // to S_JUMP_PI
+ {
+ restartAtFramePI(jumpFrame);
+ return;
+ }
}
}
case S_FFWD: // from S_FFWD -----------------------------------
restartAtFrame(jumpFrame);
return;
}
+ case S_JUMP_PI: // to S_JUMP_PI
+ {
+ threadStop();
+ state = S_PAUSE_I;
+ restartAtFramePI(jumpFrame);
+ return;
+ }
}
}
case S_FBWD: // from S_FBWD -----------------------------------
restartAtFrame(jumpFrame);
return;
}
+ case S_JUMP_PI: // to S_JUMP_PI
+ {
+ threadStop();
+ state = S_PAUSE_I;
+ restartAtFramePI(jumpFrame);
+ return;
+ }
}
}
case S_STOP: // from S_STOP -----------------------------------
{
return;
}
+ case S_JUMP_PI: // to S_JUMP_PI
+ {
+ return;
+ }
}
}
- // case S_JUMP cannot be selected as a start state because it auto flips to play
+ // case S_JUMP cannot be a start state because it auto flips to play
+ // case S_JUMP_PI cannot be a start state because it auto flips to S_PAUSE_I
}
}
audio->doMuting();
}
+
+void Player::restartAtFramePI(ULONG newFrame)
+{
+ ULLONG filePos;
+ ULONG nextiframeNumber;
+ ULONG iframeLength;
+ ULONG iframeNumber;
+
+ UCHAR* buffer;
+ UINT amountReceived;
+ UINT videoLength;
+
+ // newFrame could be anywhere, go forwards to next I-Frame
+ if (!vdr->getNextIFrame(newFrame, 1, &filePos, &nextiframeNumber, &iframeLength)) return;
+
+ // Now step back a GOP. This ensures we go to the greatest I-Frame equal to or less than the requested frame
+ vdr->getNextIFrame(nextiframeNumber, 0, &filePos, &iframeNumber, &iframeLength);
+
+ buffer = vdr->getBlock(filePos, iframeLength, &amountReceived);
+ videoLength = demuxer->stripAudio(buffer, amountReceived);
+ video->displayIFrame(buffer, videoLength);
+ video->displayIFrame(buffer, videoLength); // If you do it twice, it works :)
+ free(threadBuffer);
+
+ currentFrameNumber = iframeNumber;
+}
+
void Player::doConnectionLost()
{
logger->log("Player", Log::DEBUG, "Connection lost, sending message");
void Player::test1()
{
logger->log("Player", Log::DEBUG, "PLAYER TEST 1");
- video->play();
+// video->play();
// video->setAspectRatio(Video::ASPECT4X3);
+ jumpToFrameP(37507);
}
void Player::test2()
void skipForward(int seconds);
void skipBackward(int seconds);
void jumpToMark(int mark);
+ void jumpToFrameP(int newFrame);
UCHAR getState() { return state; }
ULONG getCurrentFrameNum();
const static UCHAR S_FBWD = 5;
const static UCHAR S_STOP = 6;
const static UCHAR S_JUMP = 7;
+ const static UCHAR S_JUMP_PI = 8; // Jump to Pause_I mode
// Player events
void doConnectionLost();
void restartAtFrame(ULONG newFrame);
+ void restartAtFramePI(ULONG newFrame);
MessageQueue* messageQueue;
void* messageReceiver;
-> FBwd * *
-> Stop * *
-> Jump * *
+ -> Jump_PI * *
PauseP -> Play * *
-> PauseI
-> FBwd * *
-> Stop * *
-> Jump * *
+ -> Jump_PI * *
PauseI -> Play * *
-> PauseP
-> FBwd * *
-> Stop * *
-> Jump * *
+ -> Jump_PI * *
FFwd -> Play * *
-> PauseP
-> FBwd * *
-> Stop * *
-> Jump * *
+ -> Jump_PI * *
FBwd -> Play * *
-> PauseP
-> FFwd * *
-> Stop * *
-> Jump * *
+ -> Jump_PI * *
Stop -> Play * *
-> PauseP
-> FFwd
-> FBwd
-> Jump
-
-Jump -> Play
- -> PauseP
- -> PauseI
- -> FFwd
- -> FBwd
- -> Stop
+ -> Jump_PI
*/