/
ClassicCommDetector.h
192 lines (158 loc) · 6.21 KB
/
ClassicCommDetector.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#ifndef CLASSIC_COMMDETECTOR_H
#define CLASSIC_COMMDETECTOR_H
// C++ headers
#include <cstdint>
// Qt headers
#include <QObject>
#include <QMap>
#include <QDateTime>
// MythTV headers
#include "programinfo.h"
#include "mythframe.h"
// Commercial Flagging headers
#include "CommDetectorBase.h"
class MythCommFlagPlayer;
class LogoDetectorBase;
class SceneChangeDetectorBase;
enum frameMaskValues {
COMM_FRAME_SKIPPED = 0x0001,
COMM_FRAME_BLANK = 0x0002,
COMM_FRAME_SCENE_CHANGE = 0x0004,
COMM_FRAME_LOGO_PRESENT = 0x0008,
COMM_FRAME_ASPECT_CHANGE = 0x0010,
COMM_FRAME_RATING_SYMBOL = 0x0020
};
class FrameInfoEntry
{
public:
int minBrightness;
int maxBrightness;
int avgBrightness;
int sceneChangePercent;
int aspect;
int format;
int flagMask;
static QString GetHeader(void);
QString toString(uint64_t frame, bool verbose) const;
};
class ClassicCommDetector : public CommDetectorBase
{
Q_OBJECT
public:
ClassicCommDetector(SkipType commDetectMethod, bool showProgress,
bool fullSpeed, MythCommFlagPlayer* player,
QDateTime startedAt_in,
QDateTime stopsAt_in,
QDateTime recordingStartedAt_in,
QDateTime recordingStopsAt_in);
virtual void deleteLater(void);
bool go() override; // CommDetectorBase
void GetCommercialBreakList(frm_dir_map_t &marks) override; // CommDetectorBase
void recordingFinished(long long totalFileSize) override; // CommDetectorBase
void requestCommBreakMapUpdate(void) override; // CommDetectorBase
void PrintFullMap(
std::ostream &out, const frm_dir_map_t *comm_breaks,
bool verbose) const override; // CommDetectorBase
void logoDetectorBreathe();
friend class ClassicLogoDetector;
protected:
~ClassicCommDetector() override = default;
private:
struct FrameBlock
{
long start;
long end;
long frames;
double length;
int bfCount;
int logoCount;
int ratingCount;
int scCount;
double scRate;
int formatMatch;
int aspectMatch;
int score;
};
void ClearAllMaps(void);
void GetBlankCommMap(frm_dir_map_t &comms);
void GetBlankCommBreakMap(frm_dir_map_t &comms);
void GetSceneChangeMap(frm_dir_map_t &scenes,
int64_t start_frame);
frm_dir_map_t Combine2Maps(
const frm_dir_map_t &a, const frm_dir_map_t &b) const;
static void UpdateFrameBlock(FrameBlock *fbp, FrameInfoEntry finfo,
int format, int aspect);
void BuildAllMethodsCommList(void);
void BuildBlankFrameCommList(void);
void BuildSceneChangeCommList(void);
void BuildLogoCommList();
void MergeBlankCommList(void);
bool FrameIsInBreakMap(uint64_t f, const frm_dir_map_t &breakMap) const;
void DumpMap(frm_dir_map_t &map) const;
static void CondenseMarkMap(show_map_t &map, int spacing, int length);
static void ConvertShowMapToCommMap(
frm_dir_map_t &out, const show_map_t &in);
void CleanupFrameInfo(void);
void GetLogoCommBreakMap(show_map_t &map);
SkipType m_commDetectMethod;
frm_dir_map_t m_lastSentCommBreakMap;
bool m_commBreakMapUpdateRequested {false};
bool m_sendCommBreakMapUpdates {false};
int m_commDetectBorder {0};
int m_commDetectBlankFrameMaxDiff {25};
int m_commDetectDarkBrightness {80};
int m_commDetectDimBrightness {120};
int m_commDetectBoxBrightness {30};
int m_commDetectDimAverage {35};
int m_commDetectMaxCommBreakLength {395};
int m_commDetectMinCommBreakLength {60};
int m_commDetectMinShowLength {65};
int m_commDetectMaxCommLength {125};
bool m_commDetectBlankCanHaveLogo {true};
bool m_verboseDebugging {false};
long long m_lastFrameNumber {0};
long long m_curFrameNumber {0};
int m_width {0};
int m_height {0};
int m_horizSpacing {0};
int m_vertSpacing {0};
bool m_blankFramesOnly {false};
int m_blankFrameCount {0};
int m_currentAspect {0};
int m_totalMinBrightness {0};
bool m_logoInfoAvailable {false};
LogoDetectorBase* m_logoDetector {nullptr};
frm_dir_map_t m_blankFrameMap;
frm_dir_map_t m_blankCommMap;
frm_dir_map_t m_blankCommBreakMap;
frm_dir_map_t m_sceneMap;
frm_dir_map_t m_sceneCommBreakMap;
frm_dir_map_t m_commBreakMap;
frm_dir_map_t m_logoCommBreakMap;
bool m_frameIsBlank {false};
bool m_stationLogoPresent {false};
bool m_decoderFoundAspectChanges {false};
SceneChangeDetectorBase* m_sceneChangeDetector {nullptr};
protected:
MythCommFlagPlayer *m_player {nullptr};
QDateTime m_startedAt;
QDateTime m_stopsAt;
QDateTime m_recordingStartedAt;
QDateTime m_recordingStopsAt;
bool m_aggressiveDetection {false};
bool m_stillRecording {false};
bool m_fullSpeed {false};
bool m_showProgress {false};
double m_fps {0.0};
uint64_t m_framesProcessed {0};
long long m_preRoll {0};
long long m_postRoll {0};
void Init();
void SetVideoParams(float aspect);
void ProcessFrame(VideoFrame *frame, long long frame_number);
QMap<long long, FrameInfoEntry> m_frameInfo;
public slots:
void sceneChangeDetectorHasNewInformation(unsigned int framenum, bool isSceneChange,float debugValue);
};
#endif // CLASSIC_COMMDETECTOR_H
/* vim: set expandtab tabstop=4 shiftwidth=4: */