From 95c570d26ce81e3dd1e0610ff6c5c0b34d75ba5a Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 1 Nov 2006 14:33:57 +0000 Subject: [PATCH] store subtitle data in service cache and reenable subtitles on next zap to the same service --- lib/dvb/idvb.h | 3 +- lib/python/Screens/InfoBarGenerics.py | 28 +++++++++-------- lib/python/Screens/Subtitles.py | 3 +- lib/service/iservice.h | 1 + lib/service/servicedvb.cpp | 43 +++++++++++++++++++++++++-- lib/service/servicedvb.h | 1 + 6 files changed, 62 insertions(+), 17 deletions(-) diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 46d3e5d6..1f8aebda 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -235,7 +235,8 @@ public: enum cacheID { cVPID, cAPID, cTPID, cPCRPID, cAC3PID, - cVTYPE, cACHANNEL, cAC3DELAY, cPCMDELAY, cacheMax + cVTYPE, cACHANNEL, cAC3DELAY, cPCMDELAY, + cSUBTITLE, cacheMax }; int getCacheEntry(cacheID); diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index b69ef4e1..a85bcc97 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -1750,14 +1750,24 @@ class InfoBarSubtitleSupport(object): self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evStart: self.__serviceStarted, + iPlayableService.evUpdatedInfo: self.__updatedInfo }) def __serviceStarted(self): - # reenable if it was enabled - r = self.__subtitles_enabled + self.cached_subtitle_checked = False + self.subtitle_window.hide() self.__subtitles_enabled = False - self.__selected_subtitle = None - self.setSubtitlesEnable(r) + + def __updatedInfo(self): + if not self.cached_subtitle_checked: + subtitle = self.getCurrentServiceSubtitle() + self.cached_subtitle_checked = True + if subtitle: + self.__selected_subtitle = subtitle.getCachedSubtitle() + if self.__selected_subtitle: + subtitle.enableSubtitles(self.subtitle_window.instance, self.selected_subtitle) + self.subtitle_window.show() + self.__subtitles_enabled = True def getCurrentServiceSubtitle(self): service = self.session.nav.getCurrentService() @@ -1773,17 +1783,11 @@ class InfoBarSubtitleSupport(object): else: if subtitle: subtitle.disableSubtitles(self.subtitle_window.instance) - - self.subtitle_window.hide() self.__subtitles_enabled = False + self.subtitle_window.hide() def setSelectedSubtitle(self, subtitle): - if self.__selected_subtitle != subtitle and self.subtitles_enabled: - # kick - self.__selected_subtitle = subtitle - self.__serviceStarted() - else: - self.__selected_subtitle = subtitle + self.__selected_subtitle = subtitle subtitles_enabled = property(lambda self: self.__subtitles_enabled, setSubtitlesEnable) selected_subtitle = property(lambda self: self.__selected_subtitle, setSelectedSubtitle) diff --git a/lib/python/Screens/Subtitles.py b/lib/python/Screens/Subtitles.py index 6a1deedb..d72ea336 100644 --- a/lib/python/Screens/Subtitles.py +++ b/lib/python/Screens/Subtitles.py @@ -25,7 +25,7 @@ class Subtitles(Screen, ConfigListScreen): else: sel = None for x in self.getSubtitleList(): - if sel and sel == x: + if sel and sel[:4] == x[:4]: #ignore Language code in compare text = _("Running") else: text = _("Enable") @@ -50,7 +50,6 @@ class Subtitles(Screen, ConfigListScreen): def enableSubtitle(self, subtitles): if self.infobar.selected_subtitle != subtitles: - print "enable subtitles", subtitles self.infobar.subtitles_enabled = False self.infobar.selected_subtitle = subtitles self.infobar.subtitles_enabled = True diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 73d35eed..71c82ab0 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -476,6 +476,7 @@ public: virtual RESULT enableSubtitles(eWidget *parent, PyObject *entry)=0; virtual RESULT disableSubtitles(eWidget *parent)=0; virtual PyObject *getSubtitleList()=0; + virtual PyObject *getCachedSubtitle()=0; }; TEMPLATE_TYPEDEF(ePtr, iSubtitleOutputPtr); diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index e6a21439..5a6ea0cd 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -2013,7 +2013,7 @@ RESULT eDVBServicePlay::enableSubtitles(eWidget *parent, PyObject *tuple) if (type == 1) // teletext subtitles { - int page, magazine; + int page, magazine, pid; if (tuplesize < 4) goto error_out; @@ -2023,7 +2023,11 @@ RESULT eDVBServicePlay::enableSubtitles(eWidget *parent, PyObject *tuple) return -1; } - // PyTuple_GET_ITEM(tuple, 1); //we dont need pid yet + entry = PyTuple_GET_ITEM(tuple, 1); + if (!PyInt_Check(entry)) + goto error_out; + pid = PyInt_AsLong(entry); + entry = PyTuple_GET_ITEM(tuple, 2); if (!PyInt_Check(entry)) goto error_out; @@ -2037,6 +2041,8 @@ RESULT eDVBServicePlay::enableSubtitles(eWidget *parent, PyObject *tuple) m_subtitle_widget = new eSubtitleWidget(parent); m_subtitle_widget->resize(parent->size()); /* full size */ m_teletext_parser->setPageAndMagazine(page, magazine); + if (m_dvb_service) + m_dvb_service->setCacheEntry(eDVBService::cSUBTITLE,((pid&0xFFFF)<<16)|((page&0xFF)<<8)|(magazine&0xFF)); } else if (type == 0) { @@ -2067,6 +2073,8 @@ RESULT eDVBServicePlay::enableSubtitles(eWidget *parent, PyObject *tuple) m_subtitle_widget = new eSubtitleWidget(parent); m_subtitle_widget->resize(parent->size()); /* full size */ m_subtitle_parser->start(pid, composition_page_id, ancillary_page_id); + if (m_dvb_service) + m_dvb_service->setCacheEntry(eDVBService::cSUBTITLE, ((pid&0xFFFF)<<16)|((composition_page_id&0xFF)<<8)|(ancillary_page_id&0xFF)); } else goto error_out; @@ -2092,9 +2100,40 @@ RESULT eDVBServicePlay::disableSubtitles(eWidget *parent) m_teletext_parser->setPageAndMagazine(0,0); m_subtitle_pages.clear(); } + if (m_dvb_service) + m_dvb_service->setCacheEntry(eDVBService::cSUBTITLE, -1); return 0; } +PyObject *eDVBServicePlay::getCachedSubtitle() +{ + if (m_dvb_service) + { + int tmp = m_dvb_service->getCacheEntry(eDVBService::cSUBTITLE); + if (tmp != -1) + { + unsigned int data = (unsigned int)tmp; + int pid = (data&0xFFFF0000)>>16; + PyObject *tuple = PyTuple_New(4); + eDVBServicePMTHandler::program program; + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + if (!h.getProgramInfo(program)) + { + if (program.textPid==pid) // teletext + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(1)); // type teletext + else + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0)); // type dvb + PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong((data&0xFFFF0000)>>16)); // pid + PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong((data&0xFF00)>>8)); // composition_page / page + PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(data&0xFF)); // ancillary_page / magazine + return tuple; + } + } + } + Py_INCREF(Py_None); + return Py_None; +} + PyObject *eDVBServicePlay::getSubtitleList() { if (!m_teletext_parser) diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 62d34169..5e0cf0b4 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -158,6 +158,7 @@ public: RESULT enableSubtitles(eWidget *parent, PyObject *entry); RESULT disableSubtitles(eWidget *parent); PyObject *getSubtitleList(); + PyObject *getCachedSubtitle(); // iAudioDelay int getAC3Delay(); -- 2.30.2