4#include "libmythbase/mythconfig.h"
7#include "libavcodec/avcodec.h"
30 LOG(VB_COMMFLAG, LOG_INFO,
31 QString(
"BorderDetector debugLevel %1").arg(
m_debugLevel));
52 LOG(VB_COMMFLAG, LOG_INFO,
53 QString(
"BorderDetector::setLogoState: %1x%2@(%3,%4)")
92 static constexpr unsigned char kMaxRange = 32;
99 static constexpr int kMaxLines = 2;
101 const int pgmwidth = pgm->linesize[0];
108 const int MAXOUTLIERS = pgmwidth * 12 / 1000;
114 const int VERTMARGIN = std::max(2, pgmheight * 1 / 60);
115 const int HORIZMARGIN = std::max(2, pgmwidth * 1 / 80);
122 const int VERTSLOP = std::max(kMaxLines, pgmheight * 1 / 120);
123 const int HORIZSLOP = std::max(kMaxLines, pgmwidth * 1 / 160);
125 int minrow = VERTMARGIN;
126 int mincol = HORIZMARGIN;
127 int maxrow1 = pgmheight - VERTMARGIN;
128 int maxcol1 = pgmwidth - HORIZMARGIN;
129 int newrow = minrow - 1;
130 int newcol = mincol - 1;
131 int newwidth = maxcol1 + 1 - mincol;
132 int newheight = maxrow1 + 1 - minrow;
135 bool monochromatic =
false;
143 uchar minval = UCHAR_MAX;
148 for (
int cc = mincol; !found && cc < maxcol1; cc++)
152 for (
int rr = minrow; rr < maxrow1; rr++)
158 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
159 int range = std::max(maxval, val) - std::min(minval, val) + 1;
160 if (range > kMaxRange)
162 if (outliers++ < MAXOUTLIERS)
165 if (lines++ >= kMaxLines)
169 minval = std::min(val, minval);
170 maxval = std::max(val, maxval);
178 if (newcol != saved + 1 + HORIZSLOP)
180 newcol = std::min(maxcol1, saved + 1 + HORIZSLOP);
181 newwidth = std::max(0, maxcol1 - newcol);
186 throw "monochromatic";
198 for (
int cc = maxcol1 - 1; !found && cc >= mincol; cc--)
202 for (
int rr = minrow; rr < maxrow1; rr++)
208 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
209 int range = std::max(maxval, val) - std::min(minval, val) + 1;
210 if (range > kMaxRange)
212 if (outliers++ < MAXOUTLIERS)
215 if (lines++ >= kMaxLines)
219 minval = std::min(val, minval);
220 maxval = std::max(val, maxval);
228 if (newwidth != saved - mincol - HORIZSLOP)
230 newwidth = std::max(0, saved - mincol - HORIZSLOP);
235 throw "monochromatic";
240 maxcol1 = mincol + newwidth;
249 for (
int rr = minrow; !found && rr < maxrow1; rr++)
253 for (
int cc = mincol; cc < maxcol1; cc++)
259 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
260 int range = std::max(maxval, val) - std::min(minval, val) + 1;
261 if (range > kMaxRange)
263 if (outliers++ < MAXOUTLIERS)
266 if (lines++ >= kMaxLines)
270 minval = std::min(val, minval);
271 maxval = std::max(val, maxval);
279 if (newrow != saved + 1 + VERTSLOP)
281 newrow = std::min(maxrow1, saved + 1 + VERTSLOP);
282 newheight = std::max(0, maxrow1 - newrow);
287 throw "monochromatic";
296 for (
int rr = maxrow1 - 1; !found && rr >= minrow; rr--)
300 for (
int cc = mincol; cc < maxcol1; cc++)
306 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
307 int range = std::max(maxval, val) - std::min(minval, val) + 1;
308 if (range > kMaxRange)
310 if (outliers++ < MAXOUTLIERS)
313 if (lines++ >= kMaxLines)
317 minval = std::min(val, minval);
318 maxval = std::max(val, maxval);
326 if (newheight != saved - minrow - VERTSLOP)
328 newheight = std::max(0, saved - minrow - VERTSLOP);
333 throw "monochromatic";
338 maxrow1 = minrow + newheight;
341 catch (
char const* e)
343 monochromatic =
true;
356 long long _frameno,
int *prow,
int *pcol,
int *pwidth,
int *pheight)
358 auto start = nowAsDuration<std::chrono::microseconds>();
368 auto end = nowAsDuration<std::chrono::microseconds>();
379 LOG(VB_COMMFLAG, LOG_INFO, QString(
"BD Time: analyze=%1s")
std::chrono::microseconds m_analyzeTime
int getDimensions(const AVFrame *pgm, int pgmheight, long long frameno, int *prow, int *pcol, int *pwidth, int *pheight)
void getDimensionsReal(const AVFrame *pgm, int pgmheight, long long frameno)
static const long long kUncached
TemplateFinder * m_logoFinder
void setLogoState(TemplateFinder *finder)
int MythPlayerInited(const MythPlayer *player)
const struct AVFrame * m_logo
int GetNumSetting(const QString &key, int defaultval=0)
const struct AVFrame * getTemplate(int *prow, int *pcol, int *pwidth, int *pheight) const
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QString strftimeval(std::chrono::microseconds usecs)
bool rrccinrect(int rr, int cc, int rrow, int rcol, int rwidth, int rheight)