From 2348f5d412f8a5a59f5adae39b423101675bdf22 Mon Sep 17 00:00:00 2001 From: David Hampton Date: Sun, 19 Apr 2020 09:51:32 -0400 Subject: [PATCH] Convert to std::array and std::string. (libmythtv/captions) --- .../libs/libmythtv/captions/cc608decoder.cpp | 11 +-- mythtv/libs/libmythtv/captions/cc608decoder.h | 72 ++++++++++--------- mythtv/libs/libmythtv/captions/cc608reader.h | 4 +- .../libs/libmythtv/captions/cc708decoder.cpp | 8 +-- mythtv/libs/libmythtv/captions/cc708decoder.h | 15 ++-- .../libs/libmythtv/captions/cc708reader.cpp | 22 +++--- mythtv/libs/libmythtv/captions/cc708reader.h | 30 ++++---- mythtv/libs/libmythtv/captions/cc708window.h | 2 +- .../captions/teletextextractorreader.cpp | 34 +++++---- .../captions/teletextextractorreader.h | 4 +- .../libmythtv/captions/teletextreader.cpp | 26 +++---- .../libs/libmythtv/captions/teletextreader.h | 20 +++--- .../libmythtv/captions/teletextscreen.cpp | 8 +-- .../libs/libmythtv/captions/teletextscreen.h | 4 +- .../libmythtv/captions/vbi608extractor.cpp | 2 +- .../libs/libmythtv/captions/vbi608extractor.h | 7 +- .../libmythtv/captions/xine_demux_sputext.cpp | 7 +- .../libmythtv/decoders/avformatdecoder.cpp | 4 +- .../libs/libmythtv/mythccextractorplayer.cpp | 2 +- 19 files changed, 145 insertions(+), 137 deletions(-) diff --git a/mythtv/libs/libmythtv/captions/cc608decoder.cpp b/mythtv/libs/libmythtv/captions/cc608decoder.cpp index 01d874d04b2..ea685f922bc 100644 --- a/mythtv/libs/libmythtv/captions/cc608decoder.cpp +++ b/mythtv/libs/libmythtv/captions/cc608decoder.cpp @@ -3,6 +3,7 @@ // Some of the XDS was inspired by code in TVTime. -- dtk 03/30/2006 #include +#include using namespace std; // Qt headers @@ -18,7 +19,7 @@ using namespace std; #define DEBUG_XDS 0 -static void init_xds_program_type(QString xds_program_type[96]); +static void init_xds_program_type(CC608ProgramType& xds_program_type); CC608Decoder::CC608Decoder(CC608Input *ccr) : m_reader(ccr), @@ -52,7 +53,7 @@ void CC608Decoder::FormatCC(int tc, int code1, int code2) FormatCCField(tc, 1, code2); } -void CC608Decoder::GetServices(uint seconds, bool seen[4]) const +void CC608Decoder::GetServices(uint seconds, CC608Seen seen) const { time_t now = time(nullptr); time_t then = now - seconds; @@ -880,7 +881,7 @@ void CC608Decoder::DecodeVPS(const unsigned char *buf) if ((int8_t) c < 0) { m_vpsLabel[m_vpsL] = 0; - memcpy(m_vpsPrLabel, m_vpsLabel, sizeof(m_vpsPrLabel)); + m_vpsPrLabel = m_vpsLabel; m_vpsL = 0; } c &= 0x7F; @@ -889,7 +890,7 @@ void CC608Decoder::DecodeVPS(const unsigned char *buf) LOG(VB_VBI, LOG_INFO, QString("VPS: 3-10: %1 %2 %3 %4 %5 %6 %7 %8 (\"%9\")") .arg(buf[0]).arg(buf[1]).arg(buf[2]).arg(buf[3]).arg(buf[4]) - .arg(buf[5]).arg(buf[6]).arg(buf[7]).arg(m_vpsPrLabel)); + .arg(buf[5]).arg(buf[6]).arg(buf[7]).arg(m_vpsPrLabel.data())); int pcs = buf[2] >> 6; int cni = + ((buf[10] & 3) << 10) @@ -1442,7 +1443,7 @@ bool CC608Decoder::XDSPacketParseChannel(const vector &xds_buf) return handled; } -static void init_xds_program_type(QString xds_program_type[96]) +static void init_xds_program_type(CC608ProgramType& xds_program_type) { xds_program_type[0] = QCoreApplication::translate("(Categories)", "Education"); diff --git a/mythtv/libs/libmythtv/captions/cc608decoder.h b/mythtv/libs/libmythtv/captions/cc608decoder.h index 36013b34a98..844206030a9 100644 --- a/mythtv/libs/libmythtv/captions/cc608decoder.h +++ b/mythtv/libs/libmythtv/captions/cc608decoder.h @@ -6,6 +6,7 @@ #include #include +#include #include using namespace std; @@ -15,6 +16,11 @@ using namespace std; #include "format.h" +using CC608Seen = std::array; +using CC608ProgramType = std::array; +using CC608PerField = std::array; +using CC608PerMode = std::array; + class CC608Input { public: @@ -62,7 +68,7 @@ class CC608Decoder QString GetXDS(const QString &key) const; /// \return Services seen in last few seconds as specified. - void GetServices(uint seconds, bool seen[4]) const; + void GetServices(uint seconds, CC608Seen seen) const; static QString ToASCII(const QString &cc608, bool suppress_unknown); @@ -86,43 +92,43 @@ class CC608Decoder bool m_ignoreTimeCode {false}; - time_t m_lastSeen[4] {0}; + std::array m_lastSeen {0}; // per-field - int m_badVbi[2] { 0, 0}; - int m_lastTc[2] { 0, 0}; - int m_lastCode[2] {-1, -1}; - int m_lastCodeTc[2] { 0, 0}; - int m_ccMode[2] {-1, -1}; // 0=cc1/txt1, 1=cc2/txt2 - int m_xds[2] { 0, 0}; - int m_txtMode[4] { 0, 0, 0, 0}; + CC608PerField m_badVbi { 0, 0}; + CC608PerField m_lastTc { 0, 0}; + CC608PerField m_lastCode {-1, -1}; + CC608PerField m_lastCodeTc { 0, 0}; + CC608PerField m_ccMode {-1, -1}; // 0=cc1/txt1, 1=cc2/txt2 + CC608PerField m_xds { 0, 0}; + std::array m_txtMode { 0, 0, 0, 0}; // per-mode state - int m_lastRow[8] {0}; - int m_newRow[8] {0}; - int m_newCol[8] {0}; - int m_newAttr[8] {0}; // color+italic+underline - int m_timeCode[8] {0}; - int m_row[8] {0}; - int m_col[8] {0}; - int m_rowCount[8] {0}; - int m_style[8] {0}; - int m_lineCont[8] {0}; - int m_resumeText[8] {0}; - int m_lastClr[8] {0}; - QString m_ccBuf[8]; + CC608PerMode m_lastRow {0}; + CC608PerMode m_newRow {0}; + CC608PerMode m_newCol {0}; + CC608PerMode m_newAttr {0}; // color+italic+underline + CC608PerMode m_timeCode {0}; + CC608PerMode m_row {0}; + CC608PerMode m_col {0}; + CC608PerMode m_rowCount {0}; + CC608PerMode m_style {0}; + CC608PerMode m_lineCont {0}; + CC608PerMode m_resumeText {0}; + CC608PerMode m_lastClr {0}; + std::array m_ccBuf; // translation table - QChar m_stdChar[128]; + std::array m_stdChar; // temporary buffer unsigned char *m_rbuf {nullptr}; - int m_lastFormatTc[2] {0, 0}; - int m_lastFormatData[2] {0, 0}; + std::array m_lastFormatTc {0, 0}; + std::array m_lastFormatData {0, 0}; // VPS data - char m_vpsPrLabel[20] {0}; - char m_vpsLabel[20] {0}; + std::array m_vpsPrLabel {0}; + std::array m_vpsLabel {0}; int m_vpsL {0}; // WSS data @@ -130,21 +136,21 @@ class CC608Decoder bool m_wssValid {false}; int m_xdsCurService {-1}; - vector m_xdsBuf[7]; + std::array,7> m_xdsBuf; uint m_xdsCrcPassed {0}; uint m_xdsCrcFailed {0}; mutable QMutex m_xdsLock {QMutex::Recursive}; - uint m_xdsRatingSystems[2] {0}; - uint m_xdsRating[2][4] {{0}}; - QString m_xdsProgramName[2]; - vector m_xdsProgramType[2]; + std::array m_xdsRatingSystems {0}; + std::array,2> m_xdsRating {{}}; + std::array m_xdsProgramName; + std::array,2> m_xdsProgramType; QString m_xdsNetCall; QString m_xdsNetName; uint m_xdsTsid {0}; - QString m_xdsProgramTypeString[96]; + CC608ProgramType m_xdsProgramTypeString; }; #endif diff --git a/mythtv/libs/libmythtv/captions/cc608reader.h b/mythtv/libs/libmythtv/captions/cc608reader.h index 427cd031676..f9154b39174 100644 --- a/mythtv/libs/libmythtv/captions/cc608reader.h +++ b/mythtv/libs/libmythtv/captions/cc608reader.h @@ -109,11 +109,11 @@ class MTV_PUBLIC CC608Reader : public CC608Input int m_writePosition {0}; QMutex m_inputBufLock; int m_maxTextSize {0}; - TextContainer m_inputBuffers[MAXTBUFFER+1] {}; + std::array m_inputBuffers {}; int m_ccMode {CC_CC1}; int m_ccPageNum {0x888}; // Output buffers - CC608StateTracker m_state[MAXOUTBUFFERS]; + std::array m_state; }; #endif // CC608READER_H diff --git a/mythtv/libs/libmythtv/captions/cc708decoder.cpp b/mythtv/libs/libmythtv/captions/cc708decoder.cpp index 0b87f66b278..618a396d47e 100644 --- a/mythtv/libs/libmythtv/captions/cc708decoder.cpp +++ b/mythtv/libs/libmythtv/captions/cc708decoder.cpp @@ -35,7 +35,7 @@ const std::array cc_types = }; static void parse_cc_packet(CC708Reader *cb_cbs, CaptionPacket *pkt, - time_t last_seen[64]); + cc708_seen_times last_seen); void CC708Decoder::decode_cc_data(uint cc_type, uint data1, uint data2) { @@ -73,7 +73,7 @@ void CC708Decoder::decode_cc_null(void) m_partialPacket.size = 0; } -void CC708Decoder::services(uint seconds, bool seen[64]) const +void CC708Decoder::services(uint seconds, cc708_seen_flags & seen) const { time_t now = time(nullptr); time_t then = now - seconds; @@ -620,9 +620,9 @@ static void append_cc(CC708Reader* cc, uint service_num, } static void parse_cc_packet(CC708Reader* cb_cbs, CaptionPacket* pkt, - time_t last_seen[64]) + cc708_seen_times last_seen) { - const unsigned char* pkt_buf = pkt->data; + const unsigned char* pkt_buf = pkt->data.data(); const int pkt_size = pkt->size; int off = 1; int len = ((((int)pkt_buf[0]) & 0x3f)<<1) - 1; diff --git a/mythtv/libs/libmythtv/captions/cc708decoder.h b/mythtv/libs/libmythtv/captions/cc708decoder.h index 748e625fb4b..a7eeb3e8862 100644 --- a/mythtv/libs/libmythtv/captions/cc708decoder.h +++ b/mythtv/libs/libmythtv/captions/cc708decoder.h @@ -10,11 +10,14 @@ #include "format.h" #include "compat.h" +using cc708_seen_flags = std::array; +using cc708_seen_times = std::array; + #ifndef __CC_CALLBACKS_H__ /** EIA-708-A closed caption packet */ struct CaptionPacket { - unsigned char data[128+16]; + std::array data; int size; }; #endif @@ -24,23 +27,19 @@ class CC708Reader; class CC708Decoder { public: - explicit CC708Decoder(CC708Reader *ccr) : m_reader(ccr) - { - memset(&m_partialPacket, 0, sizeof(CaptionPacket)); - memset(m_lastSeen, 0, sizeof(m_lastSeen)); - } + explicit CC708Decoder(CC708Reader *ccr) : m_reader(ccr) {} ~CC708Decoder() = default; void decode_cc_data(uint cc_type, uint data1, uint data2); void decode_cc_null(void); /// \return Services seen in last few seconds as specified. - void services(uint seconds, bool seen[64]) const; + void services(uint seconds, cc708_seen_flags & seen) const; private: CaptionPacket m_partialPacket {}; CC708Reader *m_reader {nullptr}; - time_t m_lastSeen[64] {}; + cc708_seen_times m_lastSeen {}; }; #endif // CC708DECODER_H_ diff --git a/mythtv/libs/libmythtv/captions/cc708reader.cpp b/mythtv/libs/libmythtv/captions/cc708reader.cpp index 3125a22dd80..acd2e162261 100644 --- a/mythtv/libs/libmythtv/captions/cc708reader.cpp +++ b/mythtv/libs/libmythtv/captions/cc708reader.cpp @@ -23,9 +23,9 @@ CC708Reader::CC708Reader(MythPlayer *owner) m_tempStrAlloc[i] = 512; m_tempStrSize[i] = 0; - m_tempStr[i] = (short*) malloc(m_tempStrAlloc[i] * sizeof(short)); + m_tempStr[i] = (int16_t*) malloc(m_tempStrAlloc[i] * sizeof(int16_t)); } - memset(&CC708DelayedDeletes, 0, sizeof(CC708DelayedDeletes)); + m_cc708DelayedDeletes.fill(0); } CC708Reader::~CC708Reader() @@ -48,7 +48,7 @@ void CC708Reader::SetCurrentWindow(uint service_num, int window_id) CHECKENABLED; LOG(VB_VBI, LOG_DEBUG, LOC + QString("SetCurrentWindow(%1, %2)") .arg(service_num).arg(window_id)); - CC708services[service_num].m_currentWindow = window_id; + m_cc708services[service_num].m_currentWindow = window_id; } void CC708Reader::DefineWindow( @@ -68,7 +68,7 @@ void CC708Reader::DefineWindow( CHECKENABLED; - CC708DelayedDeletes[service_num & 63] &= ~(1 << window_id); + m_cc708DelayedDeletes[service_num & 63] &= ~(1 << window_id); LOG(VB_VBI, LOG_DEBUG, LOC + QString("DefineWindow(%1, %2,\n\t\t\t\t\t") @@ -91,7 +91,7 @@ void CC708Reader::DefineWindow( row_lock, column_lock, pen_style, window_style); - CC708services[service_num].m_currentWindow = window_id; + m_cc708services[service_num].m_currentWindow = window_id; } void CC708Reader::DeleteWindows(uint service_num, int window_map) @@ -103,7 +103,7 @@ void CC708Reader::DeleteWindows(uint service_num, int window_map) for (uint i = 0; i < 8; i++) if ((1 << i) & window_map) GetCCWin(service_num, i).Clear(); - CC708DelayedDeletes[service_num&63] |= window_map; + m_cc708DelayedDeletes[service_num&63] |= window_map; } void CC708Reader::DisplayWindows(uint service_num, int window_map) @@ -114,7 +114,7 @@ void CC708Reader::DisplayWindows(uint service_num, int window_map) for (uint i = 0; i < 8; i++) { - if ((1 << i) & CC708DelayedDeletes[service_num & 63]) + if ((1 << i) & m_cc708DelayedDeletes[service_num & 63]) { CC708Window &win = GetCCWin(service_num, i); QMutexLocker locker(&win.m_lock); @@ -126,7 +126,7 @@ void CC708Reader::DisplayWindows(uint service_num, int window_map) win.m_text = nullptr; } } - CC708DelayedDeletes[service_num & 63] = 0; + m_cc708DelayedDeletes[service_num & 63] = 0; } for (uint i = 0; i < 8; i++) @@ -219,7 +219,7 @@ void CC708Reader::SetPenAttributes( { CHECKENABLED; LOG(VB_VBI, LOG_DEBUG, LOC + QString("SetPenAttributes(%1, %2,") - .arg(service_num).arg(CC708services[service_num].m_currentWindow) + + .arg(service_num).arg(m_cc708services[service_num].m_currentWindow) + QString("\n\t\t\t\t\t pen_size %1, offset %2, text_tag %3, " "font_tag %4," "\n\t\t\t\t\t edge_type %5, underline %6, italics %7") @@ -281,7 +281,7 @@ void CC708Reader::Reset(uint service_num) } void CC708Reader::TextWrite(uint service_num, - short* unicode_string, short len) + int16_t* unicode_string, int16_t len) { CHECKENABLED; QString debug = QString(); @@ -291,5 +291,5 @@ void CC708Reader::TextWrite(uint service_num, debug += QChar(unicode_string[i]); } LOG(VB_VBI, LOG_DEBUG, LOC + QString("AddText to %1->%2 |%3|") - .arg(service_num).arg(CC708services[service_num].m_currentWindow).arg(debug)); + .arg(service_num).arg(m_cc708services[service_num].m_currentWindow).arg(debug)); } diff --git a/mythtv/libs/libmythtv/captions/cc708reader.h b/mythtv/libs/libmythtv/captions/cc708reader.h index c64ef8e21ee..999dc032367 100644 --- a/mythtv/libs/libmythtv/captions/cc708reader.h +++ b/mythtv/libs/libmythtv/captions/cc708reader.h @@ -20,16 +20,16 @@ class CC708Reader virtual ~CC708Reader(); void SetCurrentService(int service) { m_currentService = service; } - CC708Service* GetCurrentService(void) { return &CC708services[m_currentService]; } + CC708Service* GetCurrentService(void) { return &m_cc708services[m_currentService]; } void SetEnabled(bool enable) { m_enabled = enable; } void ClearBuffers(void); CC708Service* GetService(uint service_num) - { return &(CC708services[service_num]); } + { return &(m_cc708services[service_num]); } CC708Window &GetCCWin(uint service_num, uint window_id) - { return CC708services[service_num].m_windows[window_id]; } + { return m_cc708services[service_num].m_windows[window_id]; } CC708Window &GetCCWin(uint svc_num) - { return GetCCWin(svc_num, CC708services[svc_num].m_currentWindow); } + { return GetCCWin(svc_num, m_cc708services[svc_num].m_currentWindow); } // Window settings virtual void SetCurrentWindow(uint service_num, int window_id); @@ -72,21 +72,21 @@ class CC708Reader // Text virtual void TextWrite(uint service_num, - short* unicode_string, short len); + int16_t* unicode_string, int16_t len); // Data - unsigned char *m_buf[k708MaxServices] {}; - uint m_bufAlloc[k708MaxServices] {}; - uint m_bufSize[k708MaxServices] {}; - bool m_delayed[k708MaxServices] {}; + std::array m_buf {}; + std::array m_bufAlloc {}; + std::array m_bufSize {}; + std::array m_delayed {}; - short *m_tempStr[k708MaxServices] {}; - int m_tempStrAlloc[k708MaxServices] {}; - int m_tempStrSize[k708MaxServices] {}; + std::array m_tempStr {}; + std::array m_tempStrAlloc {}; + std::array m_tempStrSize {}; - int m_currentService {1}; - CC708Service CC708services[k708MaxServices]; - int CC708DelayedDeletes[k708MaxServices] {}; + int m_currentService {1}; + std::array m_cc708services; + std::array m_cc708DelayedDeletes {}; MythPlayer *m_parent {nullptr}; bool m_enabled {false}; diff --git a/mythtv/libs/libmythtv/captions/cc708window.h b/mythtv/libs/libmythtv/captions/cc708window.h index 7bbfc29d1c1..374617dfc87 100644 --- a/mythtv/libs/libmythtv/captions/cc708window.h +++ b/mythtv/libs/libmythtv/captions/cc708window.h @@ -310,7 +310,7 @@ class CC708Service public: uint m_currentWindow {0}; - CC708Window m_windows[k708MaxWindows]; + std::array m_windows; }; #endif // CC708_WINDOW_H diff --git a/mythtv/libs/libmythtv/captions/teletextextractorreader.cpp b/mythtv/libs/libmythtv/captions/teletextextractorreader.cpp index 9fdd19796d1..dd490aaaa83 100644 --- a/mythtv/libs/libmythtv/captions/teletextextractorreader.cpp +++ b/mythtv/libs/libmythtv/captions/teletextextractorreader.cpp @@ -9,7 +9,7 @@ void TeletextExtractorReader::PageUpdated(int page, int subpage) } void TeletextExtractorReader::HeaderUpdated( - int page, int subpage, uint8_t *page_ptr, int lang) + int page, int subpage, tt_line_array& page_ptr, int lang) { m_updatedPages.insert(qMakePair(page, subpage)); TeletextReader::HeaderUpdated(page, subpage, page_ptr, lang); @@ -53,8 +53,9 @@ void TeletextExtractorReader::HeaderUpdated( * 0x08 0x09 0x0a 0x0b 0x0c 0x0d (apparently a control character) 0x0e 0x0f */ -static const uint16_t ppi_national_subsets[][20] = -{ +using ppi_natl_array = std::array; +static const std::array ppi_national_subsets +{{ { 0x00a3, 0x0024, 0x0040, 0x00ab, 0x00bd, 0x00bb, 0x005e, 0x0023, 0x002d, 0x00bc, 0x00a6, 0x00be, 0x00f7 }, /* english, 000 */ @@ -97,33 +98,30 @@ static const uint16_t ppi_national_subsets[][20] = { 0x0054, 0x011f, 0x0130, 0x015e, 0x00d6, 0x00c7, 0x00dc, 0x011e, 0x0131, 0x015f, 0x00f6, 0x00e7, 0x00fc }, /* turkish, 1100 */ -}; +}}; // utc-2 --> utf-8 // this is not a general function, but it's enough for what we do here // the result buffer need to be at least 4 bytes long -static void to_utf8(char *res, uint16_t ch) +static void to_utf8(std::string &res, uint16_t ch) { if(ch >= 0x80) { if(ch >= 0x800) { - res[0] = (ch >> 12) | 0xE0; - res[1] = ((ch >> 6) & 0x3F) | 0x80; - res[2] = (ch & 0x3F) | 0x80; - res[3] = 0; + res = { static_cast( (ch >> 12) | 0xE0), + static_cast(((ch >> 6) & 0x3F) | 0x80), + static_cast( (ch & 0x3F) | 0x80) }; } else { - res[0] = (ch >> 6) | 0xC0; - res[1] = (ch & 0x3F) | 0x80; - res[2] = 0; + res = { static_cast((ch >> 6) | 0xC0), + static_cast((ch & 0x3F) | 0x80) } ; } } else { - res[0] = ch; - res[1] = 0; + res = { static_cast(ch) }; } } @@ -131,12 +129,12 @@ static void to_utf8(char *res, uint16_t ch) * Get decoded ttx as a string. */ -QString decode_teletext(int codePage, const uint8_t data[40]) +QString decode_teletext(int codePage, const tt_line_array& data) { QString res; - char utf8[7]; + std::string utf8 {}; - const uint16_t *pi_active_national_set = ppi_national_subsets[codePage]; + const ppi_natl_array pi_active_national_set = ppi_national_subsets[codePage]; for (int i = 0; i < 40; ++i) { @@ -213,7 +211,7 @@ QString decode_teletext(int codePage, const uint8_t data[40]) /* convert to utf-8 */ to_utf8(utf8, out); - res += QString::fromUtf8(utf8, strlen(utf8)); + res += QString::fromUtf8(utf8.c_str()); } return res; diff --git a/mythtv/libs/libmythtv/captions/teletextextractorreader.h b/mythtv/libs/libmythtv/captions/teletextextractorreader.h index dc6922fe17c..974f9ad205b 100644 --- a/mythtv/libs/libmythtv/captions/teletextextractorreader.h +++ b/mythtv/libs/libmythtv/captions/teletextextractorreader.h @@ -11,7 +11,7 @@ #include "mythtvexp.h" #include "captions/teletextreader.h" -QString decode_teletext(int codePage, const uint8_t data[40]); +QString decode_teletext(int codePage, const tt_line_array& data); class MTV_PUBLIC TeletextExtractorReader : public TeletextReader { @@ -28,7 +28,7 @@ class MTV_PUBLIC TeletextExtractorReader : public TeletextReader protected: void PageUpdated(int page, int subpage) override; // TeletextReader - void HeaderUpdated(int page, int subpage, uint8_t *page_ptr, int lang) override; // TeletextReader + void HeaderUpdated(int page, int subpage, tt_line_array& page_ptr, int lang) override; // TeletextReader private: QSet > m_updatedPages; diff --git a/mythtv/libs/libmythtv/captions/teletextreader.cpp b/mythtv/libs/libmythtv/captions/teletextreader.cpp index 400e9cd7407..55300850f28 100644 --- a/mythtv/libs/libmythtv/captions/teletextreader.cpp +++ b/mythtv/libs/libmythtv/captions/teletextreader.cpp @@ -12,9 +12,9 @@ TeletextReader::TeletextReader() { + m_bitswap.fill(0); for (int i = 0; i < 256; i++) { - m_bitswap[i] = 0; for (int bit = 0; bit < 8; bit++) if (i & (1 << bit)) m_bitswap[i] |= (1 << (7-bit)); @@ -280,7 +280,7 @@ void TeletextReader::Reset(void) mag.current_subpage = 0; mag.loadingpage.active = false; } - memset(m_header, ' ', 40); + m_header.fill(' '); m_curpage = 0x100; m_cursubpage = -1; @@ -358,21 +358,19 @@ void TeletextReader::AddPageHeader(int page, int subpage, const uint8_t *buf, m_magazines[magazine - 1].current_page = page; m_magazines[magazine - 1].current_subpage = subpage; - memset(ttpage->data, ' ', sizeof(ttpage->data)); + for (auto & line : ttpage->data) + line.fill(' '); ttpage->active = true; ttpage->subpagenum = subpage; - - for (int & flof : ttpage->floflink) - flof = 0; - + ttpage->floflink.fill(0); ttpage->lang = lang; ttpage->flags = flags; ttpage->flof = 0; ttpage->subtitle = (vbimode == VBI_DVB_SUBTITLE); - memset(ttpage->data[0], ' ', 8 * sizeof(uint8_t)); + std::fill_n(ttpage->data[0].data(), 8, ' '); if (vbimode == VBI_DVB || vbimode == VBI_DVB_SUBTITLE) { @@ -381,12 +379,12 @@ void TeletextReader::AddPageHeader(int page, int subpage, const uint8_t *buf, } else { - memcpy(ttpage->data[0]+0, buf, 40); + std::copy(buf, buf + 40, ttpage->data[0].data()); } if ( !(ttpage->flags & TP_INTERRUPTED_SEQ)) { - memcpy(m_header, ttpage->data[0], 40); + std::copy(ttpage->data[0].cbegin(), ttpage->data[0].cend(), m_header.data()); HeaderUpdated(page, subpage, ttpage->data[0],ttpage->lang); } } @@ -493,7 +491,7 @@ void TeletextReader::AddTeletextData(int magazine, int row, } else { - memcpy(ttpage->data[row], buf, 40); + std::copy(buf, buf + 40, ttpage->data[row].data()); } } @@ -511,15 +509,13 @@ void TeletextReader::PageUpdated(int page, int subpage) } void TeletextReader::HeaderUpdated( - int page, int subpage, uint8_t *page_ptr, int lang) + int page, int subpage, tt_line_array& page_ptr, int lang) { (void)page; (void)subpage; + (void)page_ptr; (void)lang; - if (page_ptr == nullptr) - return; - if (!m_curpageShowHeader) return; diff --git a/mythtv/libs/libmythtv/captions/teletextreader.h b/mythtv/libs/libmythtv/captions/teletextreader.h index 01967afaf28..9373ac3f988 100644 --- a/mythtv/libs/libmythtv/captions/teletextreader.h +++ b/mythtv/libs/libmythtv/captions/teletextreader.h @@ -3,8 +3,10 @@ #ifndef TELETEXTREADER_H #define TELETEXTREADER_H +#include #include #include +#include #include #include @@ -33,6 +35,8 @@ enum TTColor #define TP_NEWSFLASH 0x40 #define TP_SUBTITLE 0x80 +using tt_line_array = std::array; + class TeletextSubPage { public: @@ -40,9 +44,9 @@ class TeletextSubPage int subpagenum; ///< the wanted subpage int lang; ///< language code int flags; ///< misc flags - uint8_t data[25][40]; ///< page data + std::array data; ///< page data int flof; ///< page has FastText links - int floflink[6]; ///< FastText links (FLOF) + std::array floflink; ///< FastText links (FLOF) bool subtitle; ///< page is subtitle page bool active; ///< data has arrived since page last cleared }; @@ -93,7 +97,7 @@ class TeletextReader int GetPageInput(uint num) const { return m_pageinput[num]; } TeletextSubPage* FindSubPage(void) { return FindSubPage(m_curpage, m_cursubpage); } - uint8_t* GetHeader(void) { return m_header; } + tt_line_array GetHeader(void) { return m_header; } // Decoder methods void AddPageHeader(int page, int subpage, const uint8_t *buf, @@ -104,7 +108,7 @@ class TeletextReader protected: virtual void PageUpdated(int page, int subpage); virtual void HeaderUpdated( - int page, int subpage, uint8_t *page_ptr, int lang); + int page, int subpage, tt_line_array& page_ptr, int lang); const TeletextSubPage *FindSubPage(int page, int subpage, int dir=0) const { return FindSubPageInternal(page, subpage, dir); } @@ -128,14 +132,14 @@ class TeletextReader int m_cursubpage {-1}; bool m_curpageShowHeader {true}; bool m_curpageIsSubtitle {false}; - int m_pageinput[3] {0}; + std::array m_pageinput {0}; bool m_transparent {false}; bool m_revealHidden {false}; - uint8_t m_header[40] {0}; + tt_line_array m_header {0}; bool m_headerChanged {false}; bool m_pageChanged {false}; - TeletextMagazine m_magazines[8] { }; - unsigned char m_bitswap[256] {}; + std::array m_magazines {}; + std::array m_bitswap {}; int m_fetchpage {0}; int m_fetchsubpage {0}; }; diff --git a/mythtv/libs/libmythtv/captions/teletextscreen.cpp b/mythtv/libs/libmythtv/captions/teletextscreen.cpp index c6dbe87f8c1..63d930821d6 100644 --- a/mythtv/libs/libmythtv/captions/teletextscreen.cpp +++ b/mythtv/libs/libmythtv/captions/teletextscreen.cpp @@ -195,7 +195,7 @@ void TeletextScreen::Pulse(void) if (!ttpage) { // no page selected so show the header and a list of available pages - DrawHeader(nullptr, 0); + DrawHeader({}, 0); m_teletextReader->SetPageChanged(false); OptimiseDisplayedArea(); return; @@ -253,12 +253,12 @@ void TeletextScreen::Reset(void) m_teletextReader->Reset(); } -void TeletextScreen::DrawHeader(const uint8_t *page, int lang) +void TeletextScreen::DrawHeader(const tt_line_array& page, int lang) { if (!m_displaying) return; - if (page != nullptr) + if (!page.empty()) DrawLine(page, 1, lang); DrawStatus(); @@ -317,7 +317,7 @@ void TeletextScreen::SetBackgroundColor(int ttcolor) 0x00 : gTTBackgroundAlpha); } -void TeletextScreen::DrawLine(const uint8_t *page, uint row, int lang) +void TeletextScreen::DrawLine(const tt_line_array& page, uint row, int lang) { unsigned char last_ch = ' '; diff --git a/mythtv/libs/libmythtv/captions/teletextscreen.h b/mythtv/libs/libmythtv/captions/teletextscreen.h index 9ff149b53c9..2c2bd35c46c 100644 --- a/mythtv/libs/libmythtv/captions/teletextscreen.h +++ b/mythtv/libs/libmythtv/captions/teletextscreen.h @@ -35,8 +35,8 @@ class TeletextScreen: public MythScreenType void DrawRect(int row, QRect rect); void DrawCharacter(int x, int y, QChar ch, bool doubleheight = false); void DrawMosaic(int x, int y, int code, bool doubleheight); - void DrawLine(const uint8_t *page, uint row, int lang); - void DrawHeader(const uint8_t *page, int lang); + void DrawLine(const tt_line_array& page, uint row, int lang); + void DrawHeader(const tt_line_array &page, int lang); void DrawStatus(void); void DrawPage(void); diff --git a/mythtv/libs/libmythtv/captions/vbi608extractor.cpp b/mythtv/libs/libmythtv/captions/vbi608extractor.cpp index ce0f9bbb6a6..0c22e1af621 100644 --- a/mythtv/libs/libmythtv/captions/vbi608extractor.cpp +++ b/mythtv/libs/libmythtv/captions/vbi608extractor.cpp @@ -376,7 +376,7 @@ bool VBI608Extractor::ExtractCC34(const unsigned char *buf, uint width) return false; } -uint VBI608Extractor::FillCCData(uint8_t cc_data[8]) const +uint VBI608Extractor::FillCCData(cc608_data &cc_data) const { uint cc_count = 0; if (m_code[0] != UINT16_MAX) diff --git a/mythtv/libs/libmythtv/captions/vbi608extractor.h b/mythtv/libs/libmythtv/captions/vbi608extractor.h index b2542e08f09..6f077454183 100644 --- a/mythtv/libs/libmythtv/captions/vbi608extractor.h +++ b/mythtv/libs/libmythtv/captions/vbi608extractor.h @@ -20,12 +20,15 @@ #ifndef VBI_608_EXTRACTOR_H #define VBI_608_EXTRACTOR_H +#include #include #include #include "mythframe.h" +using cc608_data = std::array; + class VBI608Extractor { public: @@ -38,7 +41,7 @@ class VBI608Extractor bool ExtractCC12(const unsigned char *buf, uint width); bool ExtractCC34(const unsigned char *buf, uint width); - uint FillCCData(uint8_t cc_data[8]) const; + uint FillCCData(cc608_data &cc_data) const; private: float GetClockStart(void) const { return m_start; } @@ -51,7 +54,7 @@ class VBI608Extractor QList m_minimas; float m_start {0.0F}; float m_rate {0.0F}; - uint16_t m_code[2] {UINT16_MAX, UINT16_MAX}; + std::array m_code {UINT16_MAX, UINT16_MAX}; }; #endif // VBI_608_EXTRACTOR_H diff --git a/mythtv/libs/libmythtv/captions/xine_demux_sputext.cpp b/mythtv/libs/libmythtv/captions/xine_demux_sputext.cpp index 8251174ec88..ce248561ac9 100644 --- a/mythtv/libs/libmythtv/captions/xine_demux_sputext.cpp +++ b/mythtv/libs/libmythtv/captions/xine_demux_sputext.cpp @@ -32,6 +32,7 @@ #include "config.h" #endif +#include #include #include #include @@ -121,7 +122,7 @@ static char *read_line_from_input(demux_sputext_t *demuxstr, char *line, off_t l static subtitle_t *sub_read_line_sami(demux_sputext_t *demuxstr, subtitle_t *current) { - static char s_line[LINE_LEN + 1]; + static std::array s_line; static char *s_s = nullptr; char text[LINE_LEN + 1]; @@ -132,7 +133,7 @@ static subtitle_t *sub_read_line_sami(demux_sputext_t *demuxstr, subtitle_t *cur /* read the first line */ if (!s_s) - if (!(s_s = read_line_from_input(demuxstr, s_line, LINE_LEN))) return nullptr; + if (!(s_s = read_line_from_input(demuxstr, s_line.data(), LINE_LEN))) return nullptr; do { switch (state) { @@ -183,7 +184,7 @@ static subtitle_t *sub_read_line_sami(demux_sputext_t *demuxstr, subtitle_t *cur } /* read next line */ - if (state != 99 && !(s_s = read_line_from_input (demuxstr, s_line, LINE_LEN))) + if (state != 99 && !(s_s = read_line_from_input (demuxstr, s_line.data(), LINE_LEN))) return nullptr; } while (state != 99); diff --git a/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp b/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp index ae13ffde135..77421b441ac 100644 --- a/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp +++ b/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp @@ -2927,7 +2927,7 @@ void AvFormatDecoder::UpdateCaptionTracksFromStreams( bool check_608, bool check_708) { bool need_change_608 = false; - bool seen_608[4]; + CC608Seen seen_608; if (check_608) { m_ccd608->GetServices(15/*seconds*/, seen_608); @@ -2939,7 +2939,7 @@ void AvFormatDecoder::UpdateCaptionTracksFromStreams( } bool need_change_708 = false; - bool seen_708[64]; + cc708_seen_flags seen_708; if (check_708 || need_change_608) { m_ccd708->services(15/*seconds*/, seen_708); diff --git a/mythtv/libs/libmythtv/mythccextractorplayer.cpp b/mythtv/libs/libmythtv/mythccextractorplayer.cpp index 624a1dc728d..5e00ceac594 100644 --- a/mythtv/libs/libmythtv/mythccextractorplayer.cpp +++ b/mythtv/libs/libmythtv/mythccextractorplayer.cpp @@ -535,7 +535,7 @@ static QStringList to_string_list(const TeletextSubPage &subPage) { QStringList content; // Skip the page header (line 0) - for (int i = 1; i < 25; ++i) + for (size_t i = 1; i < subPage.data.size(); ++i) { QString str = decode_teletext(subPage.lang, subPage.data[i]).trimmed(); if (!str.isEmpty())