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;
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++;
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);
}
}
-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];
{
col = 0;
len = 1;
- } else if (code&2)
+ } else if (code&2)
{
if (code&1)
len = 3 + 4 + bitstream_get(&bit);
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)
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)
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;
// TODO fill region->surface->clut !!!!!
}
// TODO Blit Region Pixmap !!!
+ eDebug("blit region");
}
else
eDebug("region not found");
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));
+}
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
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;
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;
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)
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);
void eDVBServicePlay::newDVBSubtitleRegion(const eDVBSubtitleRegion &p)
{
+ eDebug("new dvb subtitle region");
}
void eDVBServicePlay::checkDvbSubtitleTiming()
{
+ eDebug("check dvb subtitle timing");
}
int eDVBServicePlay::getAC3Delay()
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;