more work on dvb subtitles (not finished/working yet)
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 23 Oct 2006 20:12:00 +0000 (20:12 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 23 Oct 2006 20:12:00 +0000 (20:12 +0000)
lib/dvb/pmt.cpp
lib/dvb/subtitle.cpp
lib/dvb/subtitle.h
lib/service/servicedvb.cpp
lib/service/servicedvb.h

index ccc7796..2ab6777 100644 (file)
@@ -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;
index 5510997..e6ca65c 100644 (file)
@@ -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));
+}
index 0d364f8..6faad50 100644 (file)
@@ -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
index b63420a..9da276e 100644 (file)
@@ -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()
index 3f133d6..d55cdd8 100644 (file)
@@ -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;