vdr  2.4.1
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);
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; }
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; }
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;
456  tIndexTs *index;
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
cRecordings::~cRecordings
virtual ~cRecordings()
Definition: recording.c:1490
cIndexFile::Delete
void Delete(void)
Definition: recording.c:2832
cIndexFile
Definition: recording.h:451
cRecording::BaseName
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder).
Definition: recording.c:1051
rsmTime
@ rsmTime
Definition: recording.h:531
IncRecordingsSortMode
void IncRecordingsSortMode(const char *Directory)
Definition: recording.c:3123
ReadFrame
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
Definition: recording.c:3081
cRecording::SetId
void SetId(int Id)
Definition: recording.c:1013
eRecordingsSortDir
eRecordingsSortDir
Definition: recording.h:530
cRecordingsHandler
Definition: recording.h:313
cRecording::ResetResume
void ResetResume(void) const
Definition: recording.c:1337
cRecording::instanceId
int instanceId
Definition: recording.h:111
cMarks::isPesRecording
bool isPesRecording
Definition: recording.h:376
cRecordings::ResetResume
void ResetResume(const char *ResumeFileName=NULL)
Definition: recording.c:1667
cRecordings::lastUpdate
static time_t lastUpdate
Definition: recording.h:231
cRecording::resume
int resume
Definition: recording.h:102
cMarks::MarksFileName
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:2126
rsdDescending
@ rsdDescending
Definition: recording.h:530
cMark::Save
bool Save(FILE *f)
Definition: recording.c:2119
cVideoDirectoryScannerThread
Definition: recording.c:1374
ruMove
@ ruMove
Definition: recording.h:34
cResumeFile::cResumeFile
cResumeFile(const char *FileName, bool IsPesRecording)
Definition: recording.c:244
InstanceId
int InstanceId
Definition: recording.c:79
RecordingsHandler
cRecordingsHandler RecordingsHandler
Definition: recording.c:1967
cRecordings::Add
void Add(cRecording *Recording)
Definition: recording.c:1552
cRecordingInfo::SetFramesPerSecond
void SetFramesPerSecond(double FramesPerSecond)
Definition: recording.c:447
cIndexFile::CatchUp
bool CatchUp(int Index=-1)
Definition: recording.c:2648
cRecording::IsPesRecording
bool IsPesRecording(void) const
Definition: recording.h:171
cRecordingsHandler::DelAll
void DelAll(void)
Deletes/terminates all operations.
Definition: recording.c:2057
cMarks::GetNext
const cMark * GetNext(int Position) const
Definition: recording.c:2242
cIndexFile::ConvertToPes
void ConvertToPes(tIndexTs *IndexTs, int Count)
Definition: recording.c:2635
GenerateIndex
bool GenerateIndex(const char *FileName, bool Update=false)
Generates the index of the existing recording with the given FileName.
Definition: recording.c:2853
cIndexFile::GetLength
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:2844
cRecordings::AddByName
void AddByName(const char *FileName, bool TriggerUpdate=true)
Definition: recording.c:1558
cRecording::id
int id
Definition: recording.h:101
cFileName::isPesRecording
bool isPesRecording
Definition: recording.h:496
cRecordingInfo::aux
char * aux
Definition: recording.h:70
cIndexFile::ConvertFromPes
void ConvertFromPes(tIndexTs *IndexTs, int Count)
Definition: recording.c:2623
cMark::framesPerSecond
double framesPerSecond
Definition: recording.h:356
cTimer
Definition: timers.h:27
RecordingsSortMode
eRecordingsSortMode RecordingsSortMode
Definition: recording.c:3097
cMark::ToText
cString ToText(void)
Definition: recording.c:2100
cIndexFileGenerator
Definition: recording.c:2323
ruPending
@ ruPending
Definition: recording.h:40
cFileName::record
bool record
Definition: recording.h:494
cRecordingInfo::Title
const char * Title(void) const
Definition: recording.h:85
cIndexFile::index
tIndexTs * index
Definition: recording.h:456
SetRecordingsSortMode
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode)
Definition: recording.c:3115
cRecording::IsNew
bool IsNew(void) const
Definition: recording.h:169
cFileName::SetOffset
cUnbufferedFile * SetOffset(int Number, off_t Offset=0)
Definition: recording.c:2998
cRecording::Info
const cRecordingInfo * Info(void) const
Definition: recording.h:153
cMarks::Sort
void Sort(void)
Definition: recording.c:2206
cRecordings::GetById
cRecording * GetById(int Id)
Definition: recording.h:263
cRecordings::GetRecordingsRead
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
Definition: recording.h:237
cRecordings::GetByName
const cRecording * GetByName(const char *FileName) const
Definition: recording.c:1541
cRecordingInfo::SetData
void SetData(const char *Title, const char *ShortText, const char *Description)
Definition: recording.c:431
cRecordingsHandler::cRecordingsHandler
cRecordingsHandler(void)
Definition: recording.c:1969
SecondsToFrames
int SecondsToFrames(int Seconds, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3074
cRecordings::PathIsInUse
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:1627
cFileName::NextFile
cUnbufferedFile * NextFile(void)
Definition: recording.c:3040
cFileName::Open
cUnbufferedFile * Open(void)
Definition: recording.c:2964
cRecording::IsOnVideoDirectoryFileSystem
bool IsOnVideoDirectoryFileSystem(void) const
Definition: recording.c:1166
cIndexFile::Ok
bool Ok(void)
Definition: recording.h:467
cRecordingsHandler::Finished
bool Finished(bool &Error)
Returns true if all operations in the list have been finished.
Definition: recording.c:2072
cRecording::SetDeleted
void SetDeleted(void)
Definition: recording.h:135
cMark::~cMark
virtual ~cMark()
Definition: recording.c:2096
cRecordingInfo::Description
const char * Description(void) const
Definition: recording.h:87
rsmName
@ rsmName
Definition: recording.h:531
cFileName::fileName
char * fileName
Definition: recording.h:493
cRecordingsHandler::Add
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:2019
cIndexFile::IndexFileName
static cString IndexFileName(const char *FileName, bool IsPesRecording)
Definition: recording.c:2618
ruCut
@ ruCut
Definition: recording.h:33
cRecordingInfo::FramesPerSecond
double FramesPerSecond(void) const
Definition: recording.h:90
cRecording::Title
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
Definition: recording.c:1076
ruCopy
@ ruCopy
Definition: recording.h:35
cRecording::FileName
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
cEvent
Definition: epg.h:71
cRecording::Deleted
time_t Deleted(void) const
Definition: recording.h:134
cMarks::GetPrev
cMark * GetPrev(int Position)
Definition: recording.h:414
cRecordings::recordings
static cRecordings recordings
Definition: recording.h:227
cFileName::GetLastPatPmtVersions
bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
Definition: recording.c:2913
tChannelID
Definition: channels.h:49
cRecording::Folder
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
Definition: recording.c:1044
cRecordingInfo::ShortText
const char * ShortText(void) const
Definition: recording.h:86
cRecordingsHandler::error
bool error
Definition: recording.h:318
cRecording::sortBufferTime
char * sortBufferTime
Definition: recording.h:105
cMarks::GetPrev
const cMark * GetPrev(int Position) const
Definition: recording.c:2233
cIndexFile::last
int last
Definition: recording.h:455
cMarks::Add
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:2218
cRecordingInfo::Components
const cComponents * Components(void) const
Definition: recording.h:88
cRecordings::deletedRecordings
static cRecordings deletedRecordings
Definition: recording.h:228
cRecording::Delete
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
cRecordings::GetRecordingsWrite
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
Definition: recording.h:240
cResumeFile::isPesRecording
bool isPesRecording
Definition: recording.h:54
cStateKey
Definition: thread.h:233
cRecording::Start
time_t Start(void) const
Definition: recording.h:131
cMarks::Update
bool Update(void)
Definition: recording.c:2154
cRecordingInfo::Aux
const char * Aux(void) const
Definition: recording.h:89
DirectoryPathMax
int DirectoryPathMax
Definition: recording.c:76
cRecordingInfo
Definition: recording.h:63
cMarks
Definition: recording.h:371
cRecording::Compare
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
cMark::SetPosition
void SetPosition(int Position)
Definition: recording.h:364
cRecording::StripEpisodeName
static char * StripEpisodeName(char *s, bool Strip)
Definition: recording.c:953
cFileName::Number
uint16_t Number(void)
Definition: recording.h:501
cRecording::Name
const char * Name(void) const
Returns the full name of the recording (without the video directory).
Definition: recording.h:146
cRecordingsHandler::Del
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
Definition: recording.c:2050
cIndexFile::mutex
cMutex mutex
Definition: recording.h:460
ruTimer
@ ruTimer
Definition: recording.h:30
cUnbufferedFile
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner,...
Definition: tools.h:457
cRecordingsHandler::Get
cRecordingsHandlerEntry * Get(const char *FileName)
Definition: recording.c:2006
cMarks::Align
void Align(void)
Definition: recording.c:2194
cMarks::Get
const cMark * Get(int Position) const
Definition: recording.c:2224
cMarks::lastFileTime
time_t lastFileTime
Definition: recording.h:378
cRecordings::UpdateByName
void UpdateByName(const char *FileName)
Definition: recording.c:1589
cRecordingInfo::ChannelID
tChannelID ChannelID(void) const
Definition: recording.h:82
cMutex
Definition: thread.h:67
ruNone
@ ruNone
Definition: recording.h:29
channels.h
cRecording::isOnVideoDirectoryFileSystem
int isOnVideoDirectoryFileSystem
Definition: recording.h:113
cRecordingUserCommand::InvokeCommand
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
Definition: recording.c:2306
GetRecordingsSortMode
void GetRecordingsSortMode(const char *Directory)
Definition: recording.c:3104
cMarks::framesPerSecond
double framesPerSecond
Definition: recording.h:375
cListObject
Definition: tools.h:493
cMarks::recordingFileName
cString recordingFileName
Definition: recording.h:373
cRecording::deleted
time_t deleted
Definition: recording.h:125
cMarks::nextUpdate
time_t nextUpdate
Definition: recording.h:377
cRecordings::GetByName
cRecording * GetByName(const char *FileName)
Definition: recording.h:265
cRecordingsHandler::GetUsage
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
Definition: recording.c:2064
cRecordingUserCommand
Definition: recording.h:427
cRecordings::GetDeletedRecordingsRead
static const cRecordings * GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for read access.
Definition: recording.h:243
cMarks::Save
bool Save(void)
Definition: recording.c:2185
cFileName::~cFileName
~cFileName()
Definition: recording.c:2907
cRecording::fileSizeMB
int fileSizeMB
Definition: recording.h:108
cFileName::fileNumber
uint16_t fileNumber
Definition: recording.h:492
rsdAscending
@ rsdAscending
Definition: recording.h:530
cRecordings::GetById
const cRecording * GetById(int Id) const
Definition: recording.c:1532
cRecordingInfo::framesPerSecond
double framesPerSecond
Definition: recording.h:71
cFileName::file
cUnbufferedFile * file
Definition: recording.h:491
cRecording::priority
int priority
Definition: recording.h:123
cFileName
Definition: recording.h:489
cRecording::FramesPerSecond
double FramesPerSecond(void) const
Definition: recording.h:157
cRecording::PrefixFileName
const char * PrefixFileName(char Prefix)
Definition: recording.c:1137
cRecordingsHandler::finished
bool finished
Definition: recording.h:317
uchar
unsigned char uchar
Definition: tools.h:31
cRecordingInfo::SetAux
void SetAux(const char *Aux)
Definition: recording.c:441
cListBase::Lock
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
cRecording::numFrames
int numFrames
Definition: recording.h:109
cMarks::cMarks
cMarks(void)
Definition: recording.h:381
cMarks::GetNextEnd
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:2267
cMarks::GetNextBegin
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:2251
cRecordings::TotalFileSizeMB
int TotalFileSizeMB(void) const
Definition: recording.c:1595
cRecording::FileSizeMB
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
cIndexFile::GetClosestIFrame
int GetClosestIFrame(int Index)
Returns the index of the I-frame that is closest to the given Index (or Index itself,...
Definition: recording.c:2785
cRecordingInfo::~cRecordingInfo
~cRecordingInfo()
Definition: recording.c:423
cMark::comment
cString comment
Definition: recording.h:358
cMark
Definition: recording.h:353
cIndexFile::StoreResume
bool StoreResume(int Index)
Definition: recording.h:480
DirectoryNameMax
int DirectoryNameMax
Definition: recording.c:77
DEF_LIST_LOCK
DEF_LIST_LOCK(Recordings)
cRecording::framesPerSecond
double framesPerSecond
Definition: recording.h:114
cResumeFile::Save
bool Save(int Index)
Definition: recording.c:307
ruCanceled
@ ruCanceled
Definition: recording.h:41
cIndexFile::fileName
cString fileName
Definition: recording.h:454
cRecording
Definition: recording.h:98
DEF_LIST_LOCK2
DEF_LIST_LOCK2(Recordings, DeletedRecordings)
cRecordings::lastRecordingId
static int lastRecordingId
Definition: recording.h:229
cMark::cMark
cMark(int Position=0, const char *Comment=NULL, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:2089
cRecording::LengthInSeconds
int LengthInSeconds(void) const
Returns the length (in seconds) of this recording, or -1 in case of error.
Definition: recording.c:1353
DirectoryEncoding
bool DirectoryEncoding
Definition: recording.c:78
DEFAULTFRAMESPERSECOND
#define DEFAULTFRAMESPERSECOND
Definition: recording.h:351
cRecordingInfo::Read
bool Read(void)
Definition: recording.c:531
cList
Definition: tools.h:594
cRecordingsHandler::Action
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:1981
cRecording::start
time_t start
Definition: recording.h:122
cRecordings::Update
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:1520
cIndexFile::cIndexFile
cIndexFile(const char *FileName, bool Record, bool IsPesRecording=false, bool PauseLive=false, bool Update=false)
Definition: recording.c:2526
cMark::Comment
const char * Comment(void) const
Definition: recording.h:363
ruSrc
@ ruSrc
Definition: recording.h:37
SetRecordingTimerId
void SetRecordingTimerId(const char *Directory, const char *TimerId)
Definition: recording.c:3134
eRecordingUsage
eRecordingUsage
Definition: recording.h:28
cIndexFile::IsStillRecording
bool IsStillRecording(void)
Definition: recording.c:2827
IndexToHMSF
cString IndexToHMSF(int Index, bool WithFrame=false, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3047
cRecordings::videoDirectoryScannerThread
static cVideoDirectoryScannerThread * videoDirectoryScannerThread
Definition: recording.h:232
cComponents
Definition: epg.h:51
cRecording::ChangeName
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
Definition: recording.c:1236
cRecordingInfo::priority
int priority
Definition: recording.h:72
cChannel
Definition: channels.h:89
cRecording::~cRecording
virtual ~cRecording()
Definition: recording.c:943
cRecording::isPesRecording
bool isPesRecording
Definition: recording.h:112
GetRecordingTimerId
cString GetRecordingTimerId(const char *Directory)
Definition: recording.c:3152
cResumeFile::fileName
char * fileName
Definition: recording.h:53
cFileName::Name
const char * Name(void)
Definition: recording.h:500
cRecordingInfo::SetFileName
void SetFileName(const char *FileName)
Definition: recording.c:452
cRecordings::ClearSortNames
void ClearSortNames(void)
Definition: recording.c:1675
cString
Definition: tools.h:176
eRecordingsSortMode
eRecordingsSortMode
Definition: recording.h:531
cRecordingInfo::cRecordingInfo
cRecordingInfo(const cChannel *Channel=NULL, const cEvent *Event=NULL)
Definition: recording.c:351
cRecordingsHandler::mutex
cMutex mutex
Definition: recording.h:315
cResumeFile::~cResumeFile
~cResumeFile()
Definition: recording.c:257
cRecording::lifetime
int lifetime
Definition: recording.h:124
HMSFToIndex
int HMSFToIndex(const char *HMSF, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition: recording.c:3063
cRecording::HasMarks
bool HasMarks(void) const
Returns true if this recording has any editing marks.
Definition: recording.c:1173
cMark::Parse
bool Parse(const char *s)
Definition: recording.c:2105
cRecordings::UpdateFileName
static const char * UpdateFileName(void)
Definition: recording.c:1497
cIndexFile::indexFileGenerator
cIndexFileGenerator * indexFileGenerator
Definition: recording.h:459
cMark::position
int position
Definition: recording.h:357
cRecording::HierarchyLevels
int HierarchyLevels(void) const
Definition: recording.c:1148
cMarks::GetNextBegin
cMark * GetNextBegin(const cMark *EndMark=NULL)
Definition: recording.h:416
cRecordings::GetNumRecordingsInPath
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:1637
cRecordings::NeedsUpdate
static bool NeedsUpdate(void)
Definition: recording.c:1512
cRecordingInfo::channelID
tChannelID channelID
Definition: recording.h:66
timers.h
cRecordings::cRecordings
cRecordings(bool Deleted=false)
Definition: recording.c:1485
HasRecordingsSortMode
bool HasRecordingsSortMode(const char *Directory)
Definition: recording.c:3099
cMark::SetComment
void SetComment(const char *Comment)
Definition: recording.h:365
cMarks::DeleteMarksFile
static bool DeleteMarksFile(const cRecording *Recording)
Definition: recording.c:2131
cMarks::Load
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
Definition: recording.c:2142
cThread
Definition: thread.h:79
cMarks::GetNumSequences
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
Definition: recording.c:2285
cIndexFile::f
int f
Definition: recording.h:453
cFileName::Close
void Close(void)
Definition: recording.c:2988
cIndexFile::Write
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset)
Definition: recording.c:2704
cRecording::info
cRecordingInfo * info
Definition: recording.h:115
cRecordings::updateFileName
static char * updateFileName
Definition: recording.h:230
cRecordingInfo::ChannelName
const char * ChannelName(void) const
Definition: recording.h:83
cIndexFile::Last
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
Definition: recording.h:477
cRecordings::DelByName
void DelByName(const char *FileName)
Definition: recording.c:1567
cRecordingsHandler::operations
cList< cRecordingsHandlerEntry > operations
Definition: recording.h:316
cRecording::Undelete
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
cIndexFile::resumeFile
cResumeFile resumeFile
Definition: recording.h:458
cRecordings::TouchUpdate
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:1504
cRecordings::MoveRecordings
bool MoveRecordings(const char *OldPath, const char *NewPath)
Moves all recordings in OldPath to NewPath.
Definition: recording.c:1647
cRecording::fileName
char * fileName
Definition: recording.h:106
cIndexFile::size
int size
Definition: recording.h:455
cRecordingInfo::fileName
char * fileName
Definition: recording.h:74
cRecordingsHandler::~cRecordingsHandler
virtual ~cRecordingsHandler()
Definition: recording.c:1976
cRecordingInfo::GetEvent
const cEvent * GetEvent(void) const
Definition: recording.h:84
cRecordingsHandlerEntry
Definition: recording.c:1846
cRecordings::GetDeletedRecordingsWrite
static cRecordings * GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for write access.
Definition: recording.h:246
cConfig
Definition: config.h:106
cRecording::IsInUse
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with.
Definition: recording.c:1326
cRecordingInfo::Write
bool Write(void) const
Definition: recording.c:549
cFileName::pFileNumber
char * pFileNumber
Definition: recording.h:493
cRecording::GetResume
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
cResumeFile
Definition: recording.h:51
cMarks::fileName
cString fileName
Definition: recording.h:374
cRecordingUserCommand::SetCommand
static void SetCommand(const char *Command)
Definition: recording.h:431
config.h
cIndexFile::GetNextIFrame
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber=NULL, off_t *FileOffset=NULL, int *Length=NULL)
Definition: recording.c:2747
cRecording::channel
int channel
Definition: recording.h:110
cRecording::cRecording
cRecording(const cRecording &)
cMarks::Get
cMark * Get(int Position)
Definition: recording.h:413
cRecordings
Definition: recording.h:225
epg.h
cMarks::GetNextEnd
cMark * GetNextEnd(const cMark *BeginMark)
Definition: recording.h:417
cRecording::operator=
cRecording & operator=(const cRecording &)
cRecording::ChangePriorityLifetime
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
Definition: recording.c:1211
cRecording::name
char * name
Definition: recording.h:107
cRecording::IsInPath
bool IsInPath(const char *Path) const
Returns true if this recording is stored anywhere under the given Path.
Definition: recording.c:1036
cRecordingInfo::lifetime
int lifetime
Definition: recording.h:73
cRecording::sortBufferName
char * sortBufferName
Definition: recording.h:104
tools.h
AssertFreeDiskSpace
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
cRecordingInfo::channelName
char * channelName
Definition: recording.h:67
cResumeFile::Read
int Read(void)
Definition: recording.c:262
cRecording::Priority
int Priority(void) const
Definition: recording.h:132
cRecording::titleBuffer
char * titleBuffer
Definition: recording.h:103
ExchangeChars
char * ExchangeChars(char *s, bool ToFileSystem)
Definition: recording.c:590
cRecording::Remove
bool Remove(void)
Actually removes the file from the disk Returns false in case of error.
Definition: recording.c:1289
cIndexFile::Get
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent=NULL, int *Length=NULL)
Definition: recording.c:2721
cRecording::SortName
char * SortName(void) const
Definition: recording.c:982
cRecording::Lifetime
int Lifetime(void) const
Definition: recording.h:133
cRecordingInfo::ownEvent
cEvent * ownEvent
Definition: recording.h:69
cResumeFile::Delete
void Delete(void)
Definition: recording.c:337
thread.h
cIndexFile::isPesRecording
bool isPesRecording
Definition: recording.h:457
cRecordingUserCommand::command
static const char * command
Definition: recording.h:429
cRecording::ClearSortName
void ClearSortName(void)
Definition: recording.c:1006
cMarks::GetNext
cMark * GetNext(int Position)
Definition: recording.h:415
cIndexFile::~cIndexFile
~cIndexFile()
Definition: recording.c:2610
cFileName::cFileName
cFileName(const char *FileName, bool Record, bool Blocking=false, bool IsPesRecording=false)
Definition: recording.c:2889
cMarks::lastChange
time_t lastChange
Definition: recording.h:379
cRecordingInfo::event
const cEvent * event
Definition: recording.h:68
cRecording::IsEdited
bool IsEdited(void) const
Definition: recording.c:1159
cMark::Position
int Position(void) const
Definition: recording.h:362
cRecording::DeleteMarks
bool DeleteMarks(void)
Deletes the editing marks from this recording (if any).
Definition: recording.c:1178
cRecording::NumFrames
int NumFrames(void) const
Returns the number of frames in this recording.
Definition: recording.c:1342
ruDst
@ ruDst
Definition: recording.h:38
cRecordings::MBperMinute
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:1606
cIndexFile::GetResume
int GetResume(void)
Definition: recording.h:479
cFileName::blocking
bool blocking
Definition: recording.h:495
cRecording::Id
int Id(void) const
Definition: recording.h:130
cRecording::ReadInfo
void ReadInfo(void)
Definition: recording.c:1183
ruReplay
@ ruReplay
Definition: recording.h:31
cRecording::WriteInfo
bool WriteInfo(const char *OtherFileName=NULL)
Writes in info file of this recording.
Definition: recording.c:1191
cRecording::SetStartTime
void SetStartTime(time_t Start)
Sets the start time of this recording to the given value.
Definition: recording.c:1204
RemoveDeletedRecordings
void RemoveDeletedRecordings(void)
Definition: recording.c:137