MythTV master
HistogramAnalyzer.h
Go to the documentation of this file.
1/*
2 * HistogramAnalyzer
3 *
4 * Detect frame-to-frame changes in histograms.
5 */
6
7#ifndef HISTOGRAMANALYZER_H
8#define HISTOGRAMANALYZER_H
9
10#include "FrameAnalyzer.h"
11
12class PGMConverter;
13class BorderDetector;
14class TemplateFinder;
15
17{
18public:
19 /* Ctor/dtor. */
20 HistogramAnalyzer(std::shared_ptr<PGMConverter> pgmc,
21 std::shared_ptr<BorderDetector> bd,
22 const QString& debugdir);
24
26 MythPlayer *player, long long nframes);
27 void setLogoState(TemplateFinder *finder);
28 static const long long kUncached = -1;
30 long long frameno);
31 int finished(long long nframes, bool final);
32 int reportTime(void) const;
33
34 /* Each color 0-255 gets a scaled frequency counter 0-255. */
35 using Histogram = std::array<uint8_t,UCHAR_MAX+1>;
36
37 const float *getMeans(void) const { return m_mean; }
38 const unsigned char *getMedians(void) const { return m_median; }
39 const float *getStdDevs(void) const { return m_stddev; }
40 const Histogram *getHistograms(void) const { return m_histogram; }
41 const unsigned char *getMonochromatics(void) const { return m_monochromatic; }
42
43private:
44 std::shared_ptr<PGMConverter> m_pgmConverter {nullptr};
45 std::shared_ptr<BorderDetector> m_borderDetector {nullptr};
46
48 const struct AVFrame *m_logo {nullptr};
49 int m_logoWidth {-1};
50 int m_logoHeight {-1};
51 int m_logoRr1 {-1};
52 int m_logoCc1 {-1};
53 int m_logoRr2 {-1};
54 int m_logoCc2 {-1};
55
56 /* Per-frame info. */
57 float *m_mean {nullptr}; /* mean pixel value */
58 unsigned char *m_median {nullptr}; /* median pixel value */
59 float *m_stddev {nullptr}; /* standard deviation */
60 int *m_fRow {nullptr}; /* position of borders */
61 int *m_fCol {nullptr}; /* position of borders */
62 int *m_fWidth {nullptr}; /* area of borders */
63 int *m_fHeight {nullptr}; /* area of borders */
64 Histogram *m_histogram {nullptr}; /* histogram */
65 unsigned char *m_monochromatic {nullptr}; /* computed boolean */
66 std::array<int,UCHAR_MAX+1> m_histVal {0}; /* temporary buffer */
67 unsigned char *m_buf {nullptr}; /* temporary buffer */
68 long long m_lastFrameNo {-1};
69
70 /* Debugging */
71 int m_debugLevel {0};
72 QString m_debugdata; /* filename */
73 bool m_debugHistVal {false};
74 bool m_histValDone {false};
75 std::chrono::microseconds m_analyzeTime {0us};
76};
77
78#endif /* !HISTOGRAMANALYZER_H */
79
80/* vim: set expandtab tabstop=4 shiftwidth=4: */
AVFrame AVFrame
static const long long kUncached
HistogramAnalyzer(std::shared_ptr< PGMConverter > pgmc, std::shared_ptr< BorderDetector > bd, const QString &debugdir)
TemplateFinder * m_logoFinder
unsigned char * m_monochromatic
const float * getMeans(void) const
enum FrameAnalyzer::analyzeFrameResult MythPlayerInited(MythPlayer *player, long long nframes)
const struct AVFrame * m_logo
unsigned char * m_median
std::array< int, UCHAR_MAX+1 > m_histVal
std::array< uint8_t, UCHAR_MAX+1 > Histogram
int finished(long long nframes, bool final)
std::shared_ptr< BorderDetector > m_borderDetector
const Histogram * getHistograms(void) const
unsigned char * m_buf
void setLogoState(TemplateFinder *finder)
const float * getStdDevs(void) const
std::chrono::microseconds m_analyzeTime
const unsigned char * getMedians(void) const
int reportTime(void) const
enum FrameAnalyzer::analyzeFrameResult analyzeFrame(const MythVideoFrame *frame, long long frameno)
Histogram * m_histogram
std::shared_ptr< PGMConverter > m_pgmConverter
const unsigned char * getMonochromatics(void) const