5#include "libavcodec/avcodec.h"
28 LOG(VB_COMMFLAG, LOG_INFO,
29 QString(
"BorderDetector debugLevel %1").arg(
m_debugLevel));
50 LOG(VB_COMMFLAG, LOG_INFO,
51 QString(
"BorderDetector::setLogoState: %1x%2@(%3,%4)")
90 static constexpr unsigned char kMaxRange = 32;
97 static constexpr int kMaxLines = 2;
99 const int pgmwidth = pgm->linesize[0];
106 const int MAXOUTLIERS = pgmwidth * 12 / 1000;
112 const int VERTMARGIN = std::max(2, pgmheight * 1 / 60);
113 const int HORIZMARGIN = std::max(2, pgmwidth * 1 / 80);
120 const int VERTSLOP = std::max(kMaxLines, pgmheight * 1 / 120);
121 const int HORIZSLOP = std::max(kMaxLines, pgmwidth * 1 / 160);
123 int minrow = VERTMARGIN;
124 int mincol = HORIZMARGIN;
125 int maxrow1 = pgmheight - VERTMARGIN;
126 int maxcol1 = pgmwidth - HORIZMARGIN;
127 int newrow = minrow - 1;
128 int newcol = mincol - 1;
129 int newwidth = maxcol1 + 1 - mincol;
130 int newheight = maxrow1 + 1 - minrow;
133 bool monochromatic =
false;
141 uchar minval = UCHAR_MAX;
146 for (
int cc = mincol; !found && cc < maxcol1; cc++)
150 for (
int rr = minrow; rr < maxrow1; rr++)
156 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
157 int range = std::max(maxval, val) - std::min(minval, val) + 1;
158 if (range > kMaxRange)
160 if (outliers++ < MAXOUTLIERS)
163 if (lines++ >= kMaxLines)
167 minval = std::min(val, minval);
168 maxval = std::max(val, maxval);
176 if (newcol != saved + 1 + HORIZSLOP)
178 newcol = std::min(maxcol1, saved + 1 + HORIZSLOP);
179 newwidth = std::max(0, maxcol1 - newcol);
184 throw "monochromatic";
196 for (
int cc = maxcol1 - 1; !found && cc >= mincol; cc--)
200 for (
int rr = minrow; rr < maxrow1; rr++)
206 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
207 int range = std::max(maxval, val) - std::min(minval, val) + 1;
208 if (range > kMaxRange)
210 if (outliers++ < MAXOUTLIERS)
213 if (lines++ >= kMaxLines)
217 minval = std::min(val, minval);
218 maxval = std::max(val, maxval);
226 if (newwidth != saved - mincol - HORIZSLOP)
228 newwidth = std::max(0, saved - mincol - HORIZSLOP);
233 throw "monochromatic";
238 maxcol1 = mincol + newwidth;
247 for (
int rr = minrow; !found && rr < maxrow1; rr++)
251 for (
int cc = mincol; cc < maxcol1; cc++)
257 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
258 int range = std::max(maxval, val) - std::min(minval, val) + 1;
259 if (range > kMaxRange)
261 if (outliers++ < MAXOUTLIERS)
264 if (lines++ >= kMaxLines)
268 minval = std::min(val, minval);
269 maxval = std::max(val, maxval);
277 if (newrow != saved + 1 + VERTSLOP)
279 newrow = std::min(maxrow1, saved + 1 + VERTSLOP);
280 newheight = std::max(0, maxrow1 - newrow);
285 throw "monochromatic";
294 for (
int rr = maxrow1 - 1; !found && rr >= minrow; rr--)
298 for (
int cc = mincol; cc < maxcol1; cc++)
304 uchar val = pgm->data[0][(rr * pgmwidth) + cc];
305 int range = std::max(maxval, val) - std::min(minval, val) + 1;
306 if (range > kMaxRange)
308 if (outliers++ < MAXOUTLIERS)
311 if (lines++ >= kMaxLines)
315 minval = std::min(val, minval);
316 maxval = std::max(val, maxval);
324 if (newheight != saved - minrow - VERTSLOP)
326 newheight = std::max(0, saved - minrow - VERTSLOP);
331 throw "monochromatic";
336 maxrow1 = minrow + newheight;
339 catch (
char const* e)
341 monochromatic =
true;
354 long long _frameno,
int *prow,
int *pcol,
int *pwidth,
int *pheight)
356 auto start = nowAsDuration<std::chrono::microseconds>();
366 auto end = nowAsDuration<std::chrono::microseconds>();
377 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)