summaryrefslogtreecommitdiff
path: root/recording.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2012-10-15 11:23:59 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2012-10-15 11:23:59 +0200
commit15bb8ca60db165833441e44da6d8861e9a7df0ad (patch)
treeae32fdeeef17952713495b1c46b2e41147028ed3 /recording.c
parent8c633a5f65da85769600f8867296f33cc30b9946 (diff)
downloadvdr-15bb8ca60db165833441e44da6d8861e9a7df0ad.tar.gz
vdr-15bb8ca60db165833441e44da6d8861e9a7df0ad.tar.bz2
If a frame position in the 'marks' file of a recording doesn't point to an I-frame, it will now be shifted towards the next I-frame
Diffstat (limited to 'recording.c')
-rw-r--r--recording.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/recording.c b/recording.c
index 783a46e5..71272fca 100644
--- a/recording.c
+++ b/recording.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.c 2.66 2012/10/04 12:21:38 kls Exp $
+ * $Id: recording.c 2.67 2012/10/15 10:23:37 kls Exp $
*/
#include "recording.h"
@@ -1358,8 +1358,10 @@ bool cMark::Save(FILE *f)
bool cMarks::Load(const char *RecordingFileName, double FramesPerSecond, bool IsPesRecording)
{
+ recordingFileName = RecordingFileName;
fileName = AddDirectory(RecordingFileName, IsPesRecording ? MARKSFILESUFFIX ".vdr" : MARKSFILESUFFIX);
framesPerSecond = FramesPerSecond;
+ isPesRecording = IsPesRecording;
nextUpdate = 0;
lastFileTime = -1; // the first call to Load() must take place!
lastChange = 0;
@@ -1388,6 +1390,7 @@ bool cMarks::Update(void)
cMutexLock MutexLock(&MutexMarkFramesPerSecond);
MarkFramesPerSecond = framesPerSecond;
if (cConfig<cMark>::Load(fileName)) {
+ Align();
Sort();
return true;
}
@@ -1396,6 +1399,18 @@ bool cMarks::Update(void)
return false;
}
+void cMarks::Align(void)
+{
+ cIndexFile IndexFile(recordingFileName, isPesRecording);
+ for (cMark *m = First(); m; m = Next(m)) {
+ int p = IndexFile.GetClosestIFrame(m->Position());
+ if (int d = m->Position() - p) {
+ isyslog("aligned editing mark %s to %s (off by %d frame%s)", *IndexToHMSF(m->Position(), true, framesPerSecond), *IndexToHMSF(p, true, framesPerSecond), d, abs(d) > 1 ? "s" : "");
+ m->SetPosition(p);
+ }
+ }
+}
+
void cMarks::Sort(void)
{
for (cMark *m1 = First(); m1; m1 = Next(m1)) {
@@ -1882,6 +1897,34 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber, off
return -1;
}
+int cIndexFile::GetClosestIFrame(int Index)
+{
+ if (last > 0) {
+ Index = constrain(Index, 0, last - 1);
+ if (index[Index].independent)
+ return Index;
+ int il = Index - 1;
+ int ih = Index + 1;
+ for (;;) {
+ if (il >= 0) {
+ if (index[il].independent)
+ return il;
+ il--;
+ }
+ else if (ih >= last)
+ break;
+ if (ih < last) {
+ if (index[ih].independent)
+ return ih;
+ ih++;
+ }
+ else if (il < 0)
+ break;
+ }
+ }
+ return 0;
+}
+
int cIndexFile::Get(uint16_t FileNumber, off_t FileOffset)
{
if (CatchUp()) {