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 
14 static constexpr int8_t MAXTBUFFER { 60 };
15 static constexpr int8_t MAXOUTBUFFERS { 16 + 1 };
16 
17 class CC608Text
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;
64  m_output.Clear();
65  }
66 
67  QString m_outputText;
68  int m_outputCol {0};
69  int m_outputRow {0};
70  bool m_changed {true};
72 };
73 
74 class MythPlayer;
75 
76 using 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
CC608Buffer::m_lock
QMutex m_lock
Definition: cc608reader.h:49
CC608Text
Definition: cc608reader.h:17
CC608Reader::m_inputBufLock
QMutex m_inputBufLock
Definition: cc608reader.h:109
mythtvexp.h
CC608Buffer::m_buffers
std::vector< CC608Text * > m_buffers
Definition: cc608reader.h:50
CC608Reader::SetTTPageNum
void SetTTPageNum(int page)
Definition: cc608reader.h:84
CC608Input
Definition: cc608decoder.h:67
MythPlayer
Definition: mythplayer.h:83
CC608WriteFn
void(*)(void *, unsigned char *, int, std::chrono::milliseconds, int) CC608WriteFn
Definition: cc608reader.h:76
CC608Text::m_x
int m_x
Definition: cc608reader.h:24
cc608decoder.h
CC608Buffer::Clear
void Clear(void)
Definition: cc608reader.h:40
CC608Buffer
Definition: cc608reader.h:36
CC608StateTracker::m_outputRow
int m_outputRow
Definition: cc608reader.h:69
CC608Reader::m_state
std::array< CC608StateTracker, MAXOUTBUFFERS > m_state
Definition: cc608reader.h:115
MAXOUTBUFFERS
static constexpr int8_t MAXOUTBUFFERS
Definition: cc608reader.h:15
CC608StateTracker::m_output
CC608Buffer m_output
Definition: cc608reader.h:71
CC608Buffer::~CC608Buffer
~CC608Buffer(void)
Definition: cc608reader.h:39
CC608StateTracker::m_changed
bool m_changed
Definition: cc608reader.h:70
CC608Input::AddTextData
virtual void AddTextData(unsigned char *buf, int len, std::chrono::milliseconds timecode, char type)=0
TextContainer
Definition: cc608reader.h:28
CC_CC1
@ CC_CC1
Definition: cc608decoder.h:50
MTV_PUBLIC
#define MTV_PUBLIC
Definition: mythtvexp.h:15
CC608Text::CC608Text
CC608Text(QString T, int X, int Y)
Definition: cc608reader.h:20
MAXTBUFFER
static constexpr int8_t MAXTBUFFER
Definition: cc608reader.h:14
CC608StateTracker::Clear
void Clear(void)
Definition: cc608reader.h:58
TextContainer::len
int len
Definition: cc608reader.h:31
TextContainer::timecode
std::chrono::milliseconds timecode
Definition: cc608reader.h:30
CC608StateTracker
Definition: cc608reader.h:53
CC608StateTracker::m_outputText
QString m_outputText
Definition: cc608reader.h:67
CC608StateTracker::CC608StateTracker
CC608StateTracker()=default
TextContainer::type
char type
Definition: cc608reader.h:33
CC608Reader::SetEnabled
void SetEnabled(bool enable)
Definition: cc608reader.h:85
CC608Text::m_text
QString m_text
Definition: cc608reader.h:23
CC608Reader
Definition: cc608reader.h:78
CC608StateTracker::m_outputCol
int m_outputCol
Definition: cc608reader.h:68
output
#define output
Definition: synaesthesia.cpp:223
TextContainer::buffer
unsigned char * buffer
Definition: cc608reader.h:32
CC608Text::m_y
int m_y
Definition: cc608reader.h:25