X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d2f28afab054e3cd5875499fe342ecfb8206aa06..056f4ed60ae323f41601b8acdc42794902eac0d1:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index f23696b0..74042ed0 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include #include @@ -12,7 +14,7 @@ #include eDVBServicePMTHandler::eDVBServicePMTHandler() - :m_ca_servicePtr(0), m_decode_demux_num(0xFF) + :m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF) { m_use_decode_demux = 0; m_pmt_pid = -1; @@ -36,7 +38,7 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) { if (m_channel) if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) - eDebug("Allocating a demux for now tuned-in channel failed."); + eDebug("Allocating %s-decoding a demux for now tuned-in channel failed.", m_use_decode_demux ? "" : "non-"); serviceEvent(eventTuned); @@ -134,6 +136,76 @@ void eDVBServicePMTHandler::PATready(int) serviceEvent(eventNoPAT); } +PyObject *eDVBServicePMTHandler::getCaIds() +{ + PyObject *ret=0; + + ePtr > ptr; + + if ( ((m_service && m_service->usePMT()) || !m_service) && !m_PMT.getCurrent(ptr)) + { + 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; + if (cnt) + { + ret=PyList_New(cnt); + while(cnt--) + PyList_SET_ITEM(ret, cnt, PyInt_FromLong(caids[cnt])); + } + } + + if (!ret) + ret=PyList_New(0); + + return ret; +} + int eDVBServicePMTHandler::getProgramInfo(struct program &program) { ePtr > ptr; @@ -145,7 +217,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) program.pmtPid = -1; program.textPid = -1; - if (!m_PMT.getCurrent(ptr)) + if ( ((m_service && m_service->usePMT()) || !m_service) && !m_PMT.getCurrent(ptr)) { int cached_apid_ac3 = -1; int cached_apid_mpeg = -1; @@ -369,6 +441,39 @@ int eDVBServicePMTHandler::getPVRChannel(ePtr &pvr_channel) return -1; } +void eDVBServicePMTHandler::SDTScanEvent(int event) +{ + eDebug("scan event %d!", event); + + switch (event) + { + case eDVBScan::evtFinish: + { + ePtr db; + int err; + if ((err = m_resourceManager->getChannelList(db)) != 0) + eDebug("no channel list"); + else + { + m_dvb_scan->insertInto(db); + eDebug("scan done!"); + } + break; + } + + case eDVBScan::evtNewService: + eDebug("scan new service"); + break; + + case eDVBScan::evtFail: + eDebug("scan failed."); + break; + + default: + break; + } +} + int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue) { RESULT res; @@ -413,7 +518,11 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eDebug("allocatePVRChannel failed!\n"); 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( @@ -425,6 +534,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, m_channel->connectEvent( slot(*this, &eDVBServicePMTHandler::channelEvent), m_channelEvent_connection); + + if (ref.path.empty()) + { + delete m_dvb_scan; + m_dvb_scan = new eDVBScan(m_channel); + m_dvb_scan->connectEvent(slot(*this, &eDVBServicePMTHandler::SDTScanEvent), m_scan_event_connection); + } } else { serviceEvent(eventTuneFailed); @@ -437,15 +553,15 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, m_pvr_channel->playFile(ref.path.c_str()); } - ePtr db; - if (!m_resourceManager->getChannelList(db)) - db->getService((eServiceReferenceDVB&)m_reference, m_service); - return res; } void eDVBServicePMTHandler::free() { + eDVBScan *tmp = m_dvb_scan; + m_dvb_scan = 0; + delete m_dvb_scan; + if (m_ca_servicePtr) { int demuxes[2] = {0,0};