]> git.vomp.tv Git - vompclient.git/commitdiff
Update for retrieving total recording length in frames
authorChris Tallon <chris@vomp.tv>
Sun, 11 Jun 2006 15:11:45 +0000 (15:11 +0000)
committerChris Tallon <chris@vomp.tv>
Sun, 11 Jun 2006 15:11:45 +0000 (15:11 +0000)
player.cc
player.h
vdr.cc
vdr.h
vvideorec.cc

index 4475fdca058584203b396443153a2359d6b364bd..bd7585de9fba6362b54249b5a6ca40383e9066ff 100644 (file)
--- a/player.cc
+++ b/player.cc
@@ -34,7 +34,8 @@ Player::Player(MessageQueue* messageQueue, bool tIsRecording, bool tIsRadio)
   playing = false;
   ffwd = false;
   fbwd = false;
-  streamLength = 0;
+  lengthBytes = 0;
+  lengthFrames = 0;
   feedPosition = 0;
   feedMode = MODE_NORMAL;
   lastRescan = 0;
@@ -132,11 +133,17 @@ void Player::setPosition(ULLONG position)
   feedPosition = position;
 }
 
-void Player::setLength(ULLONG length)
+void Player::setLengthBytes(ULLONG length)
 {
   lastRescan = time(NULL);
-  streamLength = length;
-  logger->log("Player", Log::DEBUG, "Player has received length of %llu", streamLength);
+  lengthBytes = length;
+  logger->log("Player", Log::DEBUG, "Player has received length bytes of %llu", lengthBytes);
+}
+
+void Player::setLengthFrames(ULONG length)
+{
+  lengthFrames = length;
+  logger->log("Player", Log::DEBUG, "Player has received length frames of %lu", lengthFrames);
 }
 
 ULLONG Player::getEndTS() // used internally (jump to percent)
@@ -522,14 +529,14 @@ void Player::setEndTS()
   logger->log("Player", Log::DEBUG, "Setting end TS");
 #ifndef NEW_DEMUXER
   UINT thisRead;
-  UCHAR* tempBuffer = VDR::getInstance()->getBlock((streamLength - 100000), 100000, &thisRead);
+  UCHAR* tempBuffer = VDR::getInstance()->getBlock((lengthBytes - 100000), 100000, &thisRead);
   if (!tempBuffer && !VDR::getInstance()->isConnected()) { doConnectionLost(); return; }
   if (!tempBuffer) return;
   if (thisRead) demuxer->findVideoPTS(tempBuffer, thisRead, &endTS);
   free(tempBuffer);
  #else //The replacement code relias completely on VDRs timecode and not the pts
    endTS=video->frameNumberToTimecode(
-    VDR::getInstance()->frameNumberFromPosition((streamLength - 100000)));
+    VDR::getInstance()->frameNumberFromPosition((lengthBytes - 100000)));
  #endif
   logger->log("Player", Log::DEBUG, "Set end TS");
 }
@@ -615,28 +622,28 @@ void Player::threadMethod()
     // If we havn't rescanned for a while..
     if (isRecording && ((lastRescan + 60) < time(NULL)))
     {
-      streamLength = vdr->rescanRecording();
+      lengthBytes = vdr->rescanRecording(&lengthFrames);
       if (!vdr->isConnected()) { doConnectionLost(); return; }
-      logger->log("Player", Log::DEBUG, "Rescanned and reset length: %llu", streamLength);
+      logger->log("Player", Log::DEBUG, "Rescanned and reset length: %llu", lengthBytes);
       lastRescan = time(NULL);
       setEndTS();
     }
 
-    if (streamLength) // is playing a recording
+    if (lengthBytes) // is playing a recording
     {
-      if (feedPosition >= streamLength) break;  // finished playback
+      if (feedPosition >= lengthBytes) break;  // finished playback
 
       if (startup)
       {
-        if (startupBlockSize > streamLength)
-          askFor = streamLength; // is a very small recording!
+        if (startupBlockSize > lengthBytes)
+          askFor = lengthBytes; // is a very small recording!
         else
           askFor = startupBlockSize; // normal, but a startup sized block to detect all the audio streams
       }
       else
       {
-        if ((feedPosition + blockSize) > streamLength) // last block of recording
-          askFor = streamLength - feedPosition;
+        if ((feedPosition + blockSize) > lengthBytes) // last block of recording
+          askFor = lengthBytes - feedPosition;
         else // normal
           askFor = blockSize;
       }
@@ -750,7 +757,7 @@ void Player::threadMethod()
   threadCheckExit();
 
   Message* m = new Message(); // Must be done after this thread finishes, and must break into master mutex
-  if (streamLength) m->message = Message::STOP_PLAYBACK;  // recording
+  if (lengthBytes) m->message = Message::STOP_PLAYBACK;  // recording
   else m->message = Message::STREAM_END;                  // live
   logger->log("Player", Log::DEBUG, "Posting message to %p...", commandMessageQueue);
   commandMessageQueue->postMessage(m);
index 09af40c02d12b3b238269891e73b82df8c86de93..915b0db8ccd6bfbb1059009ab20bcf5d13eb618f 100644 (file)
--- a/player.h
+++ b/player.h
@@ -49,7 +49,8 @@ class Player : public Thread_TYPE, public Callback
     int init();
     int shutdown();
     void setPosition(ULLONG position);
-    void setLength(ULLONG length);
+    void setLengthBytes(ULLONG length);
+    void setLengthFrames(ULONG length);
 
     int play();
     void stop();
@@ -117,7 +118,8 @@ class Player : public Thread_TYPE, public Callback
 
     ULLONG startTS;
     ULLONG endTS;
-    ULLONG streamLength;
+    ULLONG lengthBytes;
+    ULONG lengthFrames;
     ULLONG feedPosition;
     UCHAR feedMode;
     time_t lastRescan;
diff --git a/vdr.cc b/vdr.cc
index 179e8072f2bb6b8cd3aafb462f837ed0baa72233..36dd7da2ef35319166f5ba5a992c1cc28ab4ddcc 100644 (file)
--- a/vdr.cc
+++ b/vdr.cc
@@ -652,7 +652,7 @@ UCHAR* VDR::getBlock(ULLONG position, UINT maxAmount, UINT* amountReceived)
   return toReturn;
 }
 
