21 #define FOLDERDELIMCHAR '~'
56 cResumeFile(
const char *FileName,
bool IsPesRecording);
85 const char *
Title(
void)
const {
return event->Title(); }
86 const char *
ShortText(
void)
const {
return event->ShortText(); }
87 const char *
Description(
void)
const {
return event->Description(); }
89 const char *
Aux(
void)
const {
return aux; }
93 bool Write(FILE *f,
const char *Prefix =
"")
const;
95 bool Write(
void)
const;
148 const char *
Title(
char Delimiter =
' ',
bool NewIndicator =
false,
int Level = -1)
const;
176 bool WriteInfo(
const char *OtherFileName = NULL);
227 void Refresh(
bool Foreground =
false);
228 bool ScanVideoDir(
const char *DirName,
bool Foreground =
false,
int LinkLevel = 0,
int DirLevel = 0);
238 bool Update(
bool Wait =
false);
251 void ResetResume(
const char *ResumeFileName = NULL);
254 void AddByName(
const char *FileName,
bool TriggerUpdate =
true);
301 bool Add(
int Usage,
const char *FileNameSrc,
const char *FileNameDst = NULL);
309 void Del(
const char *FileName);
333 #define DEFAULTFRAMESPERSECOND 25.0
349 bool Parse(
const char *s);
371 void Add(
int Position);
395 #define RUC_BEFORERECORDING "before"
396 #define RUC_STARTRECORDING "started"
397 #define RUC_AFTERRECORDING "after"
398 #define RUC_EDITEDRECORDING "edited"
399 #define RUC_DELETERECORDING "deleted"
405 static void SetCommand(
const char *Command) { command = Command; }
406 static void InvokeCommand(
const char *State,
const char *RecordingFileName,
const char *SourceFileName = NULL);
410 #define MAXFRAMESIZE (KILOBYTE(1024) / TS_SIZE * TS_SIZE) // multiple of TS_SIZE to avoid breaking up TS packets
417 #define MAXVIDEOFILESIZETS 1048570 // MB
418 #define MAXVIDEOFILESIZEPES 2000 // MB
419 #define MINVIDEOFILESIZE 100 // MB
420 #define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES
439 cIndexFile(
const char *FileName,
bool Record,
bool IsPesRecording =
false,
bool PauseLive =
false,
bool Update =
false);
441 bool Ok(
void) {
return index != NULL; }
442 bool Write(
bool Independent, uint16_t FileNumber, off_t FileOffset);
443 bool Get(
int Index, uint16_t *FileNumber, off_t *FileOffset,
bool *Independent = NULL,
int *Length = NULL);
444 int GetNextIFrame(
int Index,
bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL,
int *Length = NULL);
450 int Get(uint16_t FileNumber, off_t FileOffset);
457 static int GetLength(
const char *FileName,
bool IsPesRecording =
false);
472 cFileName(
const char *FileName,
bool Record,
bool Blocking =
false,
bool IsPesRecording =
false);
498 bool GenerateIndex(
const char *FileName,
bool Update =
false);
511 #endif //__RECORDING_H
void SetFramesPerSecond(double FramesPerSecond)
bool Update(bool Wait=false)
Triggers an update of the list of recordings, which will run as a separate thread if Wait is false...
static cString MarksFileName(const cRecording *Recording)
Returns the marks file name for the given Recording (regardless whether such a file actually exists)...
int TotalFileSizeMB(void)
int NumFrames(void) const
Returns the number of frames in this recording.
void Refresh(bool Foreground=false)
static char * StripEpisodeName(char *s, bool Strip)
#define DEFAULTFRAMESPERSECOND
bool Load(void)
Loads the current list of recordings and returns true if there is anything in it (for compatibility w...
cMark * GetPrev(int Position)
const cRecordingInfo * Info(void) const
void ResetResume(const char *ResumeFileName=NULL)
bool CatchUp(int Index=-1)
cResumeFile(const char *FileName, bool IsPesRecording)
const char * ShortText(void) const
bool IsEdited(void) const
int HMSFToIndex(const char *HMSF, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
bool IsInPath(const char *Path)
Returns true if this recording is stored anywhere under the given Path.
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
double FramesPerSecond(void) const
cMark * GetNextBegin(cMark *EndMark=NULL)
Returns the next "begin" mark after EndMark, skipping any marks at the same position as EndMark...
cUnbufferedFile * SetOffset(int Number, off_t Offset=0)
const char * Title(char Delimiter= ' ', bool NewIndicator=false, int Level=-1) const
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber=NULL, off_t *FileOffset=NULL, int *Length=NULL)
bool IsOnVideoDirectoryFileSystem(void) const
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
cUnbufferedFile * NextFile(void)
const cComponents * Components(void) const
cString IndexToHMSF(int Index, bool WithFrame=false, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
double FramesPerSecond(void) const
void ResetResume(void) const
cRecording(const cRecording &)
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
void SetPosition(int Position)
void SetAux(const char *Aux)
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner...
static cString IndexFileName(const char *FileName, bool IsPesRecording)
bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
static void SetCommand(const char *Command)
static const char * command
bool GenerateIndex(const char *FileName, bool Update=false)
Generates the index of the existing recording with the given FileName.
bool HasRecordingsSortMode(const char *Directory)
void IncRecordingsSortMode(const char *Directory)
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
eRecordingsSortMode RecordingsSortMode
char * SortName(void) const
cMark * GetNextEnd(cMark *BeginMark)
Returns the next "end" mark after BeginMark, skipping any marks at the same position as BeginMark...
cMark(int Position=0, const char *Comment=NULL, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
int PathIsInUse(const char *Path)
Checks whether any recording in the given Path is currently in use and therefore the whole Path shall...
cRecording & operator=(const cRecording &)
cRecording * GetByName(const char *FileName)
cMark * GetNext(int Position)
const char * Comment(void) const
void SetFileName(const char *FileName)
void RemoveDeletedRecordings(void)
char * ExchangeChars(char *s, bool ToFileSystem)
time_t Deleted(void) const
void SetData(const char *Title, const char *ShortText, const char *Description)
int GetResume(void) const
Returns the index of the frame where replay of this recording shall be resumed, or -1 in case of an e...
int LengthInSeconds(void) const
Returns the length (in seconds) of this recording, or -1 in case of error.
void UpdateByName(const char *FileName)
int GetNumRecordingsInPath(const char *Path)
Returns the total number of recordings in the given Path, including all sub-folders of Path...
void AssertFreeDiskSpace(int Priority=0, bool Force=false)
The special Priority value -1 means that we shall get rid of any deleted recordings faster than norma...
void SetStartTime(time_t Start)
Sets the start time of this recording to the given value.
bool Finished(bool &Error)
Returns true if all operations in the list have been finished.
int FileSizeMB(void) const
Returns the total file size of this recording (in MB), or -1 if the file size is unknown.
bool Delete(void)
Changes the file name so that it will no longer be visible in the "Recordings" menu Returns false in ...
tChannelID ChannelID(void) const
void ConvertToPes(tIndexTs *IndexTs, int Count)
cUnbufferedFile * Open(void)
static int GetLength(const char *FileName, bool IsPesRecording=false)
Calculates the recording length (number of frames) without actually reading the index file...
int isOnVideoDirectoryFileSystem
void ConvertFromPes(tIndexTs *IndexTs, int Count)
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).
static char * updateFileName
int HierarchyLevels(void) const
void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
void TouchUpdate(void)
Touches the '.update' file in the video directory, so that other instances of VDR that access the sam...
bool MoveRecordings(const char *OldPath, const char *NewPath)
Moves all recordings in OldPath to NewPath.
int SecondsToFrames(int Seconds, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
bool Parse(const char *s)
const char * UpdateFileName(void)
cIndexFile(const char *FileName, bool Record, bool IsPesRecording=false, bool PauseLive=false, bool Update=false)
bool Remove(void)
Actually removes the file from the disk Returns false in case of error.
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder). ...
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
cRecordings DeletedRecordings
bool StoreResume(int Index)
cIndexFileGenerator * indexFileGenerator
cRecordings(bool Deleted=false)
void GetRecordingsSortMode(const char *Directory)
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
int GetNumSequences(void)
Returns the actual number of sequences to be cut from the recording.
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode)
void DelAll(void)
Deletes/terminates all operations.
cMark * Get(int Position)
cRecordingsHandler RecordingsHandler
cFileName(const char *FileName, bool Record, bool Blocking=false, bool IsPesRecording=false)
double MBperMinute(void)
Returns the average data rate (in MB/min) of all recordings, or -1 if this value is unknown...
void Add(int Position)
If this cMarks object is used by multiple threads, the caller must Lock() it before calling Add() and...
cRecordingsHandlerEntry * Get(const char *FileName)
const cEvent * GetEvent(void) const
const char * Description(void) const
const char * Name(void) const
Returns the full name of the recording (without the video directory.
void ClearVanishedRecordings(void)
void DelByName(const char *FileName)
const char * Title(void) const
cList< cRecordingsHandlerEntry > operations
void ClearSortNames(void)
bool StateChanged(int &State)
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
cRecordingInfo(const cChannel *Channel=NULL, const cEvent *Event=NULL)
bool DeleteMarks(void)
Deletes the editing marks from this recording (if any).
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent=NULL, int *Length=NULL)
bool Active(void)
Checks whether there is currently any operation running and starts the next one form the list if the ...
const char * ChannelName(void) const
bool IsStillRecording(void)
void SetComment(const char *Comment)
const char * Aux(void) const
cString recordingFileName
cRecordings Recordings
Any access to Recordings that loops through the list of recordings needs to hold a thread lock on thi...
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
virtual int Compare(const cListObject &ListObject) const
Must return 0 if this object is equal to ListObject, a positive value if it is "greater", and a negative value if it is "smaller".
const char * PrefixFileName(char Prefix)
bool WriteInfo(const char *OtherFileName=NULL)
Writes in info file of this recording.
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
void AddByName(const char *FileName, bool TriggerUpdate=true)
bool IsPesRecording(void) const
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with...
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset)
bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst=NULL)
Adds the given FileNameSrc to the recordings handler for (later) processing.
bool Undelete(void)
Changes the file name so that it will be visible in the "Recordings" menu again and not processed by ...
bool HasMarks(void)
Returns true if this recording has any editing marks.
bool ScanVideoDir(const char *DirName, bool Foreground=false, int LinkLevel=0, int DirLevel=0)