From 3edb2ed5467c9b3d306ed5340ada893afbc04e9c Mon Sep 17 00:00:00 2001 From: Chris Tallon Date: Wed, 20 Sep 2006 22:56:50 +0000 Subject: [PATCH] New iframe navigation server side support --- mvpclient.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ mvpclient.h | 1 + recplayer.c | 26 ++++++++++++++++++++++++++ recplayer.h | 1 + 4 files changed, 80 insertions(+) diff --git a/mvpclient.c b/mvpclient.c index 256a6a5..e66207b 100644 --- a/mvpclient.c +++ b/mvpclient.c @@ -243,6 +243,9 @@ void MVPClient::run2() case 18: result = processMoveRecording(data, packetLength); break; + case 19: + result = processGetIFrame(data, packetLength); + break; } free(buffer); @@ -869,6 +872,55 @@ int MVPClient::processFrameNumberFromPosition(UCHAR* data, int length) return 1; } +int MVPClient::processGetIFrame(UCHAR* data, int length) +{ + bool success = false; + + ULONG frameNumber = ntohl(*(ULONG*)data); + data += 4; + ULONG direction = ntohl(*(ULONG*)data); + data += 4; + + ULLONG rfilePosition = 0; + ULONG rframeNumber = 0; + ULONG rframeLength = 0; + + if (!rp) + { + log->log("Client", Log::DEBUG, "GetIFrame recording called when no recording being played!"); + } + else + { + success = rp->getNextIFrame(frameNumber, direction, &rfilePosition, &rframeNumber, &rframeLength); + } + + // returns file position, frame number, length + + UCHAR sendBuffer[20]; + int packetLength; + + if (success) + { + packetLength = 20; + *(ULONG*)&sendBuffer[0] = htonl(16); + *(ULLONG*)&sendBuffer[4] = htonll(rfilePosition); + *(ULONG*)&sendBuffer[12] = htonl(rframeNumber); + *(ULONG*)&sendBuffer[16] = htonl(rframeLength); + } + else + { + packetLength = 8; + *(ULONG*)&sendBuffer[0] = htonl(4); + *(ULONG*)&sendBuffer[4] = 0; + } + + log->log("Client", Log::DEBUG, "%llu %lu %lu", rfilePosition, rframeNumber, rframeLength); + + tcp.sendPacket(sendBuffer, packetLength); + log->log("Client", Log::DEBUG, "Wrote GNIF reply to client"); + return 1; +} + int MVPClient::processGetChannelSchedule(UCHAR* data, int length) { ULONG channelNumber = ntohl(*(ULONG*)data); diff --git a/mvpclient.h b/mvpclient.h index 5d34f16..5358d09 100644 --- a/mvpclient.h +++ b/mvpclient.h @@ -82,6 +82,7 @@ class MVPClient int processSetTimer(UCHAR* data, int length); int processPositionFromFrameNumber(UCHAR* data, int length); int processFrameNumberFromPosition(UCHAR* data, int length); + int processGetIFrame(UCHAR* data, int length); cChannel* channelFromNumber(ULONG channelNumber); void writeResumeData(); diff --git a/recplayer.c b/recplayer.c index fadf522..6647589 100644 --- a/recplayer.c +++ b/recplayer.c @@ -225,3 +225,29 @@ ULONG RecPlayer::frameNumberFromPosition(ULLONG position) return indexFile->Get((int)segmentNumber, askposition); } + + +bool RecPlayer::getNextIFrame(ULONG frameNumber, ULONG direction, ULLONG* rfilePosition, ULONG* rframeNumber, ULONG* rframeLength) +{ + // 0 = backwards + // 1 = forwards + + if (!indexFile) return false; + + uchar waste1; + int waste2; + + int iframeLength; + int indexReturnFrameNumber; + + indexReturnFrameNumber = (ULONG)indexFile->GetNextIFrame(frameNumber, (direction==1 ? true : false), &waste1, &waste2, &iframeLength); + log->log("RecPlayer", Log::DEBUG, "GNIF input framenumber:%lu, direction=%lu, output:framenumber=%i, framelength=%i", frameNumber, direction, indexReturnFrameNumber, iframeLength); + + if (indexReturnFrameNumber == -1) return false; + + *rfilePosition = positionFromFrameNumber(indexReturnFrameNumber); + *rframeNumber = (ULONG)indexReturnFrameNumber; + *rframeLength = (ULONG)iframeLength; + + return true; +} diff --git a/recplayer.h b/recplayer.h index 5795fcb..c3b1795 100644 --- a/recplayer.h +++ b/recplayer.h @@ -48,6 +48,7 @@ class RecPlayer void scan(); ULLONG positionFromFrameNumber(ULONG frameNumber); ULONG frameNumberFromPosition(ULLONG position); + bool getNextIFrame(ULONG frameNumber, ULONG direction, ULLONG* rfilePosition, ULONG* rframeNumber, ULONG* rframeLength); private: Log* log; -- 2.39.2