3 #include "mythconfig.h"
6 #include "libavcodec/avcodec.h"
24 if (m_debugLevel >= 1)
25 LOG(VB_COMMFLAG, LOG_INFO,
26 QString(
"BorderDetector debugLevel %1").
arg(m_debugLevel));
33 m_timeReported =
false;
34 memset(&m_analyzeTime, 0,
sizeof(m_analyzeTime));
41 if ((m_logoFinder = finder) && (m_logo = m_logoFinder->getTemplate(
42 &m_logoRow, &m_logoCol, &m_logoWidth, &m_logoHeight)))
44 LOG(VB_COMMFLAG, LOG_INFO,
45 QString(
"BorderDetector::setLogoState: %1x%2@(%3,%4)")
46 .
arg(m_logoWidth).
arg(m_logoHeight).
arg(m_logoCol).
arg(m_logoRow));
52 long long _frameno,
int *prow,
int *pcol,
int *pwidth,
int *pheight)
85 static constexpr
unsigned char kMaxRange = 32;
92 static constexpr
int kMaxLines = 2;
94 const int pgmwidth = pgm->linesize[0];
101 const int MAXOUTLIERS = pgmwidth * 12 / 1000;
107 const int VERTMARGIN = std::max(2, pgmheight * 1 / 60);
108 const int HORIZMARGIN = std::max(2, pgmwidth * 1 / 80);
115 const int VERTSLOP = std::max(kMaxLines, pgmheight * 1 / 120);
116 const int HORIZSLOP = std::max(kMaxLines, pgmwidth * 1 / 160);
118 int minrow = VERTMARGIN;
119 int mincol = HORIZMARGIN;
120 int maxrow1 = pgmheight - VERTMARGIN;
121 int maxcol1 = pgmwidth - HORIZMARGIN;
122 int newrow = minrow - 1;
123 int newcol = mincol - 1;
124 int newwidth = maxcol1 + 1 - mincol;
125 int newheight = maxrow1 + 1 - minrow;
129 auto start = nowAsDuration<std::chrono::microseconds>();
131 if (_frameno != kUncached && _frameno == m_frameNo)
138 uchar minval = UCHAR_MAX;
142 for (
int cc = mincol;
cc < maxcol1;
cc++)
146 for (
int rr = minrow; rr < maxrow1; rr++)
149 m_logoWidth, m_logoHeight))
152 uchar val = pgm->data[0][rr * pgmwidth +
cc];
153 int range = std::max(maxval, val) - std::min(minval, val) + 1;
154 if (range > kMaxRange)
156 if (outliers++ < MAXOUTLIERS)
159 if (lines++ < kMaxLines)
175 if (newcol != saved + 1 + HORIZSLOP)
177 newcol = std::min(maxcol1, saved + 1 + HORIZSLOP);
178 newwidth = std::max(0, maxcol1 - newcol);
183 goto monochromatic_frame;
194 for (
int cc = maxcol1 - 1;
cc >= mincol;
cc--)
198 for (
int rr = minrow; rr < maxrow1; rr++)
201 m_logoWidth, m_logoHeight))
204 uchar val = pgm->data[0][rr * pgmwidth +
cc];
205 int range = std::max(maxval, val) - std::min(minval, val) + 1;
206 if (range > kMaxRange)
208 if (outliers++ < MAXOUTLIERS)
211 if (lines++ < kMaxLines)
227 if (newwidth != saved - mincol - HORIZSLOP)
229 newwidth = std::max(0, saved - mincol - HORIZSLOP);
234 goto monochromatic_frame;
239 maxcol1 = mincol + newwidth;
247 for (
int rr = minrow; rr < maxrow1; rr++)
251 for (
int cc = mincol;
cc < maxcol1;
cc++)
254 m_logoWidth, m_logoHeight))
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)
280 if (newrow != saved + 1 + VERTSLOP)
282 newrow = std::min(maxrow1, saved + 1 + VERTSLOP);
283 newheight = std::max(0, maxrow1 - newrow);
288 goto monochromatic_frame;
296 for (
int rr = maxrow1 - 1; rr >= minrow; rr--)
300 for (
int cc = mincol;
cc < maxcol1;
cc++)
303 m_logoWidth, m_logoHeight))
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)
329 if (newheight != saved - minrow - VERTSLOP)
331 newheight = std::max(0, saved - minrow - VERTSLOP);
336 goto monochromatic_frame;
341 maxrow1 = minrow + newheight;
344 m_frameNo = _frameno;
348 m_height = newheight;
349 m_isMonochromatic =
false;
353 m_frameNo = _frameno;
357 m_height = newheight;
358 m_isMonochromatic =
true;
366 auto end = nowAsDuration<std::chrono::microseconds>();
367 m_analyzeTime += (end - start);
369 return m_isMonochromatic ? -1 : 0;
377 LOG(VB_COMMFLAG, LOG_INFO, QString(
"BD Time: analyze=%1s")
379 m_timeReported =
true;