vdr  2.4.0
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.8 2018/02/12 12:28:24 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 void RemoveDeletedRecordings(void);
45 void AssertFreeDiskSpace(int Priority = 0, bool Force = false);
50 
51 class cResumeFile {
52 private:
53  char *fileName;
55 public:
56  cResumeFile(const char *FileName, bool IsPesRecording);
57  ~cResumeFile();
58  int Read(void);
59  bool Save(int Index);
60  void Delete(void);
61  };
62 
64  friend class cRecording;
65 private:
67  char *channelName;
68  const cEvent *event;
70  char *aux;
72  int priority;
73  int lifetime;
74  char *fileName;
75  cRecordingInfo(const cChannel *Channel = NULL, const cEvent *Event = NULL);
76  bool Read(FILE *f);
77  void SetData(const char *Title, const char *ShortText, const char *Description);
78  void SetAux(const char *Aux);
79 public:
80  cRecordingInfo(const char *FileName);
81  ~cRecordingInfo();
82  tChannelID ChannelID(void) const { return channelID; }
83  const char *ChannelName(void) const { return channelName; }
84  const cEvent *GetEvent(void) const { return event; }
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(); }
88  const cComponents *Components(void) const { return event->Components(); }
89  const char *Aux(void) const { return aux; }
90  double FramesPerSecond(void) const { return framesPerSecond; }
91  void SetFramesPerSecond(double FramesPerSecond);
92  void SetFileName(const char *FileName);
93  bool Write(FILE *f, const char *Prefix = "") const;
94  bool Read(void);
95  bool Write(void) const;
96  };
97 
98 class cRecording : public cListObject {
99  friend class cRecordings;
100 private:
101  int id;
102  mutable int resume;
103  mutable char *titleBuffer;
104  mutable char *sortBufferName;
105  mutable char *sortBufferTime;
106  mutable char *fileName;
107  mutable char *name;
108  mutable int fileSizeMB;
109  mutable int numFrames;
110  int channel;
113  mutable int isOnVideoDirectoryFileSystem; // -1 = unknown, 0 = no, 1 = yes
116  cRecording(const cRecording&); // can't copy cRecording
117  cRecording &operator=(const cRecording &); // can't assign cRecording
118  static char *StripEpisodeName(char *s, bool Strip);
119  char *SortName(void) const;
120  void ClearSortName(void);
121  void SetId(int Id); // should only be set by cRecordings
122  time_t start;
123  int priority;
124  int lifetime;
125  time_t deleted;
126 public:
127  cRecording(cTimer *Timer, const cEvent *Event);
128  cRecording(const char *FileName);
129  virtual ~cRecording();
130  int Id(void) const { return id; }
131  time_t Start(void) const { return start; }
132  int Priority(void) const { return priority; }
133  int Lifetime(void) const { return lifetime; }
134  time_t Deleted(void) const { return deleted; }
135  void SetDeleted(void) { deleted = time(NULL); }
136  virtual int Compare(const cListObject &ListObject) const;
137  bool IsInPath(const char *Path) const;
140  cString Folder(void) const;
143  cString BaseName(void) const;
146  const char *Name(void) const { return name; }
149  const char *FileName(void) const;
152  const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const;
153  const cRecordingInfo *Info(void) const { return info; }
154  const char *PrefixFileName(char Prefix);
155  int HierarchyLevels(void) const;
156  void ResetResume(void) const;
157  double FramesPerSecond(void) const { return framesPerSecond; }
158  int NumFrames(void) const;
161  int LengthInSeconds(void) const;
163  int FileSizeMB(void) const;
166  int GetResume(void) const;
169  bool IsNew(void) const { return GetResume() <= 0; }
170  bool IsEdited(void) const;
171  bool IsPesRecording(void) const { return isPesRecording; }
172  bool IsOnVideoDirectoryFileSystem(void) const;
173  bool HasMarks(void) const;
175  bool DeleteMarks(void);
179  void ReadInfo(void);
180  bool WriteInfo(const char *OtherFileName = NULL);
184  void SetStartTime(time_t Start);
192  bool ChangePriorityLifetime(int NewPriority, int NewLifetime);
196  bool ChangeName(const char *NewName);
203  bool Delete(void);
206  bool Remove(void);
209  bool Undelete(void);
213  int IsInUse(void) const;
221  };
222 
224 
225 class cRecordings : public cList<cRecording> {
226 private:
229  static int lastRecordingId;
230  static char *updateFileName;
231  static time_t lastUpdate;
233  static const char *UpdateFileName(void);
234 public:
235  cRecordings(bool Deleted = false);
236  virtual ~cRecordings();
237  static const cRecordings *GetRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, false, TimeoutMs) ? &recordings : NULL; }
240  static cRecordings *GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, true, TimeoutMs) ? &recordings : NULL; }
243  static const cRecordings *GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, false, TimeoutMs) ? &deletedRecordings : NULL; }
246  static cRecordings *GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, true, TimeoutMs) ? &deletedRecordings : NULL; }
249  static void Update(bool Wait = false);
253  static void TouchUpdate(void);
259  static bool NeedsUpdate(void);
260  void ResetResume(const char *ResumeFileName = NULL);
261  void ClearSortNames(void);
262  const cRecording *GetById(int Id) const;
263  cRecording *GetById(int Id) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetById(Id)); };
264  const cRecording *GetByName(const char *FileName) const;
265  cRecording *GetByName(const char *FileName) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetByName(FileName)); }
266  void Add(cRecording *Recording);
267  void AddByName(const char *FileName, bool TriggerUpdate = true);
268  void DelByName(const char *FileName);
269  void UpdateByName(const char *FileName);
270  int TotalFileSizeMB(void) const;
271  double MBperMinute(void) const;
274  int PathIsInUse(const char *Path) const;
282  int GetNumRecordingsInPath(const char *Path) const;
286  bool MoveRecordings(const char *OldPath, const char *NewPath);
295  };
296 
297 // Provide lock controlled access to the list:
298 
299 DEF_LIST_LOCK(Recordings);
300 DEF_LIST_LOCK2(Recordings, DeletedRecordings);
301 
302 // These macros provide a convenient way of locking the global recordings list
303 // and making sure the lock is released as soon as the current scope is left
304 // (note that these macros wait forever to obtain the lock!):
305 
306 #define LOCK_RECORDINGS_READ USE_LIST_LOCK_READ(Recordings)
307 #define LOCK_RECORDINGS_WRITE USE_LIST_LOCK_WRITE(Recordings)
308 #define LOCK_DELETEDRECORDINGS_READ USE_LIST_LOCK_READ2(Recordings, DeletedRecordings)
309 #define LOCK_DELETEDRECORDINGS_WRITE USE_LIST_LOCK_WRITE2(Recordings, DeletedRecordings)
310 
312 
313 class cRecordingsHandler : public cThread {
314 private:
317  bool finished;
318  bool error;
319  cRecordingsHandlerEntry *Get(const char *FileName);
320 protected:
321  virtual void Action(void);
322 public:
323  cRecordingsHandler(void);
324  virtual ~cRecordingsHandler();
325  bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst = NULL);
333  void Del(const char *FileName);
338  void DelAll(void);
340  int GetUsage(const char *FileName);
342  bool Finished(bool &Error);
347  };
348 
350 
351 #define DEFAULTFRAMESPERSECOND 25.0
352 
353 class cMark : public cListObject {
354  friend class cMarks; // for sorting
355 private:
357  int position;
359 public:
360  cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
361  virtual ~cMark();
362  int Position(void) const { return position; }
363  const char *Comment(void) const { return comment; }
364  void SetPosition(int Position) { position = Position; }
365  void SetComment(const char *Comment) { comment = Comment; }
366  cString ToText(void);
367  bool Parse(const char *s);
368  bool Save(FILE *f);
369  };
370 
371 class cMarks : public cConfig<cMark> {
372 private:
377  time_t nextUpdate;
378  time_t lastFileTime;
379  time_t lastChange;
380 public:
381  cMarks(void): cConfig<cMark>("Marks") {};
382  static cString MarksFileName(const cRecording *Recording);
385  static bool DeleteMarksFile(const cRecording *Recording);
386  bool Load(const char *RecordingFileName, double FramesPerSecond = DEFAULTFRAMESPERSECOND, bool IsPesRecording = false);
387  bool Update(void);
388  bool Save(void);
389  void Align(void);
390  void Sort(void);
391  void Add(int Position);
397  const cMark *Get(int Position) const;
398  const cMark *GetPrev(int Position) const;
399  const cMark *GetNext(int Position) const;
400  const cMark *GetNextBegin(const cMark *EndMark = NULL) const;
404  const cMark *GetNextEnd(const cMark *BeginMark) const;
407  int GetNumSequences(void) const;
413  cMark *Get(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->Get(Position)); }
414  cMark *GetPrev(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetPrev(Position)); }
415  cMark *GetNext(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNext(Position)); }
416  cMark *GetNextBegin(const cMark *EndMark = NULL) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextBegin(EndMark)); }
417  cMark *GetNextEnd(const cMark *BeginMark) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextEnd(BeginMark)); }
418  };
419 
420 #define RUC_BEFORERECORDING "before"
421 #define RUC_STARTRECORDING "started"
422 #define RUC_AFTERRECORDING "after"
423 #define RUC_EDITINGRECORDING "editing"
424 #define RUC_EDITEDRECORDING "edited"
425 #define RUC_DELETERECORDING "deleted"
426 
428 private:
429  static const char *command;
430 public:
431  static void SetCommand(const char *Command) { command = Command; }
432  static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName = NULL);
433  };
434 
435 // The maximum size of a single frame (up to HDTV 1920x1080):
436 #define MAXFRAMESIZE (KILOBYTE(1024) / TS_SIZE * TS_SIZE) // multiple of TS_SIZE to avoid breaking up TS packets
437 
438 // The maximum file size is limited by the range that can be covered
439 // with a 40 bit 'unsigned int', which is 1TB. The actual maximum value
440 // used is 6MB below the theoretical maximum, to have some safety (the
441 // actual file size may be slightly higher because we stop recording only
442 // before the next independent frame, to have a complete Group Of Pictures):
443 #define MAXVIDEOFILESIZETS 1048570 // MB
444 #define MAXVIDEOFILESIZEPES 2000 // MB
445 #define MINVIDEOFILESIZE 100 // MB
446 #define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES
447 
448 struct tIndexTs;
449 class cIndexFileGenerator;
450 
451 class cIndexFile {
452 private:
453  int f;
455  int size, last;
461  void ConvertFromPes(tIndexTs *IndexTs, int Count);
462  void ConvertToPes(tIndexTs *IndexTs, int Count);
463  bool CatchUp(int Index = -1);
464 public:
465  cIndexFile(const char *FileName, bool Record, bool IsPesRecording = false, bool PauseLive = false, bool Update = false);
466  ~cIndexFile();
467  bool Ok(void) { return index != NULL; }
468  bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset);
469  bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL);
470  int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL);
471  int GetClosestIFrame(int Index);
476  int Get(uint16_t FileNumber, off_t FileOffset);
477  int Last(void) { CatchUp(); return last; }
479  int GetResume(void) { return resumeFile.Read(); }
480  bool StoreResume(int Index) { return resumeFile.Save(Index); }
481  bool IsStillRecording(void);
482  void Delete(void);
483  static int GetLength(const char *FileName, bool IsPesRecording = false);
486  static cString IndexFileName(const char *FileName, bool IsPesRecording);
487  };
488 
489 class cFileName {
490 private:
492  uint16_t fileNumber;
494  bool record;
495  bool blocking;
497 public:
498  cFileName(const char *FileName, bool Record, bool Blocking = false, bool IsPesRecording = false);
499  ~cFileName();
500  const char *Name(void) { return fileName; }
501  uint16_t Number(void) { return fileNumber; }
502  bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion);
503  cUnbufferedFile *Open(void);
504  void Close(void);
505  cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating
506  cUnbufferedFile *NextFile(void);
507  };
508 
509 cString IndexToHMSF(int Index, bool WithFrame = false, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
510  // Converts the given index to a string, optionally containing the frame number.
511 int HMSFToIndex(const char *HMSF, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
512  // Converts the given string (format: "hh:mm:ss.ff") to an index.
513 int SecondsToFrames(int Seconds, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
514  // Returns the number of frames corresponding to the given number of seconds.
515 
516 int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max);
517 
518 char *ExchangeChars(char *s, bool ToFileSystem);
519  // Exchanges the characters in the given string to or from a file system
520  // specific representation (depending on ToFileSystem). The given string will
521  // be modified and may be reallocated if more space is needed. The return
522  // value points to the resulting string, which may be different from s.
523 
524 bool GenerateIndex(const char *FileName, bool Update = false);
529 
533 bool HasRecordingsSortMode(const char *Directory);
534 void GetRecordingsSortMode(const char *Directory);
535 void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode);
536 void IncRecordingsSortMode(const char *Directory);
537 
538 void SetRecordingTimerId(const char *Directory, const char *TimerId);
539 cString GetRecordingTimerId(const char *Directory);
540 
541 #endif //__RECORDING_H
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:2143
unsigned char uchar
Definition: tools.h:31
Definition: epg.h:71
int Priority(void) const
Definition: recording.h:132
int Position(void) const
Definition: recording.h:362
cMark * GetNext(int Position)
Definition: recording.h:415
DEF_LIST_LOCK(Recordings)
tIndexTs * index
Definition: recording.h:456
cString GetRecordingTimerId(const char *Directory)
Definition: recording.c:3147
bool DirectoryEncoding
Definition: recording.c:79
#define DEFAULTFRAMESPERSECOND
Definition: recording.h:351
time_t Start(void) const
Definition: recording.h:131
cRecordingInfo * info
Definition: recording.h:115
cEvent * ownEvent
Definition: recording.h:69
char * fileName
Definition: recording.h:74
char * sortBufferName
Definition: recording.h:104
const cRecordingInfo * Info(void) const
Definition: recording.h:153
void ResetResume(const char *ResumeFileName=NULL)
Definition: recording.c:1662
cMark * GetNextBegin(const cMark *EndMark=NULL)
Definition: recording.h:416
const cEvent * event
Definition: recording.h:68
cResumeFile(const char *FileName, bool IsPesRecording)
Definition: recording.c:239
bool isPesRecording
Definition: recording.h:457
const char * ShortText(void) const
Definition: recording.h:86
int HMSFToIndex(const char *HMSF, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3058
char * name
Definition: recording.h:107
double FramesPerSecond(void) const
Definition: recording.h:157
const char * Title(char Delimiter= ' ', bool NewIndicator=false, int Level=-1) const
Definition: recording.c:1071
static cRecordings deletedRecordings
Definition: recording.h:228
time_t deleted
Definition: recording.h:125
cRecording * GetById(int Id)
Definition: recording.h:263
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
Definition: recording.h:237
cMutex mutex
Definition: recording.h:460
int fileSizeMB
Definition: recording.h:108
static cRecordings recordings
Definition: recording.h:227
Definition: tools.h:594
bool Ok(void)
Definition: recording.h:467
tChannelID channelID
Definition: recording.h:66
const cComponents * Components(void) const
Definition: recording.h:88
void SetRecordingTimerId(const char *Directory, const char *TimerId)
Definition: recording.c:3129
cString IndexToHMSF(int Index, bool WithFrame=false, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3042
double FramesPerSecond(void) const
Definition: recording.h:90
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
Definition: recording.h:240
bool IsNew(void) const
Definition: recording.h:169
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
Definition: recording.h:477
time_t start
Definition: recording.h:122
void SetPosition(int Position)
Definition: recording.h:364
eRecordingsSortMode
Definition: recording.h:531
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner...
Definition: tools.h:457
static void SetCommand(const char *Command)
Definition: recording.h:431
uint16_t Number(void)
Definition: recording.h:501
static const char * command
Definition: recording.h:429
bool GenerateIndex(const char *FileName, bool Update=false)
Generates the index of the existing recording with the given FileName.
Definition: recording.c:2848
eRecordingUsage
Definition: recording.h:28
bool HasRecordingsSortMode(const char *Directory)
Definition: recording.c:3094
Definition: timers.h:27
void IncRecordingsSortMode(const char *Directory)
Definition: recording.c:3118
bool Save(int Index)
Definition: recording.c:302
eRecordingsSortMode RecordingsSortMode
Definition: recording.c:3092
static int lastRecordingId
Definition: recording.h:229
bool isPesRecording
Definition: recording.h:54
eRecordingsSortDir
Definition: recording.h:530
int priority
Definition: recording.h:123
double framesPerSecond
Definition: recording.h:114
double framesPerSecond
Definition: recording.h:71
const char * Comment(void) const
Definition: recording.h:363
bool isPesRecording
Definition: recording.h:376
cMark * GetPrev(int Position)
Definition: recording.h:414
char * aux
Definition: recording.h:70
void RemoveDeletedRecordings(void)
Definition: recording.c:132
time_t lastChange
Definition: recording.h:379
char * ExchangeChars(char *s, bool ToFileSystem)
Definition: recording.c:585
char * sortBufferTime
Definition: recording.h:105
bool record
Definition: recording.h:494
bool isPesRecording
Definition: recording.h:112
time_t Deleted(void) const
Definition: recording.h:134
static const cRecordings * GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for read access.
Definition: recording.h:243
cMarks(void)
Definition: recording.h:381
bool blocking
Definition: recording.h:495
int instanceId
Definition: recording.h:111
char * channelName
Definition: recording.h:67
int position
Definition: recording.h:357
int lifetime
Definition: recording.h:124
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:149
int InstanceId
Definition: recording.c:80
tChannelID ChannelID(void) const
Definition: recording.h:82
int Lifetime(void) const
Definition: recording.h:133
int isOnVideoDirectoryFileSystem
Definition: recording.h:113
char * pFileNumber
Definition: recording.h:493
cRecording * GetByName(const char *FileName)
Definition: recording.h:265
int Id(void) const
Definition: recording.h:130
static char * updateFileName
Definition: recording.h:230
Definition: thread.h:67
int SecondsToFrames(int Seconds, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3069
static cRecordings * GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for write access.
Definition: recording.h:246
const char * Name(void)
Definition: recording.h:500
cString fileName
Definition: recording.h:374
bool StoreResume(int Index)
Definition: recording.h:480
cIndexFileGenerator * indexFileGenerator
Definition: recording.h:459
cString comment
Definition: recording.h:358
void GetRecordingsSortMode(const char *Directory)
Definition: recording.c:3099
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
Definition: recording.c:3076
char * titleBuffer
Definition: recording.h:103
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode)
Definition: recording.c:3110
int channel
Definition: recording.h:110
cRecordingsHandler RecordingsHandler
Definition: recording.c:1962
int GetResume(void)
Definition: recording.h:479
cString fileName
Definition: recording.h:454
time_t lastFileTime
Definition: recording.h:378
void Delete(void)
Definition: recording.c:332
static cVideoDirectoryScannerThread * videoDirectoryScannerThread
Definition: recording.h:232
const cEvent * GetEvent(void) const
Definition: recording.h:84
const char * Description(void) const
Definition: recording.h:87
const char * Name(void) const
Returns the full name of the recording (without the video directory).
Definition: recording.h:146
DEF_LIST_LOCK2(Recordings, DeletedRecordings)
double framesPerSecond
Definition: recording.h:375
cResumeFile resumeFile
Definition: recording.h:458
Definition: thread.h:79
char * fileName
Definition: recording.h:53
const char * Title(void) const
Definition: recording.h:85
cList< cRecordingsHandlerEntry > operations
Definition: recording.h:316
int Read(void)
Definition: recording.c:257
int resume
Definition: recording.h:102
time_t nextUpdate
Definition: recording.h:377
cMark * Get(int Position)
Definition: recording.h:413
cMark * GetNextEnd(const cMark *BeginMark)
Definition: recording.h:417
const char * ChannelName(void) const
Definition: recording.h:83
void SetComment(const char *Comment)
Definition: recording.h:365
void SetDeleted(void)
Definition: recording.h:135
const char * Aux(void) const
Definition: recording.h:89
static const uint8_t * GetLength(const uint8_t *Data, int &Length)
Definition: ci.c:42
bool isPesRecording
Definition: recording.h:496
uint16_t fileNumber
Definition: recording.h:492
cString recordingFileName
Definition: recording.h:373
char * fileName
Definition: recording.h:106
int DirectoryPathMax
Definition: recording.c:77
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual &#39;...
Definition: recording.c:1053
static time_t lastUpdate
Definition: recording.h:231
cUnbufferedFile * file
Definition: recording.h:491
int numFrames
Definition: recording.h:109
bool IsPesRecording(void) const
Definition: recording.h:171
int DirectoryNameMax
Definition: recording.c:78
double framesPerSecond
Definition: recording.h:356
Definition: tools.h:176