From: hschang Date: Thu, 15 Mar 2018 06:32:50 +0000 (+0900) Subject: Add Relevant PIDs Routing. (for support Extra high bitrate in DVB-CI) X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=e55c2a3f54467f487dfd75617b19b0efeccf8ed7 Add Relevant PIDs Routing. (for support Extra high bitrate in DVB-CI) --- diff --git a/lib/dvb/ecm.h b/lib/dvb/ecm.h index f0cd5f2..145b63b 100644 --- a/lib/dvb/ecm.h +++ b/lib/dvb/ecm.h @@ -18,6 +18,7 @@ public: int start(int pid); int stop(); void processData(const __u8 *p, int len); + int getPid(){return m_pid;} private: void processPESPacket(__u8 *pkt, int len); int m_pid; diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index e7618d0..1419e97 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -298,6 +298,7 @@ void eDVBCIInterfaces::recheckPMTHandlers() if (tmp) // we dont like to change tsmux for running services { eDebugCI("already assigned and running CI!\n"); + tmp->addVtunerPid(pmthandler); continue; } } @@ -1069,13 +1070,6 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) { perror(filename); } - - for(int i = 0; i < NUM_OF_ECM ; i++) - { - m_ecm[i] = 0; - } - ecm_num = 0; - } eDVBCISlot::~eDVBCISlot() @@ -1355,7 +1349,8 @@ void eDVBCISlot::addVtunerPid(eDVBServicePMTHandler *pmthandler) ePtr demux; eDVBServicePMTHandler::program p; - if (!pmthandler->getDataDemux(demux) && !ecm_num) + bool ignore = 0; + if (!pmthandler->getDataDemux(demux)) { if (!pmthandler->getProgramInfo(p)) @@ -1363,11 +1358,23 @@ void eDVBCISlot::addVtunerPid(eDVBServicePMTHandler *pmthandler) for (std::list::const_iterator i(p.caids.begin()); i != p.caids.end(); ++i) { - if (i->capid >= 0) + ignore = 0; + for (eSmartPtrList::iterator it(m_ecms.begin()); it != m_ecms.end(); ++it) + { + if(it->getPid() == i->capid) + { + ignore = 1; + break; + } + } + + if (i->capid >= 0 && !ignore) { - eDebug("PES Start ECM PID = %d Caid = %d ecm_num=%d", i->capid, i->caid, ecm_num); - m_ecm[ecm_num] = new eDVBECMParser(demux); - m_ecm[ecm_num++]->start(i->capid); + ePtr ecm; + eDebug("PES Start CAPID = %d Caid = %d", i->capid, i->caid); + ecm = new eDVBECMParser(demux); + m_ecms.push_back(ecm); + ecm->start(i->capid); } } } @@ -1377,15 +1384,12 @@ void eDVBCISlot::addVtunerPid(eDVBServicePMTHandler *pmthandler) void eDVBCISlot::removeVtunerPid(void) { - for(int i = 0; i < ecm_num ; i++) + eDebugCI("eDVBCISlot::removeVtunerPid..."); + for (eSmartPtrList::iterator it(m_ecms.begin()); it != m_ecms.end(); ++it) { - if(m_ecm[i]) - { - m_ecm[i]->stop(); - m_ecm[i] = 0; - } + it->stop(); } - ecm_num = 0; + m_ecms.clear(); } eAutoInitP0 init_eDVBCIInterfaces(eAutoInitNumbers::dvb, "CI Slots"); diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h index 4262623..9cb9a0b 100644 --- a/lib/dvb_ci/dvbci.h +++ b/lib/dvb_ci/dvbci.h @@ -67,10 +67,7 @@ class eDVBCISlot: public iObject, public Object bool user_mapped; void data(int); bool plugged; - -#define NUM_OF_ECM 32 - ePtr m_ecm[NUM_OF_ECM]; - int ecm_num; + eSmartPtrList m_ecms; public: enum {stateRemoved, stateInserted, stateInvalid, stateResetted}; eDVBCISlot(eMainloop *context, int nr); diff --git a/lib/python/Screens/Ci.py b/lib/python/Screens/Ci.py index 0fb0fee..666033b 100644 --- a/lib/python/Screens/Ci.py +++ b/lib/python/Screens/Ci.py @@ -7,6 +7,7 @@ from Components.config import config, ConfigSubsection, ConfigSelection, ConfigS from Components.ConfigList import ConfigList from Components.SystemInfo import SystemInfo +from Tools.Directories import fileExists from enigma import eTimer, eDVBCI_UI, eDVBCIInterfaces @@ -18,6 +19,18 @@ def setCIBitrate(configElement): else: eDVBCI_UI.getInstance().setClockRate(configElement.slotid, eDVBCI_UI.rateHigh) +def setRelevantPidsRouting(configElement): + fileName = "/proc/stb/tsmux/ci%d_relevant_pids_routing" % (configElement.slotid) + if not fileExists(fileName, 'r'): + print "[CI] file not found : ", fileName + else: + data = configElement.value + if data in ("yes", "no"): + fd = open(fileName, 'w') + fd.write("%s" % data) + fd.close() + +relevantPidsRoutingChoices = None def InitCiConfig(): config.ci = ConfigSubList() for slot in range(MAX_NUM_CI): @@ -28,6 +41,26 @@ def InitCiConfig(): config.ci[slot].canHandleHighBitrates.slotid = slot config.ci[slot].canHandleHighBitrates.addNotifier(setCIBitrate) + if SystemInfo["RelevantPidsRoutingSupport"]: + global relevantPidsRoutingChoices + if not relevantPidsRoutingChoices: + relevantPidsRoutingChoices = [("no", _("No")), ("yes", _("Yes"))] + default = "no" + fileName = "/proc/stb/tsmux/ci%d_relevant_pids_routing_choices" + if fileExists(fileName, 'r'): + relevantPidsRoutingChoices = [] + fd = open(fileName, 'r') + data = fd.read() + data = data.split() + for x in data: + relevantPidsRoutingChoices.append((x, _(x))) + if default not in data: + default = data[0] + + config.ci[slot].relevantPidsRouting = ConfigSelection(choices = relevantPidsRoutingChoices, default = default) + config.ci[slot].relevantPidsRouting.slotid = slot + config.ci[slot].relevantPidsRouting.addNotifier(setRelevantPidsRouting) + class MMIDialog(Screen): def __init__(self, session, slotid, action, handler = eDVBCI_UI.getInstance(), wait_text = _("wait for ci...") ): Screen.__init__(self, session) @@ -244,6 +277,13 @@ class CiMessageHandler: except: SystemInfo["CommonInterfaceSupportsHighBitrates"] = False + try: + file = open("/proc/stb/tsmux/ci0_relevant_pids_routing", "r") + file.close() + SystemInfo["RelevantPidsRoutingSupport"] = True + except: + SystemInfo["RelevantPidsRoutingSupport"] = False + def setSession(self, session): self.session = session @@ -284,29 +324,39 @@ class CiSelection(Screen): self.dlg = None self.state = { } + self.slots = [] + self.HighBitrateEntry = {} + self.RelevantPidsRoutingEntry = {} + + self.entryData = [] + self.list = [ ] + self["entries"] = ConfigList(self.list) + self["entries"].list = self.list + self["entries"].l.setList(self.list) + self["text"] = Label(_("Slot %d")%(1)) + self.onLayoutFinish.append(self.initialUpdate) + def initialUpdate(self): for slot in range(MAX_NUM_CI): state = eDVBCI_UI.getInstance().getState(slot) if state != -1: - self.appendEntries(slot, state) + self.slots.append(slot) + self.state[slot] = state + self.createEntries(slot) CiHandler.registerCIMessageHandler(slot, self.ciStateChanged) - menuList = ConfigList(self.list) - menuList.list = self.list - menuList.l.setList(self.list) - self["entries"] = menuList - self["entries"].onSelectionChanged.append(self.selectionChanged) - self["text"] = Label(_("Slot %d")%(1)) + self.updateEntries() def selectionChanged(self): - cur_idx = self["entries"].getCurrentIndex() - self["text"].setText(_("Slot %d")%((cur_idx / 5)+1)) + entryData = self.entryData[self["entries"].getCurrentIndex()] + self["text"].setText(_("Slot %d")%(entryData[1] + 1)) def keyConfigEntry(self, key): + current = self["entries"].getCurrent() try: self["entries"].handleKey(key) - self["entries"].getCurrent()[1].save() + current[1].save() except: pass @@ -316,47 +366,43 @@ class CiSelection(Screen): def keyRight(self): self.keyConfigEntry(KEY_RIGHT) - def appendEntries(self, slot, state): - self.state[slot] = state - self.list.append( (_("Reset"), ConfigNothing(), 0, slot) ) - self.list.append( (_("Init"), ConfigNothing(), 1, slot) ) - - if self.state[slot] == 0: #no module - self.list.append( (_("no module found"), ConfigNothing(), 2, slot) ) - elif self.state[slot] == 1: #module in init - self.list.append( (_("init module"), ConfigNothing(), 2, slot) ) - elif self.state[slot] == 2: #module ready - #get appname - appname = eDVBCI_UI.getInstance().getAppName(slot) - self.list.append( (appname, ConfigNothing(), 2, slot) ) - - self.list.append(getConfigListEntry(_("Multiple service support"), config.ci[slot].canDescrambleMultipleServices)) + def createEntries(self, slot): if SystemInfo["CommonInterfaceSupportsHighBitrates"]: - self.list.append(getConfigListEntry(_("High bitrate support"), config.ci[slot].canHandleHighBitrates)) - - def updateState(self, slot): - state = eDVBCI_UI.getInstance().getState(slot) - self.state[slot] = state - - slotidx=0 - while len(self.list[slotidx]) < 3 or self.list[slotidx][3] != slot: - slotidx += 1 - - slotidx += 1 # do not change Reset - slotidx += 1 # do not change Init - - if state == 0: #no module - self.list[slotidx] = (_("no module found"), ConfigNothing(), 2, slot) - elif state == 1: #module in init - self.list[slotidx] = (_("init module"), ConfigNothing(), 2, slot) - elif state == 2: #module ready - #get appname - appname = eDVBCI_UI.getInstance().getAppName(slot) - self.list[slotidx] = (appname, ConfigNothing(), 2, slot) - - lst = self["entries"] - lst.list = self.list - lst.l.setList(self.list) + self.HighBitrateEntry[slot] = getConfigListEntry(_("High bitrate support"), config.ci[slot].canHandleHighBitrates) + if SystemInfo["RelevantPidsRoutingSupport"]: + self.RelevantPidsRoutingEntry[slot] = getConfigListEntry(_("Relevant PIDs Routing"), config.ci[slot].relevantPidsRouting) + + def addToList(self, data, action, slotid): + self.list.append(data) + self.entryData.append((action, slotid)) + + def updateEntries(self): + self.list = [] + self.entryData = [] + for slot in self.slots: + self.addToList((_("Reset"), ConfigNothing()), 0, slot) + self.addToList((_("Init"), ConfigNothing()), 1, slot) + + if self.state[slot] == 0: #no module + self.addToList((_("no module found"), ConfigNothing()), 2, slot) + elif self.state[slot] == 1: #module in init + self.addToList((_("init module"), ConfigNothing()), 2, slot) + elif self.state[slot] == 2: #module ready + #get appname + appname = eDVBCI_UI.getInstance().getAppName(slot) + self.addToList((appname, ConfigNothing()), 2, slot) + + self.addToList(getConfigListEntry(_("Multiple service support"), config.ci[slot].canDescrambleMultipleServices), -1, slot) + + if SystemInfo["CommonInterfaceSupportsHighBitrates"]: + self.addToList(self.HighBitrateEntry[slot], -1, slot) + if SystemInfo["RelevantPidsRoutingSupport"]: + self.addToList(self.RelevantPidsRoutingEntry[slot], -1, slot) + + self["entries"].list = self.list + self["entries"].l.setList(self.list) + if self.selectionChanged not in self["entries"].onSelectionChanged: + self["entries"].onSelectionChanged.append(self.selectionChanged) def ciStateChanged(self, slot): if self.dlg: @@ -366,21 +412,23 @@ class CiSelection(Screen): if self.state[slot] != state: #print "something happens" self.state[slot] = state - self.updateState(slot) + self.updateEntries() def dlgClosed(self, slot): self.dlg = None def okbuttonClick(self): cur = self["entries"].getCurrent() - if cur and len(cur) > 2: - action = cur[2] - slot = cur[3] + if cur: + idx = self["entries"].getCurrentIndex() + entryData = self.entryData[idx] + action = entryData[0] + slot = entryData[1] if action == 0: #reset eDVBCI_UI.getInstance().setReset(slot) elif action == 1: #init eDVBCI_UI.getInstance().setInit(slot) - elif self.state[slot] == 2: + elif action == 2 and self.state[slot] == 2: self.dlg = self.session.openWithCallback(self.dlgClosed, MMIDialog, slot, action) def cancel(self):