From: Andreas Monzner Date: Mon, 23 Oct 2006 20:12:00 +0000 (+0000) Subject: more work on dvb subtitles (not finished/working yet) X-Git-Tag: 2.6.0~2855 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/ad5b517b4648c91ec34936ac5eba7cde4c34bb31 more work on dvb subtitles (not finished/working yet) --- diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index ccc77960..2ab6777f 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -245,6 +245,8 @@ 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); program.subtitleStreams.push_back(s); } break; diff --git a/lib/dvb/subtitle.cpp b/lib/dvb/subtitle.cpp index 5510997b..e6ca65cd 100644 --- a/lib/dvb/subtitle.cpp +++ b/lib/dvb/subtitle.cpp @@ -33,7 +33,7 @@ int bitstream_get(struct bitstream *bit) return val; } -static int extract_pts(pts_t &pts, const __u8 *pkt) +static int extract_pts(pts_t &pts, __u8 *pkt) { pkt += 7; int flags = *pkt++; @@ -54,7 +54,7 @@ static int extract_pts(pts_t &pts, const __u8 *pkt) return -1; } -void eDVBSubtitleParser::subtitle_process_line(struct subtitle_page *page, int object_id, int line, const __u8 *data, int len) +void eDVBSubtitleParser::subtitle_process_line(struct subtitle_page *page, int object_id, int line, __u8 *data, int len) { struct subtitle_region *region = page->regions; // eDebug("line for %d:%d", page->page_id, object_id); @@ -88,7 +88,7 @@ void eDVBSubtitleParser::subtitle_process_line(struct subtitle_page *page, int o } } -int eDVBSubtitleParser::subtitle_process_pixel_data(struct subtitle_page *page, int object_id, int *linenr, int *linep, const __u8 *data) +int eDVBSubtitleParser::subtitle_process_pixel_data(struct subtitle_page *page, int object_id, int *linenr, int *linep, __u8 *data) { int data_type = *data++; static __u8 line[720]; @@ -137,7 +137,7 @@ int eDVBSubtitleParser::subtitle_process_pixel_data(struct subtitle_page *page, { col = 0; len = 1; - } else if (code&2) + } else if (code&2) { if (code&1) len = 3 + 4 + bitstream_get(&bit); @@ -272,7 +272,7 @@ int eDVBSubtitleParser::subtitle_process_pixel_data(struct subtitle_page *page, return 0; } -int eDVBSubtitleParser::subtitle_process_segment(const __u8 *segment) +int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) { int segment_type, page_id, segment_length, processed_length; if (*segment++ != 0x0F) @@ -288,11 +288,11 @@ int eDVBSubtitleParser::subtitle_process_segment(const __u8 *segment) if (segment_type == 0xFF) return segment_length + 6; // //eDebug("have %d bytes of segment data", segment_length); - + // //eDebug("page_id %d, segtype %02x", page_id, segment_type); - + struct subtitle_page *page, **ppage; - + page = this->pages; ppage = &this->pages; while (page) @@ -726,8 +726,9 @@ int eDVBSubtitleParser::subtitle_process_segment(const __u8 *segment) return segment_length + 6; } -void eDVBSubtitleParser::subtitle_process_pes(const __u8 *pkt, int len) +void eDVBSubtitleParser::subtitle_process_pes(__u8 *pkt, int len) { + eDebug("subtitle_process_pes"); if (!extract_pts(show_time, pkt)) { pkt += 6; len -= 6; @@ -970,6 +971,7 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id) // TODO fill region->surface->clut !!!!! } // TODO Blit Region Pixmap !!! + eDebug("blit region"); } else eDebug("region not found"); @@ -987,10 +989,26 @@ eDVBSubtitleParser::eDVBSubtitleParser(iDVBDemux *demux) if (demux->createPESReader(eApp, m_pes_reader)) eDebug("failed to create dvb subtitle PES reader!"); else - m_pes_reader->connectRead(slot(*this, &eDVBSubtitleParser::subtitle_process_pes), m_read_connection); + m_pes_reader->connectRead(slot(*this, &eDVBSubtitleParser::processData), m_read_connection); } eDVBSubtitleParser::~eDVBSubtitleParser() { subtitle_reset(); } + +int eDVBSubtitleParser::start(int pid) +{ +#if 0 + eDebug("eDVBSubtitleParser::start(%04x)", pid); + if (m_pes_reader) + return m_pes_reader->start(pid); + else + return -1; +#endif +} + +void eDVBSubtitleParser::connectNewRegion(const Slot1 &slot, ePtr &connection) +{ + connection = new eConnection(this, m_new_subtitle_region.connect(slot)); +} diff --git a/lib/dvb/subtitle.h b/lib/dvb/subtitle.h index 0d364f8a..6faad507 100644 --- a/lib/dvb/subtitle.h +++ b/lib/dvb/subtitle.h @@ -104,19 +104,22 @@ class eDVBSubtitleParser ePtr m_pes_reader; ePtr m_read_connection; pts_t show_time; + Signal1 m_new_subtitle_region; public: eDVBSubtitleParser(iDVBDemux *demux); virtual ~eDVBSubtitleParser(); int start(int pid); + void connectNewRegion(const Slot1 &slot, ePtr &connection); private: - void subtitle_process_line(struct subtitle_page *page, int object_id, int line, const __u8 *data, int len); - int subtitle_process_pixel_data(struct subtitle_page *page, int object_id, int *linenr, int *linep, const __u8 *data); - int subtitle_process_segment(const __u8 *segment); - void subtitle_process_pes(const __u8 *buffer, int len); + void subtitle_process_line(struct subtitle_page *page, int object_id, int line, __u8 *data, int len); + int subtitle_process_pixel_data(struct subtitle_page *page, int object_id, int *linenr, int *linep, __u8 *data); + int subtitle_process_segment(__u8 *segment); + void subtitle_process_pes(__u8 *buffer, int len); void subtitle_clear_screen(); void subtitle_redraw_all(); void subtitle_reset(); void subtitle_redraw(int page_id); + void processPESPacket(__u8 *pkt, int len) { subtitle_process_pes(pkt, len); } }; #endif diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index b63420ae..9da276e5 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -1640,9 +1640,11 @@ void eDVBServicePlay::switchToLive() m_decode_demux = 0; m_teletext_parser = 0; m_radiotext_parser = 0; + m_subtitle_parser = 0; + m_new_dvb_subtitle_region_connection = 0; m_new_subtitle_page_connection = 0; m_radiotext_updated_connection = 0; - + /* free the timeshift service handler, we need the resources */ m_service_handler_timeshift.free(); m_timeshift_active = 0; @@ -1661,7 +1663,9 @@ void eDVBServicePlay::switchToTimeshift() m_decoder = 0; m_teletext_parser = 0; m_radiotext_parser = 0; + m_subtitle_parser = 0; m_new_subtitle_page_connection = 0; + m_new_dvb_subtitle_region_connection = 0; m_radiotext_updated_connection = 0; m_timeshift_active = 1; @@ -1751,6 +1755,8 @@ void eDVBServicePlay::updateDecoder() m_teletext_parser = new eDVBTeletextParser(m_decode_demux); m_teletext_parser->connectNewPage(slot(*this, &eDVBServicePlay::newSubtitlePage), m_new_subtitle_page_connection); #endif + m_subtitle_parser = new eDVBSubtitleParser(m_decode_demux); + m_subtitle_parser->connectNewRegion(slot(*this, &eDVBServicePlay::newDVBSubtitleRegion), m_new_dvb_subtitle_region_connection); } if (m_decoder) @@ -1813,6 +1819,9 @@ void eDVBServicePlay::updateDecoder() if (m_teletext_parser) m_teletext_parser->start(tpid); + if (m_subtitle_parser && program.subtitleStreams.size() > 0) + m_subtitle_parser->start(program.subtitleStreams[0].pid); + if (!m_is_primary) m_decoder->setTrickmode(1); @@ -2077,10 +2086,12 @@ void eDVBServicePlay::checkSubtitleTiming() void eDVBServicePlay::newDVBSubtitleRegion(const eDVBSubtitleRegion &p) { + eDebug("new dvb subtitle region"); } void eDVBServicePlay::checkDvbSubtitleTiming() { + eDebug("check dvb subtitle timing"); } int eDVBServicePlay::getAC3Delay() diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 3f133d69..d55cdd85 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -250,6 +250,7 @@ private: void checkSubtitleTiming(); /* dvb subtitles */ + ePtr m_subtitle_parser; void newDVBSubtitleRegion(const eDVBSubtitleRegion &p); ePtr m_new_dvb_subtitle_region_connection; eTimer m_dvb_subtitle_sync_timer;