MythTV master
TemplateFinder.h
Go to the documentation of this file.
1/*
2 * TemplateFinder
3 *
4 * Attempt to infer the existence of a static template across a series of
5 * images by looking for stable edges. Some ideas are taken from
6 * http://thomashargrove.com/logo-detection/
7 *
8 * By operating on the edges of images rather than the image data itself, both
9 * opaque and transparent templates are robustly located (if they exist).
10 * Hopefully the "core" portion of animated templates is sufficiently large and
11 * stable enough for animated templates to also be discovered.
12 *
13 * This TemplateFinder only expects to successfully discover non- or
14 * minimally-moving templates. Templates that change position during the
15 * sequence of images will cause this algorithm to fail.
16 */
17
18#ifndef TEMPLATEFINDER_H
19#define TEMPLATEFINDER_H
20
21extern "C" {
22#include "libavcodec/avcodec.h" /* AVFrame */
23}
24#include "FrameAnalyzer.h"
25
26class PGMConverter;
27class BorderDetector;
28class EdgeDetector;
29
31{
32public:
33 /* Ctor/dtor. */
34 TemplateFinder(std::shared_ptr<PGMConverter> pgmc,
35 std::shared_ptr<BorderDetector> bd,
36 std::shared_ptr<EdgeDetector> ed,
37 MythPlayer *player, std::chrono::seconds proglen,
38 const QString& debugdir);
39 TemplateFinder(std::shared_ptr<PGMConverter> pgmc,
40 std::shared_ptr<BorderDetector> bd,
41 std::shared_ptr<EdgeDetector> ed,
42 MythPlayer *player, int proglen, const QString& debugdir) :
43 TemplateFinder(std::move(pgmc), std::move(bd), std::move(ed),
44 player, std::chrono::seconds(proglen), debugdir) {};
45 ~TemplateFinder(void) override;
46
47 /* FrameAnalyzer interface. */
48 const char *name(void) const override // FrameAnalyzer
49 { return "TemplateFinder"; }
51 long long nframes) override; // FrameAnalyzer
53 long long frameno, long long *pNextFrame) override; // FrameAnalyzer
54 int finished(long long nframes, bool final) override; // FrameAnalyzer
55 int reportTime(void) const override; // FrameAnalyzer
56 FrameMap GetMap(unsigned int /*index*/) const override // FrameAnalyzer
57 { FrameMap map; return map; }
58
59 /* TemplateFinder implementation. */
60 const struct AVFrame *getTemplate(int *prow, int *pcol,
61 int *pwidth, int *pheight) const;
62
63private:
64 int resetBuffers(int newwidth, int newheight);
65
66 std::shared_ptr<PGMConverter> m_pgmConverter {nullptr};
67 std::shared_ptr<BorderDetector> m_borderDetector {nullptr};
68 std::shared_ptr<EdgeDetector> m_edgeDetector {nullptr};
69
70 std::chrono::seconds m_sampleTime {20min}; /* amount of time to analyze */
71 int m_frameInterval; /* analyze every <Interval> frames */
72 long long m_endFrame {0}; /* end of logo detection */
73 long long m_nextFrame {0}; /* next desired frame */
74
75 ssize_t m_width {-1}; /* dimensions of frames */
76 ssize_t m_height {-1}; /* dimensions of frames */
77 unsigned int *m_scores {nullptr}; /* pixel "edge" scores */
78
79 int m_minContentRow {INT_MAX}; /* limits of content area of images */
80 int m_minContentCol {INT_MAX};
81 int m_maxContentRow1 {INT_MIN}; /* minrow + height ("maxrow + 1") */
82 int m_maxContentCol1 {INT_MIN}; /* mincol + width ("maxcol + 1") */
83
84 AVFrame m_tmpl {}; /* logo-matching template */
85 int m_tmplRow {-1};
86 int m_tmplCol {-1};
87 int m_tmplWidth {-1};
88 int m_tmplHeight {-1};
89
90 AVFrame m_cropped {}; /* cropped version of frame */
91 int m_cwidth {-1}; /* cropped width */
92 int m_cheight {-1}; /* cropped height */
93
94 /* Debugging. */
95 int m_debugLevel {0};
96 QString m_debugDir;
97 QString m_debugData; /* filename: template location */
98 QString m_debugTmpl; /* filename: logo template */
99 bool m_debugTemplate {false};
100 bool m_debugEdgeCounts {false};
101 bool m_debugFrames {false};
102 bool m_tmplValid {false};
103 bool m_tmplDone {false};
104 std::chrono::microseconds m_analyzeTime {0us};
105};
106
107#endif /* !TEMPLATEFINDER_H */
108
109/* vim: set expandtab tabstop=4 shiftwidth=4: */
AVFrame AVFrame
QMap< long long, long long > FrameMap
Definition: FrameAnalyzer.h:45
std::shared_ptr< BorderDetector > m_borderDetector
const char * name(void) const override
unsigned int * m_scores
QString m_debugTmpl
FrameMap GetMap(unsigned int) const override
std::chrono::microseconds m_analyzeTime
enum analyzeFrameResult analyzeFrame(const MythVideoFrame *frame, long long frameno, long long *pNextFrame) override
QString m_debugData
enum analyzeFrameResult MythPlayerInited(MythPlayer *player, long long nframes) override
TemplateFinder(std::shared_ptr< PGMConverter > pgmc, std::shared_ptr< BorderDetector > bd, std::shared_ptr< EdgeDetector > ed, MythPlayer *player, std::chrono::seconds proglen, const QString &debugdir)
TemplateFinder(std::shared_ptr< PGMConverter > pgmc, std::shared_ptr< BorderDetector > bd, std::shared_ptr< EdgeDetector > ed, MythPlayer *player, int proglen, const QString &debugdir)
int reportTime(void) const override
~TemplateFinder(void) override
std::shared_ptr< PGMConverter > m_pgmConverter
const struct AVFrame * getTemplate(int *prow, int *pcol, int *pwidth, int *pheight) const
std::shared_ptr< EdgeDetector > m_edgeDetector
std::chrono::seconds m_sampleTime
int resetBuffers(int newwidth, int newheight)
long long m_endFrame
QString m_debugDir
long long m_nextFrame
int finished(long long nframes, bool final) override
STL namespace.