vdr  2.7.6
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 5.15 2025/04/16 09:14:20 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 #include "remux.h"
21 
22 #define FOLDERDELIMCHAR '~'
23 
24 extern int DirectoryPathMax;
25 extern int DirectoryNameMax;
26 extern bool DirectoryEncoding;
27 extern int InstanceId;
28 
30  ruNone = 0x0000, // the recording is currently unused
31  ruTimer = 0x0001, // the recording is currently written to by a timer
32  ruReplay = 0x0002, // the recording is being replayed
33  // mutually exclusive:
34  ruCut = 0x0004, // the recording is being cut
35  ruMove = 0x0008, // the recording is being moved
36  ruCopy = 0x0010, // the recording is being copied
37  // mutually exclusive:
38  ruSrc = 0x0020, // the recording is the source of a cut, move or copy process
39  ruDst = 0x0040, // the recording is the destination of a cut, move or copy process
40  //
41  ruPending = 0x0080, // the recording is pending a cut, move or copy process
42  ruCanceled = 0x8000, // the operation has been canceled, waiting for cleanup
43  };
44 
45 void RemoveDeletedRecordings(void);
46 void AssertFreeDiskSpace(int Priority = 0, bool Force = false);
51 
52 class cResumeFile {
53 private:
54  char *fileName;
56 public:
57  cResumeFile(const char *FileName, bool IsPesRecording);
58  ~cResumeFile();
59  int Read(void);
60  bool Save(int Index);
61  void Delete(void);
62  };
63 
65  friend class cRecording;
66 private:
67  time_t modified;
69  char *channelName;
70  const cEvent *event;
72  char *aux;
74  uint16_t frameWidth;
75  uint16_t frameHeight;
78  int priority;
79  int lifetime;
80  char *fileName;
81  int errors;
82  cRecordingInfo(const cChannel *Channel = NULL, const cEvent *Event = NULL);
83  bool Read(FILE *f, bool Force = false);
84 public:
85  cRecordingInfo(const char *FileName);
87  tChannelID ChannelID(void) const { return channelID; }
88  const char *ChannelName(void) const { return channelName; }
89  const cEvent *GetEvent(void) const { return event; }
90  const char *Title(void) const { return event->Title(); }
91  const char *ShortText(void) const { return event->ShortText(); }
92  const char *Description(void) const { return event->Description(); }
93  const cComponents *Components(void) const { return event->Components(); }
94  const char *Aux(void) const { return aux; }
95  double FramesPerSecond(void) const { return framesPerSecond; }
96  int Priority(void) const { return priority; }
97  int Lifetime(void) const { return lifetime; }
98  uint16_t FrameWidth(void) const { return frameWidth; }
99  uint16_t FrameHeight(void) const { return frameHeight; }
100  eScanType ScanType(void) const { return scanType; }
101  char ScanTypeChar(void) const { return ScanTypeChars[scanType]; }
102  eAspectRatio AspectRatio(void) const { return aspectRatio; }
103  const char *AspectRatioText(void) const { return AspectRatioTexts[aspectRatio]; }
104  cString FrameParams(void) const;
105  void SetFramesPerSecond(double FramesPerSecond);
106  void SetPriority(int Priority);
107  void SetLifetime(int Lifetime);
109  void SetFileName(const char *FileName);
110  int Errors(void) const { return errors; } // returns -1 if undefined
111  void SetErrors(int Errors);
112  bool Write(FILE *f, const char *Prefix = "") const;
113  bool Read(bool Force = false);
114  bool Write(void) const;
115  void SetData(const char *Title, const char *ShortText, const char *Description);
116  void SetAux(const char *Aux);
117  };
118 
119 class cRecording : public cListObject {
120  friend class cRecordings;
121 private:
122  int id;
123  mutable int resume;
124  mutable char *titleBuffer;
125  mutable char *sortBufferName;
126  mutable char *sortBufferTime;
127  mutable char *fileName;
128  mutable char *name;
129  mutable int fileSizeMB;
130  mutable int numFrames;
131  int channel;
134  mutable int isOnVideoDirectoryFileSystem; // -1 = unknown, 0 = no, 1 = yes
136  cRecording(const cRecording&); // can't copy cRecording
137  cRecording &operator=(const cRecording &); // can't assign cRecording
138  static char *StripEpisodeName(char *s, bool Strip);
139  char *SortName(void) const;
140  void ClearSortName(void);
141  void SetId(int Id); // should only be set by cRecordings
142  time_t start;
143  time_t deleted;
144 public:
145  cRecording(cTimer *Timer, const cEvent *Event);
146  cRecording(const char *FileName);
147  virtual ~cRecording() override;
148  int Id(void) const { return id; }
149  time_t Start(void) const { return start; }
150  int Priority(void) const { return info->Priority(); }
151  int Lifetime(void) const { return info->Lifetime(); }
152  time_t Deleted(void) const { return deleted; }
153  void SetDeleted(void) { deleted = time(NULL); }
154  virtual int Compare(const cListObject &ListObject) const override;
155  bool IsInPath(const char *Path) const;
158  cString Folder(void) const;
161  cString BaseName(void) const;
164  const char *Name(void) const { return name; }
167  const char *FileName(void) const;
170  const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const;
171  cRecordingInfo *Info(void) const { return info; }
172  const char *PrefixFileName(char Prefix);
173  int HierarchyLevels(void) const;
174  void ResetResume(void) const;
175  double FramesPerSecond(void) const { return info->FramesPerSecond(); }
176  int NumFrames(void) const;
179  int NumFramesAfterEdit(void) const;
183  int LengthInSeconds(void) const;
185  int LengthInSecondsAfterEdit(void) const;
188  int FileSizeMB(void) const;
191  int GetResume(void) const;
194  bool IsNew(void) const { return GetResume() <= 0; }
195  bool IsEdited(void) const;
196  bool IsPesRecording(void) const { return isPesRecording; }
197  bool IsOnVideoDirectoryFileSystem(void) const;
198  bool HasMarks(void) const;
200  bool DeleteMarks(void);
204  void ReadInfo(bool Force = false);
205  bool WriteInfo(const char *OtherFileName = NULL);
209  void SetStartTime(time_t Start);
217  bool ChangePriorityLifetime(int NewPriority, int NewLifetime);
221  bool ChangeName(const char *NewName);
228  bool Delete(void);
231  bool Remove(void);
234  bool Undelete(void);
238  int IsInUse(void) const;
246  };
247 
249 
250 class cRecordings : public cList<cRecording> {
251 private:
254  static int lastRecordingId;
255  static char *updateFileName;
256  static time_t lastUpdate;
258  static const char *UpdateFileName(void);
259 public:
260  cRecordings(bool Deleted = false);
261  virtual ~cRecordings() override;
262  static const cRecordings *GetRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, false, TimeoutMs) ? &recordings : NULL; }
265  static cRecordings *GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, true, TimeoutMs) ? &recordings : NULL; }
268  static const cRecordings *GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, false, TimeoutMs) ? &deletedRecordings : NULL; }
271  static cRecordings *GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, true, TimeoutMs) ? &deletedRecordings : NULL; }
274  static void Update(bool Wait = false);
278  static void TouchUpdate(void);
282  static bool NeedsUpdate(void);
283  void ResetResume(const char *ResumeFileName = NULL);
284  void ClearSortNames(void);
285  const cRecording *GetById(int Id) const;
286  cRecording *GetById(int Id) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetById(Id)); };
287  const cRecording *GetByName(const char *FileName) const;
288  cRecording *GetByName(const char *FileName) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetByName(FileName)); }
289  void Add(cRecording *Recording);
290  void AddByName(const char *FileName, bool TriggerUpdate = true);
291  void DelByName(const char *FileName);
292  void UpdateByName(const char *FileName);
293  int TotalFileSizeMB(void) const;
294  double MBperMinute(void) const;
297  int PathIsInUse(const char *Path) const;
305  int GetNumRecordingsInPath(const char *Path) const;
309  bool MoveRecordings(const char *OldPath, const char *NewPath);
318  };
319 
320 // Provide lock controlled access to the list:
321 
322 DEF_LIST_LOCK(Recordings);
323 DEF_LIST_LOCK2(Recordings, DeletedRecordings);
324 
325 // These macros provide a convenient way of locking the global recordings list
326 // and making sure the lock is released as soon as the current scope is left
327 // (note that these macros wait forever to obtain the lock!):
328 
329 #define LOCK_RECORDINGS_READ USE_LIST_LOCK_READ(Recordings)
330 #define LOCK_RECORDINGS_WRITE USE_LIST_LOCK_WRITE(Recordings)
331 #define LOCK_DELETEDRECORDINGS_READ USE_LIST_LOCK_READ2(Recordings, DeletedRecordings)
332 #define LOCK_DELETEDRECORDINGS_WRITE USE_LIST_LOCK_WRITE2(Recordings, DeletedRecordings)
333 
335 
336 class cRecordingsHandler : public cThread {
337 private:
340  bool finished;
341  bool error;
342  cRecordingsHandlerEntry *Get(const char *FileName);
343 protected:
344  virtual void Action(void) override;
345 public:
346  cRecordingsHandler(void);
347  virtual ~cRecordingsHandler() override;
348  bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst = NULL);
356  void Del(const char *FileName);
361  void DelAll(void);
363  int GetUsage(const char *FileName);
365  int GetRequiredDiskSpaceMB(const char *FileName = NULL);
369  bool Finished(bool &Error);
374  };
375 
377 
378 #define DEFAULTFRAMESPERSECOND 25.0
379 
380 class cMark : public cListObject {
381  friend class cMarks; // for sorting
382 private:
384  int position;
386 public:
387  cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
388  virtual ~cMark() override;
389  int Position(void) const { return position; }
390  const char *Comment(void) const { return comment; }
392  void SetComment(const char *Comment) { comment = Comment; }
393  cString ToText(void);
394  bool Parse(const char *s);
395  bool Save(FILE *f);
396  };
397 
398 class cMarks : public cConfig<cMark> {
399 private:
404  time_t nextUpdate;
405  time_t lastFileTime;
406  time_t lastChange;
407 public:
408  cMarks(void): cConfig<cMark>("Marks") {};
409  static cString MarksFileName(const cRecording *Recording);
412  static bool DeleteMarksFile(const cRecording *Recording);
413  bool Load(const char *RecordingFileName, double FramesPerSecond = DEFAULTFRAMESPERSECOND, bool IsPesRecording = false);
414  bool Update(void);
415  bool Save(void);
416  void Align(void);
417  void Sort(void);
418  void Add(int Position);
424  const cMark *Get(int Position) const;
425  const cMark *GetPrev(int Position) const;
426  const cMark *GetNext(int Position) const;
427  const cMark *GetNextBegin(const cMark *EndMark = NULL) const;
431  const cMark *GetNextEnd(const cMark *BeginMark) const;
434  int GetNumSequences(void) const;
440  int GetFrameAfterEdit(int Frame, int LastFrame) const;
444  cMark *Get(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->Get(Position)); }
445  cMark *GetPrev(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetPrev(Position)); }
446  cMark *GetNext(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNext(Position)); }
447  cMark *GetNextBegin(const cMark *EndMark = NULL) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextBegin(EndMark)); }
448  cMark *GetNextEnd(const cMark *BeginMark) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextEnd(BeginMark)); }
449  };
450 
451 class cErrors : public cVector<int> {
452  };
453 
454 #define RUC_BEFORERECORDING "before"
455 #define RUC_STARTRECORDING "started"
456 #define RUC_AFTERRECORDING "after"
457 #define RUC_EDITINGRECORDING "editing"
458 #define RUC_EDITEDRECORDING "edited"
459 #define RUC_DELETERECORDING "deleted"
460 #define RUC_RENAMEDRECORDING "renamed" // same directory, only the base name is changed
461 #define RUC_MOVEDRECORDING "moved" // different directory (and maybe base name), or "copy" to other filesystem + delete original (triggers copying->copied->deleted)
462 #define RUC_COPYINGRECORDING "copying"
463 #define RUC_COPIEDRECORDING "copied"
464 
466 private:
467  static const char *command;
468 public:
469  static void SetCommand(const char *Command) { command = Command; }
470  static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName = NULL);
471  };
472 
473 // The maximum size of a single frame (up to HDTV 1920x1080):
474 #define MAXFRAMESIZE (KILOBYTE(1024) / TS_SIZE * TS_SIZE) // multiple of TS_SIZE to avoid breaking up TS packets
475 
476 // The maximum file size is limited by the range that can be covered
477 // with a 40 bit 'unsigned int', which is 1TB. The actual maximum value
478 // used is 6MB below the theoretical maximum, to have some safety (the
479 // actual file size may be slightly higher because we stop recording only
480 // before the next independent frame, to have a complete Group Of Pictures):
481 #define MAXVIDEOFILESIZETS 1048570 // MB
482 #define MAXVIDEOFILESIZEPES 2000 // MB
483 #define MINVIDEOFILESIZE 100 // MB
484 #define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES
485 
486 struct tIndexTs;
487 class cIndexFileGenerator;
488 
489 class cIndexFile {
490 private:
491  int f;
493  int size, last;
495  tIndexTs *index;
501  void ConvertFromPes(tIndexTs *IndexTs, int Count);
502  void ConvertToPes(tIndexTs *IndexTs, int Count);
503  bool CatchUp(int Index = -1);
504 public:
505  cIndexFile(const char *FileName, bool Record, bool IsPesRecording = false, bool PauseLive = false, bool Update = false);
506  ~cIndexFile();
507  bool Ok(void) { return index != NULL; }
508  bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset, bool Errors = false, bool Missing = false);
509  bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL, bool *Errors = NULL, bool *Missing = NULL);
510  const cErrors *GetErrors(void);
512  int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL);
513  int GetClosestIFrame(int Index);
518  int Get(uint16_t FileNumber, off_t FileOffset);
519  int Last(void) { CatchUp(); return last; }
521  int GetResume(void) { return resumeFile.Read(); }
522  bool StoreResume(int Index) { return resumeFile.Save(Index); }
523  bool IsStillRecording(void);
524  void Delete(void);
525  static int GetLength(const char *FileName, bool IsPesRecording = false);
528  static cString IndexFileName(const char *FileName, bool IsPesRecording);
529  };
530 
531 class cFileName {
532 private:
534  uint16_t fileNumber;
536  bool record;
537  bool blocking;
539 public:
540  cFileName(const char *FileName, bool Record, bool Blocking = false, bool IsPesRecording = false);
541  ~cFileName();
542  const char *Name(void) { return fileName; }
543  uint16_t Number(void) { return fileNumber; }
544  bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion);
545  cUnbufferedFile *Open(void);
546  void Close(void);
547  cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating
548  cUnbufferedFile *NextFile(void);
549  };
550 
552 private:
555  void Add(const char *Title);
556 public:
557  bool Load(const char *FileName);
558  bool Save(void) const;
559  void Append(const char *Title);
560  bool Contains(const char *Title) const;
561  };
562 
564 
565 cString IndexToHMSF(int Index, bool WithFrame = false, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
566  // Converts the given index to a string, optionally containing the frame number.
567 int HMSFToIndex(const char *HMSF, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
568  // Converts the given string (format: "hh:mm:ss.ff") to an index.
569 int SecondsToFrames(int Seconds, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
570  // Returns the number of frames corresponding to the given number of seconds.
571 
572 int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max);
573 
574 char *ExchangeChars(char *s, bool ToFileSystem);
575  // Exchanges the characters in the given string to or from a file system
576  // specific representation (depending on ToFileSystem). The given string will
577  // be modified and may be reallocated if more space is needed. The return
578  // value points to the resulting string, which may be different from s.
579 
580 bool GenerateIndex(const char *FileName, bool Update = false);
585 
589 bool HasRecordingsSortMode(const char *Directory);
590 void GetRecordingsSortMode(const char *Directory);
591 void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode);
592 void IncRecordingsSortMode(const char *Directory);
593 
594 void SetRecordingTimerId(const char *Directory, const char *TimerId);
595 cString GetRecordingTimerId(const char *Directory);
596 
597 int FileSizeMBafterEdit(const char *FileName);
598 bool EnoughFreeDiskSpaceForEdit(const char *FileName);
599 
600 #endif //__RECORDING_H
cStringList doneRecordings
Definition: recording.h:554
bool Save(void) const
Definition: recording.c:3330
void Add(const char *Title)
Definition: recording.c:3349
cString fileName
Definition: recording.h:553
void Append(const char *Title)
Definition: recording.c:3354
bool Load(const char *FileName)
Definition: recording.c:3309
bool Contains(const char *Title) const
Definition: recording.c:3377
Definition: epg.h:73
bool isPesRecording
Definition: recording.h:538
cUnbufferedFile * NextFile(void)
Definition: recording.c:3300
uint16_t Number(void)
Definition: recording.h:543
bool record
Definition: recording.h:536
void Close(void)
Definition: recording.c:3248
uint16_t fileNumber
Definition: recording.h:534
cUnbufferedFile * Open(void)
Definition: recording.c:3224
cFileName(const char *FileName, bool Record, bool Blocking=false, bool IsPesRecording=false)
Definition: recording.c:3149
char * fileName
Definition: recording.h:535
char * pFileNumber
Definition: recording.h:535
bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
Definition: recording.c:3173
bool blocking
Definition: recording.h:537
const char * Name(void)
Definition: recording.h:542
cUnbufferedFile * SetOffset(int Number, off_t Offset=0)
Definition: recording.c:3258
cUnbufferedFile * file
Definition: recording.h:533
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber=NULL, off_t *FileOffset=NULL, int *Length=NULL)
Definition: recording.c:3007
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset, bool Errors=false, bool Missing=false)
Definition: recording.c:2949
cResumeFile resumeFile
Definition: recording.h:497
bool IsStillRecording(void)
Definition: recording.c:3087
void ConvertFromPes(tIndexTs *IndexTs, int Count)
Definition: recording.c:2868
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:3104
bool CatchUp(int Index=-1)
Definition: recording.c:2893
const cErrors * GetErrors(void)
Returns the frame indexes of errors in the recording (if any).
Definition: recording.c:2996
int GetResume(void)
Definition: recording.h:521
void ConvertToPes(tIndexTs *IndexTs, int Count)
Definition: recording.c:2880
bool isPesRecording
Definition: recording.h:496
cErrors errors
Definition: recording.h:498
int lastErrorIndex
Definition: recording.h:494
cString fileName
Definition: recording.h:492
bool StoreResume(int Index)
Definition: recording.h:522
cIndexFile(const char *FileName, bool Record, bool IsPesRecording=false, bool PauseLive=false, bool Update=false)
Definition: recording.c:2765
cIndexFileGenerator * indexFileGenerator
Definition: recording.h:499
static cString IndexFileName(const char *FileName, bool IsPesRecording)
Definition: recording.c:2863
int GetClosestIFrame(int Index)
Returns the index of the I-frame that is closest to the given Index (or Index itself,...
Definition: recording.c:3045
bool Ok(void)
Definition: recording.h:507
cMutex mutex
Definition: recording.h:500
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent=NULL, int *Length=NULL, bool *Errors=NULL, bool *Missing=NULL)
Definition: recording.c:2966
void Delete(void)
Definition: recording.c:3092
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
Definition: recording.h:519
tIndexTs * index
Definition: recording.h:495
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:2166
Definition: tools.h:631
cMark(int Position=0, const char *Comment=NULL, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:2263
cString comment
Definition: recording.h:385
int position
Definition: recording.h:384
bool Parse(const char *s)
Definition: recording.c:2279
bool Save(FILE *f)
Definition: recording.c:2293
cString ToText(void)
Definition: recording.c:2274
const char * Comment(void) const
Definition: recording.h:390
double framesPerSecond
Definition: recording.h:383
void SetPosition(int Position)
Definition: recording.h:391
int Position(void) const
Definition: recording.h:389
virtual ~cMark() override
Definition: recording.c:2270
void SetComment(const char *Comment)
Definition: recording.h:392
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
Definition: recording.c:2459
double framesPerSecond
Definition: recording.h:402
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:2392
cMark * GetNextEnd(const cMark *BeginMark)
Definition: recording.h:448
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:2425
cMark * Get(int Position)
Definition: recording.h:444
const cMark * GetNext(int Position) const
Definition: recording.c:2416
bool Update(void)
Definition: recording.c:2328
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
Definition: recording.c:2316
time_t lastFileTime
Definition: recording.h:405
cMark * GetNext(int Position)
Definition: recording.h:446
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:2441
const cMark * Get(int Position) const
Definition: recording.c:2398
cString recordingFileName
Definition: recording.h:400
cMark * GetNextBegin(const cMark *EndMark=NULL)
Definition: recording.h:447
bool isPesRecording
Definition: recording.h:403
cMark * GetPrev(int Position)
Definition: recording.h:445
time_t nextUpdate
Definition: recording.h:404
cString fileName
Definition: recording.h:401
static bool DeleteMarksFile(const cRecording *Recording)
Definition: recording.c:2305
void Align(void)
Definition: recording.c:2368
int GetFrameAfterEdit(int Frame, int LastFrame) const
Returns the number of the given Frame within the region covered by begin/end sequences.
Definition: recording.c:2476
void Sort(void)
Definition: recording.c:2380
cMarks(void)
Definition: recording.h:408
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:2300
bool Save(void)
Definition: recording.c:2359
const cMark * GetPrev(int Position) const
Definition: recording.c:2407
time_t lastChange
Definition: recording.h:406
Definition: thread.h:67
char ScanTypeChar(void) const
Definition: recording.h:101
void SetFramesPerSecond(double FramesPerSecond)
Definition: recording.c:465
cEvent * ownEvent
Definition: recording.h:71
uint16_t FrameHeight(void) const
Definition: recording.h:99
const cEvent * event
Definition: recording.h:70
uint16_t frameHeight
Definition: recording.h:75
int Errors(void) const
Definition: recording.h:110
int Priority(void) const
Definition: recording.h:96
eAspectRatio aspectRatio
Definition: recording.h:77
eScanType ScanType(void) const
Definition: recording.h:100
int Lifetime(void) const
Definition: recording.h:97
cRecordingInfo(const cChannel *Channel=NULL, const cEvent *Event=NULL)
Definition: recording.c:357
bool Write(void) const
Definition: recording.c:635
void SetLifetime(int Lifetime)
Definition: recording.c:475
const cEvent * GetEvent(void) const
Definition: recording.h:89
char * aux
Definition: recording.h:72
const char * ChannelName(void) const
Definition: recording.h:88
const char * Title(void) const
Definition: recording.h:90
tChannelID channelID
Definition: recording.h:68
cString FrameParams(void) const
Definition: recording.c:651
eScanType scanType
Definition: recording.h:76
tChannelID ChannelID(void) const
Definition: recording.h:87
const char * Description(void) const
Definition: recording.h:92
const char * AspectRatioText(void) const
Definition: recording.h:103
void SetFileName(const char *FileName)
Definition: recording.c:488
void SetPriority(int Priority)
Definition: recording.c:470
const char * ShortText(void) const
Definition: recording.h:91
time_t modified
Definition: recording.h:67
char * channelName
Definition: recording.h:69
uint16_t FrameWidth(void) const
Definition: recording.h:98
void SetFrameParams(uint16_t FrameWidth, uint16_t FrameHeight, eScanType ScanType, eAspectRatio AspectRatio)
Definition: recording.c:480
const char * Aux(void) const
Definition: recording.h:94
void SetErrors(int Errors)
Definition: recording.c:495
void SetAux(const char *Aux)
Definition: recording.c:459
void SetData(const char *Title, const char *ShortText, const char *Description)
Definition: recording.c:449
const cComponents * Components(void) const
Definition: recording.h:93
eAspectRatio AspectRatio(void) const
Definition: recording.h:102
bool Read(FILE *f, bool Force=false)
Definition: recording.c:500
uint16_t frameWidth
Definition: recording.h:74
double framesPerSecond
Definition: recording.h:73
double FramesPerSecond(void) const
Definition: recording.h:95
char * fileName
Definition: recording.h:80
static const char * command
Definition: recording.h:467
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
Definition: recording.c:2512
static void SetCommand(const char *Command)
Definition: recording.h:469
virtual int Compare(const cListObject &ListObject) const override
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
Definition: recording.c:1129
int isOnVideoDirectoryFileSystem
Definition: recording.h:134
virtual ~cRecording() override
Definition: recording.c:1045
time_t deleted
Definition: recording.h:143
cRecordingInfo * info
Definition: recording.h:135
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
Definition: recording.c:1317
bool HasMarks(void) const
Returns true if this recording has any editing marks.
Definition: recording.c:1274
bool WriteInfo(const char *OtherFileName=NULL)
Writes in info file of this recording.
Definition: recording.c:1289
int resume
Definition: recording.h:123
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with.
Definition: recording.c:1431
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
Definition: recording.c:1340
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:1405
void ResetResume(void) const
Definition: recording.c:1447
void ReadInfo(bool Force=false)
Definition: recording.c:1284
bool IsNew(void) const
Definition: recording.h:194
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:1368
const char * Name(void) const
Returns the full name of the recording (without the video directory).
Definition: recording.h:164
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
Definition: recording.c:1146
bool isPesRecording
Definition: recording.h:133
void ClearSortName(void)
Definition: recording.c:1108
char * sortBufferName
Definition: recording.h:125
int NumFrames(void) const
Returns the number of frames in this recording.
Definition: recording.c:1452
bool IsEdited(void) const
Definition: recording.c:1261
int Id(void) const
Definition: recording.h:148
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:1120
bool IsInPath(const char *Path) const
Returns true if this recording is stored anywhere under the given Path.
Definition: recording.c:1138
int fileSizeMB
Definition: recording.h:129
void SetId(int Id)
Definition: recording.c:1115
void SetStartTime(time_t Start)
Sets the start time of this recording to the given value.
Definition: recording.c:1310
char * SortName(void) const
Definition: recording.c:1084
time_t Start(void) const
Definition: recording.h:149
int Lifetime(void) const
Definition: recording.h:151
int NumFramesAfterEdit(void) const
Returns the number of frames in the edited version of this recording.
Definition: recording.c:1463
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
Definition: recording.c:1158
const char * PrefixFileName(char Prefix)
Definition: recording.c:1239
bool DeleteMarks(void)
Deletes the editing marks from this recording (if any).
Definition: recording.c:1279
bool IsOnVideoDirectoryFileSystem(void) const
Definition: recording.c:1267
int HierarchyLevels(void) const
Definition: recording.c:1250
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:1490
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder).
Definition: recording.c:1153
char * fileName
Definition: recording.h:127
char * titleBuffer
Definition: recording.h:124
void SetDeleted(void)
Definition: recording.h:153
int Priority(void) const
Definition: recording.h:150
cRecordingInfo * Info(void) const
Definition: recording.h:171
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
Definition: recording.c:1176
cRecording & operator=(const cRecording &)
int instanceId
Definition: recording.h:132
bool Remove(void)
Actually removes the file from the disk Returns false in case of error.
Definition: recording.c:1394
char * name
Definition: recording.h:128
cRecording(const cRecording &)
char * sortBufferTime
Definition: recording.h:126
int LengthInSecondsAfterEdit(void) const
Returns the length (in seconds) of the edited version of this recording, or -1 in case of error.
Definition: recording.c:1482
int channel
Definition: recording.h:131
time_t start
Definition: recording.h:142
int numFrames
Definition: recording.h:130
double FramesPerSecond(void) const
Definition: recording.h:175
bool IsPesRecording(void) const
Definition: recording.h:196
time_t Deleted(void) const
Definition: recording.h:152
static char * StripEpisodeName(char *s, bool Strip)
Definition: recording.c:1055
int LengthInSeconds(void) const
Returns the length (in seconds) of this recording, or -1 in case of error.
Definition: recording.c:1474
void DelAll(void)
Deletes/terminates all operations.
Definition: recording.c:2213
virtual ~cRecordingsHandler() override
Definition: recording.c:2132
cRecordingsHandler(void)
Definition: recording.c:2125
cRecordingsHandlerEntry * Get(const char *FileName)
Definition: recording.c:2162
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:2175
bool Finished(bool &Error)
Returns true if all operations in the list have been finished.
Definition: recording.c:2246
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
Definition: recording.c:2220
cList< cRecordingsHandlerEntry > operations
Definition: recording.h:339
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
Definition: recording.c:2206
virtual void Action(void) override
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
Definition: recording.c:2137
int GetRequiredDiskSpaceMB(const char *FileName=NULL)
Returns the total disk space required to process all actions.
Definition: recording.c:2228
void ResetResume(const char *ResumeFileName=NULL)
Definition: recording.c:1811
static cRecordings * GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for write access.
Definition: recording.h:271
void UpdateByName(const char *FileName)
Definition: recording.c:1731
static const char * UpdateFileName(void)
Definition: recording.c:1637
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:1750
virtual ~cRecordings() override
Definition: recording.c:1630
cRecordings(bool Deleted=false)
Definition: recording.c:1625
cRecording * GetByName(const char *FileName)
Definition: recording.h:288
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:1781
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
Definition: recording.h:262
const cRecording * GetById(int Id) const
Definition: recording.c:1672
static time_t lastUpdate
Definition: recording.h:256
static cRecordings deletedRecordings
Definition: recording.h:253
void AddByName(const char *FileName, bool TriggerUpdate=true)
Definition: recording.c:1698
static cRecordings recordings
Definition: recording.h:252
int TotalFileSizeMB(void) const
Definition: recording.c:1739
cRecording * GetById(int Id)
Definition: recording.h:286
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:1660
static const cRecordings * GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for read access.
Definition: recording.h:268
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:1644
void Add(cRecording *Recording)
Definition: recording.c:1692
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
Definition: recording.h:265
static cVideoDirectoryScannerThread * videoDirectoryScannerThread
Definition: recording.h:257
void DelByName(const char *FileName)
Definition: recording.c:1709
bool MoveRecordings(const char *OldPath, const char *NewPath)
Moves all recordings in OldPath to NewPath.
Definition: recording.c:1791
static bool NeedsUpdate(void)
Definition: recording.c:1652
void ClearSortNames(void)
Definition: recording.c:1819
static int lastRecordingId
Definition: recording.h:254
const cRecording * GetByName(const char *FileName) const
Definition: recording.c:1681
static char * updateFileName
Definition: recording.h:255
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:1771
bool isPesRecording
Definition: recording.h:55
bool Save(int Index)
Definition: recording.c:305
char * fileName
Definition: recording.h:54
int Read(void)
Definition: recording.c:260
void Delete(void)
Definition: recording.c:343
cResumeFile(const char *FileName, bool IsPesRecording)
Definition: recording.c:242
Definition: tools.h:178
Definition: thread.h:79
Definition: timers.h:31
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner,...
Definition: tools.h:494
Definition: tools.h:701
eRecordingUsage
Definition: recording.h:29
@ ruSrc
Definition: recording.h:38
@ ruCut
Definition: recording.h:34
@ ruReplay
Definition: recording.h:32
@ ruCopy
Definition: recording.h:36
@ ruCanceled
Definition: recording.h:42
@ ruTimer
Definition: recording.h:31
@ ruDst
Definition: recording.h:39
@ ruNone
Definition: recording.h:30
@ ruMove
Definition: recording.h:35
@ ruPending
Definition: recording.h:41
int DirectoryNameMax
Definition: recording.c:75
cString GetRecordingTimerId(const char *Directory)
Definition: recording.c:3505
eRecordingsSortMode
Definition: recording.h:587
@ rsmName
Definition: recording.h:587
@ rsmTime
Definition: recording.h:587
char * ExchangeChars(char *s, bool ToFileSystem)
Definition: recording.c:697
#define DEFAULTFRAMESPERSECOND
Definition: recording.h:378
int HMSFToIndex(const char *HMSF, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3416
eRecordingsSortDir
Definition: recording.h:586
@ rsdDescending
Definition: recording.h:586
@ rsdAscending
Definition: recording.h:586
int DirectoryPathMax
Definition: recording.c:74
void GetRecordingsSortMode(const char *Directory)
Definition: recording.c:3457
eRecordingsSortMode RecordingsSortMode
Definition: recording.c:3450
bool HasRecordingsSortMode(const char *Directory)
Definition: recording.c:3452
DEF_LIST_LOCK(Recordings)
int InstanceId
Definition: recording.c:77
bool EnoughFreeDiskSpaceForEdit(const char *FileName)
Definition: recording.c:3537
bool DirectoryEncoding
Definition: recording.c:76
void IncRecordingsSortMode(const char *Directory)
Definition: recording.c:3476
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode)
Definition: recording.c:3468
cDoneRecordings DoneRecordingsPattern
Definition: recording.c:3307
DEF_LIST_LOCK2(Recordings, DeletedRecordings)
int FileSizeMBafterEdit(const char *FileName)
Definition: recording.c:3522
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
Definition: recording.c:3434
cRecordingsHandler RecordingsHandler
Definition: recording.c:2123
void SetRecordingTimerId(const char *Directory, const char *TimerId)
Definition: recording.c:3487
void RemoveDeletedRecordings(void)
Definition: recording.c:135
int SecondsToFrames(int Seconds, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3427
cString IndexToHMSF(int Index, bool WithFrame=false, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3400
bool GenerateIndex(const char *FileName, bool Update=false)
Generates the index of the existing recording with the given FileName.
Definition: recording.c:3113
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:152
const char * AspectRatioTexts[]
Definition: remux.c:2096
const char * ScanTypeChars
Definition: remux.c:2095
eAspectRatio
Definition: remux.h:514
eScanType
Definition: remux.h:507
unsigned char uchar
Definition: tools.h:31