1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

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

This commit is contained in:
Klaus Schmidinger 2012-10-15 11:23:59 +02:00
parent 8c633a5f65
commit 15bb8ca60d
5 changed files with 65 additions and 8 deletions

View File

@ -7272,7 +7272,7 @@ Video Disk Recorder Revision History
".keep" to prevent a directory from being deleted when it is empty. Currently the ".keep" to prevent a directory from being deleted when it is empty. Currently the
only file name that is ignored is ".sort". only file name that is ignored is ".sort".
2012-10-13: Version 1.7.32 2012-10-15: Version 1.7.32
- Pressing the Play key during normal live viewing mode now opens the Recordings menu - Pressing the Play key during normal live viewing mode now opens the Recordings menu
if there is no "last viewed" recording (thanks to Alexander Wenzel). if there is no "last viewed" recording (thanks to Alexander Wenzel).
@ -7298,3 +7298,6 @@ Video Disk Recorder Revision History
Make.config.template. Make.config.template.
- Fixed handling VPS timers in case the running status of an event goes to '1' (not - Fixed handling VPS timers in case the running status of an event goes to '1' (not
running) and later goes to '4' (running). running) and later goes to '4' (running).
- 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 (either up or down, whichever is
closer).

View File

@ -327,6 +327,9 @@ Recordings:
This obsoletes the CUTTIME patch. This obsoletes the CUTTIME patch.
- An ongoing editing process is now canceled if either the original or the edited - An ongoing editing process is now canceled if either the original or the edited
version of the recording is deleted from the Recordings menu. version of the recording is deleted from the Recordings menu.
- 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 (either up or down, whichever is
closer).
SVDRP: SVDRP:

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "recording.h"
@ -1358,8 +1358,10 @@ bool cMark::Save(FILE *f)
bool cMarks::Load(const char *RecordingFileName, double FramesPerSecond, bool IsPesRecording) bool cMarks::Load(const char *RecordingFileName, double FramesPerSecond, bool IsPesRecording)
{ {
recordingFileName = RecordingFileName;
fileName = AddDirectory(RecordingFileName, IsPesRecording ? MARKSFILESUFFIX ".vdr" : MARKSFILESUFFIX); fileName = AddDirectory(RecordingFileName, IsPesRecording ? MARKSFILESUFFIX ".vdr" : MARKSFILESUFFIX);
framesPerSecond = FramesPerSecond; framesPerSecond = FramesPerSecond;
isPesRecording = IsPesRecording;
nextUpdate = 0; nextUpdate = 0;
lastFileTime = -1; // the first call to Load() must take place! lastFileTime = -1; // the first call to Load() must take place!
lastChange = 0; lastChange = 0;
@ -1388,6 +1390,7 @@ bool cMarks::Update(void)
cMutexLock MutexLock(&MutexMarkFramesPerSecond); cMutexLock MutexLock(&MutexMarkFramesPerSecond);
MarkFramesPerSecond = framesPerSecond; MarkFramesPerSecond = framesPerSecond;
if (cConfig<cMark>::Load(fileName)) { if (cConfig<cMark>::Load(fileName)) {
Align();
Sort(); Sort();
return true; return true;
} }
@ -1396,6 +1399,18 @@ bool cMarks::Update(void)
return false; 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) void cMarks::Sort(void)
{ {
for (cMark *m1 = First(); m1; m1 = Next(m1)) { 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; 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) int cIndexFile::Get(uint16_t FileNumber, off_t FileOffset)
{ {
if (CatchUp()) { if (CatchUp()) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.h 2.37 2012/09/17 08:53:23 kls Exp $ * $Id: recording.h 2.38 2012/10/15 10:22:27 kls Exp $
*/ */
#ifndef __RECORDING_H #ifndef __RECORDING_H
@ -222,14 +222,17 @@ public:
class cMarks : public cConfig<cMark> { class cMarks : public cConfig<cMark> {
private: private:
cString recordingFileName;
cString fileName; cString fileName;
double framesPerSecond; double framesPerSecond;
bool isPesRecording;
time_t nextUpdate; time_t nextUpdate;
time_t lastFileTime; time_t lastFileTime;
time_t lastChange; time_t lastChange;
public: public:
bool Load(const char *RecordingFileName, double FramesPerSecond = DEFAULTFRAMESPERSECOND, bool IsPesRecording = false); bool Load(const char *RecordingFileName, double FramesPerSecond = DEFAULTFRAMESPERSECOND, bool IsPesRecording = false);
bool Update(void); bool Update(void);
void Align(void);
void Sort(void); void Sort(void);
cMark *Add(int Position); cMark *Add(int Position);
cMark *Get(int Position); cMark *Get(int Position);
@ -291,6 +294,11 @@ public:
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset); bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset);
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL); bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL);
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL); int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL);
int GetClosestIFrame(int Index);
///< Returns the index of the I-frame that is closest to the given Index (or Index itself,
///< if it already points to an I-frame). Index may be any value, even outside the current
///< range of frame indexes.
///< If there is no actual index data available, 0 is returned.
int Get(uint16_t FileNumber, off_t FileOffset); int Get(uint16_t FileNumber, off_t FileOffset);
int Last(void) { CatchUp(); return last; } int Last(void) { CatchUp(); return last; }
int GetResume(void) { return resumeFile.Read(); } int GetResume(void) { return resumeFile.Read(); }

10
vdr.5
View File

@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the .\" License as specified in the file COPYING that comes with the
.\" vdr distribution. .\" vdr distribution.
.\" .\"
.\" $Id: vdr.5 2.29 2012/03/10 14:56:01 kls Exp $ .\" $Id: vdr.5 2.30 2012/10/15 10:50:23 kls Exp $
.\" .\"
.TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files" .TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
.SH NAME .SH NAME
@ -815,13 +815,13 @@ least one blank.
The lines in this file need not necessarily appear in the correct temporal The lines in this file need not necessarily appear in the correct temporal
sequence, they will be automatically sorted by time index. sequence, they will be automatically sorted by time index.
If a frame position doesn't point to an I-frame of the corresponding recording,
it will be shifted towards the next I-frame (either up or down, whichever is
closer).
\fBCURRENT RESTRICTIONS:\fR \fBCURRENT RESTRICTIONS:\fR
-\ the comment is currently not used by VDR -\ the comment is currently not used by VDR
.br
-\ marks must have a frame number, and that frame MUST be an I-frame (this
means that only marks generated by VDR itself can be used, since they
will always be guaranteed to mark I-frames).
.SS EPG DATA .SS EPG DATA
The file \fIepg.data\fR contains the EPG data in an easily parsable format. The file \fIepg.data\fR contains the EPG data in an easily parsable format.
The first character of each line defines what kind of data this line contains. The first character of each line defines what kind of data this line contains.