MythTV master
cc608reader.h
Go to the documentation of this file.
1#ifndef CC608READER_H
2#define CC608READER_H
3
4#include <cstdint>
5#include <utility>
6
7// Qt headers
8#include <QMutex>
9
10// MythTV headers
12#include "libmythtv/mythtvexp.h"
13
14static constexpr int8_t MAXTBUFFER { 60 };
15static constexpr int8_t MAXOUTBUFFERS { 16 + 1 };
16
18{
19 public:
20 CC608Text(QString T, int X, int Y) :
21 m_text(std::move(T)), m_x(X), m_y(Y) {}
22 CC608Text(const CC608Text &other) = default;
23 QString m_text;
24 int m_x;
25 int m_y;
26};
27
29{
30 std::chrono::milliseconds timecode;
31 int len;
32 unsigned char *buffer;
33 char type;
34};
35
37{
38 public:
39 ~CC608Buffer(void) { Clear(); }
40 void Clear(void)
41 {
42 m_lock.lock();
43 for (auto *cc : m_buffers)
44 delete cc;
45 m_buffers.clear();
46 m_lock.unlock();
47 }
48
49 QMutex m_lock;
50 std::vector<CC608Text*> m_buffers;
51};
52
54{
55 public:
56 CC608StateTracker() = default;
57
58 void Clear(void)
59 {
60 m_outputText = "";
61 m_outputCol = 0;
62 m_outputRow = 0;
63 m_changed = true;
65 }
66
67 QString m_outputText;
68 int m_outputCol {0};
69 int m_outputRow {0};
70 bool m_changed {true};
72};
73
74class MythPlayer;
75
76using CC608WriteFn = void (*) (void *, unsigned char *, int, std::chrono::milliseconds, int);
77
79{
80 public:
81 explicit CC608Reader(MythPlayer *parent);
82 ~CC608Reader() override;
83
84 void SetTTPageNum(int page) { m_ccPageNum = page; }
85 void SetEnabled(bool enable) { m_enabled = enable; }
86 void FlushTxtBuffers(void);
87 CC608Buffer *GetOutputText(bool &changed, int &streamIdx);
88 CC608Buffer* GetOutputText(bool &changed);
89 void SetMode(int mode);
90 void ClearBuffers(bool input, bool output, int outputStreamIdx = -1);
91 void AddTextData(unsigned char *buf, int len,
92 std::chrono::milliseconds timecode, char type) override; // CC608Input
93 void TranscodeWriteText(CC608WriteFn func, void * ptr);
94
95 private:
96 int Update(unsigned char *inpos);
97 void Update608Text(std::vector<CC608Text*> *ccbuf,
98 int replace = 0, int scroll = 0,
99 bool scroll_prsv = false,
100 int scroll_yoff = 0, int scroll_ymax = 15,
101 int streamIdx = CC_CC1);
102 int NumInputBuffers(bool need_to_lock = true);
103
104 MythPlayer *m_parent {nullptr};
105 bool m_enabled {false};
106 // Input buffers
107 int m_readPosition {0};
108 int m_writePosition {0};
110 int m_maxTextSize {0};
111 std::array<TextContainer,MAXTBUFFER+1> m_inputBuffers {};
112 int m_ccMode {CC_CC1};
113 int m_ccPageNum {0x888};
114 // Output buffers
115 std::array<CC608StateTracker,MAXOUTBUFFERS> m_state;
116};
117
118#endif // CC608READER_H
@ CC_CC1
Definition: cc608decoder.h:49
static constexpr int8_t MAXTBUFFER
Definition: cc608reader.h:14
static constexpr int8_t MAXOUTBUFFERS
Definition: cc608reader.h:15
void(*)(void *, unsigned char *, int, std::chrono::milliseconds, int) CC608WriteFn
Definition: cc608reader.h:76
void Clear(void)
Definition: cc608reader.h:40
QMutex m_lock
Definition: cc608reader.h:49
std::vector< CC608Text * > m_buffers
Definition: cc608reader.h:50
~CC608Buffer(void)
Definition: cc608reader.h:39
virtual void AddTextData(unsigned char *buf, int len, std::chrono::milliseconds timecode, char type)=0
QMutex m_inputBufLock
Definition: cc608reader.h:109
void SetTTPageNum(int page)
Definition: cc608reader.h:84
std::array< CC608StateTracker, MAXOUTBUFFERS > m_state
Definition: cc608reader.h:115
void SetEnabled(bool enable)
Definition: cc608reader.h:85
QString m_outputText
Definition: cc608reader.h:67
CC608StateTracker()=default
CC608Buffer m_output
Definition: cc608reader.h:71
void Clear(void)
Definition: cc608reader.h:58
CC608Text(QString T, int X, int Y)
Definition: cc608reader.h:20
CC608Text(const CC608Text &other)=default
QString m_text
Definition: cc608reader.h:23
#define MTV_PUBLIC
Definition: mythtvexp.h:11
STL namespace.
std::chrono::milliseconds timecode
Definition: cc608reader.h:30
unsigned char * buffer
Definition: cc608reader.h:32
#define output