aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-10-23 20:12:00 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-10-23 20:12:00 +0000
commitad5b517b4648c91ec34936ac5eba7cde4c34bb31 (patch)
treef0466649d5b63f5bfebdceedc8efc7378842d6e3 /lib
parent92456d9542585d58e011fa4f0b501de3ef9c1819 (diff)
downloadenigma2-ad5b517b4648c91ec34936ac5eba7cde4c34bb31.tar.gz
enigma2-ad5b517b4648c91ec34936ac5eba7cde4c34bb31.zip
more work on dvb subtitles (not finished/working yet)
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/pmt.cpp2
-rw-r--r--lib/dvb/subtitle.cpp38
-rw-r--r--lib/dvb/subtitle.h11
-rw-r--r--lib/service/servicedvb.cpp13
-rw-r--r--lib/service/servicedvb.h1
5 files changed, 50 insertions, 15 deletions
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<void, const eDVBSubtitleRegion&> &slot, ePtr<eConnection> &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<iDVBPESReader> m_pes_reader;
ePtr<eConnection> m_read_connection;
pts_t show_time;
+ Signal1<void,const eDVBSubtitleRegion&> m_new_subtitle_region;
public:
eDVBSubtitleParser(iDVBDemux *demux);
virtual ~eDVBSubtitleParser();
int start(int pid);
+ void connectNewRegion(const Slot1<void, const eDVBSubtitleRegion&> &slot, ePtr<eConnection> &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<eDVBSubtitleParser> m_subtitle_parser;
void newDVBSubtitleRegion(const eDVBSubtitleRegion &p);
ePtr<eConnection> m_new_dvb_subtitle_region_connection;
eTimer m_dvb_subtitle_sync_timer;