diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-10-30 16:04:21 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-10-30 16:04:21 +0000 |
| commit | 0e3e7773e5d8e7ff159316db3de7fcfad57bb9e8 (patch) | |
| tree | 5c63acbc6e8d531d01b0ab8bf016f7b5ce08f4eb /lib/dvb | |
| parent | 59567589c05c2756dcf779cc24aa86becd63a68c (diff) | |
| download | enigma2-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.cpp | 28 | ||||
| -rw-r--r-- | lib/dvb/pmt.h | 25 | ||||
| -rw-r--r-- | lib/dvb/subtitle.cpp | 29 | ||||
| -rw-r--r-- | lib/dvb/subtitle.h | 7 | ||||
| -rw-r--r-- | lib/dvb/teletext.cpp | 33 | ||||
| -rw-r--r-- | lib/dvb/teletext.h | 10 |
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); |
