aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2006-06-05 21:22:21 +0000
committerFelix Domke <tmbinc@elitedvb.net>2006-06-05 21:22:21 +0000
commit64017303b692e478a3d693a7d9e36fa075d1056a (patch)
tree25c86c09f517a613f20d06cf4e755ed582330c0c /lib
parentc389119db9c2134103d5845dca1387ad7d8367da (diff)
downloadenigma2-64017303b692e478a3d693a7d9e36fa075d1056a.tar.gz
enigma2-64017303b692e478a3d693a7d9e36fa075d1056a.zip
fix some bugs, collect subtitle pages
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/teletext.cpp20
-rw-r--r--lib/dvb/teletext.h2
2 files changed, 17 insertions, 5 deletions
diff --git a/lib/dvb/teletext.cpp b/lib/dvb/teletext.cpp
index 6f8886eb..0fa98094 100644
--- a/lib/dvb/teletext.cpp
+++ b/lib/dvb/teletext.cpp
@@ -107,7 +107,8 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len)
m_M = magazine_and_packet_address & 7;
m_Y = magazine_and_packet_address >> 3;
-// eDebug("line %d, framing code: %02x, M=%02x, Y=%02x", line_offset, framing_code, M, Y);
+
+// eDebug("line %d, framing code: %02x, M=%02x, Y=%02x", line_offset, framing_code, m_M, m_Y);
if (m_Y == 0) /* page header */
{
@@ -129,8 +130,10 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len)
m_C |= decode_hamming_84(data + 6) << 7;
m_C |= decode_hamming_84(data + 7) << 11;
+ int serial_mode = m_C & (1<<11);
+
/* page on the same magazine? end current page. */
- if ((m_M == m_page_M) && (m_page_open))
+ if ((serial_mode || (m_M == m_page_M)) && (m_page_open))
{
handlePageEnd();
m_page_open = 0;
@@ -138,6 +141,9 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len)
m_X = decode_hamming_84(data+1) * 0x10 + decode_hamming_84(data);
+ if (m_C & (1<<6))
+ m_found_subtitle_pages.insert((m_M << 8) | m_X);
+
/* correct page on correct magazine? open page. */
if ((m_M == m_page_M) && (m_X == m_page_X))
{
@@ -178,10 +184,11 @@ void eDVBTeletextParser::handleLine(unsigned char *data, int len)
if (!m_Y) /* first line is page header, we don't need that. */
return;
- int last_was_white = 1, color = -1;
+ int last_was_white = 1, color = 7; /* start with whitespace. start with color=white. (that's unrelated.) */
std::string text;
+// eDebug("handle subtitle line: %d len", len);
for (int i=0; i<len; ++i)
{
unsigned char b = decode_odd_parity(data + i);
@@ -192,8 +199,7 @@ void eDVBTeletextParser::handleLine(unsigned char *data, int len)
{
if (b != color) /* new color is split into a new string */
{
- if (color != -1)
- addSubtitleString(color, text);
+ addSubtitleString(color, text);
text = "";
color = b;
}
@@ -201,6 +207,7 @@ void eDVBTeletextParser::handleLine(unsigned char *data, int len)
/* ignore other attributes */
} else
{
+ eDebugNoNewLine("%c", b);
/* no more than one whitespace, only printable chars */
if (((!last_was_white) || (b != ' ')) && (b >= 0x20))
{
@@ -209,11 +216,13 @@ void eDVBTeletextParser::handleLine(unsigned char *data, int len)
}
}
}
+ eDebug("");
addSubtitleString(color, text);
}
void eDVBTeletextParser::handlePageEnd()
{
+ eDebug("handle page end");
addSubtitleString(-1, ""); /* end last line */
sendSubtitlePage(); /* send assembled subtitle page to display */
}
@@ -231,6 +240,7 @@ void eDVBTeletextParser::connectNewPage(const Slot1<void, const eDVBTeletextSubt
void eDVBTeletextParser::addSubtitleString(int color, const std::string &string)
{
+// eDebug("add subtitle string: %s, col %d", string.c_str(), color);
gRGB rgbcol((color & 1) ? 255 : 128, (color & 2) ? 255 : 128, (color & 4) ? 255 : 128);
if ((color != m_subtitle_color) && !m_subtitle_text.empty())
{
diff --git a/lib/dvb/teletext.h b/lib/dvb/teletext.h
index a73783ae..2fe9bb70 100644
--- a/lib/dvb/teletext.h
+++ b/lib/dvb/teletext.h
@@ -35,6 +35,8 @@ public:
void setPage(int page);
void connectNewPage(const Slot1<void,const eDVBTeletextSubtitlePage &> &slot, ePtr<eConnection> &connection);
+
+ std::set<int> m_found_subtitle_pages;
private:
void processPESPacket(__u8 *pkt, int len);