-ULLONG VDR::streamRecording(char* fileName)
+ULLONG VDR::streamRecording(char* fileName, ULONG* totalFrames)
 {
   unsigned long totalLength = 8 + strlen(fileName) + 1;
   UCHAR* buffer = new UCHAR[totalLength];
@@ -680,16 +680,18 @@ ULLONG VDR::streamRecording(char* fileName)
     return 0;
   }
 
-  ULLONG recordingLength = extractULLONG();
+  ULLONG lengthBytes = extractULLONG();
+  ULONG lengthFrames = extractULONG();
   freePacket();
   MUTEX_UNLOCK(&mutex);
 
-  Log::getInstance()->log("VDR", Log::DEBUG, "VDR said length is: %llu", recordingLength);
+  Log::getInstance()->log("VDR", Log::DEBUG, "VDR said length is: %llu %lu", lengthBytes, lengthFrames);
 
-  return recordingLength;
+  *totalFrames = lengthFrames;
+  return lengthBytes;
 }
 
-ULLONG VDR::rescanRecording()
+ULLONG VDR::rescanRecording(ULONG* totalFrames)
 {
   unsigned long totalLength = 8;
   UCHAR* buffer = new UCHAR[totalLength];
@@ -716,13 +718,15 @@ ULLONG VDR::rescanRecording()
     return 0;
   }
 
-  ULLONG recordingLength = extractULLONG();
+  ULLONG lengthBytes = extractULLONG();
+  ULONG lengthFrames = extractULONG();
   freePacket();
   MUTEX_UNLOCK(&mutex);
 
-  Log::getInstance()->log("VDR", Log::DEBUG, "VDR said length is: %llu", recordingLength);
+  Log::getInstance()->log("VDR", Log::DEBUG, "VDR said length is: %llu %lu", lengthBytes, lengthFrames);
 
-  return recordingLength;
+  *totalFrames = lengthFrames;
+  return lengthBytes;
 }
 
 ULLONG VDR::positionFromFrameNumber(ULONG frameNumber)
diff --git a/vdr.h b/vdr.h
index 5f63793f00a3a365d33f09c5ac70718de6a9c6df..f80b6e66dbc3adcfbe36cf9db9a75bf9d4529e4e 100644 (file)
--- a/vdr.h
+++ b/vdr.h
@@ -117,8 +117,8 @@ class VDR
     char*      getRecordingSummary(char* fileName);
     int        deleteRecording(char* fileName);
     char*      moveRecording(char* fileName, char* newPath);
-    ULLONG     streamRecording(char* fileName);
-    ULLONG     rescanRecording();
+    ULLONG     streamRecording(char* fileName, ULONG* lengthFrames);
+    ULLONG     rescanRecording(ULONG* lengthFrames);
     ULLONG     positionFromFrameNumber(ULONG frameNumber);
     ULONG      frameNumberFromPosition(ULLONG position);
 
index 819aec922172ef7494c9ffbd2c38c516d46a5f35..5f3eb47a5d77a884ee5ce1b6a3de3d4275c5d724 100644 (file)
@@ -96,11 +96,13 @@ void VVideoRec::draw()
 void VVideoRec::go(ULLONG startPosition)
 {
   Log::getInstance()->log("VVideoRec", Log::DEBUG, "Starting stream: %s", myRec->getFileName());
-  ULLONG recLength = vdr->streamRecording(myRec->getFileName());
-  if (recLength)
+  ULONG lengthFrames = 0;
+  ULLONG lengthBytes = vdr->streamRecording(myRec->getFileName(), &lengthFrames);
+  if (lengthBytes)
   {
     doBar(0);
-    player->setLength(recLength);
+    player->setLengthBytes(lengthBytes);
+    player->setLengthFrames(lengthFrames);
     player->setPosition(startPosition);
     player->play();
     playing = true;