summaryrefslogtreecommitdiff
path: root/server/recplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/recplayer.c')
-rw-r--r--server/recplayer.c70
1 files changed, 31 insertions, 39 deletions
diff --git a/server/recplayer.c b/server/recplayer.c
index f85ed45..3885b4c 100644
--- a/server/recplayer.c
+++ b/server/recplayer.c
@@ -19,10 +19,6 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include <iostream>
-#include <fstream>
-#include <string>
-
#include "recplayer.h"
// for TSPLAY patch detection
@@ -32,17 +28,17 @@
#define _XOPEN_SOURCE 600
#include <fcntl.h>
-RecPlayer::RecPlayer(cRecording* rec)
+RecPlayer::RecPlayer(const char* FileName)
{
file = NULL;
fileOpen = 0;
lastPosition = 0;
- recording = rec;
+ recording = new cRecording(FileName);
for(int i = 1; i < 1000; i++) segments[i] = NULL;
// FIXME find out max file path / name lengths
- indexFile = new cIndexFile(recording->FileName(), false, rec->IsPesRecording());
+ indexFile = new cIndexFile(recording->FileName(), false, recording->IsPesRecording());
if (!indexFile) esyslog("ERROR: Streamdev: Failed to create indexfile!");
scan();
@@ -89,6 +85,8 @@ RecPlayer::~RecPlayer()
int i = 1;
while(segments[i++]) delete segments[i];
if (file) fclose(file);
+ delete indexFile;
+ delete recording;
}
int RecPlayer::openFile(int index)
@@ -214,45 +212,39 @@ cRecording* RecPlayer::getCurrentRecording()
return recording;
}
-int RecPlayer::frameFromResume()
+#if VDRVERSNUM < 10732
+#define ALIGNED_POS(x) (positionFromFrameNumber(indexFile->GetNextIFrame(x, 1)))
+#else
+#define ALIGNED_POS(x) (positionFromFrameNumber(indexFile->GetClosestIFrame(x)))
+#endif
+uint64_t RecPlayer::positionFromResume(int ResumeID)
{
- int frame = 0;
- char fileName[2048];
- snprintf(fileName, 2047, "%s/resume", recording->FileName());
- std::ifstream ifs;
- ifs.open(fileName);
- if (!ifs.is_open()) return 0;
- std::string sFrame;
- getline(ifs, sFrame);
- ifs.close();
- sFrame=sFrame.substr(2);
- frame=atoi(sFrame.c_str());
- return frame;
+ int resumeBackup = Setup.ResumeID;
+ Setup.ResumeID = ResumeID;
+ cResumeFile resume(recording->FileName(), recording->IsPesRecording());
+ Setup.ResumeID = resumeBackup;
+ return ALIGNED_POS(resume.Read());
}
-int RecPlayer::frameFromMark(int index)
+uint64_t RecPlayer::positionFromMark(int MarkIndex)
{
- char fileName[2048];
- snprintf(fileName, 2047, "%s/marks", recording->FileName());
- std::ifstream ifs;
- ifs.open(fileName);
- if (!ifs.is_open()) return 0;
- std::string sTime;
- for (int i=0; i<=index; i++) {
- getline(ifs, sTime);
- if (ifs.eof()) break;
- }
- ifs.close();
- int seconds = 0, minutes = 0, hours = 0;
- hours = atoi(sTime.substr(0, sTime.find(":")).c_str());
- minutes = atoi(sTime.substr(sTime.find(":") + 1, 2).c_str());
- seconds = atoi(sTime.substr(sTime.rfind(":") + 1, 2).c_str());
- return frameFromSeconds(seconds + minutes * 60 + hours * 3600);
+ cMarks marks;
+ if (marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording()) && marks.Count()) {
+ cMark *mark = marks.cConfig<cMark>::Get(MarkIndex);
+ if (mark)
+ return ALIGNED_POS(mark->Position());
+ }
+ return 0;
+}
+
+uint64_t RecPlayer::positionFromTime(int Seconds)
+{
+ return ALIGNED_POS(SecondsToFrames(Seconds, recording->FramesPerSecond()));
}
-int RecPlayer::frameFromSeconds(int seconds)
+uint64_t RecPlayer::positionFromPercent(int Percent)
{
- return 25 * seconds; // 25fps
+ return ALIGNED_POS(getLengthFrames() * Percent / 100L);
}
uint64_t RecPlayer::positionFromFrameNumber(uint32_t frameNumber)