12#if QT_VERSION >= QT_VERSION_CHECK(6,5,0)
13#include <QtSystemDetection>
76 friend class TestRecordingExtender;
79 static const std::array<const QString,5>
kCatName;
81 static constexpr int kNumCatTypes = 5;
104 QString syndicatedepisode,
111 QString chanplaybackfilters,
116 const QString &pathname,
119 QString storagegroup,
124 CategoryType catType,
132 QDateTime recstartts,
141 QDate originalAirDate,
142 QDateTime lastmodified,
154 uint audioproperties,
155 uint videoproperties,
158 QDateTime bookmarkupdate);
164 QString sortSubtitle,
181 QDateTime recstartts,
198 QString sortSubtitle,
200 QString syndicatedepisode,
207 QString chanplaybackfilters,
211 QDateTime recstartts,
216 CategoryType catType,
222 QDate originalAirDate,
231 uint videoproperties,
232 uint audioproperties,
244 QString sortSubtitle,
255 QString chanplaybackfilters,
262 QDateTime recstartts,
274 const QString &title,
275 const QString &sortTitle,
276 const QString &subtitle,
277 const QString &sortSubtitle,
278 const QString &director,
279 int season,
int episode,
280 const QString &inetref,
281 std::chrono::minutes length_in_minutes,
283 const QString &programid);
286 const QDateTime &_startts,
const QDateTime &_endts);
289 QDateTime _startts, QDateTime _endts)
290 : m_title(
std::move(_title)), m_category(
std::move(_category)),
291 m_startTs(
std::move(_startts)), m_endTs(
std::move(_endts))
292 { ensureSortFields(); }
294 const QStringList::const_iterator& end)
301 QStringList::const_iterator it = list.begin();
309 bool ignore_non_serialized_data =
false);
310 void ensureSortFields(
void);
312 virtual void clear(
void);
319 virtual void ToMap(
InfoMap &progMap,
320 bool showrerecord =
false,
321 uint star_range = 10,
322 uint date_format = 0)
const;
323 virtual void SubstituteMatches(QString &str);
326 bool IsSameProgram(
const ProgramInfo &other)
const;
327 bool IsDuplicateProgram(
const ProgramInfo &other)
const;
328 bool IsSameProgramAndStartTime(
const ProgramInfo &other)
const;
329 bool IsSameTitleStartTimeAndChannel(
const ProgramInfo &other)
const;
330 bool IsSameTitleTimeslotAndChannel(
const ProgramInfo &other)
const;
333 return s_usingProgIDAuth;
335 static void CheckProgramIDAuthorities(
void);
338 bool IsSameProgramWeakCheck(
const ProgramInfo &other)
const;
341 bool IsSameChannel(
const ProgramInfo &other)
const;
347 {
return MakeUniqueKey(m_chanId, m_recStartTs); }
348 std::chrono::seconds GetSecondsInRecording(
void)
const;
349 QString ChannelText(
const QString& format)
const;
351 QString
GetBasename(
void)
const {
return m_pathname.section(
'/', -1); }
358 bool IsLocal(
void)
const {
return m_pathname.startsWith(
"/")
360 || m_pathname.at(1) ==
':'
363 bool IsMythStream(
void)
const {
return m_pathname.startsWith(
"myth://"); }
364 bool IsPathSet(
void)
const {
return GetBasename() != m_pathname; }
366 bool IsFileReadable(
void);
396 {
return m_chanPlaybackFilters; }
435 if (m_originalAirDate.isValid())
436 return m_originalAirDate.year();
445 virtual uint64_t GetFilesize(
void)
const;
450 QString GetCategoryTypeString(
void)
const;
455 {
return lroundf(m_stars * range_max); }
476 QString GetShortInputName(
void)
const;
482 QString GetProgramFlagNames(
void)
const;
486 QString GetRecTypeStatus(
bool showrerecord)
const;
487 bool IsGeneric(
void)
const;
488 bool IsInUsePlaying(
void)
const {
return (m_programFlags & FL_INUSEPLAYING) != 0U;}
491 bool HasCutlist(
void)
const {
return (m_programFlags & FL_CUTLIST) != 0U; }
492 bool IsBookmarkSet(
void)
const {
return (m_programFlags & FL_BOOKMARK) != 0U; }
493 bool IsLastPlaySet(
void)
const {
return (m_programFlags & FL_LASTPLAYPOS) != 0U; }
494 bool IsWatched(
void)
const {
return (m_programFlags & FL_WATCHED) != 0U; }
496 bool IsPreserved(
void)
const {
return (m_programFlags & FL_PRESERVED) != 0U; }
497 bool IsVideo(
void)
const {
return (m_programFlags & FL_TYPEMASK) != 0U; }
499 bool IsRepeat(
void)
const {
return (m_programFlags & FL_REPEAT) != 0U; }
500 bool IsDuplicate(
void)
const {
return (m_programFlags & FL_DUPLICATE) != 0U; }
501 bool IsReactivated(
void)
const {
return (m_programFlags & FL_REACTIVATE) != 0U; }
503 {
return (m_programFlags & FL_DELETEPENDING) != 0U; }
506 QString GetSubtitleTypeNames(
void)
const;
508 QString GetVideoPropertyNames(
void)
const;
510 QString GetAudioPropertyNames(
void)
const;
512 static uint SubtitleTypesFromNames(
const QString & names);
513 static uint VideoPropertiesFromNames(
const QString & names);
514 static uint AudioPropertiesFromNames(
const QString & names);
516 void ProgramFlagsFromNames(
const QString & names);
525 QString
toString(Verbosity v = kLongDescription,
const QString& sep =
":",
526 const QString& grp =
"\"")
const;
529 void SetTitle(
const QString &
t,
const QString &st =
nullptr);
530 void SetSubtitle(
const QString &st,
const QString &sst =
nullptr);
532 { m_programFlags &= ~FL_TYPEMASK; m_programFlags |= ((uint32_t)
t<<20); }
533 void SetPathname(
const QString& pn);
543 virtual void SetFilesize( uint64_t sz);
555 m_programFlags &= ~FL_REACTIVATE;
556 m_programFlags |= (reactivate) ? FL_REACTIVATE : FL_NONE;
560 m_programFlags &= ~FL_EDITING;
561 m_programFlags |= (editing) ? FL_EDITING : FL_NONE;
565 m_programFlags &= ~FL_COMMFLAG;
566 m_programFlags |= (flagging) ? FL_COMMFLAG : FL_NONE;
572 m_programFlags &= ~FL_IGNOREBOOKMARK;
573 m_programFlags |= (ignore) ? FL_IGNOREBOOKMARK : FL_NONE;
579 m_programFlags &= ~FL_IGNOREPROGSTART;
580 m_programFlags |= (ignore) ? FL_IGNOREPROGSTART : FL_NONE;
587 m_programFlags &= ~FL_IGNORELASTPLAYPOS;
588 m_programFlags |= (ignore) ? FL_IGNORELASTPLAYPOS : FL_NONE;
591 { m_recordedId = _recordedid; }
595 { m_positionMapDBReplacement = pmap; }
597 void CalculateRecordedProgress();
600 void CalculateWatchedProgress(uint64_t pos);
603 void CalculateProgress(uint64_t pos);
606 QString QueryBasename(
void)
const;
608 uint QueryMplexID(
void)
const;
609 QDateTime QueryBookmarkTimeStamp(
void)
const;
610 uint64_t QueryBookmark(
void)
const;
611 uint64_t QueryProgStart(
void)
const;
612 uint64_t QueryLastPlayPos(
void)
const;
613 uint64_t QueryStartMark(
void)
const;
614 CategoryType QueryCategoryType(
void)
const;
615 QStringList QueryDVDBookmark(
const QString &serialid)
const;
616 QStringList QueryBDBookmark(
const QString &serialid)
const;
617 bool QueryIsEditing(
void)
const;
618 bool QueryIsInUse(QStringList &byWho)
const;
619 bool QueryIsInUse(QString &byWho)
const;
620 bool QueryIsDeleteCandidate(
bool one_playback_allowed =
false)
const;
623 bool QueryTuningInfo(QString &channum, QString &input)
const;
625 uint QueryAverageWidth(
void)
const;
626 uint QueryAverageHeight(
void)
const;
627 uint QueryAverageFrameRate(
void)
const;
628 MarkTypes QueryAverageAspectRatio(
void)
const;
629 bool QueryAverageScanProgressive(
void)
const;
630 std::chrono::milliseconds QueryTotalDuration(
void)
const;
631 int64_t QueryTotalFrames(
void)
const;
632 QString QueryRecordingGroup(
void)
const;
634 uint QueryTranscoderID(
void)
const;
635 uint64_t QueryLastFrameInPosMap(
void)
const;
639 virtual void SaveFilesize(uint64_t fsize);
640 void SaveLastPlayPos(uint64_t frame);
641 void SaveBookmark(uint64_t frame);
642 static void SaveDVDBookmark(
const QStringList &fields) ;
643 static void SaveBDBookmark(
const QStringList &fields) ;
644 void SaveEditing(
bool edit);
646 void SaveWatched(
bool watchedFlag);
647 void SaveDeletePendingFlag(
bool deleteFlag);
649 void SaveAutoExpire(
AutoExpireType autoExpire,
bool updateDelete =
false);
650 void SavePreserve(
bool preserveEpisode);
651 bool SaveBasename(
const QString &basename);
653 void SaveResolution(uint64_t frame,
uint width,
uint height);
654 void SaveFrameRate(uint64_t frame,
uint framerate);
655 void SaveVideoScanType(uint64_t frame,
bool progressive);
656 void SaveTotalDuration(std::chrono::milliseconds duration);
657 void SaveTotalFrames(int64_t frames);
658 void SaveVideoProperties(
uint mask,
uint video_property_flags);
661 void UpdateLastDelete(
bool setTime)
const;
662 void MarkAsInUse(
bool inuse,
const QString& usedFor =
"");
663 void UpdateInUseMark(
bool force =
false);
664 void SaveSeasonEpisode(
uint seas,
uint ep);
665 void SaveInetRef(
const QString &inet);
668 QString DiscoverRecordingDirectory(
void);
670 bool forceCheckLocal =
false);
674 bool QueryCutList(
frm_dir_map_t &delMap,
bool loadAutosave=
false)
const;
675 void SaveCutList(
frm_dir_map_t &delMap,
bool isAutoSave=
false)
const;
685 int64_t min_frame = -1, int64_t max_frame = -1)
const;
689 bool QueryKeyFrameInfo(uint64_t *result, uint64_t position_or_keyframe,
692 const char *from_filemarkup_desc,
693 const char *from_recordedseek_asc,
694 const char *from_recordedseek_desc)
const;
695 bool QueryKeyFramePosition(uint64_t *position, uint64_t keyframe,
696 bool backwards)
const;
697 bool QueryPositionKeyFrame(uint64_t *keyframe, uint64_t position,
698 bool backwards)
const;
699 bool QueryKeyFrameDuration(uint64_t *duration, uint64_t keyframe,
700 bool backwards)
const;
701 bool QueryDurationKeyFrame(uint64_t *keyframe, uint64_t duration,
702 bool backwards)
const;
708 uint64_t frame { 0 };
710 bool isDataNull {
true };
712 :
type(
t), frame(f), data(
d), isDataNull(n) {}
715 void QueryMarkup(QVector<MarkupEntry> &mapMark,
716 QVector<MarkupEntry> &mapSeek)
const;
717 void SaveMarkup(
const QVector<MarkupEntry> &mapMark,
718 const QVector<MarkupEntry> &mapSeek)
const;
721 void SendUpdateEvent(
void)
const;
723 void SendAddedEvent(
void)
const;
725 void SendDeletedEvent(
void)
const;
728 static QString i18n(
const QString &msg);
730 static QString MakeUniqueKey(
uint chanid,
const QDateTime &recstartts);
731 static bool ExtractKey(
const QString &uniquekey,
732 uint &chanid, QDateTime &recstartts);
733 static bool ExtractKeyFromPathname(
734 const QString &pathname,
uint &chanid, QDateTime &recstartts);
735 static bool QueryKeyFromPathname(
736 const QString &pathname,
uint &chanid, QDateTime &recstartts);
737 static bool QueryRecordedIdFromPathname(
const QString &pathname,
740 static QString QueryRecordingGroupPassword(
const QString &group);
741 static uint64_t QueryBookmark(
uint chanid,
const QDateTime &recstartts);
742 static QMap<QString,uint32_t> QueryInUseMap(
void);
743 static QMap<QString,bool> QueryJobsRunning(
int type);
747 void UpdateMarkTimeStamp(
bool bookmarked)
const;
748 void UpdateLastPlayTimeStamp(
bool lastplay)
const;
750 bool merge =
false)
const;
752 int64_t min_frame = -1, int64_t max_frame = -1)
const;
754 int64_t min_frame = -1, int64_t max_frame = -1)
const;
758 QString CreateRecordBasename(
const QString &ext)
const;
760 bool LoadProgramFromRecorded(
761 uint chanid,
const QDateTime &recstartts);
764 const QStringList::const_iterator& end);
766 static void QueryMarkupMap(
767 const QString &video_pathname,
769 static void QueryMarkupMap(
770 uint chanid,
const QDateTime &recstartts,
773 static int InitStatics(
void);
788 int32_t m_recPriority {0};
790 uint32_t m_chanId {0};
796 QString m_recGroup {
"Default"};
797 QString m_playGroup {
"Default"};
802 QString m_storageGroup {
"Default"};
809 uint64_t m_fileSize {0ULL};
812 QDateTime m_endTs {m_startTs};
813 QDateTime m_recStartTs {m_startTs};
814 QDateTime m_recEndTs {m_startTs};
816 float m_stars {0.0F};
818 QDateTime m_lastModified {m_startTs};
819 static constexpr int64_t kLastInUseOffset {4LL * 60 * 60};
820 QDateTime m_lastInUseTime {m_startTs.addSecs(-kLastInUseOffset)};
822 int32_t m_recPriority2 {0};
824 uint32_t m_recordId {0};
825 uint32_t m_parentId {0};
827 uint32_t m_sourceId {0};
828 uint32_t m_inputId {0};
829 uint32_t m_findId {0};
831 uint32_t m_programFlags {FL_NONE};
832 VideoPropsType m_videoProperties {VID_UNKNOWN};
833 AudioPropsType m_audioProperties {AUD_UNKNOWN};
834 SubtitlePropsType m_subtitleProperties {SUB_UNKNOWN};
850 int8_t m_recordedPercent {-1};
851 int8_t m_watchedPercent {-1};
857 int8_t m_spread {-1};
858 int8_t m_startCol {-1};
894 const QString &where,
895 const QString &groupBy,
896 const QString &orderBy,
918 uint chanid,
const QDateTime &starttime);
935 bool possiblyInProgressRecordingsOnly,
936 const QMap<QString,uint32_t> &inUseMap,
937 const QMap<QString,bool> &isJobRunning,
938 const QMap<QString, ProgramInfo*> &recMap,
940 const QString &sortBy =
"",
941 bool ignoreLiveTV =
false,
942 bool ignoreDeleted =
false);
944template<
typename TYPE>
948 const QString& altTable =
"",
952 hasConflicts =
false;
958 hasConflicts = slist[0].toInt();
960 QStringList::const_iterator sit = slist.cbegin()+2;
961 while (sit != slist.cend())
963 TYPE *
p =
new TYPE(sit, slist.cend());
966 if (!
p->HasPathname() && !
p->GetChanID())
974 if (destination.
size() != slist[1].toUInt())
986 bool dummyConflicts =
false;
993 bool *hasConflicts =
nullptr,
994 std::vector<ProgramInfo> *list =
nullptr);
1003 QMap<MarkTypes,frm_pos_map_t>
map;
QSqlQuery wrapper that fetches a DB connection from the connection pool.
QMap< MarkTypes, frm_pos_map_t > map
Holds information on recordings and videos.
float GetStars(void) const
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
uint GetRecordingRuleID(void) const
bool IsInUsePlaying(void) const
RecordingDupMethodType GetDuplicateCheckMethod(void) const
What should be compared to determine if two programs are the same?
QString GetBasename(void) const
void SetFlagging(bool flagging)
bool HasPathname(void) const
QString GetSeriesID(void) const
static bool s_usingProgIDAuth
uint GetVideoProperties(void) const
static ProgramInfoUpdater * s_updater
bool IsVideoFile(void) const
ProgramInfo(QStringList::const_iterator &it, const QStringList::const_iterator &end)
QString GetLastModifiedTime(MythDate::Format fmt) const
bool IsCommercialFlagged(void) const
bool IsDeletePending(void) const
bool IsAutoExpirable(void) const
bool IsPreserved(void) const
bool IsVideoDVD(void) const
void SetRecordingPriority2(int priority)
void SetIgnoreProgStart(bool ignore)
If "ignore" is true QueryProgStart() will return 0, otherwise QueryProgStart() will return the progst...
QDateTime m_previewUpdate
ProgramInfoType GetProgramInfoType(void) const
static const QString kFromRecordedQuery
void SetIgnoreBookmark(bool ignore)
If "ignore" is true GetBookmark() will return 0, otherwise GetBookmark() will return the bookmark pos...
uint GetEpisode(void) const
uint GetSubtitleType(void) const
QString GetProgramID(void) const
QString m_chanPlaybackFilters
QDateTime GetBookmarkUpdate(void) const
void SetEditing(bool editing)
QString GetRecordingGroup(void) const
virtual ~ProgramInfo()=default
void SetRecordingRuleType(RecordingType type)
ProgramInfo(const QStringList &list)
uint GetRecordingID(void) const
static const std::array< const QString, 5 > kCatName
ProgramInfo(void)
Null constructor.
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
QString GetChannelPlaybackFilters(void) const
QString GetInetRef(void) const
void ClearMarkupFlag(MarkTypes type) const
QString GetRecordingEndTime(MythDate::Format fmt) const
Approximate time the recording should have ended, did end, or is intended to end (with formatting).
uint GetWatchedPercent() const
void SetRecordingStatus(RecStatus::Type status)
void SetScheduledStartTime(const QDateTime &dt)
AvailableStatusType GetAvailableStatus(void) const
RecordingDupInType GetDuplicateCheckSource(void) const
Where should we check for duplicates?
bool HasCutlist(void) const
uint GetAudioProperties(void) const
bool IsRepeat(void) const
void SetIgnoreLastPlayPos(bool ignore)
If "ignore" is true QueryLastPlayPos() will return 0, otherwise QueryLastPlayPos() will return the la...
QString QueryInputDisplayName(void) const
QString GetSortSubtitle(void) const
void SetPlaybackGroup(const QString &group)
QString GetHostname(void) const
bool IsRecording(void) const
void SetRecordingGroup(const QString &group)
static QStringList LoadFromScheduler(const QString &tmptable, int recordid)
void SetCategory(const QString &cat)
static bool UsingProgramIDAuthority(void)
uint GetSourceID(void) const
bool IsBookmarkSet(void) const
QString GetSyndicatedEpisode(void) const
bool IsReactivated(void) const
QString GetPlaybackGroup(void) const
void SetScheduledEndTime(const QDateTime &dt)
QString GetDescription(void) const
QDateTime GetLastModifiedTime(void) const
QString GetStorageGroup(void) const
void SetPositionMapDBReplacement(PMapDBReplacement *pmap)
void SetRecordingStartTime(const QDateTime &dt)
QString GetScheduledStartTime(MythDate::Format fmt) const
The scheduled start time of program (with formatting).
QString GetChannelName(void) const
This is the channel name in the local market, i.e.
QString GetTitle(void) const
void SetHostname(const QString &host)
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
ProgramInfo(QString _title, QString _category, QDateTime _startts, QDateTime _endts)
Constructs a Dummy ProgramInfo (used by GuideGrid)
uint GetFindID(void) const
QString m_syndicatedEpisode
QString GetChanNum(void) const
This is the channel "number", in the form 1, 1_2, 1-2, 1#1, etc.
void SetChanID(uint _chanid)
void SetSourceID(uint id)
uint GetYearOfInitialRelease(void) const
bool IsCommercialFree(void) const
bool IsDuplicate(void) const
void SetRecordingRuleID(uint id)
void SetProgramInfoType(ProgramInfoType t)
QString MakeUniqueKey(void) const
Creates a unique string that can be used to identify an existing recording.
QString GetInputName(void) const
void SetWatchedPercent(uint progress)
QString GetSortTitle(void) const
void SetRecordedPercent(uint progress)
bool IsVideoBD(void) const
bool IsSameRecording(const ProgramInfo &other) const
uint GetStars(uint range_max) const
int GetRecordingPriority(void) const
QString GetPathname(void) const
QDate GetOriginalAirDate(void) const
uint GetInputID(void) const
CategoryType GetCategoryType(void) const
int GetRecordingPriority2(void) const
uint GetParentRecordingRuleID(void) const
void SetSeriesID(const QString &id)
TODO Move to RecordingInfo.
QString GetRecordingStartTime(MythDate::Format fmt) const
Approximate time the recording started (with formatting).
void ClearInputName(void)
void SetRecordingPriority(int priority)
bool IsWatched(void) const
bool IsPathSet(void) const
void SetRecordingEndTime(const QDateTime &dt)
void SetStorageGroup(const QString &group)
uint GetRecordedPercent() const
uint32_t GetProgramFlags(void) const
RecStatus::Type GetRecordingStatus(void) const
bool IsLastPlaySet(void) const
void SetReactivated(bool reactivate)
void SetCategoryType(const CategoryType type)
QDateTime m_bookmarkUpdate
QDateTime GetRecordingEndTime(void) const
Approximate time the recording should have ended, did end, or is intended to end.
QString GetSubtitle(void) const
QString GetScheduledEndTime(MythDate::Format fmt) const
The scheduled end time of the program (with formatting).
QString GetCategory(void) const
uint GetSeason(void) const
virtual void SetRecordingID(uint _recordedid)
void SetProgramID(const QString &id)
bool IsMythStream(void) const
RecordingType GetRecordingRuleType(void) const
uint GetEpisodeTotal(void) const
QString GetChannelSchedulingID(void) const
This is the unique programming identifier of a channel.
static QMutex s_staticDataLock
QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath)
static const iso6937table * d
Q_DECLARE_METATYPE(std::chrono::seconds)
static void clear(SettingsMap &cache, SettingsMap &overrides, const QString &myKey)
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
QHash< QString, QString > InfoMap
MBASE_PUBLIC QStringList ToStringList(const FileSystemInfoList &fsInfos)
MBASE_PUBLIC FileSystemInfoList FromStringList(const QStringList &list)
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
int pginfo_init_statics()
MTV_PUBLIC bool LoadFromRecorded(ProgramList &destination, bool possiblyInProgressRecordingsOnly, const QMap< QString, uint32_t > &inUseMap, const QMap< QString, bool > &isJobRunning, const QMap< QString, ProgramInfo * > &recMap, int sort=0, const QString &sortBy="", bool ignoreLiveTV=false, bool ignoreDeleted=false)
static constexpr int8_t NUMPROGRAMLINES
MTV_PUBLIC bool GetNextRecordingList(QDateTime &nextRecordingStart, bool *hasConflicts=nullptr, std::vector< ProgramInfo > *list=nullptr)
MTV_PUBLIC ProgramInfo::CategoryType string_to_myth_category_type(const QString &type)
MTV_PUBLIC bool LoadFromOldRecorded(ProgramList &destination, const QString &sql, const MSqlBindings &bindings)
MTV_PUBLIC ProgramInfo * LoadProgramFromProgram(uint chanid, const QDateTime &starttime)
MTV_PUBLIC bool LoadFromProgram(ProgramList &destination, const QString &where, const QString &groupBy, const QString &orderBy, const MSqlBindings &bindings, const ProgramList &schedList)
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
MTV_PUBLIC bool RemoteCheckFile(ProgramInfo *pginfo, bool checkSlaves=true)
MTV_PUBLIC QString myth_category_type_to_string(ProgramInfo::CategoryType category_type)
QMap< uint64_t, MarkTypes > frm_dir_map_t
Frame # -> Mark map.
@ kProgramInfoTypeVideoDVD
@ kProgramInfoTypeVideoFile
@ kProgramInfoTypeVideoBD
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
MarkupEntry(int t, uint64_t f, uint64_t d, bool n)
MarkupEntry(void)=default