MythTV master
cc608decoder.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2
3#ifndef CCDECODER_H_
4#define CCDECODER_H_
5
6#include <cstdint>
7
8#include <array>
9#include <vector>
10
11#include <QString>
12#include <QRecursiveMutex>
13#include <QChar>
14
16
18{
19 unsigned char row;
20 unsigned char col;
21 unsigned char dbl;
22 unsigned char fg;
23 unsigned char bg;
24 unsigned char len;
25};
26
28{
29 unsigned char row;
30 unsigned char rowcount;
31 unsigned char resumedirect;
32 unsigned char resumetext;
33 unsigned char clr; // clear the display
34 unsigned char len; //length of string to follow
35};
36
37// resumedirect codes
38enum CC_STYLE : std::uint8_t {
42};
43
44// resumetext special codes
45static constexpr uint8_t CC_LINE_CONT { 0x02 };
46static constexpr uint8_t CC_MODE_MASK { 0xf0 };
47static constexpr uint8_t CC_TXT_MASK { 0x20 };
48enum CC_MODE : std::uint8_t {
49 CC_CC1 = 0x00,
50 CC_CC2 = 0x10,
51 CC_TXT1 = 0x20,
52 CC_TXT2 = 0x30,
53 CC_CC3 = 0x40,
54 CC_CC4 = 0x50,
55 CC_TXT3 = 0x60,
56 CC_TXT4 = 0x70,
57};
58
59using CC608Seen = std::array<bool,4>;
60using CC608ProgramType = std::array<QString,96>;
61using CC608PerField = std::array<int,2>;
62using CC608PerFieldTc = std::array<std::chrono::milliseconds,2>;
63using CC608PerMode = std::array<int,8>;
64using CC608PerModeTc = std::array<std::chrono::milliseconds,8>;
65
67{
68 public:
69 virtual ~CC608Input() = default;
70 virtual void AddTextData(unsigned char *buf, int len,
71 std::chrono::milliseconds timecode, char type) = 0;
72};
73
74enum : std::uint8_t
75{
76 kHasMPAA = 0x1,
77 kHasTPG = 0x2,
80};
81enum : std::uint8_t
82{
87};
88
90{
91 public:
92 explicit CC608Decoder(CC608Input *ccr);
95
96 void FormatCC(std::chrono::milliseconds tc, int code1, int code2);
97 void FormatCCField(std::chrono::milliseconds tc, size_t field, int data);
98 bool FalseDup(std::chrono::milliseconds tc, int field, int data);
99
100 void DecodeVPS(const unsigned char *buf);
101 void DecodeWSS(const unsigned char *buf);
102
103 void SetIgnoreTimecode(bool val) { m_ignoreTimeCode = val; }
104
105 uint GetRatingSystems(bool future) const;
106 uint GetRating(uint i, bool future) const;
107 QString GetRatingString(uint i, bool future) const;
108 QString GetProgramName(bool future) const;
109 QString GetProgramType(bool future) const;
110 QString GetXDS(const QString &key) const;
111
113 void GetServices(std::chrono::seconds seconds, CC608Seen& seen) const;
114
115 static QString ToASCII(const QString &cc608, bool suppress_unknown);
116
117 private:
118 QChar CharCC(int code) const { return m_stdChar[code]; }
119 void ResetCC(size_t mode);
120 void BufferCC(size_t mode, int len, int clr);
121 int NewRowCC(size_t mode, int len);
122
123 void FormatTextCode(std::chrono::milliseconds tc, size_t field, size_t mode, size_t len, int b1, int b2);
124 void FormatControlCode(std::chrono::milliseconds tc, size_t field, int b1, int b2);
125 QString XDSDecodeString(const std::vector<unsigned char>&buf,
126 uint start, uint end) const;
127 bool XDSDecode(int field, int b1, int b2);
128
129 bool XDSPacketParseProgram(const std::vector<unsigned char> &xds_buf,
130 bool future);
131 bool XDSPacketParseChannel(const std::vector<unsigned char> &xds_buf);
132 void XDSPacketParse(const std::vector<unsigned char> &xds_buf);
133 bool XDSPacketCRC(const std::vector<unsigned char> &xds_buf);
134
136
137 bool m_ignoreTimeCode {false};
138
139 std::array<SystemTime,4> m_lastSeen {};
140
141 // per-field
146 CC608PerField m_ccMode {-1, -1}; // 0=cc1/txt1, 1=cc2/txt2
148 std::array<int,4> m_txtMode { 0, 0, 0, 0};
149
150 // per-mode state
154 CC608PerMode m_newAttr {0}; // color+italic+underline
163 std::array<QString,8> m_ccBuf;
164
165 // translation table
166 std::array<QChar,128> m_stdChar;
167
168 // temporary buffer
169 unsigned char *m_rbuf {nullptr};
172
173 // VPS data
174 std::array<char,20> m_vpsPrLabel {0};
175 std::array<char,20> m_vpsLabel {0};
176 int m_vpsL {0};
177
178 // WSS data
180 bool m_wssValid {false};
181
183 std::array<std::vector<unsigned char>,7> m_xdsBuf;
186
187 mutable QRecursiveMutex m_xdsLock;
188 std::array<uint,2> m_xdsRatingSystems {0};
189 std::array<std::array<uint,4>,2> m_xdsRating {{}};
190 std::array<QString,2> m_xdsProgramName;
191 std::array<std::vector<uint>,2> m_xdsProgramType;
192
196
198};
199
200#endif
std::array< bool, 4 > CC608Seen
Definition: cc608decoder.h:59
std::array< std::chrono::milliseconds, 2 > CC608PerFieldTc
Definition: cc608decoder.h:62
@ kHasCanEnglish
Definition: cc608decoder.h:78
@ kHasCanFrench
Definition: cc608decoder.h:79
@ kHasMPAA
Definition: cc608decoder.h:76
@ kHasTPG
Definition: cc608decoder.h:77
std::array< int, 8 > CC608PerMode
Definition: cc608decoder.h:63
std::array< QString, 96 > CC608ProgramType
Definition: cc608decoder.h:60
static constexpr uint8_t CC_LINE_CONT
Definition: cc608decoder.h:45
std::array< std::chrono::milliseconds, 8 > CC608PerModeTc
Definition: cc608decoder.h:64
CC_MODE
Definition: cc608decoder.h:48
@ CC_TXT2
Definition: cc608decoder.h:52
@ CC_CC4
Definition: cc608decoder.h:54
@ CC_CC3
Definition: cc608decoder.h:53
@ CC_CC2
Definition: cc608decoder.h:50
@ CC_TXT4
Definition: cc608decoder.h:56
@ CC_TXT3
Definition: cc608decoder.h:55
@ CC_CC1
Definition: cc608decoder.h:49
@ CC_TXT1
Definition: cc608decoder.h:51
std::array< int, 2 > CC608PerField
Definition: cc608decoder.h:61
@ kRatingCanFrench
Definition: cc608decoder.h:86
@ kRatingCanEnglish
Definition: cc608decoder.h:85
@ kRatingMPAA
Definition: cc608decoder.h:83
@ kRatingTPG
Definition: cc608decoder.h:84
CC_STYLE
Definition: cc608decoder.h:38
@ CC_STYLE_PAINT
Definition: cc608decoder.h:40
@ CC_STYLE_POPUP
Definition: cc608decoder.h:39
@ CC_STYLE_ROLLUP
Definition: cc608decoder.h:41
static constexpr uint8_t CC_MODE_MASK
Definition: cc608decoder.h:46
static constexpr uint8_t CC_TXT_MASK
Definition: cc608decoder.h:47
CC608PerField m_badVbi
Definition: cc608decoder.h:142
uint m_xdsCrcPassed
Definition: cc608decoder.h:184
CC608PerFieldTc m_lastFormatTc
Definition: cc608decoder.h:170
CC608Input * m_reader
Definition: cc608decoder.h:135
QString m_xdsNetName
Definition: cc608decoder.h:194
bool m_ignoreTimeCode
Definition: cc608decoder.h:137
CC608PerMode m_lineCont
Definition: cc608decoder.h:160
QString GetRatingString(uint i, bool future) const
CC608PerField m_xds
Definition: cc608decoder.h:147
void XDSPacketParse(const std::vector< unsigned char > &xds_buf)
CC608PerFieldTc m_lastTc
Definition: cc608decoder.h:143
QString GetProgramType(bool future) const
bool XDSDecode(int field, int b1, int b2)
static QString ToASCII(const QString &cc608, bool suppress_unknown)
std::array< uint, 2 > m_xdsRatingSystems
Definition: cc608decoder.h:188
QString GetXDS(const QString &key) const
CC608PerMode m_col
Definition: cc608decoder.h:157
QString XDSDecodeString(const std::vector< unsigned char > &buf, uint start, uint end) const
std::array< QString, 2 > m_xdsProgramName
Definition: cc608decoder.h:190
uint m_xdsCrcFailed
Definition: cc608decoder.h:185
void DecodeWSS(const unsigned char *buf)
CC608PerField m_lastFormatData
Definition: cc608decoder.h:171
CC608PerMode m_resumeText
Definition: cc608decoder.h:161
CC608PerModeTc m_lastClr
Definition: cc608decoder.h:162
std::array< QChar, 128 > m_stdChar
Definition: cc608decoder.h:166
void FormatControlCode(std::chrono::milliseconds tc, size_t field, int b1, int b2)
void FormatTextCode(std::chrono::milliseconds tc, size_t field, size_t mode, size_t len, int b1, int b2)
QRecursiveMutex m_xdsLock
Definition: cc608decoder.h:187
std::array< std::array< uint, 4 >, 2 > m_xdsRating
Definition: cc608decoder.h:189
void FormatCC(std::chrono::milliseconds tc, int code1, int code2)
bool XDSPacketParseChannel(const std::vector< unsigned char > &xds_buf)
bool XDSPacketParseProgram(const std::vector< unsigned char > &xds_buf, bool future)
void DecodeVPS(const unsigned char *buf)
QChar CharCC(int code) const
Definition: cc608decoder.h:118
CC608PerMode m_lastRow
Definition: cc608decoder.h:151
QString m_xdsNetCall
Definition: cc608decoder.h:193
CC608PerField m_lastCode
Definition: cc608decoder.h:144
bool FalseDup(std::chrono::milliseconds tc, int field, int data)
std::array< QString, 8 > m_ccBuf
Definition: cc608decoder.h:163
QString GetProgramName(bool future) const
CC608ProgramType m_xdsProgramTypeString
Definition: cc608decoder.h:197
uint GetRatingSystems(bool future) const
CC608PerFieldTc m_lastCodeTc
Definition: cc608decoder.h:145
void GetServices(std::chrono::seconds seconds, CC608Seen &seen) const
void BufferCC(size_t mode, int len, int clr)
std::array< std::vector< unsigned char >, 7 > m_xdsBuf
Definition: cc608decoder.h:183
void ResetCC(size_t mode)
CC608PerMode m_newAttr
Definition: cc608decoder.h:154
bool XDSPacketCRC(const std::vector< unsigned char > &xds_buf)
std::array< std::vector< uint >, 2 > m_xdsProgramType
Definition: cc608decoder.h:191
unsigned char * m_rbuf
Definition: cc608decoder.h:169
std::array< char, 20 > m_vpsLabel
Definition: cc608decoder.h:175
CC608Decoder(CC608Input *ccr)
std::array< int, 4 > m_txtMode
Definition: cc608decoder.h:148
CC608PerMode m_style
Definition: cc608decoder.h:159
CC608PerMode m_newRow
Definition: cc608decoder.h:152
CC608PerMode m_rowCount
Definition: cc608decoder.h:158
std::array< SystemTime, 4 > m_lastSeen
Definition: cc608decoder.h:139
CC608PerField m_ccMode
Definition: cc608decoder.h:146
void SetIgnoreTimecode(bool val)
Definition: cc608decoder.h:103
uint GetRating(uint i, bool future) const
CC608PerMode m_newCol
Definition: cc608decoder.h:153
std::array< char, 20 > m_vpsPrLabel
Definition: cc608decoder.h:174
CC608PerModeTc m_timeCode
Definition: cc608decoder.h:155
CC608Decoder(const CC608Decoder &rhs)
int NewRowCC(size_t mode, int len)
void FormatCCField(std::chrono::milliseconds tc, size_t field, int data)
CC608PerMode m_row
Definition: cc608decoder.h:156
virtual ~CC608Input()=default
virtual void AddTextData(unsigned char *buf, int len, std::chrono::milliseconds timecode, char type)=0
unsigned int uint
Definition: freesurround.h:24
unsigned char resumetext
Definition: cc608decoder.h:32
unsigned char row
Definition: cc608decoder.h:29
unsigned char rowcount
Definition: cc608decoder.h:30
unsigned char len
Definition: cc608decoder.h:34
unsigned char resumedirect
Definition: cc608decoder.h:31
unsigned char clr
Definition: cc608decoder.h:33
unsigned char bg
Definition: cc608decoder.h:23
unsigned char len
Definition: cc608decoder.h:24
unsigned char row
Definition: cc608decoder.h:19
unsigned char fg
Definition: cc608decoder.h:22
unsigned char dbl
Definition: cc608decoder.h:21
unsigned char col
Definition: cc608decoder.h:20