vdr 2.6.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.7 2023/12/29 10:48:25 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
24extern int DirectoryPathMax;
25extern int DirectoryNameMax;
26extern bool DirectoryEncoding;
27extern 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
46void AssertFreeDiskSpace(int Priority = 0, bool Force = false);
51
53private:
54 char *fileName;
56public:
57 cResumeFile(const char *FileName, bool IsPesRecording);
59 int Read(void);
60 bool Save(int Index);
61 void Delete(void);
62 };
63
65 friend class cRecording;
66private:
69 const cEvent *event;
71 char *aux;
73 uint16_t frameWidth;
74 uint16_t frameHeight;
79 char *fileName;
80 int errors;
81 cRecordingInfo(const cChannel *Channel = NULL, const cEvent *Event = NULL);
82 bool Read(FILE *f);
83public:
84 cRecordingInfo(const char *FileName);
86 tChannelID ChannelID(void) const { return channelID; }
87 const char *ChannelName(void) const { return channelName; }
88 const cEvent *GetEvent(void) const { return event; }
89 const char *Title(void) const { return event->Title(); }
90 const char *ShortText(void) const { return event->ShortText(); }
91 const char *Description(void) const { return event->Description(); }
92 const cComponents *Components(void) const { return event->Components(); }
93 const char *Aux(void) const { return aux; }
94 double FramesPerSecond(void) const { return framesPerSecond; }
95 uint16_t FrameWidth(void) const { return frameWidth; }
96 uint16_t FrameHeight(void) const { return frameHeight; }
97 eScanType ScanType(void) const { return scanType; }
98 char ScanTypeChar(void) const { return ScanTypeChars[scanType]; }
99 eAspectRatio AspectRatio(void) const { return aspectRatio; }
100 const char *AspectRatioText(void) const { return AspectRatioTexts[aspectRatio]; }
101 cString FrameParams(void) const;
104 void SetFileName(const char *FileName);
105 int Errors(void) const { return errors; } // returns -1 if undefined
106 void SetErrors(int Errors);
107 bool Write(FILE *f, const char *Prefix = "") const;
108 bool Read(void);
109 bool Write(void) const;
110 void SetData(const char *Title, const char *ShortText, const char *Description);
111 void SetAux(const char *Aux);
112 };
113
114class cRecording : public cListObject {
115 friend class cRecordings;
116private:
117 int id;
118 mutable int resume;
119 mutable char *titleBuffer;
120 mutable char *sortBufferName;
121 mutable char *sortBufferTime;
122 mutable char *fileName;
123 mutable char *name;
124 mutable int fileSizeMB;
125 mutable int numFrames;
129 mutable int isOnVideoDirectoryFileSystem; // -1 = unknown, 0 = no, 1 = yes
132 cRecording(const cRecording&); // can't copy cRecording
133 cRecording &operator=(const cRecording &); // can't assign cRecording
134 static char *StripEpisodeName(char *s, bool Strip);
135 char *SortName(void) const;
136 void ClearSortName(void);
137 void SetId(int Id); // should only be set by cRecordings
138 time_t start;
141 time_t deleted;
142public:
143 cRecording(cTimer *Timer, const cEvent *Event);
144 cRecording(const char *FileName);
145 virtual ~cRecording();
146 int Id(void) const { return id; }
147 time_t Start(void) const { return start; }
148 int Priority(void) const { return priority; }
149 int Lifetime(void) const { return lifetime; }
150 time_t Deleted(void) const { return deleted; }
151 void SetDeleted(void) { deleted = time(NULL); }
152 virtual int Compare(const cListObject &ListObject) const;
153 bool IsInPath(const char *Path) const;
156 cString Folder(void) const;
159 cString BaseName(void) const;
162 const char *Name(void) const { return name; }
165 const char *FileName(void) const;
168 const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const;
169 cRecordingInfo *Info(void) const { return info; }
170 const char *PrefixFileName(char Prefix);
171 int HierarchyLevels(void) const;
172 void ResetResume(void) const;
173 double FramesPerSecond(void) const { return framesPerSecond; }
174 int NumFrames(void) const;
177 int LengthInSeconds(void) const;
179 int FileSizeMB(void) const;
182 int GetResume(void) const;
185 bool IsNew(void) const { return GetResume() <= 0; }
186 bool IsEdited(void) const;
187 bool IsPesRecording(void) const { return isPesRecording; }
188 bool IsOnVideoDirectoryFileSystem(void) const;
189 bool HasMarks(void) const;
191 bool DeleteMarks(void);
195 void ReadInfo(void);
196 bool WriteInfo(const char *OtherFileName = NULL);
200 void SetStartTime(time_t Start);
208 bool ChangePriorityLifetime(int NewPriority, int NewLifetime);
212 bool ChangeName(const char *NewName);
219 bool Delete(void);
222 bool Remove(void);
225 bool Undelete(void);
229 int IsInUse(void) const;
237 };
238
240
241class cRecordings : public cList<cRecording> {
242private:
245 static int lastRecordingId;
246 static char *updateFileName;
247 static time_t lastUpdate;
249 static const char *UpdateFileName(void);
250public:
251 cRecordings(bool Deleted = false);
252 virtual ~cRecordings();
253 static const cRecordings *GetRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, false, TimeoutMs) ? &recordings : NULL; }
256 static cRecordings *GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, true, TimeoutMs) ? &recordings : NULL; }
259 static const cRecordings *GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, false, TimeoutMs) ? &deletedRecordings : NULL; }
262 static cRecordings *GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, true, TimeoutMs) ? &deletedRecordings : NULL; }
265 static void Update(bool Wait = false);
269 static void TouchUpdate(void);
273 static bool NeedsUpdate(void);
274 void ResetResume(const char *ResumeFileName = NULL);
275 void ClearSortNames(void);
276 const cRecording *GetById(int Id) const;
277 cRecording *GetById(int Id) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetById(Id)); };
278 const cRecording *GetByName(const char *FileName) const;
279 cRecording *GetByName(const char *FileName) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetByName(FileName)); }
280 void Add(cRecording *Recording);
281 void AddByName(const char *FileName, bool TriggerUpdate = true);
282 void DelByName(const char *FileName);
283 void UpdateByName(const char *FileName);
284 int TotalFileSizeMB(void) const;
285 double MBperMinute(void) const;
288 int PathIsInUse(const char *Path) const;
296 int GetNumRecordingsInPath(const char *Path) const;
300 bool MoveRecordings(const char *OldPath, const char *NewPath);
309 };
310
311// Provide lock controlled access to the list:
312
313DEF_LIST_LOCK(Recordings);
314DEF_LIST_LOCK2(Recordings, DeletedRecordings);
315
316// These macros provide a convenient way of locking the global recordings list
317// and making sure the lock is released as soon as the current scope is left
318// (note that these macros wait forever to obtain the lock!):
319
320#define LOCK_RECORDINGS_READ USE_LIST_LOCK_READ(Recordings)
321#define LOCK_RECORDINGS_WRITE USE_LIST_LOCK_WRITE(Recordings)
322#define LOCK_DELETEDRECORDINGS_READ USE_LIST_LOCK_READ2(Recordings, DeletedRecordings)
323#define LOCK_DELETEDRECORDINGS_WRITE USE_LIST_LOCK_WRITE2(Recordings, DeletedRecordings)
324
326
328private:
332 bool error;
333 cRecordingsHandlerEntry *Get(const char *FileName);
334protected:
335 virtual void Action(void);
336public:
337 cRecordingsHandler(void);
338 virtual ~cRecordingsHandler();
339 bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst = NULL);
347 void Del(const char *FileName);
352 void DelAll(void);
354 int GetUsage(const char *FileName);
356 bool Finished(bool &Error);
361 };
362
364
365#define DEFAULTFRAMESPERSECOND 25.0
366
367class cMark : public cListObject {
368 friend class cMarks; // for sorting
369private:
373public:
374 cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
375 virtual ~cMark();
376 int Position(void) const { return position; }
377 const char *Comment(void) const { return comment; }
379 void SetComment(const char *Comment) { comment = Comment; }
380 cString ToText(void);
381 bool Parse(const char *s);
382 bool Save(FILE *f);
383 };
384
385class cMarks : public cConfig<cMark> {
386private:
394public:
395 cMarks(void): cConfig<cMark>("Marks") {};
396 static cString MarksFileName(const cRecording *Recording);
399 static bool DeleteMarksFile(const cRecording *Recording);
400 bool Load(const char *RecordingFileName, double FramesPerSecond = DEFAULTFRAMESPERSECOND, bool IsPesRecording = false);
401 bool Update(void);
402 bool Save(void);
403 void Align(void);
404 void Sort(void);
405 void Add(int Position);
411 const cMark *Get(int Position) const;
412 const cMark *GetPrev(int Position) const;
413 const cMark *GetNext(int Position) const;
414 const cMark *GetNextBegin(const cMark *EndMark = NULL) const;
418 const cMark *GetNextEnd(const cMark *BeginMark) const;
421 int GetNumSequences(void) const;
427 cMark *Get(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->Get(Position)); }
428 cMark *GetPrev(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetPrev(Position)); }
429 cMark *GetNext(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNext(Position)); }
430 cMark *GetNextBegin(const cMark *EndMark = NULL) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextBegin(EndMark)); }
431 cMark *GetNextEnd(const cMark *BeginMark) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextEnd(BeginMark)); }
432 };
433
434#define RUC_BEFORERECORDING "before"
435#define RUC_STARTRECORDING "started"
436#define RUC_AFTERRECORDING "after"
437#define RUC_EDITINGRECORDING "editing"
438#define RUC_EDITEDRECORDING "edited"
439#define RUC_DELETERECORDING "deleted"
440#define RUC_RENAMEDRECORDING "renamed" // same directory, only the base name is changed
441#define RUC_MOVEDRECORDING "moved" // different directory (and maybe base name), or "copy" to other filesystem + delete original (triggers copying->copied->deleted)
442#define RUC_COPYINGRECORDING "copying"
443#define RUC_COPIEDRECORDING "copied"
444
446private:
447 static const char *command;
448public:
449 static void SetCommand(const char *Command) { command = Command; }
450 static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName = NULL);
451 };
452
453// The maximum size of a single frame (up to HDTV 1920x1080):
454#define MAXFRAMESIZE (KILOBYTE(1024) / TS_SIZE * TS_SIZE) // multiple of TS_SIZE to avoid breaking up TS packets
455
456// The maximum file size is limited by the range that can be covered
457// with a 40 bit 'unsigned int', which is 1TB. The actual maximum value
458// used is 6MB below the theoretical maximum, to have some safety (the
459// actual file size may be slightly higher because we stop recording only
460// before the next independent frame, to have a complete Group Of Pictures):
461#define MAXVIDEOFILESIZETS 1048570 // MB
462#define MAXVIDEOFILESIZEPES 2000 // MB
463#define MINVIDEOFILESIZE 100 // MB
464#define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES
465
466struct tIndexTs;
468
470private:
471 int f;
473 int size, last;
474 tIndexTs *index;
479 void ConvertFromPes(tIndexTs *IndexTs, int Count);
480 void ConvertToPes(tIndexTs *IndexTs, int Count);
481 bool CatchUp(int Index = -1);
482public:
483 cIndexFile(const char *FileName, bool Record, bool IsPesRecording = false, bool PauseLive = false, bool Update = false);
484 ~cIndexFile();
485 bool Ok(void) { return index != NULL; }
486 bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset);
487 bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL);
488 int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL);
489 int GetClosestIFrame(int Index);
494 int Get(uint16_t FileNumber, off_t FileOffset);
495 int Last(void) { CatchUp(); return last; }
497 int GetResume(void) { return resumeFile.Read(); }
498 bool StoreResume(int Index) { return resumeFile.Save(Index); }
499 bool IsStillRecording(void);
500 void Delete(void);
501 static int GetLength(const char *FileName, bool IsPesRecording = false);
504 static cString IndexFileName(const char *FileName, bool IsPesRecording);
505 };
506
508private:
512 bool record;
515public:
516 cFileName(const char *FileName, bool Record, bool Blocking = false, bool IsPesRecording = false);
517 ~cFileName();
518 const char *Name(void) { return fileName; }
519 uint16_t Number(void) { return fileNumber; }
521 cUnbufferedFile *Open(void);
522 void Close(void);
523 cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating
525 };
526
528private:
531 void Add(const char *Title);
532public:
533 bool Load(const char *FileName);
534 bool Save(void) const;
535 void Append(const char *Title);
536 bool Contains(const char *Title) const;
537 };
538
540
541cString IndexToHMSF(int Index, bool WithFrame = false, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
542 // Converts the given index to a string, optionally containing the frame number.
543int HMSFToIndex(const char *HMSF, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
544 // Converts the given string (format: "hh:mm:ss.ff") to an index.
545int SecondsToFrames(int Seconds, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
546 // Returns the number of frames corresponding to the given number of seconds.
547
548int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max);
549
550char *ExchangeChars(char *s, bool ToFileSystem);
551 // Exchanges the characters in the given string to or from a file system
552 // specific representation (depending on ToFileSystem). The given string will
553 // be modified and may be reallocated if more space is needed. The return
554 // value points to the resulting string, which may be different from s.
555
556bool GenerateIndex(const char *FileName, bool Update = false);
561
565bool HasRecordingsSortMode(const char *Directory);
566void GetRecordingsSortMode(const char *Directory);
567void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode);
568void IncRecordingsSortMode(const char *Directory);
569
570void SetRecordingTimerId(const char *Directory, const char *TimerId);
571cString GetRecordingTimerId(const char *Directory);
572
573#endif //__RECORDING_H
cStringList doneRecordings
Definition recording.h:530
bool Save(void) const
Definition recording.c:3194
void Add(const char *Title)
Definition recording.c:3213
cString fileName
Definition recording.h:529
void Append(const char *Title)
Definition recording.c:3218
bool Load(const char *FileName)
Definition recording.c:3173
bool Contains(const char *Title) const
Definition recording.c:3241
Definition epg.h:73
bool isPesRecording
Definition recording.h:514
cUnbufferedFile * NextFile(void)
Definition recording.c:3164
uint16_t Number(void)
Definition recording.h:519
bool record
Definition recording.h:512
void Close(void)
Definition recording.c:3112
uint16_t fileNumber
Definition recording.h:510
cUnbufferedFile * Open(void)
Definition recording.c:3088
cFileName(const char *FileName, bool Record, bool Blocking=false, bool IsPesRecording=false)
Definition recording.c:3013
char * fileName
Definition recording.h:511
char * pFileNumber
Definition recording.h:511
const char * Name(void)
Definition recording.h:518
bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
Definition recording.c:3037
bool blocking
Definition recording.h:513
cUnbufferedFile * SetOffset(int Number, off_t Offset=0)
Definition recording.c:3122
cUnbufferedFile * file
Definition recording.h:509
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber=NULL, off_t *FileOffset=NULL, int *Length=NULL)
Definition recording.c:2871
cResumeFile resumeFile
Definition recording.h:476
bool IsStillRecording(void)
Definition recording.c:2951
void ConvertFromPes(tIndexTs *IndexTs, int Count)
Definition recording.c:2747
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset)
Definition recording.c:2828
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:2968
bool CatchUp(int Index=-1)
Definition recording.c:2772
int GetResume(void)
Definition recording.h:497
void ConvertToPes(tIndexTs *IndexTs, int Count)
Definition recording.c:2759
bool isPesRecording
Definition recording.h:475
cString fileName
Definition recording.h:472
bool StoreResume(int Index)
Definition recording.h:498
cIndexFile(const char *FileName, bool Record, bool IsPesRecording=false, bool PauseLive=false, bool Update=false)
Definition recording.c:2645
cIndexFileGenerator * indexFileGenerator
Definition recording.h:477
static cString IndexFileName(const char *FileName, bool IsPesRecording)
Definition recording.c:2742
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent=NULL, int *Length=NULL)
Definition recording.c:2845
int GetClosestIFrame(int Index)
Returns the index of the I-frame that is closest to the given Index (or Index itself,...
Definition recording.c:2909
bool Ok(void)
Definition recording.h:485
cMutex mutex
Definition recording.h:478
void Delete(void)
Definition recording.c:2956
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
Definition recording.h:495
tIndexTs * index
Definition recording.h:474
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:2203
Definition tools.h:644
cMark(int Position=0, const char *Comment=NULL, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition recording.c:2202
cString comment
Definition recording.h:372
int position
Definition recording.h:371
bool Parse(const char *s)
Definition recording.c:2218
bool Save(FILE *f)
Definition recording.c:2232
cString ToText(void)
Definition recording.c:2213
const char * Comment(void) const
Definition recording.h:377
double framesPerSecond
Definition recording.h:370
void SetPosition(int Position)
Definition recording.h:378
int Position(void) const
Definition recording.h:376
virtual ~cMark()
Definition recording.c:2209
void SetComment(const char *Comment)
Definition recording.h:379
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
Definition recording.c:2398
double framesPerSecond
Definition recording.h:389
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:2331
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:2364
const cMark * GetNext(int Position) const
Definition recording.c:2355
bool Update(void)
Definition recording.c:2267
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
Definition recording.c:2255
time_t lastFileTime
Definition recording.h:392
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:2380
const cMark * Get(int Position) const
Definition recording.c:2337
cString recordingFileName
Definition recording.h:387
bool isPesRecording
Definition recording.h:390
time_t nextUpdate
Definition recording.h:391
cString fileName
Definition recording.h:388
static bool DeleteMarksFile(const cRecording *Recording)
Definition recording.c:2244
void Align(void)
Definition recording.c:2307
void Sort(void)
Definition recording.c:2319
cMark * Get(int Position)
Definition recording.h:427
cMark * GetNextEnd(const cMark *BeginMark)
Definition recording.h:431
cMarks(void)
Definition recording.h:395
cMark * GetNextBegin(const cMark *EndMark=NULL)
Definition recording.h:430
cMark * GetPrev(int Position)
Definition recording.h:428
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:2239
cMark * GetNext(int Position)
Definition recording.h:429
bool Save(void)
Definition recording.c:2298
const cMark * GetPrev(int Position) const
Definition recording.c:2346
time_t lastChange
Definition recording.h:393
char ScanTypeChar(void) const
Definition recording.h:98
const char * ChannelName(void) const
Definition recording.h:87
void SetFramesPerSecond(double FramesPerSecond)
Definition recording.c:463
cEvent * ownEvent
Definition recording.h:70
const cEvent * GetEvent(void) const
Definition recording.h:88
uint16_t FrameHeight(void) const
Definition recording.h:96
const cEvent * event
Definition recording.h:69
uint16_t frameHeight
Definition recording.h:74
int Errors(void) const
Definition recording.h:105
const char * AspectRatioText(void) const
Definition recording.h:100
const char * ShortText(void) const
Definition recording.h:90
eAspectRatio aspectRatio
Definition recording.h:76
eScanType ScanType(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:613
const char * Title(void) const
Definition recording.h:89
bool Read(void)
Definition recording.c:595
tChannelID channelID
Definition recording.h:67
cString FrameParams(void) const
Definition recording.c:629
const char * Aux(void) const
Definition recording.h:93
eScanType scanType
Definition recording.h:75
tChannelID ChannelID(void) const
Definition recording.h:86
void SetFileName(const char *FileName)
Definition recording.c:476
char * channelName
Definition recording.h:68
uint16_t FrameWidth(void) const
Definition recording.h:95
void SetFrameParams(uint16_t FrameWidth, uint16_t FrameHeight, eScanType ScanType, eAspectRatio AspectRatio)
Definition recording.c:468
void SetErrors(int Errors)
Definition recording.c:483
void SetAux(const char *Aux)
Definition recording.c:457
void SetData(const char *Title, const char *ShortText, const char *Description)
Definition recording.c:447
const char * Description(void) const
Definition recording.h:91
eAspectRatio AspectRatio(void) const
Definition recording.h:99
uint16_t frameWidth
Definition recording.h:73
double framesPerSecond
Definition recording.h:72
double FramesPerSecond(void) const
Definition recording.h:94
char * fileName
Definition recording.h:79
const cComponents * Components(void) const
Definition recording.h:92
static const char * command
Definition recording.h:447
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
Definition recording.c:2419
static void SetCommand(const char *Command)
Definition recording.h:449
int isOnVideoDirectoryFileSystem
Definition recording.h:129
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:1112
time_t deleted
Definition recording.h:141
cRecordingInfo * info
Definition recording.h:131
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
Definition recording.c:1303
bool HasMarks(void) const
Returns true if this recording has any editing marks.
Definition recording.c:1257
cRecording & operator=(const cRecording &)
bool WriteInfo(const char *OtherFileName=NULL)
Writes in info file of this recording.
Definition recording.c:1275
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with.
Definition recording.c:1418
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
Definition recording.c:1328
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:1392
void ResetResume(void) const
Definition recording.c:1434
bool IsNew(void) const
Definition recording.h:185
double framesPerSecond
Definition recording.h:130
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:1355
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
Definition recording.c:1129
bool isPesRecording
Definition recording.h:128
void ClearSortName(void)
Definition recording.c:1091
char * sortBufferName
Definition recording.h:120
int NumFrames(void) const
Returns the number of frames in this recording.
Definition recording.c:1439
bool IsEdited(void) const
Definition recording.c:1244
int Id(void) const
Definition recording.h:146
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:1103
bool IsInPath(const char *Path) const
Returns true if this recording is stored anywhere under the given Path.
Definition recording.c:1121
virtual ~cRecording()
Definition recording.c:1028
int fileSizeMB
Definition recording.h:124
void SetId(int Id)
Definition recording.c:1098
void SetStartTime(time_t Start)
Sets the start time of this recording to the given value.
Definition recording.c:1296
char * SortName(void) const
Definition recording.c:1067
const char * Name(void) const
Returns the full name of the recording (without the video directory).
Definition recording.h:162
time_t Start(void) const
Definition recording.h:147
int Lifetime(void) const
Definition recording.h:149
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
Definition recording.c:1141
cRecordingInfo * Info(void) const
Definition recording.h:169
const char * PrefixFileName(char Prefix)
Definition recording.c:1222
bool DeleteMarks(void)
Deletes the editing marks from this recording (if any).
Definition recording.c:1262
bool IsOnVideoDirectoryFileSystem(void) const
Definition recording.c:1250
int HierarchyLevels(void) const
Definition recording.c:1233
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:1458
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder).
Definition recording.c:1136
char * fileName
Definition recording.h:122
char * titleBuffer
Definition recording.h:119
void SetDeleted(void)
Definition recording.h:151
int Priority(void) const
Definition recording.h:148
void ReadInfo(void)
Definition recording.c:1267
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
Definition recording.c:1159
int instanceId
Definition recording.h:127
bool Remove(void)
Actually removes the file from the disk Returns false in case of error.
Definition recording.c:1381
char * name
Definition recording.h:123
cRecording(const cRecording &)
char * sortBufferTime
Definition recording.h:121
time_t start
Definition recording.h:138
int numFrames
Definition recording.h:125
double FramesPerSecond(void) const
Definition recording.h:173
bool IsPesRecording(void) const
Definition recording.h:187
time_t Deleted(void) const
Definition recording.h:150
static char * StripEpisodeName(char *s, bool Strip)
Definition recording.c:1038
int LengthInSeconds(void) const
Returns the length (in seconds) of this recording, or -1 in case of error.
Definition recording.c:1450
void DelAll(void)
Deletes/terminates all operations.
Definition recording.c:2170
cRecordingsHandlerEntry * Get(const char *FileName)
Definition recording.c:2119
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:2132
bool Finished(bool &Error)
Returns true if all operations in the list have been finished.
Definition recording.c:2185
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:2094
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
Definition recording.c:2177
cList< cRecordingsHandlerEntry > operations
Definition recording.h:330
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
Definition recording.c:2163
virtual ~cRecordingsHandler()
Definition recording.c:2089
void ResetResume(const char *ResumeFileName=NULL)
Definition recording.c:1772
void UpdateByName(const char *FileName)
Definition recording.c:1694
static const char * UpdateFileName(void)
Definition recording.c:1602
virtual ~cRecordings()
Definition recording.c:1595
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:1711
cRecording * GetByName(const char *FileName)
Definition recording.h:279
cRecordings(bool Deleted=false)
Definition recording.c:1590
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:1742
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
Definition recording.h:253
const cRecording * GetById(int Id) const
Definition recording.c:1637
static const cRecordings * GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for read access.
Definition recording.h:259
static cRecordings * GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for write access.
Definition recording.h:262
static time_t lastUpdate
Definition recording.h:247
static cRecordings deletedRecordings
Definition recording.h:244
void AddByName(const char *FileName, bool TriggerUpdate=true)
Definition recording.c:1663
static cRecordings recordings
Definition recording.h:243
int TotalFileSizeMB(void) const
Definition recording.c:1700
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:1625
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
Definition recording.h:256
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:1609
void Add(cRecording *Recording)
Definition recording.c:1657
static cVideoDirectoryScannerThread * videoDirectoryScannerThread
Definition recording.h:248
void DelByName(const char *FileName)
Definition recording.c:1672
bool MoveRecordings(const char *OldPath, const char *NewPath)
Moves all recordings in OldPath to NewPath.
Definition recording.c:1752
static bool NeedsUpdate(void)
Definition recording.c:1617
cRecording * GetById(int Id)
Definition recording.h:277
void ClearSortNames(void)
Definition recording.c:1780
static int lastRecordingId
Definition recording.h:245
const cRecording * GetByName(const char *FileName) const
Definition recording.c:1646
static char * updateFileName
Definition recording.h:246
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:1732
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
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner,...
Definition tools.h:507
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:3369
eRecordingsSortMode
Definition recording.h:563
@ rsmName
Definition recording.h:563
@ rsmTime
Definition recording.h:563
#define DEFAULTFRAMESPERSECOND
Definition recording.h:365
int HMSFToIndex(const char *HMSF, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition recording.c:3280
eRecordingsSortDir
Definition recording.h:562
@ rsdDescending
Definition recording.h:562
@ rsdAscending
Definition recording.h:562
int DirectoryPathMax
Definition recording.c:74
void GetRecordingsSortMode(const char *Directory)
Definition recording.c:3321
eRecordingsSortMode RecordingsSortMode
Definition recording.c:3314
bool HasRecordingsSortMode(const char *Directory)
Definition recording.c:3316
int InstanceId
Definition recording.c:77
char * ExchangeChars(char *s, bool ToFileSystem)
Definition recording.c:675
bool DirectoryEncoding
Definition recording.c:76
void IncRecordingsSortMode(const char *Directory)
Definition recording.c:3340
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode)
Definition recording.c:3332
cDoneRecordings DoneRecordingsPattern
Definition recording.c:3171
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
Definition recording.c:3298
cRecordingsHandler RecordingsHandler
Definition recording.c:2080
void SetRecordingTimerId(const char *Directory, const char *TimerId)
Definition recording.c:3351
void RemoveDeletedRecordings(void)
Definition recording.c:135
int SecondsToFrames(int Seconds, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition recording.c:3291
cString IndexToHMSF(int Index, bool WithFrame=false, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition recording.c:3264
bool GenerateIndex(const char *FileName, bool Update=false)
Generates the index of the existing recording with the given FileName.
Definition recording.c:2977
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:1937
const char * ScanTypeChars
Definition remux.c:1936
eAspectRatio
Definition remux.h:514
eScanType
Definition remux.h:507
#define DEF_LIST_LOCK(Class)
Definition tools.h:699
unsigned char uchar
Definition tools.h:31
#define DEF_LIST_LOCK2(Class, Name)
Definition tools.h:682