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 m_logoFinder = finder;
44 if (m_logoFinder ==
nullptr)
46 m_logo = m_logoFinder->
getTemplate(&m_logoRow, &m_logoCol,
47 &m_logoWidth, &m_logoHeight);
48 if (m_logo ==
nullptr)
50 LOG(VB_COMMFLAG, LOG_INFO,
51 QString(
"BorderDetector::setLogoState: %1x%2@(%3,%4)")
52 .arg(m_logoWidth).arg(m_logoHeight).arg(m_logoCol).arg(m_logoRow));
57 long long _frameno,
int *prow,
int *pcol,
int *pwidth,
int *pheight)
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;
134 auto start = nowAsDuration<std::chrono::microseconds>();
136 if (_frameno != kUncached && _frameno == m_frameNo)
143 uchar minval = UCHAR_MAX;
147 for (
int cc = mincol;
cc < maxcol1;
cc++)
151 for (
int rr = minrow; rr < maxrow1; rr++)
154 m_logoWidth, m_logoHeight))
157 uchar val = pgm->data[0][rr * pgmwidth +
cc];
158 int range = std::max(maxval, val) - std::min(minval, val) + 1;
159 if (range > kMaxRange)
161 if (outliers++ < MAXOUTLIERS)
164 if (lines++ < kMaxLines)
180 if (newcol != saved + 1 + HORIZSLOP)
182 newcol = std::min(maxcol1, saved + 1 + HORIZSLOP);
183 newwidth = std::max(0, maxcol1 - newcol);
188 goto monochromatic_frame;
199 for (
int cc = maxcol1 - 1;
cc >= mincol;
cc--)
203 for (
int rr = minrow; rr < maxrow1; rr++)
206 m_logoWidth, m_logoHeight))
209 uchar val = pgm->data[0][rr * pgmwidth +
cc];
210 int range = std::max(maxval, val) - std::min(minval, val) + 1;
211 if (range > kMaxRange)
213 if (outliers++ < MAXOUTLIERS)
216 if (lines++ < kMaxLines)
232 if (newwidth != saved - mincol - HORIZSLOP)
234 newwidth = std::max(0, saved - mincol - HORIZSLOP);
239 goto monochromatic_frame;
244 maxcol1 = mincol + newwidth;
252 for (
int rr = minrow; rr < maxrow1; rr++)
256 for (
int cc = mincol;
cc < maxcol1;
cc++)
259 m_logoWidth, m_logoHeight))
262 uchar val = pgm->data[0][rr * pgmwidth +
cc];
263 int range = std::max(maxval, val) - std::min(minval, val) + 1;
264 if (range > kMaxRange)
266 if (outliers++ < MAXOUTLIERS)
269 if (lines++ < kMaxLines)
285 if (newrow != saved + 1 + VERTSLOP)
287 newrow = std::min(maxrow1, saved + 1 + VERTSLOP);
288 newheight = std::max(0, maxrow1 - newrow);
293 goto monochromatic_frame;
301 for (
int rr = maxrow1 - 1; rr >= minrow; rr--)
305 for (
int cc = mincol;
cc < maxcol1;
cc++)
308 m_logoWidth, m_logoHeight))
311 uchar val = pgm->data[0][rr * pgmwidth +
cc];
312 int range = std::max(maxval, val) - std::min(minval, val) + 1;
313 if (range > kMaxRange)
315 if (outliers++ < MAXOUTLIERS)
318 if (lines++ < kMaxLines)
334 if (newheight != saved - minrow - VERTSLOP)
336 newheight = std::max(0, saved - minrow - VERTSLOP);
341 goto monochromatic_frame;
346 maxrow1 = minrow + newheight;
349 m_frameNo = _frameno;
353 m_height = newheight;
354 m_isMonochromatic =
false;
358 m_frameNo = _frameno;
362 m_height = newheight;
363 m_isMonochromatic =
true;
371 auto end = nowAsDuration<std::chrono::microseconds>();
372 m_analyzeTime += (end - start);
374 return m_isMonochromatic ? -1 : 0;
382 LOG(VB_COMMFLAG, LOG_INFO, QString(
"BD Time: analyze=%1s")
384 m_timeReported =
true;