From: Andreas Monzner Date: Wed, 21 Dec 2005 20:32:51 +0000 (+0000) Subject: format, ac3 and crypted indicators now working X-Git-Tag: 2.6.0~4631 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/1a3bd31e5cfcba89f2db03a2b4fa550de1fa2823?hp=7b46919af63cfcb6adbe72d8d4183a203dfcfce7 format, ac3 and crypted indicators now working TODO: get format/aspect infos from the mpeg decoder ( EIT information is not working on every service ) --- diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index fdee5b40..6b2c835c 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -125,6 +125,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) program.videoStreams.clear(); program.audioStreams.clear(); program.pcrPid = -1; + program.isCrypted = false; if (!m_PMT.getCurrent(ptr)) { @@ -140,25 +141,29 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) ElementaryStreamInfoConstIterator es; for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es) { - int isaudio = 0, isvideo = 0; + int isaudio = 0, isvideo = 0, cadescriptors = 0; videoStream video; audioStream audio; audio.component_tag=-1; - + video.component_tag=-1; + video.pid = (*es)->getPid(); audio.pid = (*es)->getPid(); - + switch ((*es)->getType()) { case 0x01: // MPEG 1 video case 0x02: // MPEG 2 video isvideo = 1; - break; + //break; fall through !!! case 0x03: // MPEG 1 audio case 0x04: // MPEG 2 audio: - isaudio = 1; - audio.type = audioStream::atMPEG; - break; + if (!isvideo) + { + isaudio = 1; + audio.type = audioStream::atMPEG; + } + //break; fall through !!! case 0x06: // PES Private /* PES private can contain AC-3, DTS or lots of other stuff. check descriptors to get the exact type. */ @@ -168,40 +173,55 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) switch ((*desc)->getTag()) { case AC3_DESCRIPTOR: - isaudio = 1; - audio.type = audioStream::atAC3; + if (!isvideo) + { + isaudio = 1; + audio.type = audioStream::atAC3; + } + break; + case ISO_639_LANGUAGE_DESCRIPTOR: + if (!isvideo) + { + const Iso639LanguageList *languages = ((Iso639LanguageDescriptor*)*desc)->getIso639Languages(); + /* use last language code */ + for (Iso639LanguageConstIterator i(languages->begin()); i != languages->end(); ++i) + audio.language_code = (*i)->getIso639LanguageCode(); + } + break; + case STREAM_IDENTIFIER_DESCRIPTOR: + audio.component_tag = + video.component_tag = + ((StreamIdentifierDescriptor*)*desc)->getComponentTag(); + break; + case CA_DESCRIPTOR: + ++cadescriptors; break; } } break; } if (isaudio) + program.audioStreams.push_back(audio); + else if (isvideo) + program.videoStreams.push_back(video); + else + continue; + if ( cadescriptors > 0 ) + program.isCrypted=true; + } + if ( !program.isCrypted ) + { + for (DescriptorConstIterator desc = pmt.getDescriptors()->begin(); + desc != pmt.getDescriptors()->end(); ++desc) { - for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); - desc != (*es)->getDescriptors()->end(); ++desc) + switch ((*desc)->getTag()) { - switch ((*desc)->getTag()) - { - case ISO_639_LANGUAGE_DESCRIPTOR: - { - const Iso639LanguageList *languages = ((Iso639LanguageDescriptor*)*desc)->getIso639Languages(); - - /* use last language code */ - for (Iso639LanguageConstIterator i(languages->begin()); i != languages->end(); ++i) - audio.language_code = (*i)->getIso639LanguageCode(); - - break; - } - case STREAM_IDENTIFIER_DESCRIPTOR: - audio.component_tag = ((StreamIdentifierDescriptor*)*desc)->getComponentTag(); - break; - } + case CA_DESCRIPTOR: + program.isCrypted=true; + break; } - - program.audioStreams.push_back(audio); } - if (isvideo) - program.videoStreams.push_back(video); + break; } } return 0; @@ -209,8 +229,8 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) else if ( m_service && !m_service->cacheEmpty() ) { int vpid = m_service->getCachePID(eDVBService::cVPID), - apid_ac3 = m_service->getCachePID(eDVBService::cAPID), - apid_mpeg = m_service->getCachePID(eDVBService::cAC3PID), + apid_ac3 = m_service->getCachePID(eDVBService::cAC3PID), + apid_mpeg = m_service->getCachePID(eDVBService::cAPID), pcrpid = m_service->getCachePID(eDVBService::cPCRPID), cnt=0; if ( vpid != -1 ) diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index 5f3d4777..76fb442f 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -82,10 +82,11 @@ public: }; Signal1 serviceEvent; - + struct videoStream { int pid; + int component_tag; }; struct audioStream @@ -105,6 +106,7 @@ public: // ca info int pcrPid; int pmtPid; + bool isCrypted; }; int getProgramInfo(struct program &program); diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp index 45771f15..deec3739 100644 --- a/lib/nav/core.cpp +++ b/lib/nav/core.cpp @@ -43,6 +43,9 @@ void eNavigation::serviceEvent(iPlayableService* service, int event) case iPlayableService::evUpdatedEventInfo: m_event(this, evUpdatedEventInfo); break; + case iPlayableService::evUpdatedInfo: + m_event(this, evUpdatedInfo); + break; default: break; } diff --git a/lib/nav/core.h b/lib/nav/core.h index 8b9502d3..b71a0fd1 100644 --- a/lib/nav/core.h +++ b/lib/nav/core.h @@ -25,7 +25,8 @@ public: evNewService, /** a new "current" service was just started */ evPlayFailed, /** the next service (in playlist) or the one given in playService failed to play */ evPlaylistDone, /** the last service in the playlist was just played */ - evUpdatedEventInfo /** the "currently running" event info was updated */ + evUpdatedEventInfo, /** the "currently running" event info was updated */ + evUpdatedInfo /** the program info of this service was updated */ }; RESULT playService(const eServiceReference &service); diff --git a/lib/nav/pcore.cpp b/lib/nav/pcore.cpp index 3dbe7106..0ee94cc6 100644 --- a/lib/nav/pcore.cpp +++ b/lib/nav/pcore.cpp @@ -71,5 +71,8 @@ void pNavigation::navEvent(eNavigation *nav, int event) case eNavigation::evUpdatedEventInfo: m_event(evUpdatedEventInfo); break; + case eNavigation::evUpdatedInfo: + m_event(evUpdatedInfo); + break; } } diff --git a/lib/nav/pcore.h b/lib/nav/pcore.h index 20d7f94b..9d4cd00e 100644 --- a/lib/nav/pcore.h +++ b/lib/nav/pcore.h @@ -18,7 +18,8 @@ public: evNewService, /** a new "current" service was just started */ evPlayFailed, /** the next service (in playlist) or the one given in playService failed to play */ evPlaylistDone, /** the last service in the playlist was just played */ - evUpdatedEventInfo /** the "currently running" event info was updated */ + evUpdatedEventInfo, /** the "currently running" event info was updated */ + evUpdatedInfo, /** the program info of this service was updated */ }; pNavigation(); diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 85e2794f..c01cd17d 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -702,17 +702,9 @@ class InfoBarSubserviceSelection: class InfoBarAdditionalInfo: def __init__(self): - self["DolbyActive"] = PixmapConditional() - # TODO: get the info from c++ somehow - self["DolbyActive"].setConnect(lambda: False) - - self["CryptActive"] = PixmapConditional() - # TODO: get the info from c++ somehow - self["CryptActive"].setConnect(lambda: False) - - self["FormatActive"] = PixmapConditional() - # TODO: get the info from c++ somehow - self["FormatActive"].setConnect(lambda: False) + self["DolbyActive"] = Pixmap() + self["CryptActive"] = Pixmap() + self["FormatActive"] = Pixmap() self["ButtonRed"] = PixmapConditional(withTimer = False) self["ButtonRed"].setConnect(lambda: harddiskmanager.HDDCount() > 0) @@ -720,18 +712,79 @@ class InfoBarAdditionalInfo: self["ButtonRedText"] = LabelConditional(text = _("Record"), withTimer = False) self["ButtonRedText"].setConnect(lambda: harddiskmanager.HDDCount() > 0) self.onShown.append(self["ButtonRedText"].update) - - self["ButtonGreen"] = PixmapConditional() - self["ButtonGreen"].setConnect(lambda: self.session.nav.getCurrentService().subServices().getNumberOfSubservices() > 0) - self["ButtonGreenText"] = LabelConditional(text = _("Subservices")) - self["ButtonGreenText"].setConnect(lambda: self.session.nav.getCurrentService().subServices().getNumberOfSubservices() > 0) - self["ButtonYellow"] = PixmapConditional() + self["ButtonGreen"] = Pixmap() + self["ButtonGreenText"] = Label(_("Subservices")) + + self["ButtonYellow"] = PixmapConditional(withTimer = False) self["ButtonYellow"].setConnect(lambda: False) - self["ButtonBlue"] = PixmapConditional() + self["ButtonBlue"] = PixmapConditional(withTimer = False) self["ButtonBlue"].setConnect(lambda: False) + self.session.nav.event.append(self.gotServiceEvent) # we like to get service events + + def hideSubServiceIndication(self): + self["ButtonGreen"].hideWidget() + self["ButtonGreenText"].hide() + + def showSubServiceIndication(self): + self["ButtonGreen"].showWidget() + self["ButtonGreenText"].show() + + def checkFormat(self, service): + info = service.info() + if info is not None: + aspect = info.getInfo(iServiceInformation.sAspect) + if aspect in [ 3, 4, 7, 8, 0xB, 0xC, 0xF, 0x10 ]: + self["FormatActive"].showWidget() + else: + self["FormatActive"].hideWidget() + + def checkSubservices(self, service): + if service.subServices().getNumberOfSubservices() > 0: + self.showSubServiceIndication() + else: + self.hideSubServiceIndication() + + def checkDolby(self, service): + dolby = False + audio = service.audioTracks() + if audio is not None: + n = audio.getNumberOfTracks() + for x in range(n): + i = audio.getTrackInfo(x) + description = i.getDescription(); + if description.find("AC3") != -1 or description.find("DTS") != -1: + dolby = True + break + if dolby: + self["DolbyActive"].showWidget() + else: + self["DolbyActive"].hideWidget() + + def checkCrypted(self, service): + info = service.info() + if info is not None: + if info.getInfo(iServiceInformation.sIsCrypted) > 0: + self["CryptActive"].showWidget() + else: + self["CryptActive"].hideWidget() + + def gotServiceEvent(self, ev): + service = self.session.nav.getCurrentService() + if ev == pNavigation.evUpdatedEventInfo: + self.checkSubservices(service) + self.checkFormat(service) + elif ev == pNavigation.evUpdatedInfo: + self.checkCrypted(service) + self.checkDolby(service) + elif ev == pNavigation.evStopService: + self.hideSubServiceIndication() + self["CryptActive"].hideWidget() + self["DolbyActive"].hideWidget() + self["FormatActive"].hideWidget() + class InfoBarNotifications: def __init__(self): self.onExecBegin.append(self.checkNotifications) diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 8c68f902..3c3248c4 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -48,7 +48,7 @@ public: std::string path; #endif std::string getPath() { return path; } - std::string setPath( const std::string &n ) { path=n; } + void setPath( const std::string &n ) { path=n; } int getData(unsigned int num) const { diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 4b7ee85c..cad2ea08 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -618,7 +618,8 @@ void eDVBServicePlay::serviceEvent(int event) m_dvb_service->setCachePID(eDVBService::cPCRPID, pcrpid); } } - + + m_event((iPlayableService*)this, evUpdatedInfo); break; } } @@ -841,12 +842,51 @@ int eDVBServicePlay::getInfo(int w) switch (w) { + case sAspect: + if (!program.videoStreams.empty() && program.videoStreams[0].component_tag != -1) + { + ePtr evt; + if (!m_event_handler.getEvent(evt, 0)) + { + ePtr data; + if (!evt->getComponentData(data, program.videoStreams[0].component_tag)) + { + if ( data->getStreamContent() == 1 ) + { + switch(data->getComponentType()) + { + // SD + case 1: // 4:3 SD PAL + case 2: + case 3: // 16:9 SD PAL + case 4: // > 16:9 PAL + case 5: // 4:3 SD NTSC + case 6: + case 7: // 16:9 SD NTSC + case 8: // > 16:9 NTSC + + // HD + case 9: // 4:3 HD PAL + case 0xA: + case 0xB: // 16:9 HD PAL + case 0xC: // > 16:9 HD PAL + case 0xD: // 4:3 HD NTSC + case 0xE: + case 0xF: // 16:9 HD NTSC + case 0x10: // > 16:9 HD PAL + return data->getComponentType(); + } + } + } + } + } + return -1; + case sIsCrypted: return program.isCrypted; case sVideoPID: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid; case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[m_current_audio_stream].pid; case sPCRPID: return program.pcrPid; case sPMTPID: return program.pmtPid; case sTXTPID: return -1; - case sSID: return ((const eServiceReferenceDVB&)m_reference).getServiceID().get(); case sONID: return ((const eServiceReferenceDVB&)m_reference).getOriginalNetworkID().get(); case sTSID: return ((const eServiceReferenceDVB&)m_reference).getTransportStreamID().get(); diff --git a/lib/service/servicedvbrecord.h b/lib/service/servicedvbrecord.h index 17e3d166..7d5a4fb3 100644 --- a/lib/service/servicedvbrecord.h +++ b/lib/service/servicedvbrecord.h @@ -23,8 +23,8 @@ private: friend class eServiceFactoryDVB; eDVBServiceRecord(const eServiceReferenceDVB &ref); - eDVBServicePMTHandler m_service_handler; eServiceReferenceDVB m_ref; + eDVBServicePMTHandler m_service_handler; void serviceEvent(int event); ePtr m_record;