aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-10-30 16:04:21 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-10-30 16:04:21 +0000
commit0e3e7773e5d8e7ff159316db3de7fcfad57bb9e8 (patch)
tree5c63acbc6e8d531d01b0ab8bf016f7b5ce08f4eb /lib/dvb
parent59567589c05c2756dcf779cc24aa86becd63a68c (diff)
downloadenigma2-0e3e7773e5d8e7ff159316db3de7fcfad57bb9e8.tar.gz
enigma2-0e3e7773e5d8e7ff159316db3de7fcfad57bb9e8.zip
move subtitles selection to mainmenu, some subtitle fixes
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/pmt.cpp28
-rw-r--r--lib/dvb/pmt.h25
-rw-r--r--lib/dvb/subtitle.cpp29
-rw-r--r--lib/dvb/subtitle.h7
-rw-r--r--lib/dvb/teletext.cpp33
-rw-r--r--lib/dvb/teletext.h10
6 files changed, 93 insertions, 39 deletions
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index 2ab6777f..bdb10b18 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -13,6 +13,7 @@
#include <dvbsi++/iso639_language_descriptor.h>
#include <dvbsi++/stream_identifier_descriptor.h>
#include <dvbsi++/subtitling_descriptor.h>
+#include <dvbsi++/teletext_descriptor.h>
eDVBServicePMTHandler::eDVBServicePMTHandler()
:m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF)
@@ -245,15 +246,36 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
s.composition_page_id = (*it)->getCompositionPageId();
s.ancillary_page_id = (*it)->getAncillaryPageId();
s.language_code = (*it)->getIso639LanguageCode();
- eDebug("add subtitle %s PID %04x, type %d, composition page %d, ancillary_page %d",
- s.language_code.c_str(), s.pid, s.subtitling_type, s.composition_page_id, s.ancillary_page_id);
+// eDebug("add dvb subtitle %s PID %04x, type %d, composition page %d, ancillary_page %d",
+// s.language_code.c_str(), s.pid, s.subtitling_type, s.composition_page_id, s.ancillary_page_id);
program.subtitleStreams.push_back(s);
}
break;
}
case TELETEXT_DESCRIPTOR:
if ( program.textPid == -1 || (*es)->getPid() == cached_tpid )
- program.textPid = (*es)->getPid();
+ {
+ subtitleStream s;
+ s.subtitling_type = 0x01; // EBU TELETEXT SUBTITLES
+ s.pid = program.textPid = (*es)->getPid();
+ TeletextDescriptor *d = (TeletextDescriptor*)(*desc);
+ const VbiTeletextList *list = d->getVbiTeletexts();
+ for (VbiTeletextConstIterator it(list->begin()); it != list->end(); ++it)
+ {
+ switch((*it)->getTeletextType())
+ {
+ case 0x02: // Teletext subtitle page
+ case 0x05: // Teletext subtitle page for hearing impaired pepople
+ s.language_code = (*it)->getIso639LanguageCode();
+ s.teletext_page_number = (*it)->getTeletextPageNumber();
+ s.teletext_magazine_number = (*it)->getTeletextMagazineNumber();
+// eDebug("add teletext subtitle %s PID %04x, page number %d, magazine number %d",
+// s.language_code.c_str(), s.pid, s.teletext_page_number, s.teletext_magazine_number);
+ program.subtitleStreams.push_back(s);
+ break;
+ }
+ }
+ }
break;
case DTS_DESCRIPTOR:
isaudio = 1;
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index e5b02752..185000d9 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -117,10 +117,29 @@ public:
struct subtitleStream
{
int pid;
- int subtitling_type;
- int composition_page_id;
- int ancillary_page_id;
+ int subtitling_type; /* see ETSI EN 300 468 table 26 component_type
+ when stream_content is 0x03
+ 0x10..0x13, 0x20..0x23 is used for dvb subtitles
+ 0x01 is used for teletext subtitles */
+ union
+ {
+ int composition_page_id; // used for dvb subtitles
+ int teletext_page_number; // used for teletext subtitles
+ };
+ union
+ {
+ int ancillary_page_id; // used for dvb subtitles
+ int teletext_magazine_number; // used for teletext subtitles
+ };
std::string language_code;
+ bool operator<(const subtitleStream &s)
+ {
+ if (pid != s.pid)
+ return pid < s.pid;
+ if (teletext_page_number != s.teletext_page_number)
+ return teletext_page_number < s.teletext_page_number;
+ return teletext_magazine_number < s.teletext_magazine_number;
+ }
};
struct program
diff --git a/lib/dvb/subtitle.cpp b/lib/dvb/subtitle.cpp
index 0058a51c..f9666bc0 100644
--- a/lib/dvb/subtitle.cpp
+++ b/lib/dvb/subtitle.cpp
@@ -287,13 +287,15 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
segment_length |= *segment++;
if (segment_type == 0xFF)
return segment_length + 6;
+ if (page_id != m_composition_page_id && page_id != m_ancillary_page_id)
+ return segment_length + 6;
// //eDebug("have %d bytes of segment data", segment_length);
// //eDebug("page_id %d, segtype %02x", page_id, segment_type);
subtitle_page *page, **ppage;
- page = this->pages; ppage = &this->pages;
+ page = m_pages; ppage = &m_pages;
while (page)
{
@@ -727,7 +729,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
void eDVBSubtitleParser::subtitle_process_pes(__u8 *pkt, int len)
{
// eDebug("subtitle_process_pes");
- if (!extract_pts(show_time, pkt))
+ if (!extract_pts(m_show_time, pkt))
{
pkt += 6; len -= 6;
// skip PES header
@@ -770,14 +772,14 @@ void eDVBSubtitleParser::subtitle_process_pes(__u8 *pkt, int len)
void eDVBSubtitleParser::subtitle_redraw_all()
{
#if 1
- subtitle_page *page = this->pages;
+ subtitle_page *page = m_pages;
while(page)
{
subtitle_redraw(page->page_id);
page = page->next;
}
#else
- subtitle_page *page = this->pages;
+ subtitle_page *page = m_pages;
//eDebug("----------- end of display set");
//eDebug("active pages:");
while (page)
@@ -819,7 +821,7 @@ void eDVBSubtitleParser::subtitle_redraw_all()
void eDVBSubtitleParser::subtitle_reset()
{
- while (subtitle_page *page = this->pages)
+ while (subtitle_page *page = m_pages)
{
/* free page regions */
while (page->page_regions)
@@ -859,14 +861,14 @@ void eDVBSubtitleParser::subtitle_reset()
delete clut;
}
- this->pages = page->next;
+ m_pages = page->next;
delete page;
}
}
void eDVBSubtitleParser::subtitle_redraw(int page_id)
{
- subtitle_page *page = this->pages;
+ subtitle_page *page = m_pages;
//eDebug("displaying page id %d", page_id);
@@ -887,7 +889,7 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id)
subtitle_page_region *region = page->page_regions;
eDVBSubtitlePage Page;
- Page.m_show_time = show_time;
+ Page.m_show_time = m_show_time;
for (; region; region=region->next)
{
// eDebug("region %d", region->region_id);
@@ -905,8 +907,6 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id)
int x0 = region->region_horizontal_address;
int y0 = region->region_vertical_address;
- int x1 = x0 + reg->region_width;
- int y1 = y0 + reg->region_height;
if ((x0 < 0) || (y0 < 0))
{
@@ -1098,7 +1098,7 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id)
DEFINE_REF(eDVBSubtitleParser);
eDVBSubtitleParser::eDVBSubtitleParser(iDVBDemux *demux)
- :pages(0)
+ :m_pages(0)
{
setStreamID(0xBD);
@@ -1123,11 +1123,14 @@ int eDVBSubtitleParser::stop()
return -1;
}
-int eDVBSubtitleParser::start(int pid)
+int eDVBSubtitleParser::start(int pid, int composition_page_id, int ancillary_page_id)
{
if (m_pes_reader)
{
- eDebug("start dvb subtitles on pid 0x%04x", pid);
+ eDebug("start dvb subtitles on pid 0x%04x with composition_page_id %d and ancillary_page_id %d",
+ pid, composition_page_id, ancillary_page_id);
+ m_composition_page_id = composition_page_id;
+ m_ancillary_page_id = ancillary_page_id;
return m_pes_reader->start(pid);
}
return -1;
diff --git a/lib/dvb/subtitle.h b/lib/dvb/subtitle.h
index 44cdd4cb..6335a337 100644
--- a/lib/dvb/subtitle.h
+++ b/lib/dvb/subtitle.h
@@ -108,15 +108,16 @@ class eDVBSubtitleParser
:public iObject, public ePESParser, public Object
{
DECLARE_REF(eDVBSubtitleParser);
- subtitle_page *pages;
+ subtitle_page *m_pages;
ePtr<iDVBPESReader> m_pes_reader;
ePtr<eConnection> m_read_connection;
- pts_t show_time;
+ pts_t m_show_time;
Signal1<void,const eDVBSubtitlePage&> m_new_subtitle_page;
+ int m_composition_page_id, m_ancillary_page_id;
public:
eDVBSubtitleParser(iDVBDemux *demux);
virtual ~eDVBSubtitleParser();
- int start(int pid);
+ int start(int pid, int composition_page_id, int ancillary_page_id);
int stop();
void connectNewPage(const Slot1<void, const eDVBSubtitlePage&> &slot, ePtr<eConnection> &connection);
private:
diff --git a/lib/dvb/teletext.cpp b/lib/dvb/teletext.cpp
index ecfdb086..7128000d 100644
--- a/lib/dvb/teletext.cpp
+++ b/lib/dvb/teletext.cpp
@@ -135,7 +135,7 @@ eDVBTeletextParser::eDVBTeletextParser(iDVBDemux *demux)
{
setStreamID(0xBD); /* as per en 300 472 */
- setPage(-1);
+ setPageAndMagazine(0,0);
if (demux->createPESReader(eApp, m_pes_reader))
eDebug("failed to create teletext subtitle PES reader!");
@@ -228,7 +228,7 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len)
int serial_mode = m_C & (1<<11);
/* page on the same magazine? end current page. */
- if ((serial_mode || (m_M == m_page_M)) && (m_page_open))
+ if ((serial_mode || m_M == m_page_M) && m_page_open)
{
handlePageEnd(have_pts, pts);
m_page_open = 0;
@@ -237,10 +237,17 @@ 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_X != 0xFF)) /* scan for pages with subtitle bit set */
- m_found_subtitle_pages.insert((m_M << 8) | m_X);
-
+ {
+ eDVBServicePMTHandler::subtitleStream s;
+ s.pid = m_pid;
+ s.subtitling_type = 0x01; // ebu teletext subtitle
+ s.teletext_page_number = m_X & 0xFF;
+ s.teletext_magazine_number = m_M & 7;
+ m_found_subtitle_pages.insert(s);
+ }
+
/* correct page on correct magazine? open page. */
- if ((m_M == m_page_M) && (m_X == m_page_X))
+ if (m_M == m_page_M && m_X == m_page_X)
{
handlePageStart();
m_page_open = 1;
@@ -248,8 +255,8 @@ void eDVBTeletextParser::processPESPacket(__u8 *pkt, int len)
}
} else
{
- /* data for the selected page? */
- if ((m_M == m_page_M) && m_page_open)
+ /* data for the selected page ? */
+ if (m_M == m_page_M && m_page_open)
handleLine(data, 40);
}
}
@@ -260,7 +267,10 @@ int eDVBTeletextParser::start(int pid)
m_page_open = 0;
if (m_pes_reader)
+ {
+ m_pid = pid;
return m_pes_reader->start(pid);
+ }
else
return -1;
}
@@ -340,19 +350,18 @@ void eDVBTeletextParser::handlePageEnd(int have_pts, const pts_t &pts)
m_subtitle_page.m_have_pts = have_pts;
m_subtitle_page.m_pts = pts;
m_subtitle_page.m_timeout = 90000 * 20; /* 20s */
- if (m_page_number != -1)
+ if (m_page_X != 0)
sendSubtitlePage(); /* send assembled subtitle page to display */
}
-void eDVBTeletextParser::setPage(int page)
+void eDVBTeletextParser::setPageAndMagazine(int page, int magazine)
{
if (page > 0)
eDebug("enable teletext subtitle page %d", page);
else
eDebug("disable teletext subtitles");
- m_page_number = page;
- m_page_M = (page >> 8) & 7; /* magazine to look for */
- m_page_X = page & 0xFF; /* page number */
+ m_page_M = magazine&7; /* magazine to look for */
+ m_page_X = page&0xFF; /* page number */
}
void eDVBTeletextParser::connectNewPage(const Slot1<void, const eDVBTeletextSubtitlePage&> &slot, ePtr<eConnection> &connection)
diff --git a/lib/dvb/teletext.h b/lib/dvb/teletext.h
index 8c5dfa3e..fcabb90c 100644
--- a/lib/dvb/teletext.h
+++ b/lib/dvb/teletext.h
@@ -4,6 +4,7 @@
#include <lib/base/object.h>
#include <lib/dvb/idvb.h>
#include <lib/dvb/pesparse.h>
+#include <lib/dvb/pmt.h>
#include <lib/gdi/gpixmap.h>
struct eDVBTeletextSubtitlePageElement
@@ -34,11 +35,10 @@ public:
eDVBTeletextParser(iDVBDemux *demux);
virtual ~eDVBTeletextParser();
int start(int pid);
- void setPage(int page);
-
+ void setPageAndMagazine(int page, int magazine);
+ void setMagazine(int magazine);
void connectNewPage(const Slot1<void,const eDVBTeletextSubtitlePage &> &slot, ePtr<eConnection> &connection);
-
- std::set<int> m_found_subtitle_pages;
+ std::set<eDVBServicePMTHandler::subtitleStream> m_found_subtitle_pages;
private:
void processPESPacket(__u8 *pkt, int len);
@@ -49,7 +49,7 @@ private:
int m_M, m_Y, m_X, m_S1, m_S2, m_S3, m_S4, m_C;
- int m_page_number, 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;
void handlePageStart();
void handleLine(unsigned char *line, int len);