vdr  2.4.7
recording.h
Go to the documentation of this file.
1 /*
2  * recording.h: Recording file handling
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * $Id: recording.h 4.10 2020/09/16 13:48:33 kls Exp $
8  */
9 
10 #ifndef __RECORDING_H
11 #define __RECORDING_H
12 
13 #include <time.h>
14 #include "channels.h"
15 #include "config.h"
16 #include "epg.h"
17 #include "thread.h"
18 #include "timers.h"
19 #include "tools.h"
20 
21 #define FOLDERDELIMCHAR '~'
22 
23 extern int DirectoryPathMax;
24 extern int DirectoryNameMax;
25 extern bool DirectoryEncoding;
26 extern int InstanceId;
27 
29  ruNone = 0x0000, // the recording is currently unused
30  ruTimer = 0x0001, // the recording is currently written to by a timer
31  ruReplay = 0x0002, // the recording is being replayed
32  // mutually exclusive:
33  ruCut = 0x0004, // the recording is being cut
34  ruMove = 0x0008, // the recording is being moved
35  ruCopy = 0x0010, // the recording is being copied
36  // mutually exclusive:
37  ruSrc = 0x0020, // the recording is the source of a cut, move or copy process
38  ruDst = 0x0040, // the recording is the destination of a cut, move or copy process
39  //
40  ruPending = 0x0080, // the recording is pending a cut, move or copy process
41  ruCanceled = 0x8000, // the operation has been canceled, waiting for cleanup
42  };
43 
44 // workaround patch for enabling extra features in extrecmenung until vdr 2.5.2 is released
45 #ifndef EPGRENAME
46 #define EPGRENAME
47 #endif
48 
49 void RemoveDeletedRecordings(void);
50 void AssertFreeDiskSpace(int Priority = 0, bool Force = false);
55 
56 class cResumeFile {
57 private:
58  char *fileName;
60 public:
61  cResumeFile(const char *FileName, bool IsPesRecording);
62  ~cResumeFile();
63  int Read(void);
64  bool Save(int Index);
65  void Delete(void);
66  };
67 
69  friend class cRecording;
70 private:
72  char *channelName;
73  const cEvent *event;
75  char *aux;
77  int priority;
78  int lifetime;
79  char *fileName;
80  cRecordingInfo(const cChannel *Channel = NULL, const cEvent *Event = NULL);
81  bool Read(FILE *f);
82 public:
83  cRecordingInfo(const char *FileName);
85  tChannelID ChannelID(void) const { return channelID; }
86  const char *ChannelName(void) const { return channelName; }
87  const cEvent *GetEvent(void) const { return event; }
88  const char *Title(void) const { return event->Title(); }
89  const char *ShortText(void) const { return event->ShortText(); }
90  const char *Description(void) const { return event->Description(); }
91  const cComponents *Components(void) const { return event->Components(); }
92  const char *Aux(void) const { return aux; }
93  double FramesPerSecond(void) const { return framesPerSecond; }
95  void SetFileName(const char *FileName);
96  bool Write(FILE *f, const char *Prefix = "") const;
97  bool Read(void);
98  bool Write(void) const;
99  void SetData(const char *Title, const char *ShortText, const char *Description);
100  void SetAux(const char *Aux);
101  };
102 
103 class cRecording : public cListObject {
104  friend class cRecordings;
105 private:
106  int id;
107  mutable int resume;
108  mutable char *titleBuffer;
109  mutable char *sortBufferName;
110  mutable char *sortBufferTime;
111  mutable char *fileName;
112  mutable char *name;
113  mutable int fileSizeMB;
114  mutable int numFrames;
115  int channel;
118  mutable int isOnVideoDirectoryFileSystem; // -1 = unknown, 0 = no, 1 = yes
121  cRecording(const cRecording&); // can't copy cRecording
122  cRecording &operator=(const cRecording &); // can't assign cRecording
123  static char *StripEpisodeName(char *s, bool Strip);
124  char *SortName(void) const;
125  void ClearSortName(void);
126  void SetId(int Id); // should only be set by cRecordings
127  time_t start;
128  int priority;
129  int lifetime;
130  time_t deleted;
131 public:
132  cRecording(cTimer *Timer, const cEvent *Event);
133  cRecording(const char *FileName);
134  virtual ~cRecording();
135  int Id(void) const { return id; }
136  time_t Start(void) const { return start; }
137  int Priority(void) const { return priority; }
138  int Lifetime(void) const { return lifetime; }
139  time_t Deleted(void) const { return deleted; }
140  void SetDeleted(void) { deleted = time(NULL); }
141  virtual int Compare(const cListObject &ListObject) const;
142  bool IsInPath(const char *Path) const;
145  cString Folder(void) const;
148  cString BaseName(void) const;
151  const char *Name(void) const { return name; }
154  const char *FileName(void) const;
157  const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const;
158  cRecordingInfo *Info(void) const { return info; }
159  const char *PrefixFileName(char Prefix);
160  int HierarchyLevels(void) const;
161  void ResetResume(void) const;
162  double FramesPerSecond(void) const { return framesPerSecond; }
163  int NumFrames(void) const;
166  int LengthInSeconds(void) const;
168  int FileSizeMB(void) const;
171  int GetResume(void) const;
174  bool IsNew(void) const { return GetResume() <= 0; }
175  bool IsEdited(void) const;
176  bool IsPesRecording(void) const { return isPesRecording; }
177  bool IsOnVideoDirectoryFileSystem(void) const;
178  bool HasMarks(void) const;
180  bool DeleteMarks(void);
184  void ReadInfo(void);
185  bool WriteInfo(const char *OtherFileName = NULL);
189  void SetStartTime(time_t Start);
197  bool ChangePriorityLifetime(int NewPriority, int NewLifetime);
201  bool ChangeName(const char *NewName);
208  bool Delete(void);
211  bool Remove(void);
214  bool Undelete(void);
218  int IsInUse(void) const;
226  };
227 
229 
230 class cRecordings : public cList<cRecording> {
231 private:
234  static int lastRecordingId;
235  static char *updateFileName;
236  static time_t lastUpdate;
238  static const char *UpdateFileName(void);
239 public:
240  cRecordings(bool Deleted = false);
241  virtual ~cRecordings();
242  static const cRecordings *GetRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, false, TimeoutMs) ? &recordings : NULL; }
245  static cRecordings *GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, true, TimeoutMs) ? &recordings : NULL; }
248  static const cRecordings *GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, false, TimeoutMs) ? &deletedRecordings : NULL; }
251  static cRecordings *GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, true, TimeoutMs) ? &deletedRecordings : NULL; }
254  static void Update(bool Wait = false);
258  static void TouchUpdate(void);
262  static bool NeedsUpdate(void);
263  void ResetResume(const char *ResumeFileName = NULL);
264  void ClearSortNames(void);
265  const cRecording *GetById(int Id) const;
266  cRecording *GetById(int Id) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetById(Id)); };
267  const cRecording *GetByName(const char *FileName) const;
268  cRecording *GetByName(const char *FileName) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetByName(FileName)); }
269  void Add(cRecording *Recording);
270  void AddByName(const char *FileName, bool TriggerUpdate = true);
271  void DelByName(const char *FileName);
272  void UpdateByName(const char *FileName);
273  int TotalFileSizeMB(void) const;
274  double MBperMinute(void) const;
277  int PathIsInUse(const char *Path) const;
285  int GetNumRecordingsInPath(const char *Path) const;
289  bool MoveRecordings(const char *OldPath, const char *NewPath);
298  };
299 
300 // Provide lock controlled access to the list:
301 
302 DEF_LIST_LOCK(Recordings);
303 DEF_LIST_LOCK2(Recordings, DeletedRecordings);
304 
305 // These macros provide a convenient way of locking the global recordings list
306 // and making sure the lock is released as soon as the current scope is left
307 // (note that these macros wait forever to obtain the lock!):
308 
309 #define LOCK_RECORDINGS_READ USE_LIST_LOCK_READ(Recordings)
310 #define LOCK_RECORDINGS_WRITE USE_LIST_LOCK_WRITE(Recordings)
311 #define LOCK_DELETEDRECORDINGS_READ USE_LIST_LOCK_READ2(Recordings, DeletedRecordings)
312 #define LOCK_DELETEDRECORDINGS_WRITE USE_LIST_LOCK_WRITE2(Recordings, DeletedRecordings)
313 
315 
316 class cRecordingsHandler : public cThread {
317 private:
320  bool finished;
321  bool error;
322  cRecordingsHandlerEntry *Get(const char *FileName);
323 protected:
324  virtual void Action(void);
325 public:
326  cRecordingsHandler(void);
327  virtual ~cRecordingsHandler();
328  bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst = NULL);
336  void Del(const char *FileName);
341  void DelAll(void);
343  int GetUsage(const char *FileName);
345  bool Finished(bool &Error);
350  };
351 
353 
354 #define DEFAULTFRAMESPERSECOND 25.0
355 
356 class cMark : public cListObject {
357  friend class cMarks; // for sorting
358 private:
360  int position;
362 public:
363  cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
364  virtual ~cMark();
365  int Position(void) const { return position; }
366  const char *Comment(void) const { return comment; }
368  void SetComment(const char *Comment) { comment = Comment; }
369  cString ToText(void);
370  bool Parse(const char *s);
371  bool Save(FILE *f);
372  };
373 
374 class cMarks : public cConfig<cMark> {
375 private:
380  time_t nextUpdate;
381  time_t lastFileTime;
382  time_t lastChange;
383 public:
384  cMarks(void): cConfig<cMark>("Marks") {};
385  static cString MarksFileName(const cRecording *Recording);
388  static bool DeleteMarksFile(const cRecording *Recording);
389  bool Load(const char *RecordingFileName, double FramesPerSecond = DEFAULTFRAMESPERSECOND, bool IsPesRecording = false);
390  bool Update(void);
391  bool Save(void);
392  void Align(void);
393  void Sort(void);
394  void Add(int Position);
400  const cMark *Get(int Position) const;
401  const cMark *GetPrev(int Position) const;
402  const cMark *GetNext(int Position) const;
403  const cMark *GetNextBegin(const cMark *EndMark = NULL) const;
407  const cMark *GetNextEnd(const cMark *BeginMark) const;
410  int GetNumSequences(void) const;
416  cMark *Get(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->Get(Position)); }
417  cMark *GetPrev(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetPrev(Position)); }
418  cMark *GetNext(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNext(Position)); }
419  cMark *GetNextBegin(const cMark *EndMark = NULL) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextBegin(EndMark)); }
420  cMark *GetNextEnd(const cMark *BeginMark) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextEnd(BeginMark)); }
421  };
422 
423 #define RUC_BEFORERECORDING "before"
424 #define RUC_STARTRECORDING "started"
425 #define RUC_AFTERRECORDING "after"
426 #define RUC_EDITINGRECORDING "editing"
427 #define RUC_EDITEDRECORDING "edited"
428 #define RUC_DELETERECORDING "deleted"
429 
431 private:
432  static const char *command;
433 public:
434  static void SetCommand(const char *Command) { command = Command; }
435  static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName = NULL);
436  };
437 
438 // The maximum size of a single frame (up to HDTV 1920x1080):
439 #define MAXFRAMESIZE (KILOBYTE(1024) / TS_SIZE * TS_SIZE) // multiple of TS_SIZE to avoid breaking up TS packets
440 
441 // The maximum file size is limited by the range that can be covered
442 // with a 40 bit 'unsigned int', which is 1TB. The actual maximum value
443 // used is 6MB below the theoretical maximum, to have some safety (the
444 // actual file size may be slightly higher because we stop recording only
445 // before the next independent frame, to have a complete Group Of Pictures):
446 #define MAXVIDEOFILESIZETS 1048570 // MB
447 #define MAXVIDEOFILESIZEPES 2000 // MB
448 #define MINVIDEOFILESIZE 100 // MB
449 #define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES
450 
451 struct tIndexTs;
452 class cIndexFileGenerator;
453 
454 class cIndexFile {
455 private:
456  int f;
458  int size, last;
459  tIndexTs *index;
464  void ConvertFromPes(tIndexTs *IndexTs, int Count);
465  void ConvertToPes(tIndexTs *IndexTs, int Count);
466  bool CatchUp(int Index = -1);
467 public:
468  cIndexFile(const char *FileName, bool Record, bool IsPesRecording = false, bool PauseLive = false, bool Update = false);
469  ~cIndexFile();
470  bool Ok(void) { return index != NULL; }
471  bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset);
472  bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL);
473  int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL);
474  int GetClosestIFrame(int Index);
479  int Get(uint16_t FileNumber, off_t FileOffset);
480  int Last(void) { CatchUp(); return last; }
482  int GetResume(void) { return resumeFile.Read(); }
483  bool StoreResume(int Index) { return resumeFile.Save(Index); }
484  bool IsStillRecording(void);
485  void Delete(void);
486  static int GetLength(const char *FileName, bool IsPesRecording = false);
489  static cString IndexFileName(const char *FileName, bool IsPesRecording);
490  };
491 
492 class cFileName {
493 private:
495  uint16_t fileNumber;
497  bool record;
498  bool blocking;
500 public:
501  cFileName(const char *FileName, bool Record, bool Blocking = false, bool IsPesRecording = false);
502  ~cFileName();
503  const char *Name(void) { return fileName; }
504  uint16_t Number(void) { return fileNumber; }
505  bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion);
506  cUnbufferedFile *Open(void);
507  void Close(void);
508  cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating
509  cUnbufferedFile *NextFile(void);
510  };
511 
512 cString IndexToHMSF(int Index, bool WithFrame = false, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
513  // Converts the given index to a string, optionally containing the frame number.
514 int HMSFToIndex(const char *HMSF, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
515  // Converts the given string (format: "hh:mm:ss.ff") to an index.
516 int SecondsToFrames(int Seconds, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
517  // Returns the number of frames corresponding to the given number of seconds.
518 
519 int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max);
520 
521 char *ExchangeChars(char *s, bool ToFileSystem);
522  // Exchanges the characters in the given string to or from a file system
523  // specific representation (depending on ToFileSystem). The given string will
524  // be modified and may be reallocated if more space is needed. The return
525  // value points to the resulting string, which may be different from s.
526 
527 bool GenerateIndex(const char *FileName, bool Update = false);
532 
536 bool HasRecordingsSortMode(const char *Directory);
537 void GetRecordingsSortMode(const char *Directory);
538 void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode);
539 void IncRecordingsSortMode(const char *Directory);
540 
541 void SetRecordingTimerId(const char *Directory, const char *TimerId);
542 cString GetRecordingTimerId(const char *Directory);
543 
544 #endif //__RECORDING_H
Definition: epg.h:71
bool isPesRecording
Definition: recording.h:499
cUnbufferedFile * NextFile(void)
Definition: recording.c:3048
uint16_t Number(void)
Definition: recording.h:504
bool record
Definition: recording.h:497
void Close(void)
Definition: recording.c:2996
uint16_t fileNumber
Definition: recording.h:495
cUnbufferedFile * Open(void)
Definition: recording.c:2972
cFileName(const char *FileName, bool Record, bool Blocking=false, bool IsPesRecording=false)
Definition: recording.c:2897
char * fileName
Definition: recording.h:496
char * pFileNumber
Definition: recording.h:496
bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
Definition: recording.c:2921
bool blocking
Definition: recording.h:498
const char * Name(void)
Definition: recording.h:503
cUnbufferedFile * SetOffset(int Number, off_t Offset=0)
Definition: recording.c:3006
cUnbufferedFile * file
Definition: recording.h:494
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber=NULL, off_t *FileOffset=NULL, int *Length=NULL)
Definition: recording.c:2755
cResumeFile resumeFile
Definition: recording.h:461
bool IsStillRecording(void)
Definition: recording.c:2835
void ConvertFromPes(tIndexTs *IndexTs, int Count)
Definition: recording.c:2631
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset)
Definition: recording.c:2712
static int GetLength(const char *FileName, bool IsPesRecording=false)
Calculates the recording length (number of frames) without actually reading the index file.
Definition: recording.c:2852
bool CatchUp(int Index=-1)
Definition: recording.c:2656
int GetResume(void)
Definition: recording.h:482
void ConvertToPes(tIndexTs *IndexTs, int Count)
Definition: recording.c:2643
bool isPesRecording
Definition: recording.h:460
cString fileName
Definition: recording.h:457
bool StoreResume(int Index)
Definition: recording.h:483
cIndexFile(const char *FileName, bool Record, bool IsPesRecording=false, bool PauseLive=false, bool Update=false)
Definition: recording.c:2534
cIndexFileGenerator * indexFileGenerator
Definition: recording.h:462
static cString IndexFileName(const char *FileName, bool IsPesRecording)
Definition: recording.c:2626
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent=NULL, int *Length=NULL)
Definition: recording.c:2729
int GetClosestIFrame(int Index)
Returns the index of the I-frame that is closest to the given Index (or Index itself,...
Definition: recording.c:2793
bool Ok(void)
Definition: recording.h:470
cMutex mutex
Definition: recording.h:463
void Delete(void)
Definition: recording.c:2840
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
Definition: recording.h:480
tIndexTs * index
Definition: recording.h:459
bool Lock(cStateKey &StateKey, bool Write=false, int TimeoutMs=0) const
Tries to get a lock on this list and returns true if successful.
Definition: tools.c:2149
Definition: tools.h:598
cMark(int Position=0, const char *Comment=NULL, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:2097
cString comment
Definition: recording.h:361
int position
Definition: recording.h:360
bool Parse(const char *s)
Definition: recording.c:2113
bool Save(FILE *f)
Definition: recording.c:2127
cString ToText(void)
Definition: recording.c:2108
const char * Comment(void) const
Definition: recording.h:366
double framesPerSecond
Definition: recording.h:359
void SetPosition(int Position)
Definition: recording.h:367
int Position(void) const
Definition: recording.h:365
virtual ~cMark()
Definition: recording.c:2104
void SetComment(const char *Comment)
Definition: recording.h:368
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
Definition: recording.c:2293
double framesPerSecond
Definition: recording.h:378
void Add(int Position)
If this cMarks object is used by multiple threads, the caller must Lock() it before calling Add() and...
Definition: recording.c:2226
cMark * GetNextEnd(const cMark *BeginMark)
Definition: recording.h:420
const cMark * GetNextBegin(const cMark *EndMark=NULL) const
Returns the next "begin" mark after EndMark, skipping any marks at the same position as EndMark.
Definition: recording.c:2259
cMark * Get(int Position)
Definition: recording.h:416
const cMark * GetNext(int Position) const
Definition: recording.c:2250
bool Update(void)
Definition: recording.c:2162
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
Definition: recording.c:2150
time_t lastFileTime
Definition: recording.h:381
cMark * GetNext(int Position)
Definition: recording.h:418
const cMark * GetNextEnd(const cMark *BeginMark) const
Returns the next "end" mark after BeginMark, skipping any marks at the same position as BeginMark.
Definition: recording.c:2275
const cMark * Get(int Position) const
Definition: recording.c:2232
cString recordingFileName
Definition: recording.h:376
cMark * GetNextBegin(const cMark *EndMark=NULL)
Definition: recording.h:419
bool isPesRecording
Definition: recording.h:379
cMark * GetPrev(int Position)
Definition: recording.h:417
time_t nextUpdate
Definition: recording.h:380
cString fileName
Definition: recording.h:377
static bool DeleteMarksFile(const cRecording *Recording)
Definition: recording.c:2139
void Align(void)
Definition: recording.c:2202
void Sort(void)
Definition: recording.c:2214
cMarks(void)
Definition: recording.h:384
static cString MarksFileName(const cRecording *Recording)
Returns the marks file name for the given Recording (regardless whether such a file actually exists).
Definition: recording.c:2134
bool Save(void)
Definition: recording.c:2193
const cMark * GetPrev(int Position) const
Definition: recording.c:2241
time_t lastChange
Definition: recording.h:382
Definition: thread.h:67
void SetFramesPerSecond(double FramesPerSecond)
Definition: recording.c:447
cEvent * ownEvent
Definition: recording.h:74
const cEvent * event
Definition: recording.h:73
cRecordingInfo(const cChannel *Channel=NULL, const cEvent *Event=NULL)
Definition: recording.c:351
bool Write(void) const
Definition: recording.c:549
bool Read(void)
Definition: recording.c:531
const cEvent * GetEvent(void) const
Definition: recording.h:87
char * aux
Definition: recording.h:75
const char * ChannelName(void) const
Definition: recording.h:86
const char * Title(void) const
Definition: recording.h:88
tChannelID channelID
Definition: recording.h:71
tChannelID ChannelID(void) const
Definition: recording.h:85
const char * Description(void) const
Definition: recording.h:90
void SetFileName(const char *FileName)
Definition: recording.c:452
const char * ShortText(void) const
Definition: recording.h:89
char * channelName
Definition: recording.h:72
const char * Aux(void) const
Definition: recording.h:92
void SetAux(const char *Aux)
Definition: recording.c:441
void SetData(const char *Title, const char *ShortText, const char *Description)
Definition: recording.c:431
const cComponents * Components(void) const
Definition: recording.h:91
double framesPerSecond
Definition: recording.h:76
double FramesPerSecond(void) const
Definition: recording.h:93
char * fileName
Definition: recording.h:79
static const char * command
Definition: recording.h:432
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
Definition: recording.c:2314
static void SetCommand(const char *Command)
Definition: recording.h:434
int isOnVideoDirectoryFileSystem
Definition: recording.h:118
virtual int Compare(const cListObject &ListObject) const
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
Definition: recording.c:1027
time_t deleted
Definition: recording.h:130
cRecordingInfo * info
Definition: recording.h:120
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
Definition: recording.c:1211
bool HasMarks(void) const
Returns true if this recording has any editing marks.
Definition: recording.c:1173
bool WriteInfo(const char *OtherFileName=NULL)
Writes in info file of this recording.
Definition: recording.c:1191
int resume
Definition: recording.h:107
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with.
Definition: recording.c:1326
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
Definition: recording.c:1236
bool Undelete(void)
Changes the file name so that it will be visible in the "Recordings" menu again and not processed by ...
Definition: recording.c:1300
void ResetResume(void) const
Definition: recording.c:1337
bool IsNew(void) const
Definition: recording.h:174
double framesPerSecond
Definition: recording.h:119
bool Delete(void)
Changes the file name so that it will no longer be visible in the "Recordings" menu Returns false in ...
Definition: recording.c:1263
const char * Name(void) const
Returns the full name of the recording (without the video directory).
Definition: recording.h:151
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
Definition: recording.c:1044
bool isPesRecording
Definition: recording.h:117
void ClearSortName(void)
Definition: recording.c:1006
char * sortBufferName
Definition: recording.h:109
int NumFrames(void) const
Returns the number of frames in this recording.
Definition: recording.c:1342
bool IsEdited(void) const
Definition: recording.c:1159
int Id(void) const
Definition: recording.h:135
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...
Definition: recording.c:1018
bool IsInPath(const char *Path) const
Returns true if this recording is stored anywhere under the given Path.
Definition: recording.c:1036
virtual ~cRecording()
Definition: recording.c:943
int fileSizeMB
Definition: recording.h:113
void SetId(int Id)
Definition: recording.c:1013
void SetStartTime(time_t Start)
Sets the start time of this recording to the given value.
Definition: recording.c:1204
char * SortName(void) const
Definition: recording.c:982
time_t Start(void) const
Definition: recording.h:136
int Lifetime(void) const
Definition: recording.h:138
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
Definition: recording.c:1058
const char * PrefixFileName(char Prefix)
Definition: recording.c:1137
bool DeleteMarks(void)
Deletes the editing marks from this recording (if any).
Definition: recording.c:1178
int priority
Definition: recording.h:128
bool IsOnVideoDirectoryFileSystem(void) const
Definition: recording.c:1166
int HierarchyLevels(void) const
Definition: recording.c:1148
int lifetime
Definition: recording.h:129
int FileSizeMB(void) const
Returns the total file size of this recording (in MB), or -1 if the file size is unknown.
Definition: recording.c:1361
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder).
Definition: recording.c:1051
char * fileName
Definition: recording.h:111
char * titleBuffer
Definition: recording.h:108
void SetDeleted(void)
Definition: recording.h:140
int Priority(void) const
Definition: recording.h:137
cRecordingInfo * Info(void) const
Definition: recording.h:158
void ReadInfo(void)
Definition: recording.c:1183
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
Definition: recording.c:1076
cRecording & operator=(const cRecording &)
int instanceId
Definition: recording.h:116
bool Remove(void)
Actually removes the file from the disk Returns false in case of error.
Definition: recording.c:1289
char * name
Definition: recording.h:112
cRecording(const cRecording &)
char * sortBufferTime
Definition: recording.h:110
int channel
Definition: recording.h:115
time_t start
Definition: recording.h:127
int numFrames
Definition: recording.h:114
double FramesPerSecond(void) const
Definition: recording.h:162
bool IsPesRecording(void) const
Definition: recording.h:176
time_t Deleted(void) const
Definition: recording.h:139
static char * StripEpisodeName(char *s, bool Strip)
Definition: recording.c:953
int LengthInSeconds(void) const
Returns the length (in seconds) of this recording, or -1 in case of error.
Definition: recording.c:1353
void DelAll(void)
Deletes/terminates all operations.
Definition: recording.c:2065
cRecordingsHandler(void)
Definition: recording.c:1977
cRecordingsHandlerEntry * Get(const char *FileName)
Definition: recording.c:2014
bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst=NULL)
Adds the given FileNameSrc to the recordings handler for (later) processing.
Definition: recording.c:2027
bool Finished(bool &Error)
Returns true if all operations in the list have been finished.
Definition: recording.c:2080
virtual void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
Definition: recording.c:1989
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
Definition: recording.c:2072
cList< cRecordingsHandlerEntry > operations
Definition: recording.h:319
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
Definition: recording.c:2058
virtual ~cRecordingsHandler()
Definition: recording.c:1984
void ResetResume(const char *ResumeFileName=NULL)
Definition: recording.c:1675
static cRecordings * GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for write access.
Definition: recording.h:251
void UpdateByName(const char *FileName)
Definition: recording.c:1597
static const char * UpdateFileName(void)
Definition: recording.c:1505
virtual ~cRecordings()
Definition: recording.c:1498
double MBperMinute(void) const
Returns the average data rate (in MB/min) of all recordings, or -1 if this value is unknown.
Definition: recording.c:1614
cRecordings(bool Deleted=false)
Definition: recording.c:1493
cRecording * GetByName(const char *FileName)
Definition: recording.h:268
int GetNumRecordingsInPath(const char *Path) const
Returns the total number of recordings in the given Path, including all sub-folders of Path.
Definition: recording.c:1645
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
Definition: recording.h:242
const cRecording * GetById(int Id) const
Definition: recording.c:1540
static time_t lastUpdate
Definition: recording.h:236
static cRecordings deletedRecordings
Definition: recording.h:233
void AddByName(const char *FileName, bool TriggerUpdate=true)
Definition: recording.c:1566
static cRecordings recordings
Definition: recording.h:232
int TotalFileSizeMB(void) const
Definition: recording.c:1603
cRecording * GetById(int Id)
Definition: recording.h:266
static void Update(bool Wait=false)
Triggers an update of the list of recordings, which will run as a separate thread if Wait is false.
Definition: recording.c:1528
static const cRecordings * GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for read access.
Definition: recording.h:248
static void TouchUpdate(void)
Touches the '.update' file in the video directory, so that other instances of VDR that access the sam...
Definition: recording.c:1512
void Add(cRecording *Recording)
Definition: recording.c:1560
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
Definition: recording.h:245
static cVideoDirectoryScannerThread * videoDirectoryScannerThread
Definition: recording.h:237
void DelByName(const char *FileName)
Definition: recording.c:1575
bool MoveRecordings(const char *OldPath, const char *NewPath)
Moves all recordings in OldPath to NewPath.
Definition: recording.c:1655
static bool NeedsUpdate(void)
Definition: recording.c:1520
void ClearSortNames(void)
Definition: recording.c:1683
static int lastRecordingId
Definition: recording.h:234
const cRecording * GetByName(const char *FileName) const
Definition: recording.c:1549
static char * updateFileName
Definition: recording.h:235
int PathIsInUse(const char *Path) const
Checks whether any recording in the given Path is currently in use and therefore the whole Path shall...
Definition: recording.c:1635
bool isPesRecording
Definition: recording.h:59
bool Save(int Index)
Definition: recording.c:307
char * fileName
Definition: recording.h:58
int Read(void)
Definition: recording.c:262
void Delete(void)
Definition: recording.c:337
cResumeFile(const char *FileName, bool IsPesRecording)
Definition: recording.c:244
Definition: tools.h:174
Definition: thread.h:79
Definition: timers.h:27
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner,...
Definition: tools.h:461
eRecordingUsage
Definition: recording.h:28
@ ruSrc
Definition: recording.h:37
@ ruCut
Definition: recording.h:33
@ ruReplay
Definition: recording.h:31
@ ruCopy
Definition: recording.h:35
@ ruCanceled
Definition: recording.h:41
@ ruTimer
Definition: recording.h:30
@ ruDst
Definition: recording.h:38
@ ruNone
Definition: recording.h:29
@ ruMove
Definition: recording.h:34
@ ruPending
Definition: recording.h:40
int DirectoryNameMax
Definition: recording.c:77
cString GetRecordingTimerId(const char *Directory)
Definition: recording.c:3160
eRecordingsSortMode
Definition: recording.h:534
@ rsmName
Definition: recording.h:534
@ rsmTime
Definition: recording.h:534
char * ExchangeChars(char *s, bool ToFileSystem)
Definition: recording.c:590
#define DEFAULTFRAMESPERSECOND
Definition: recording.h:354
int HMSFToIndex(const char *HMSF, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3071
eRecordingsSortDir
Definition: recording.h:533
@ rsdDescending
Definition: recording.h:533
@ rsdAscending
Definition: recording.h:533
int DirectoryPathMax
Definition: recording.c:76
void GetRecordingsSortMode(const char *Directory)
Definition: recording.c:3112
eRecordingsSortMode RecordingsSortMode
Definition: recording.c:3105
bool HasRecordingsSortMode(const char *Directory)
Definition: recording.c:3107
DEF_LIST_LOCK(Recordings)
int InstanceId
Definition: recording.c:79
bool DirectoryEncoding
Definition: recording.c:78
void IncRecordingsSortMode(const char *Directory)
Definition: recording.c:3131
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode)
Definition: recording.c:3123
DEF_LIST_LOCK2(Recordings, DeletedRecordings)
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
Definition: recording.c:3089
cRecordingsHandler RecordingsHandler
Definition: recording.c:1975
void SetRecordingTimerId(const char *Directory, const char *TimerId)
Definition: recording.c:3142
void RemoveDeletedRecordings(void)
Definition: recording.c:137
int SecondsToFrames(int Seconds, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3082
cString IndexToHMSF(int Index, bool WithFrame=false, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3055
bool GenerateIndex(const char *FileName, bool Update=false)
Generates the index of the existing recording with the given FileName.
Definition: recording.c:2861
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...
Definition: recording.c:154
unsigned char uchar
Definition: tools.h:31