From: Andreas Monzner Date: Sat, 4 Nov 2006 22:37:00 +0000 (+0000) Subject: small code optimize X-Git-Tag: 2.6.0~2760 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/6dff5d54702aa6ed8d2c8e3b8e1ddee19b38447d small code optimize take care of "box start" and "box end" esc sequences (this fixes displaying trash characters as subtitle chars) --- diff --git a/lib/dvb/teletext.cpp b/lib/dvb/teletext.cpp index 475a322f..cafd8910 100644 --- a/lib/dvb/teletext.cpp +++ b/lib/dvb/teletext.cpp @@ -121,7 +121,7 @@ eDVBTeletextParser::eDVBTeletextParser(iDVBDemux *demux) { setStreamID(0xBD); /* as per en 300 472 */ - setPageAndMagazine(0,0); + setPageAndMagazine(-1, -1); if (demux->createPESReader(eApp, m_pes_reader)) eDebug("failed to create teletext subtitle PES reader!"); @@ -212,7 +212,7 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len) m_page_open = 0; } - if ((C & (1<<6)) && (X != 0xFF)) /* scan for pages with subtitle bit set */ + if ((C & (1<<6)) && (X != 0xFF) && !(C & (1<<5))) /* scan for pages with subtitle bit set */ { eDVBServicePMTHandler::subtitleStream s; s.pid = m_pid; @@ -229,6 +229,7 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len) m_subtitle_page.m_C = C; m_subtitle_page.m_Y = Y; m_page_open = 1; + m_box_open = 0; handleLine(data + 8, 32); } } else if (Y < 26) // directly displayable packet @@ -237,14 +238,19 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len) if (M == m_page_M && m_page_open) { m_subtitle_page.m_Y = Y; + m_box_open = 0; handleLine(data, 40); } + } else if (Y > 29) + { } -/* else + else if (m_page_open) { - if (M == m_page_M && m_page_open) - eDebug("ignore packet %d, designation code %d", Y, decode_hamming_84(data)); - }*/ + if (M == m_page_M) + eDebug("ignore packet X/%d/%d", Y, decode_hamming_84(data)); + else + eDebug("ignore packet M/%d/%d", Y, decode_hamming_84(data)); + } } } @@ -288,10 +294,23 @@ void eDVBTeletextParser::handleLine(unsigned char *data, int len) return; } - int last_was_white = 1, color = 7; /* start with whitespace. start with color=white. (that's unrelated.) */ - - std::string text; - + int last_was_white = 1, color = 1; /* start with whitespace. start with color=white. (that's unrelated.) */ + + static unsigned char out[128]; + + int outidx = 0, + Gtriplet = 0, + nat_opts = (m_subtitle_page.m_C & (1<<14) ? 1 : 0) | + (m_subtitle_page.m_C & (1<<13) ? 2 : 0) | + (m_subtitle_page.m_C & (1<<12) ? 4 : 0), + nat_subset = NationalOptionSubsetsLookup[Gtriplet*8+nat_opts]; +/* eDebug("nat_opts = %d, nat_subset = %d, C121314 = %d%d%d, m_C %08x", + nat_opts, nat_subset, + (m_subtitle_page.m_C & (1<<12))?1:0, + (m_subtitle_page.m_C & (1<<13))?1:0, + (m_subtitle_page.m_C & (1<<14))?1:0, + m_subtitle_page.m_C); */ + // eDebug("handle subtitle line: %d len", len); for (int i=0; i1) { //eDebugNoNewLine("%c", b); /* no more than one whitespace, only printable chars */ if (((!last_was_white) || (b != ' ')) && (b >= 0x20)) { - text += b; + unsigned char offs = NationalReplaceMap[b]; + if (offs) + { + unsigned int utf8_code = + NationalOptionSubsets[nat_subset*14+offs]; + if (utf8_code > 0xFFFFFF) + out[outidx++]=(utf8_code&0xFF000000)>>24; + if (utf8_code > 0xFFFF) + out[outidx++]=(utf8_code&0xFF0000)>>16; + if (utf8_code > 0xFF) + out[outidx++]=(utf8_code&0xFF00)>>8; + out[outidx++]=utf8_code&0xFF; + } + else + out[outidx++] = b; last_was_white = b == ' '; } } } //eDebug(""); - addSubtitleString(color, text); + addSubtitleString(color, std::string((const char*)out, outidx)); } void eDVBTeletextParser::handlePageEnd(int have_pts, const pts_t &pts) @@ -346,8 +383,12 @@ void eDVBTeletextParser::setPageAndMagazine(int page, int magazine) eDebug("enable teletext subtitle page %x%02x", magazine, page); else eDebug("disable teletext subtitles"); - m_page_M = magazine&7; /* magazine to look for */ - m_page_X = page&0xFF; /* page number */ + m_page_M = magazine; /* magazine to look for */ + if (magazine != -1) + m_page_M &= 7; + m_page_X = page; /* page number */ + if (page != -1) + m_page_X &= 0xFF; } void eDVBTeletextParser::connectNewPage(const Slot1 &slot, ePtr &connection) @@ -358,7 +399,6 @@ void eDVBTeletextParser::connectNewPage(const Slot1= 0x20) - { - unsigned char offs = NationalReplaceMap[c]; - if (offs) - { - unsigned int utf8_code = - NationalOptionSubsets[nat_subset*14+offs]; - if (utf8_code > 0xFFFFFF) - out[outidx++]=(utf8_code&0xFF000000)>>24; - if (utf8_code > 0xFFFF) - out[outidx++]=(utf8_code&0xFF0000)>>16; - if (utf8_code > 0xFF) - out[outidx++]=(utf8_code&0xFF00)>>8; - out[outidx++]=utf8_code&0xFF; - } - else - out[outidx++] = c; - } - ++idx; - } - // eDebug("color %d, m_subtitle_color %d", color, m_subtitle_color); gRGB rgbcol((color & 1) ? 255 : 128, (color & 2) ? 255 : 128, (color & 4) ? 255 : 128); - if ((color != m_subtitle_color || force_cell) && !m_subtitle_text.empty() && ((color == -2) || outidx)) + if ((color != m_subtitle_color || force_cell) && !m_subtitle_text.empty() && ((color == -2) || !string.empty())) { // eDebug("add text |%s|: %d != %d || %d", m_subtitle_text.c_str(), color, m_subtitle_color, force_cell); m_subtitle_page.m_elements.push_back(eDVBTeletextSubtitlePageElement(rgbcol, m_subtitle_text)); @@ -415,18 +417,22 @@ void eDVBTeletextParser::addSubtitleString(int color, std::string string) } else if (!m_subtitle_text.empty() && m_subtitle_text[m_subtitle_text.size()-1] != ' ') m_subtitle_text += " "; - if (outidx) + if (!string.empty()) { // eDebug("set %d as new color", color); m_subtitle_color = color; - m_subtitle_text += std::string((const char*)out, outidx); + m_subtitle_text += string; } } void eDVBTeletextParser::sendSubtitlePage() { // eDebug("subtitle page:"); - //for (unsigned int i = 0; i < m_subtitle_page.m_elements.size(); ++i) - // eDebug("%s", m_subtitle_page.m_elements[i].m_text.c_str()); - m_new_subtitle_page(m_subtitle_page); + bool empty=true; + if (empty) + for (unsigned int i = 0; i < m_subtitle_page.m_elements.size(); ++i) + if (!m_subtitle_page.m_elements[i].m_text.empty()) + empty=false; + if (!empty) + m_new_subtitle_page(m_subtitle_page); } diff --git a/lib/dvb/teletext.h b/lib/dvb/teletext.h index 108c2da3..de9679a3 100644 --- a/lib/dvb/teletext.h +++ b/lib/dvb/teletext.h @@ -48,7 +48,7 @@ private: eDVBTeletextSubtitlePage m_subtitle_page; - int m_pid, m_page_M, m_page_X, m_page_open, m_double_height; + int m_pid, m_page_M, m_page_X, m_page_open, m_double_height, m_box_open; void handlePageStart(); void handleLine(unsigned char *line, int len);