vdr 2.8.4
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.29 2026/09/07 18:48:24 kls Exp $
8 */
9
10#ifndef __RECORDING_H
11#define __RECORDING_H
12
13#include <atomic>
14#include <time.h>
15#include "channels.h"
16#include "config.h"
17#include "epg.h"
18#include "thread.h"
19#include "timers.h"
20#include "tools.h"
21#include "remux.h"
22
23#define FOLDERDELIMCHAR '~'
24
25extern int DirectoryPathMax;
26extern int DirectoryNameMax;
27extern bool DirectoryEncoding;
28extern int InstanceId;
29
31 ruNone = 0x0000, // the recording is currently unused
32 ruTimer = 0x0001, // the recording is currently written to by a timer
33 ruReplay = 0x0002, // the recording is being replayed
34 // mutually exclusive:
35 ruCut = 0x0004, // the recording is being cut
36 ruMove = 0x0008, // the recording is being moved
37 ruCopy = 0x0010, // the recording is being copied
38 // mutually exclusive:
39 ruSrc = 0x0020, // the recording is the source of a cut, move or copy process
40 ruDst = 0x0040, // the recording is the destination of a cut, move or copy process
41 //
42 ruPending = 0x0080, // the recording is pending a cut, move or copy process
43 ruCanceled = 0x8000, // the operation has been canceled, waiting for cleanup
44 };
45
47void AssertFreeDiskSpace(int Priority = 0, bool Force = false);
52
54private:
55 char *fileName;
56 time_t fileTime;
57 int index;
59public:
60 cResumeFile(const char *FileName, bool IsPesRecording);
62 void SetFileName(const char *FileName);
63 time_t FileTime(void);
64 int Index(void);
65 int Read(void);
66 bool Save(int Index);
67 void Reset(void);
68 void Delete(void);
69 };
70
72 friend class cRecording;
73private:
74 time_t modified;
77 const cEvent *event;
79 char *aux;
81 uint16_t frameWidth;
82 uint16_t frameHeight;
87 char *fileName;
88 int errors;
90 cRecordingInfo(const cChannel *Channel = NULL, const cEvent *Event = NULL);
91 bool Read(FILE *f, bool Force = false);
92public:
93 cRecordingInfo(const char *FileName);
95 tChannelID ChannelID(void) const { return channelID; }
96 const char *ChannelName(void) const { return channelName; }
97 const cEvent *GetEvent(void) const { return event; }
98 const char *Title(void) const { return event->Title(); }
99 const char *ShortText(void) const { return event->ShortText(); }
100 const char *Description(void) const { return event->Description(); }
101 const cComponents *Components(void) const { return event->Components(); }
102 const char *Aux(void) const { return aux; }
103 double FramesPerSecond(void) const { return framesPerSecond; }
104 int Priority(void) const { return priority; }
105 int Lifetime(void) const { return lifetime; }
106 int ParentalRating(void) { return event->ParentalRating(); }
107 uint16_t FrameWidth(void) const { return frameWidth; }
108 uint16_t FrameHeight(void) const { return frameHeight; }
109 eScanType ScanType(void) const { return scanType; }
110 char ScanTypeChar(void) const { return ScanTypeChars[scanType]; }
111 eAspectRatio AspectRatio(void) const { return aspectRatio; }
112 const char *AspectRatioText(void) const { return AspectRatioTexts[aspectRatio]; }
113 cString FrameParams(void) const;
115 void SetPriority(int Priority);
116 void SetLifetime(int Lifetime);
117 void SetTitle(const char *Title);
118 void SetShortText(const char *ShortText);
119 void SetDescription(const char *Description);
122 void SetFileName(const char *FileName);
123 int Errors(void) const { return errors; } // returns -1 if undefined
124 int TmpErrors(void) const { return tmpErrors; } // returns -1 if undefined
125 void SetErrors(int Errors, int TmpErrors = 0);
126 bool Write(FILE *f, const char *Prefix = "") const;
127 bool Read(bool Force = false);
128 bool Write(void) const;
129 [[deprecated("use SetTitle(), SetShortText() and SetDescription() instead")]]
130 void SetData(const char *Title, const char *ShortText, const char *Description);
131 void SetAux(const char *Aux);
132 };
133
134class cRecording : public cListObject {
135 friend class cRecordings;
136private:
137 int id;
139 mutable char *titleBuffer;
140 mutable char *sortBufferName;
141 mutable char *sortBufferTime;
142 mutable char *fileName;
143 mutable char *name;
144 mutable int fileSizeMB;
145 mutable int numFrames;
149 mutable int isOnVideoDirectoryFileSystem; // -1 = unknown, 0 = no, 1 = yes
151 cRecording(const cRecording&); // can't copy cRecording
152 cRecording &operator=(const cRecording &); // can't assign cRecording
153 static char *StripEpisodeName(char *s, bool Strip);
154 char *SortName(void) const;
155 void ClearSortName(void);
156 void SetId(int Id); // should only be set by cRecordings
157 time_t start;
158 time_t deleted;
159public:
160 cRecording(cTimer *Timer, const cEvent *Event);
161 cRecording(const char *FileName);
162 virtual ~cRecording() override;
163 int Id(void) const { return id; }
164 time_t Start(void) const { return start; }
165 int Priority(void) const { return info->Priority(); }
166 int Lifetime(void) const { return info->Lifetime(); }
167 time_t Deleted(void) const { return deleted; }
168 bool RetentionExpired(void) const;
169 void SetDeleted(void);
170 virtual int Compare(const cListObject &ListObject) const override;
171 bool IsInPath(const char *Path) const;
174 cString Folder(void) const;
177 cString BaseName(void) const;
180 const char *Name(void) const { return name; }
183 const char *FileName(void) const;
186 const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const;
187 cRecordingInfo *Info(void) const { return info; }
188 const char *PrefixFileName(char Prefix);
189 int HierarchyLevels(void) const;
190 void ResetResume(void) const;
191 void DeleteResume(void) const;
192 double FramesPerSecond(void) const { return info->FramesPerSecond(); }
193 int NumFrames(void) const;
196 int NumFramesAfterEdit(void) const;
200 int LengthInSeconds(void) const;
202 int LengthInSecondsAfterEdit(void) const;
205 int FileSizeMB(void) const;
208 int GetResume(void) const;
211 time_t GetLastReplayTime(void) const;
214 bool IsNew(void) const { return GetResume() <= 0; }
215 bool IsEdited(void) const;
216 bool IsPesRecording(void) const { return isPesRecording; }
217 bool IsOnVideoDirectoryFileSystem(void) const;
218 bool HasMarks(void) const;
220 bool DeleteMarks(void);
224 void ReadInfo(bool Force = false);
225 bool WriteInfo(const char *OtherFileName = NULL);
229 void SetStartTime(time_t Start);
237 bool ChangePriorityLifetime(int NewPriority, int NewLifetime);
241 bool ChangeName(const char *NewName);
248 bool Delete(void);
253 bool Remove(void);
257 bool Undelete(void);
262 int IsInUse(void) const;
270 };
271
273
274class cRecordings : public cList<cRecording> {
275private:
278 static int lastRecordingId;
279 static char *updateFileName;
280 static std::atomic<time_t> lastUpdate; // written by Update() from any thread, polled by the main loop
282 static const char *UpdateFileName(void);
283public:
284 cRecordings(bool Deleted = false);
285 virtual ~cRecordings() override;
286 static const cRecordings *GetRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, false, TimeoutMs) ? &recordings : NULL; }
289 static cRecordings *GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return recordings.Lock(StateKey, true, TimeoutMs) ? &recordings : NULL; }
292 static const cRecordings *GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, false, TimeoutMs) ? &deletedRecordings : NULL; }
295 static cRecordings *GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs = 0) { return deletedRecordings.Lock(StateKey, true, TimeoutMs) ? &deletedRecordings : NULL; }
298 static void Update(bool Wait = false);
302 static void TouchUpdate(void);
306 static bool NeedsUpdate(void);
307 void ResetResume(const char *ResumeFileName = NULL);
308 void ClearSortNames(void);
309 const cRecording *GetById(int Id) const;
310 cRecording *GetById(int Id) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetById(Id)); };
311 const cRecording *GetByName(const char *FileName) const;
312 cRecording *GetByName(const char *FileName) { return const_cast<cRecording *>(static_cast<const cRecordings *>(this)->GetByName(FileName)); }
313 void Add(cRecording *Recording);
314 void AddByName(const char *FileName, bool TriggerUpdate = true);
315 [[deprecated("use explicit locking, deleting etc.")]] void DelByName(const char *FileName);
316 void UpdateByName(const char *FileName);
317 int TotalFileSizeMB(void) const;
318 double MBperMinute(void) const;
321 int PathIsInUse(const char *Path) const;
329 int GetNumRecordingsInPath(const char *Path) const;
333 bool MoveRecordings(const char *OldPath, const char *NewPath);
342 };
343
344// Provide lock controlled access to the list:
345
346DEF_LIST_LOCK(Recordings);
347DEF_LIST_LOCK2(Recordings, DeletedRecordings);
348
349// These macros provide a convenient way of locking the global recordings list
350// and making sure the lock is released as soon as the current scope is left
351// (note that these macros wait forever to obtain the lock!):
352
353#define LOCK_RECORDINGS_READ USE_LIST_LOCK_READ(Recordings)
354#define LOCK_RECORDINGS_WRITE USE_LIST_LOCK_WRITE(Recordings)
355#define LOCK_DELETEDRECORDINGS_READ USE_LIST_LOCK_READ2(Recordings, DeletedRecordings)
356#define LOCK_DELETEDRECORDINGS_WRITE USE_LIST_LOCK_WRITE2(Recordings, DeletedRecordings)
357
359
361private:
365 bool error;
366 int state;
367 cRecordingsHandlerEntry *Get(const char *FileName);
368protected:
369 virtual void Action(void) override;
370public:
371 cRecordingsHandler(void);
372 virtual ~cRecordingsHandler() override;
373 bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst = NULL);
381 void Del(const char *FileName);
386 void DelAll(void);
388 int GetUsage(const char *FileName);
390 int GetRequiredDiskSpaceMB(const char *FileName = NULL);
394 bool StateChanged(int &OldState);
400 bool Finished(bool &Error);
405 };
406
408
409#define DEFAULTFRAMESPERSECOND 25.0
410
411class cMark : public cListObject {
412 friend class cMarks; // for sorting
413private:
417public:
418 cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
419 virtual ~cMark() override;
420 int Position(void) const { return position; }
421 const char *Comment(void) const { return comment; }
423 void SetComment(const char *Comment) { comment = Comment; }
424 cString ToText(void);
425 bool Parse(const char *s);
426 bool Save(FILE *f);
427 };
428
429class cMarks : public cConfig<cMark> {
430private:
438public:
439 cMarks(void): cConfig<cMark>("Marks") {};
440 static cString MarksFileName(const cRecording *Recording);
443 static bool DeleteMarksFile(const cRecording *Recording);
444 bool Load(const char *RecordingFileName, double FramesPerSecond = DEFAULTFRAMESPERSECOND, bool IsPesRecording = false);
445 bool Update(void);
446 bool Save(void);
447 void Align(void);
448 void Sort(void);
449 void Add(int Position);
455 const cMark *Get(int Position) const;
456 const cMark *GetPrev(int Position) const;
457 const cMark *GetNext(int Position) const;
458 const cMark *GetNextBegin(const cMark *EndMark = NULL) const;
462 const cMark *GetNextEnd(const cMark *BeginMark) const;
465 int GetNumSequences(void) const;
471 int GetFrameAfterEdit(int Frame, int LastFrame) const;
475 cMark *Get(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->Get(Position)); }
476 cMark *GetPrev(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetPrev(Position)); }
477 cMark *GetNext(int Position) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNext(Position)); }
478 cMark *GetNextBegin(const cMark *EndMark = NULL) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextBegin(EndMark)); }
479 cMark *GetNextEnd(const cMark *BeginMark) { return const_cast<cMark *>(static_cast<const cMarks *>(this)->GetNextEnd(BeginMark)); }
480 };
481
482class cErrors : public cVector<int> {
483 };
484
485#define RUC_BEFORERECORDING "before"
486#define RUC_STARTRECORDING "started"
487#define RUC_AFTERRECORDING "after"
488#define RUC_EDITINGRECORDING "editing"
489#define RUC_EDITEDRECORDING "edited"
490#define RUC_DELETERECORDING "deleted"
491#define RUC_RENAMEDRECORDING "renamed" // same directory, only the base name is changed
492#define RUC_MOVEDRECORDING "moved" // different directory (and maybe base name), or "copy" to other filesystem + delete original (triggers copying->copied->deleted)
493#define RUC_COPYINGRECORDING "copying"
494#define RUC_COPIEDRECORDING "copied"
495
497private:
498 static const char *command;
499public:
500 static void SetCommand(const char *Command) { command = Command; }
501 static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName = NULL);
502 };
503
504// The maximum size of a single frame:
505#define MAXFRAMESIZE (3 * KILOBYTE(1024) / TS_SIZE * TS_SIZE) // multiple of TS_SIZE to avoid breaking up TS packets
506
507// The maximum file size is limited by the range that can be covered
508// with a 40 bit 'unsigned int', which is 1TB. The actual maximum value
509// used is 6MB below the theoretical maximum, to have some safety (the
510// actual file size may be slightly higher because we stop recording only
511// before the next independent frame, to have a complete Group Of Pictures):
512#define MAXVIDEOFILESIZETS 1048570 // MB
513#define MAXVIDEOFILESIZEPES 2000 // MB
514#define MINVIDEOFILESIZE 100 // MB
515#define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES
516
517struct tIndexTs;
519
521private:
522 int f;
524 int size, last;
526 tIndexTs *index;
532 void ConvertFromPes(tIndexTs *IndexTs, int Count);
533 void ConvertToPes(tIndexTs *IndexTs, int Count);
534 bool CatchUp(int Index = -1);
535public:
536 cIndexFile(const char *FileName, bool Record, bool IsPesRecording = false, bool PauseLive = false);
537 [[deprecated("use cIndexFile(::cIndexFile(const char *, bool, bool, bool) instead")]]
538 cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive, bool Update)
539 :cIndexFile(FileName, Record, IsPesRecording, PauseLive) {}
540 ~cIndexFile();
541 bool Ok(void) { return index != NULL; }
542 bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset, bool Errors = false, bool Missing = false);
543 bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL, bool *Errors = NULL, bool *Missing = NULL);
544 const cErrors *GetErrors(void);
546 int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL);
547 int GetClosestIFrame(int Index);
552 int Get(uint16_t FileNumber, off_t FileOffset);
553 int Last(void) { CatchUp(); return last; }
555 int GetResume(void) { return resumeFile.Read(); }
556 bool StoreResume(int Index) { return resumeFile.Save(Index); }
557 bool IsStillRecording(void);
558 void Delete(void);
559 static int GetLength(const char *FileName, bool IsPesRecording = false);
562 static cString IndexFileName(const char *FileName, bool IsPesRecording);
563 };
564
566private:
568 uint16_t fileNumber;
570 bool record;
573public:
574 cFileName(const char *FileName, bool Record, bool Blocking = false, bool IsPesRecording = false);
575 ~cFileName();
576 const char *Name(void) { return fileName; }
577 uint16_t Number(void) { return fileNumber; }
578 [[deprecated("will be removed in a future version, if your plugin uses this function, contact vdr@tvdr.de")]]
579 bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion);
580 cUnbufferedFile *Open(void);
581 void Close(void);
582 cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating
584 };
585
587private:
590 void Add(const char *Title);
591public:
592 bool Load(const char *FileName);
593 bool Save(void) const;
594 void Append(const char *Title);
595 bool Contains(const char *Title) const;
596 };
597
599
600cString IndexToHMSF(int Index, bool WithFrame = false, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
601 // Converts the given index to a string, optionally containing the frame number.
602int HMSFToIndex(const char *HMSF, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
603 // Converts the given string (format: "hh:mm:ss.ff") to an index.
604int SecondsToFrames(int Seconds, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
605 // Returns the number of frames corresponding to the given number of seconds.
606
607int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max);
608
609char *ExchangeChars(char *s, bool ToFileSystem);
610 // Exchanges the characters in the given string to or from a file system
611 // specific representation (depending on ToFileSystem). The given string will
612 // be modified and may be reallocated if more space is needed. The return
613 // value points to the resulting string, which may be different from s.
614
615bool GenerateIndex(const char *FileName);
618[[deprecated("use GenerateIndex(const char *FileName) instead")]]
619inline bool GenerateIndex(const char *FileName, bool Update) { return GenerateIndex(FileName); }
620
624bool HasRecordingsSortMode(const char *Directory);
625void GetRecordingsSortMode(const char *Directory);
626void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode);
627void IncRecordingsSortMode(const char *Directory);
628
629void SetRecordingTimerId(const char *Directory, const char *TimerId);
630cString GetRecordingTimerId(const char *Directory);
631void ClrRecordingTimerId(const char *Directory);
632
633int FileSizeMBafterEdit(const char *FileName);
634bool EnoughFreeDiskSpaceForEdit(const char *FileName);
635
636#endif //__RECORDING_H
static const uint8_t * GetLength(const uint8_t *Data, int &Length)
Definition ci.c:42
cConfig(const char *NeedsLocking=NULL)
Definition config.h:129
cStringList doneRecordings
Definition recording.h:589
bool Save(void) const
Definition recording.c:3493
void Add(const char *Title)
Definition recording.c:3512
cString fileName
Definition recording.h:588
void Append(const char *Title)
Definition recording.c:3517
bool Load(const char *FileName)
Definition recording.c:3472
bool Contains(const char *Title) const
Definition recording.c:3540
Definition epg.h:74
bool isPesRecording
Definition recording.h:572
cUnbufferedFile * NextFile(void)
Definition recording.c:3463
uint16_t Number(void)
Definition recording.h:577
bool record
Definition recording.h:570
void Close(void)
Definition recording.c:3411
uint16_t fileNumber
Definition recording.h:568
cUnbufferedFile * Open(void)
Definition recording.c:3387
cFileName(const char *FileName, bool Record, bool Blocking=false, bool IsPesRecording=false)
Definition recording.c:3312
char * fileName
Definition recording.h:569
char * pFileNumber
Definition recording.h:569
const char * Name(void)
Definition recording.h:576
bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
Definition recording.c:3336
bool blocking
Definition recording.h:571
cUnbufferedFile * SetOffset(int Number, off_t Offset=0)
Definition recording.c:3421
cUnbufferedFile * file
Definition recording.h:567
int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber=NULL, off_t *FileOffset=NULL, int *Length=NULL)
Definition recording.c:3167
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset, bool Errors=false, bool Missing=false)
Definition recording.c:3107
cResumeFile resumeFile
Definition recording.h:528
bool IsStillRecording(void)
Definition recording.c:3250
void ConvertFromPes(tIndexTs *IndexTs, int Count)
Definition recording.c:3018
cIndexFile(const char *FileName, bool Record, bool IsPesRecording=false, bool PauseLive=false)
Definition recording.c:2915
bool CatchUp(int Index=-1)
Definition recording.c:3043
const cErrors * GetErrors(void)
Returns the frame indexes of errors in the recording (if any).
Definition recording.c:3155
int GetResume(void)
Definition recording.h:555
void ConvertToPes(tIndexTs *IndexTs, int Count)
Definition recording.c:3030
bool isPesRecording
Definition recording.h:527
cErrors errors
Definition recording.h:529
cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive, bool Update)
Definition recording.h:538
int lastErrorIndex
Definition recording.h:525
cString fileName
Definition recording.h:523
bool StoreResume(int Index)
Definition recording.h:556
cIndexFileGenerator * indexFileGenerator
Definition recording.h:530
static cString IndexFileName(const char *FileName, bool IsPesRecording)
Definition recording.c:3013
int GetClosestIFrame(int Index)
Returns the index of the I-frame that is closest to the given Index (or Index itself,...
Definition recording.c:3206
bool Ok(void)
Definition recording.h:541
cMutex mutex
Definition recording.h:531
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent=NULL, int *Length=NULL, bool *Errors=NULL, bool *Missing=NULL)
Definition recording.c:3124
void Delete(void)
Definition recording.c:3256
int Last(void)
Returns the index of the last entry in this file, or -1 if the file is empty.
Definition recording.h:553
tIndexTs * index
Definition recording.h:526
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:2219
cListObject(const cListObject &ListObject)
Definition tools.h:553
Definition tools.h:650
cList(const char *NeedsLocking=NULL)
Definition tools.h:652
cMark(int Position=0, const char *Comment=NULL, double FramesPerSecond=DEFAULTFRAMESPERSECOND)
Definition recording.c:2425
cString comment
Definition recording.h:416
int position
Definition recording.h:415
bool Parse(const char *s)
Definition recording.c:2441
friend class cMarks
Definition recording.h:412
bool Save(FILE *f)
Definition recording.c:2455
cString ToText(void)
Definition recording.c:2436
const char * Comment(void) const
Definition recording.h:421
double framesPerSecond
Definition recording.h:414
void SetPosition(int Position)
Definition recording.h:422
int Position(void) const
Definition recording.h:420
void SetComment(const char *Comment)
Definition recording.h:423
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
Definition recording.c:2621
double framesPerSecond
Definition recording.h:433
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:2554
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:2587
const cMark * GetNext(int Position) const
Definition recording.c:2578
bool Update(void)
Definition recording.c:2490
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
Definition recording.c:2478
time_t lastFileTime
Definition recording.h:436
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:2603
const cMark * Get(int Position) const
Definition recording.c:2560
cString recordingFileName
Definition recording.h:431
bool isPesRecording
Definition recording.h:434
time_t nextUpdate
Definition recording.h:435
cString fileName
Definition recording.h:432
static bool DeleteMarksFile(const cRecording *Recording)
Definition recording.c:2467
void Align(void)
Definition recording.c:2530
int GetFrameAfterEdit(int Frame, int LastFrame) const
Returns the number of the given Frame within the region covered by begin/end sequences.
Definition recording.c:2638
void Sort(void)
Definition recording.c:2542
cMark * Get(int Position)
Definition recording.h:475
cMark * GetNextEnd(const cMark *BeginMark)
Definition recording.h:479
cMarks(void)
Definition recording.h:439
cMark * GetNextBegin(const cMark *EndMark=NULL)
Definition recording.h:478
cMark * GetPrev(int Position)
Definition recording.h:476
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:2462
cMark * GetNext(int Position)
Definition recording.h:477
bool Save(void)
Definition recording.c:2521
const cMark * GetPrev(int Position) const
Definition recording.c:2569
time_t lastChange
Definition recording.h:437
char ScanTypeChar(void) const
Definition recording.h:110
const char * ChannelName(void) const
Definition recording.h:96
void SetFramesPerSecond(double FramesPerSecond)
Definition recording.c:499
cEvent * ownEvent
Definition recording.h:78
const cEvent * GetEvent(void) const
Definition recording.h:97
int TmpErrors(void) const
Definition recording.h:124
uint16_t FrameHeight(void) const
Definition recording.h:108
const cEvent * event
Definition recording.h:77
uint16_t frameHeight
Definition recording.h:82
void SetTitle(const char *Title)
Definition recording.c:514
void SetDescription(const char *Description)
Definition recording.c:524
int Errors(void) const
Definition recording.h:123
const char * AspectRatioText(void) const
Definition recording.h:112
int Priority(void) const
Definition recording.h:104
const char * ShortText(void) const
Definition recording.h:99
eAspectRatio aspectRatio
Definition recording.h:84
eScanType ScanType(void) const
Definition recording.h:109
int Lifetime(void) const
Definition recording.h:105
cRecordingInfo(const cChannel *Channel=NULL, const cEvent *Event=NULL)
Definition recording.c:390
bool Write(void) const
Definition recording.c:697
int ParentalRating(void)
Definition recording.h:106
void SetLifetime(int Lifetime)
Definition recording.c:509
const char * Title(void) const
Definition recording.h:98
tChannelID channelID
Definition recording.h:75
cString FrameParams(void) const
Definition recording.c:713
const char * Aux(void) const
Definition recording.h:102
eScanType scanType
Definition recording.h:83
friend class cRecording
Definition recording.h:72
tChannelID ChannelID(void) const
Definition recording.h:95
void SetFileName(const char *FileName)
Definition recording.c:542
void SetPriority(int Priority)
Definition recording.c:504
void SetParentalRating(int ParentalRating)
Definition recording.c:529
time_t modified
Definition recording.h:74
char * channelName
Definition recording.h:76
uint16_t FrameWidth(void) const
Definition recording.h:107
void SetFrameParams(uint16_t FrameWidth, uint16_t FrameHeight, eScanType ScanType, eAspectRatio AspectRatio)
Definition recording.c:534
void SetShortText(const char *ShortText)
Definition recording.c:519
void SetAux(const char *Aux)
Definition recording.c:493
void SetData(const char *Title, const char *ShortText, const char *Description)
Definition recording.c:483
const char * Description(void) const
Definition recording.h:100
eAspectRatio AspectRatio(void) const
Definition recording.h:111
bool Read(FILE *f, bool Force=false)
Definition recording.c:555
uint16_t frameWidth
Definition recording.h:81
void SetErrors(int Errors, int TmpErrors=0)
Definition recording.c:549
double framesPerSecond
Definition recording.h:80
double FramesPerSecond(void) const
Definition recording.h:103
char * fileName
Definition recording.h:87
const cComponents * Components(void) const
Definition recording.h:101
static const char * command
Definition recording.h:498
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
Definition recording.c:2674
static void SetCommand(const char *Command)
Definition recording.h:500
virtual int Compare(const cListObject &ListObject) const override
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
Definition recording.c:1208
int isOnVideoDirectoryFileSystem
Definition recording.h:149
time_t deleted
Definition recording.h:158
cRecordingInfo * info
Definition recording.h:150
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
Definition recording.c:1397
bool HasMarks(void) const
Returns true if this recording has any editing marks.
Definition recording.c:1354
cRecording & operator=(const cRecording &)
bool WriteInfo(const char *OtherFileName=NULL)
Writes the info file of this recording.
Definition recording.c:1369
time_t GetLastReplayTime(void) const
Returns the time this recording was last replayed (which is actually the timestamp of the resume file...
Definition recording.c:1189
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with.
Definition recording.c:1530
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
Definition recording.c:1421
bool Undelete(void)
Changes the file name (both internally and on disk) to make this a "normal" recording.
Definition recording.c:1496
void ResetResume(void) const
Definition recording.c:1546
void ReadInfo(bool Force=false)
Definition recording.c:1364
bool IsNew(void) const
Definition recording.h:214
bool Delete(void)
Changes the file name (both internally and on disk) to make this a "deleted" recording.
Definition recording.c:1450
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
Definition recording.c:1222
bool isPesRecording
Definition recording.h:148
void DeleteResume(void) const
Definition recording.c:1552
void ClearSortName(void)
Definition recording.c:1172
char * sortBufferName
Definition recording.h:140
int NumFrames(void) const
Returns the number of frames in this recording.
Definition recording.c:1558
bool IsEdited(void) const
Definition recording.c:1341
int Id(void) const
Definition recording.h:163
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:1184
bool IsInPath(const char *Path) const
Returns true if this recording is stored anywhere under the given Path.
Definition recording.c:1214
int fileSizeMB
Definition recording.h:144
void SetId(int Id)
Definition recording.c:1179
void SetStartTime(time_t Start)
Sets the start time of this recording to the given value.
Definition recording.c:1390
char * SortName(void) const
Definition recording.c:1148
const char * Name(void) const
Returns the full name of the recording (without the video directory).
Definition recording.h:180
cResumeFile * resume
Definition recording.h:138
time_t Start(void) const
Definition recording.h:164
int Lifetime(void) const
Definition recording.h:166
int NumFramesAfterEdit(void) const
Returns the number of frames in the edited version of this recording.
Definition recording.c:1569
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
Definition recording.c:1234
cRecordingInfo * Info(void) const
Definition recording.h:187
const char * PrefixFileName(char Prefix)
Definition recording.c:1319
bool DeleteMarks(void)
Deletes the editing marks from this recording (if any).
Definition recording.c:1359
bool IsOnVideoDirectoryFileSystem(void) const
Definition recording.c:1347
int HierarchyLevels(void) const
Definition recording.c:1330
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:1596
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder).
Definition recording.c:1229
char * fileName
Definition recording.h:142
char * titleBuffer
Definition recording.h:139
void SetDeleted(void)
Definition recording.c:1203
int Priority(void) const
Definition recording.h:165
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
Definition recording.c:1252
int instanceId
Definition recording.h:147
bool Remove(void)
Actually removes the file from the disk.
Definition recording.c:1485
char * name
Definition recording.h:143
cRecording(const cRecording &)
char * sortBufferTime
Definition recording.h:141
int LengthInSecondsAfterEdit(void) const
Returns the length (in seconds) of the edited version of this recording, or -1 in case of error.
Definition recording.c:1588
bool RetentionExpired(void) const
Definition recording.c:1194
time_t start
Definition recording.h:157
int numFrames
Definition recording.h:145
double FramesPerSecond(void) const
Definition recording.h:192
bool IsPesRecording(void) const
Definition recording.h:216
time_t Deleted(void) const
Definition recording.h:167
static char * StripEpisodeName(char *s, bool Strip)
Definition recording.c:1119
int LengthInSeconds(void) const
Returns the length (in seconds) of this recording, or -1 in case of error.
Definition recording.c:1580
friend class cRecordings
Definition recording.h:135
void DelAll(void)
Deletes/terminates all operations.
Definition recording.c:2362
bool StateChanged(int &OldState)
Returns true if the state if this recordings handler has changed since the last call with the given O...
Definition recording.c:2398
cRecordingsHandlerEntry * Get(const char *FileName)
Definition recording.c:2308
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:2321
bool Finished(bool &Error)
Returns true if all operations in the list have been finished.
Definition recording.c:2408
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
Definition recording.c:2371
cList< cRecordingsHandlerEntry > operations
Definition recording.h:363
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
Definition recording.c:2353
virtual void Action(void) override
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
Definition recording.c:2282
int GetRequiredDiskSpaceMB(const char *FileName=NULL)
Returns the total disk space required to process all actions.
Definition recording.c:2379
void ResetResume(const char *ResumeFileName=NULL)
Definition recording.c:1947
void UpdateByName(const char *FileName)
Definition recording.c:1867
static const char * UpdateFileName(void)
Definition recording.c:1759
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:1886
cRecording * GetByName(const char *FileName)
Definition recording.h:312
cRecordings(bool Deleted=false)
Definition recording.c:1747
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:1917
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
Definition recording.h:286
const cRecording * GetById(int Id) const
Definition recording.c:1794
static const cRecordings * GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for read access.
Definition recording.h:292
static cRecordings * GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for write access.
Definition recording.h:295
static cRecordings deletedRecordings
Definition recording.h:277
void AddByName(const char *FileName, bool TriggerUpdate=true)
Definition recording.c:1820
static cRecordings recordings
Definition recording.h:276
int TotalFileSizeMB(void) const
Definition recording.c:1875
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:1782
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
Definition recording.h:289
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:1766
void Add(cRecording *Recording)
Definition recording.c:1814
static cVideoDirectoryScannerThread * videoDirectoryScannerThread
Definition recording.h:281
void DelByName(const char *FileName)
Definition recording.c:1831
bool MoveRecordings(const char *OldPath, const char *NewPath)
Moves all recordings in OldPath to NewPath.
Definition recording.c:1927
static bool NeedsUpdate(void)
Definition recording.c:1774
cRecording * GetById(int Id)
Definition recording.h:310
void ClearSortNames(void)
Definition recording.c:1955
static int lastRecordingId
Definition recording.h:278
static std::atomic< time_t > lastUpdate
Definition recording.h:280
const cRecording * GetByName(const char *FileName) const
Definition recording.c:1803
static char * updateFileName
Definition recording.h:279
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:1907
bool isPesRecording
Definition recording.h:58
bool Save(int Index)
Definition recording.c:331
void Reset(void)
Definition recording.c:371
time_t FileTime(void)
Definition recording.c:272
char * fileName
Definition recording.h:55
int Index(void)
Definition recording.c:279
void SetFileName(const char *FileName)
Definition recording.c:258
time_t fileTime
Definition recording.h:56
int Read(void)
Definition recording.c:286
void Delete(void)
Definition recording.c:376
cResumeFile(const char *FileName, bool IsPesRecording)
Definition recording.c:244
cThread(const char *Description=NULL, bool LowPriority=false)
Creates a new thread.
Definition thread.c:264
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner,...
Definition tools.h:513
cVector(const cVector &Vector)
Definition tools.h:726
int DirectoryNameMax
Definition recording.c:75
cString GetRecordingTimerId(const char *Directory)
Definition recording.c:3668
cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
Definition recording.c:3563
void AssertFreeDiskSpace(int Priority, bool Force)
The special Priority value -1 means that we shall get rid of any deleted recordings faster than norma...
Definition recording.c:152
int DirectoryPathMax
Definition recording.c:74
void GetRecordingsSortMode(const char *Directory)
Definition recording.c:3620
bool GenerateIndex(const char *FileName)
Generates the index of the existing recording with the given FileName.
Definition recording.c:3277
int SecondsToFrames(int Seconds, double FramesPerSecond)
Definition recording.c:3590
eRecordingsSortMode RecordingsSortMode
Definition recording.c:3613
bool HasRecordingsSortMode(const char *Directory)
Definition recording.c:3615
int InstanceId
Definition recording.c:77
bool EnoughFreeDiskSpaceForEdit(const char *FileName)
Definition recording.c:3713
char * ExchangeChars(char *s, bool ToFileSystem)
Definition recording.c:757
bool DirectoryEncoding
Definition recording.c:76
void IncRecordingsSortMode(const char *Directory)
Definition recording.c:3639
int HMSFToIndex(const char *HMSF, double FramesPerSecond)
Definition recording.c:3579
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode)
Definition recording.c:3631
cDoneRecordings DoneRecordingsPattern
Definition recording.c:3470
int FileSizeMBafterEdit(const char *FileName)
Definition recording.c:3698
int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
Definition recording.c:3597
cRecordingsHandler RecordingsHandler
Definition recording.c:2267
void SetRecordingTimerId(const char *Directory, const char *TimerId)
Definition recording.c:3650
void ClrRecordingTimerId(const char *Directory)
Definition recording.c:3683
void RemoveDeletedRecordings(void)
Definition recording.c:135
eRecordingUsage
Definition recording.h:30
@ ruSrc
Definition recording.h:39
@ ruCut
Definition recording.h:35
@ ruReplay
Definition recording.h:33
@ ruCopy
Definition recording.h:37
@ ruCanceled
Definition recording.h:43
@ ruTimer
Definition recording.h:32
@ ruDst
Definition recording.h:40
@ ruNone
Definition recording.h:31
@ ruMove
Definition recording.h:36
@ ruPending
Definition recording.h:42
eRecordingsSortMode
Definition recording.h:622
@ rsmName
Definition recording.h:622
@ rsmTime
Definition recording.h:622
#define DEFAULTFRAMESPERSECOND
Definition recording.h:409
eRecordingsSortDir
Definition recording.h:621
@ rsdDescending
Definition recording.h:621
@ rsdAscending
Definition recording.h:621
const char * AspectRatioTexts[]
Definition remux.c:2190
const char * ScanTypeChars
Definition remux.c:2189
eAspectRatio
Definition remux.h:518
eScanType
Definition remux.h:511
#define DEF_LIST_LOCK(Class)
Definition tools.h:705
unsigned char uchar
Definition tools.h:31
#define DEF_LIST_LOCK2(Class, Name)
Definition tools.h:688