aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dvb/pmt.cpp86
-rw-r--r--lib/dvb/pmt.h4
-rw-r--r--lib/nav/core.cpp3
-rw-r--r--lib/nav/core.h3
-rw-r--r--lib/nav/pcore.cpp3
-rw-r--r--lib/nav/pcore.h3
-rw-r--r--lib/python/Screens/InfoBarGenerics.py89
-rw-r--r--lib/service/iservice.h2
-rw-r--r--lib/service/servicedvb.cpp44
-rw-r--r--lib/service/servicedvbrecord.h2
10 files changed, 181 insertions, 58 deletions
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<void,int> 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<eServiceEvent> evt;
+ if (!m_event_handler.getEvent(evt, 0))
+ {
+ ePtr<eComponentData> 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<iDVBTSRecorder> m_record;