MythTV master
FrameAnalyzer.h
Go to the documentation of this file.
1/*
2 * FrameAnalyzer
3 *
4 * Provide a generic interface for plugging in video frame analysis algorithms.
5 */
6
7#ifndef FRAMEANALYZER_H
8#define FRAMEANALYZER_H
9
10/* Base class for commercial flagging video frame analyzers. */
11
12#include <climits>
13#include <memory>
14
15#include <QMap>
16#include "libmythtv/mythframe.h"
17
18/*
19 * At least FreeBSD doesn't define LONG_LONG_MAX, but it does define
20 * __LONG_LONG_MAX__. Who knows what other systems do the same?
21 */
22#ifndef LONG_LONG_MAX
23#define LONG_LONG_MAX __LONG_LONG_MAX__
24#endif
25
26class MythPlayer;
27
29{
30public:
31 virtual ~FrameAnalyzer(void) = default;
32
33 virtual const char *name(void) const = 0;
34
35 /* Analyze a video frame. */
36 enum analyzeFrameResult : std::uint8_t {
37 ANALYZE_OK, /* Analysis OK */
38 ANALYZE_ERROR, /* Recoverable error */
39 ANALYZE_FINISHED, /* Analysis complete, don't need more frames. */
40 ANALYZE_FATAL, /* Don't use this analyzer anymore. */
41 };
42
43
44 /* 0-based frameno => nframes */
45 using FrameMap = QMap<long long, long long>;
46
48 [[maybe_unused]] MythPlayer *player,
49 [[maybe_unused]] long long nframes)
50 {
51 return ANALYZE_OK;
52 };
53
54 /*
55 * Populate *pNextFrame with the next frame number desired by this
56 * analyzer.
57 */
58 static const long long kAnyFrame = LLONG_MAX;
59 static const long long kNextFrame = -1;
61 long long frameno, long long *pNextFrame /* [out] */) = 0;
62
63 virtual int finished([[maybe_unused]] long long nframes,
64 [[maybe_unused]] bool final)
65 {
66 return 0;
67 }
68 virtual int reportTime(void) const { return 0; }
69
70 virtual FrameMap GetMap(unsigned int) const = 0;
71};
72
73namespace frameAnalyzer {
74
75bool rrccinrect(int rr, int cc, int rrow, int rcol, int rwidth, int rheight);
76
78 float fps, const char *comment);
79
81 float fps, const char *comment);
82
83long long frameAnalyzerMapSum(const FrameAnalyzer::FrameMap *frameMap);
84
85bool removeShortBreaks(FrameAnalyzer::FrameMap *breakMap, float fps,
86 int minbreaklen, bool verbose);
87
88bool removeShortSegments(FrameAnalyzer::FrameMap *breakMap, long long nframes,
89 float fps, int minseglen, bool verbose);
90
91FrameAnalyzer::FrameMap::const_iterator frameMapSearchForwards(
92 const FrameAnalyzer::FrameMap *frameMap, long long mark,
93 long long markend);
94
95FrameAnalyzer::FrameMap::const_iterator frameMapSearchBackwards(
96 const FrameAnalyzer::FrameMap *frameMap, long long markbegin,
97 long long mark);
98
99}; /* namespace */
100
101#endif /* !FRAMEANALYZER_H */
102
103/* vim: set expandtab tabstop=4 shiftwidth=4: */
virtual const char * name(void) const =0
virtual enum analyzeFrameResult MythPlayerInited(MythPlayer *player, long long nframes)
Definition: FrameAnalyzer.h:47
virtual FrameMap GetMap(unsigned int) const =0
virtual int reportTime(void) const
Definition: FrameAnalyzer.h:68
static const long long kNextFrame
Definition: FrameAnalyzer.h:59
static const long long kAnyFrame
Definition: FrameAnalyzer.h:58
QMap< long long, long long > FrameMap
Definition: FrameAnalyzer.h:45
virtual int finished(long long nframes, bool final)
Definition: FrameAnalyzer.h:63
virtual ~FrameAnalyzer(void)=default
virtual enum analyzeFrameResult analyzeFrame(const MythVideoFrame *frame, long long frameno, long long *pNextFrame)=0
long long frameAnalyzerMapSum(const FrameAnalyzer::FrameMap *frameMap)
void frameAnalyzerReportMapms(const FrameAnalyzer::FrameMap *frameMap, float fps, const char *comment)
FrameAnalyzer::FrameMap::const_iterator frameMapSearchForwards(const FrameAnalyzer::FrameMap *frameMap, long long mark, long long markend)
bool removeShortSegments(FrameAnalyzer::FrameMap *breakMap, long long nframes, float fps, int minseglen, bool verbose)
bool rrccinrect(int rr, int cc, int rrow, int rcol, int rwidth, int rheight)
void frameAnalyzerReportMap(const FrameAnalyzer::FrameMap *frameMap, float fps, const char *comment)
FrameAnalyzer::FrameMap::const_iterator frameMapSearchBackwards(const FrameAnalyzer::FrameMap *frameMap, long long markbegin, long long mark)
bool removeShortBreaks(FrameAnalyzer::FrameMap *breakMap, float fps, int minbreaklen, bool verbose)