X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/eca33e3fcfa98e7d6819ae6e17c64d271f1e9978..60c8087aa78a5fa24617b0f2ef86fa54f6083101:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 0cdebebf..d6f002e6 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -85,9 +85,9 @@ void eDVBServicePMTHandler::PMTready(int error) { serviceEvent(eventNewProgramInfo); eEPGCache::getInstance()->PMTready(this); - if (!m_pvr_channel) + if (!m_pvr_channel) // don't send campmt to camd.socket for playbacked services { - if(!m_ca_servicePtr) // don't send campmt to camd.socket for playbacked services + if(!m_ca_servicePtr) { int demuxes[2] = {0,0}; uint8_t tmp; @@ -98,7 +98,7 @@ void eDVBServicePMTHandler::PMTready(int error) else demuxes[1]=demuxes[0]; eDVBCAService::register_service(m_reference, demuxes, m_ca_servicePtr); - eDVBCIInterfaces::getInstance()->addPMTHandler(this); + eDVBCIInterfaces::getInstance()->recheckPMTHandlers(); } eDVBCIInterfaces::getInstance()->gotPMT(this); } @@ -140,97 +140,47 @@ PyObject *eDVBServicePMTHandler::getCaIds() { PyObject *ret=0; - ePtr > ptr; + program prog; - if ( ((m_service && m_service->usePMT()) || !m_service) && !m_PMT.getCurrent(ptr)) + if ( !getProgramInfo(prog) ) { - uint16_t caids[255]; - memset(caids, 0, sizeof(caids)); - std::vector::const_iterator i = ptr->getSections().begin(); - for (; i != ptr->getSections().end(); ++i) - { - const ProgramMapSection &pmt = **i; - ElementaryStreamInfoConstIterator es = pmt.getEsInfo()->begin(); - for (; es != pmt.getEsInfo()->end(); ++es) - { - for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); - desc != (*es)->getDescriptors()->end(); ++desc) - { - switch ((*desc)->getTag()) - { - case CA_DESCRIPTOR: - { - const CaDescriptor *cadescr = (const CaDescriptor*)*desc; - uint16_t caid = cadescr->getCaSystemId(); - int idx=0; - while (caids[idx] && caids[idx] != caid) - ++idx; - caids[idx]=caid; - break; - } - } - } - } - for (DescriptorConstIterator desc = pmt.getDescriptors()->begin(); - desc != pmt.getDescriptors()->end(); ++desc) - { - switch ((*desc)->getTag()) - { - case CA_DESCRIPTOR: - { - const CaDescriptor *cadescr = (const CaDescriptor*)*desc; - uint16_t caid = cadescr->getCaSystemId(); - int idx=0; - while (caids[idx] && caids[idx] != caid) - ++idx; - caids[idx]=caid; - break; - } - } - } - } - int cnt=0; - while (caids[cnt]) - ++cnt; + int cnt=prog.caids.size(); if (cnt) { ret=PyList_New(cnt); + std::set::iterator it(prog.caids.begin()); while(cnt--) - PyList_SET_ITEM(ret, cnt, PyInt_FromLong(caids[cnt])); + PyList_SET_ITEM(ret, cnt, PyInt_FromLong(*it++)); } } - if (!ret) - ret=PyList_New(0); - - return ret; + return ret ? ret : PyList_New(0); } int eDVBServicePMTHandler::getProgramInfo(struct program &program) { ePtr > ptr; + int cached_apid_ac3 = -1; + int cached_apid_mpeg = -1; + int cached_vpid = -1; + int cached_tpid = -1; program.videoStreams.clear(); program.audioStreams.clear(); program.pcrPid = -1; - program.isCrypted = false; program.pmtPid = -1; program.textPid = -1; - program.audioChannel = m_service ? m_service->getCacheEntry(eDVBService::cACHANNEL) : -1; + + if ( m_service && !m_service->cacheEmpty() ) + { + cached_vpid = m_service->getCacheEntry(eDVBService::cVPID); + cached_apid_mpeg = m_service->getCacheEntry(eDVBService::cAC3PID); + cached_apid_ac3 = m_service->getCacheEntry(eDVBService::cAPID); + cached_tpid = m_service->getCacheEntry(eDVBService::cTPID); + } if ( ((m_service && m_service->usePMT()) || !m_service) && !m_PMT.getCurrent(ptr)) { - int cached_apid_ac3 = -1; - int cached_apid_mpeg = -1; - int cached_vpid = -1; - int cached_tpid = -1; - if ( m_service && !m_service->cacheEmpty() ) - { - cached_vpid = m_service->getCacheEntry(eDVBService::cVPID); - cached_apid_mpeg = m_service->getCacheEntry(eDVBService::cAC3PID); - cached_apid_ac3 = m_service->getCacheEntry(eDVBService::cAPID); - cached_tpid = m_service->getCacheEntry(eDVBService::cTPID); - } eDVBTableSpec table_spec; ptr->getSpec(table_spec); program.pmtPid = table_spec.pid < 0x1fff ? table_spec.pid : -1; @@ -243,7 +193,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) ElementaryStreamInfoConstIterator es; for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es) { - int isaudio = 0, isvideo = 0, cadescriptors = 0; + int isaudio = 0, isvideo = 0; videoStream video; audioStream audio; audio.component_tag=-1; @@ -317,9 +267,12 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) ((StreamIdentifierDescriptor*)*desc)->getComponentTag(); break; case CA_DESCRIPTOR: - ++cadescriptors; + { + CaDescriptor *descr = (CaDescriptor*)(*desc); + program.caids.insert(descr->getCaSystemId()); break; } + } } break; } @@ -346,70 +299,62 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) } 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 = pmt.getDescriptors()->begin(); - desc != pmt.getDescriptors()->end(); ++desc) + if ((*desc)->getTag() == CA_DESCRIPTOR) { - switch ((*desc)->getTag()) - { - case CA_DESCRIPTOR: - program.isCrypted=true; - break; - } + CaDescriptor *descr = (CaDescriptor*)(*desc); + program.caids.insert(descr->getCaSystemId()); } - break; } } return 0; } else if ( m_service && !m_service->cacheEmpty() ) { - int vpid = m_service->getCacheEntry(eDVBService::cVPID), - apid_ac3 = m_service->getCacheEntry(eDVBService::cAC3PID), - apid_mpeg = m_service->getCacheEntry(eDVBService::cAPID), - pcrpid = m_service->getCacheEntry(eDVBService::cPCRPID), - tpid = m_service->getCacheEntry(eDVBService::cTPID), + int cached_pcrpid = m_service->getCacheEntry(eDVBService::cPCRPID), vpidtype = m_service->getCacheEntry(eDVBService::cVTYPE), cnt=0; if ( vpidtype == -1 ) vpidtype = videoStream::vtMPEG2; - if ( vpid != -1 ) + if ( cached_vpid != -1 ) { videoStream s; - s.pid = vpid; + s.pid = cached_vpid; s.type = vpidtype; program.videoStreams.push_back(s); ++cnt; } - if ( apid_ac3 != -1 ) + if ( cached_apid_ac3 != -1 ) { audioStream s; s.type = audioStream::atAC3; - s.pid = apid_ac3; + s.pid = cached_apid_ac3; program.audioStreams.push_back(s); ++cnt; } - if ( apid_mpeg != -1 ) + if ( cached_apid_mpeg != -1 ) { audioStream s; s.type = audioStream::atMPEG; - s.pid = apid_mpeg; + s.pid = cached_apid_mpeg; program.audioStreams.push_back(s); ++cnt; } - if ( pcrpid != -1 ) + if ( cached_pcrpid != -1 ) { ++cnt; - program.pcrPid = pcrpid; + program.pcrPid = cached_pcrpid; } - if ( tpid != -1 ) + if ( cached_tpid != -1 ) { ++cnt; - program.textPid = tpid; + program.textPid = cached_tpid; } + CAID_LIST &caids = m_service->m_ca; + for (CAID_LIST::iterator it(caids.begin()); it != caids.end(); ++it) + program.caids.insert(*it); if ( cnt ) return 0; } @@ -474,7 +419,7 @@ void eDVBServicePMTHandler::SDTScanEvent(int event) eDebug("no channel list"); else { - m_dvb_scan->insertInto(db); + m_dvb_scan->insertInto(db, true); eDebug("sdt update done!"); } break; @@ -499,6 +444,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, ref.getChannelID(chid); res = m_resourceManager->allocateChannel(chid, m_channel); eDebug("allocate Channel: res %d", res); + + ePtr db; + if (!m_resourceManager->getChannelList(db)) + db->getService((eServiceReferenceDVB&)m_reference, m_service); + + if (!res) + eDVBCIInterfaces::getInstance()->addPMTHandler(this); } else { eDVBMetaParser parser; @@ -530,10 +482,6 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, m_channel = m_pvr_channel; } - ePtr db; - if (!m_resourceManager->getChannelList(db)) - db->getService((eServiceReferenceDVB&)m_reference, m_service); - if (m_channel) { m_channel->connectStateChange( @@ -549,7 +497,7 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, if (ref.path.empty()) { delete m_dvb_scan; - m_dvb_scan = new eDVBScan(m_channel); + m_dvb_scan = new eDVBScan(m_channel, false, false); m_dvb_scan->connectEvent(slot(*this, &eDVBServicePMTHandler::SDTScanEvent), m_scan_event_connection); } } else @@ -586,10 +534,12 @@ void eDVBServicePMTHandler::free() ePtr > ptr; m_PMT.getCurrent(ptr); eDVBCAService::unregister_service(m_reference, demuxes, ptr); - eDVBCIInterfaces::getInstance()->removePMTHandler(this); m_ca_servicePtr = 0; } + if (m_channel) + eDVBCIInterfaces::getInstance()->removePMTHandler(this); + if (m_pvr_channel) { m_pvr_channel->stopFile();