3 #include "libmythbase/mythconfig.h"
6 #include "libavcodec/avcodec.h"
27 if (m_debugLevel >= 1)
28 LOG(VB_COMMFLAG, LOG_INFO,
29 QString(
"BorderDetector debugLevel %1").arg(m_debugLevel));
35 m_timeReported =
false;
36 memset(&m_analyzeTime, 0,
sizeof(m_analyzeTime));
43 if ((m_logoFinder = finder) && (m_logo = m_logoFinder->getTemplate(
44 &m_logoRow, &m_logoCol, &m_logoWidth, &m_logoHeight)))
46 LOG(VB_COMMFLAG, LOG_INFO,
47 QString(
"BorderDetector::setLogoState: %1x%2@(%3,%4)")
48 .arg(m_logoWidth).arg(m_logoHeight).arg(m_logoCol).arg(m_logoRow));
54 long long _frameno,
int *prow,
int *pcol,
int *pwidth,
int *pheight)
87 static constexpr
unsigned char kMaxRange = 32;
94 static constexpr
int kMaxLines = 2;
96 const int pgmwidth = pgm->linesize[0];
103 const int MAXOUTLIERS = pgmwidth * 12 / 1000;
109 const int VERTMARGIN = std::max(2, pgmheight * 1 / 60);
110 const int HORIZMARGIN = std::max(2, pgmwidth * 1 / 80);
117 const int VERTSLOP = std::max(kMaxLines, pgmheight * 1 / 120);
118 const int HORIZSLOP = std::max(kMaxLines, pgmwidth * 1 / 160);
120 int minrow = VERTMARGIN;
121 int mincol = HORIZMARGIN;
122 int maxrow1 = pgmheight - VERTMARGIN;
123 int maxcol1 = pgmwidth - HORIZMARGIN;
124 int newrow = minrow - 1;
125 int newcol = mincol - 1;
126 int newwidth = maxcol1 + 1 - mincol;
127 int newheight = maxrow1 + 1 - minrow;
131 auto start = nowAsDuration<std::chrono::microseconds>();
133 if (_frameno != kUncached && _frameno == m_frameNo)
140 uchar minval = UCHAR_MAX;
144 for (
int cc = mincol;
cc < maxcol1;
cc++)
148 for (
int rr = minrow; rr < maxrow1; rr++)
151 m_logoWidth, m_logoHeight))
154 uchar val = pgm->data[0][rr * pgmwidth +
cc];
155 int range = std::max(maxval, val) - std::min(minval, val) + 1;
156 if (range > kMaxRange)
158 if (outliers++ < MAXOUTLIERS)
161 if (lines++ < kMaxLines)
177 if (newcol != saved + 1 + HORIZSLOP)
179 newcol = std::min(maxcol1, saved + 1 + HORIZSLOP);
180 newwidth = std::max(0, maxcol1 - newcol);
185 goto monochromatic_frame;
196 for (
int cc = maxcol1 - 1;
cc >= mincol;
cc--)
200 for (
int rr = minrow; rr < maxrow1; rr++)
203 m_logoWidth, m_logoHeight))
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)
229 if (newwidth != saved - mincol - HORIZSLOP)
231 newwidth = std::max(0, saved - mincol - HORIZSLOP);
236 goto monochromatic_frame;
241 maxcol1 = mincol + newwidth;
249 for (
int rr = minrow; rr < maxrow1; rr++)
253 for (
int cc = mincol;
cc < maxcol1;
cc++)
256 m_logoWidth, m_logoHeight))
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)
282 if (newrow != saved + 1 + VERTSLOP)
284 newrow = std::min(maxrow1, saved + 1 + VERTSLOP);
285 newheight = std::max(0, maxrow1 - newrow);
290 goto monochromatic_frame;
298 for (
int rr = maxrow1 - 1; rr >= minrow; rr--)
302 for (
int cc = mincol;
cc < maxcol1;
cc++)
305 m_logoWidth, m_logoHeight))
308 uchar val = pgm->data[0][rr * pgmwidth +
cc];
309 int range = std::max(maxval, val) - std::min(minval, val) + 1;
310 if (range > kMaxRange)
312 if (outliers++ < MAXOUTLIERS)
315 if (lines++ < kMaxLines)
331 if (newheight != saved - minrow - VERTSLOP)
333 newheight = std::max(0, saved - minrow - VERTSLOP);
338 goto monochromatic_frame;
343 maxrow1 = minrow + newheight;
346 m_frameNo = _frameno;
350 m_height = newheight;
351 m_isMonochromatic =
false;
355 m_frameNo = _frameno;
359 m_height = newheight;
360 m_isMonochromatic =
true;
368 auto end = nowAsDuration<std::chrono::microseconds>();
369 m_analyzeTime += (end - start);
371 return m_isMonochromatic ? -1 : 0;
379 LOG(VB_COMMFLAG, LOG_INFO, QString(
"BD Time: analyze=%1s")
381 m_timeReported =
true;