void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) { int state; channel->getState(state); if ((m_last_channel_state != iDVBChannel::state_ok) && (state == iDVBChannel::state_ok)) { if (!m_demux && m_channel) { if (m_pvr_demux_tmp) { m_demux = m_pvr_demux_tmp; m_pvr_demux_tmp = NULL; } else if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) eDebug("[eDVBServicePMTHandler] Allocating %s-decoding a demux for now tuned-in channel failed.", m_use_decode_demux ? "" : "non-"); } if (m_demux) { eDebug("[eDVBServicePMTHandler] ok ... now we start!!"); m_have_cached_program = false; if (m_service && !m_service->cacheEmpty()) { serviceEvent(eventNewProgramInfo); if (m_use_decode_demux) { if (!m_ca_servicePtr) { registerCAService(); } if (m_ca_servicePtr && !m_service->usePMT()) { eDebug("[eDVBServicePMTHandler] create cached caPMT"); eDVBCAHandler::getInstance()->handlePMT(m_reference, m_service); } } } if (!m_service || m_service->usePMT()) { if (m_pmt_pid == -1) m_PAT.begin(eApp, eDVBPATSpec(), m_demux); else m_PMT.begin(eApp, eDVBPMTSpec(m_pmt_pid, m_reference.getServiceID().get()), m_demux); } serviceEvent(eventTuned); } } else if ((m_last_channel_state != iDVBChannel::state_failed) && (state == iDVBChannel::state_failed)) { eDebug("[eDVBServicePMTHandler] tune failed."); serviceEvent(eventTuneFailed); } }
RESULT eDVBScan::startFilter() { bool startSDT=true; int system; ASSERT(m_demux); /* only start required filters filter */ if (m_ready_all & readyPAT) startSDT = m_ready & readyPAT; // m_ch_current is not set, when eDVBScan is just used for a SDT update if (!m_ch_current) { unsigned int channelFlags; m_channel->getCurrentFrontendParameters(m_ch_current); m_ch_current->getFlags(channelFlags); if (channelFlags & iDVBFrontendParameters::flagOnlyFree) m_flags |= scanOnlyFree; } m_VCT = 0; m_ch_current->getSystem(system); if (system == iDVBFrontend::feATSC) { m_VCT = new eTable<VirtualChannelTableSection>; if (m_VCT->start(m_demux, eDVBVCTSpec())) return -1; CONNECT(m_VCT->tableReady, eDVBScan::VCTready); startSDT = false; } m_SDT = 0; if (startSDT && (m_ready_all & readySDT)) { m_SDT = new eTable<ServiceDescriptionSection>; int tsid=-1; if (m_ready & readyPAT && m_ready & validPAT) { std::vector<ProgramAssociationSection*>::const_iterator i = m_PAT->getSections().begin(); ASSERT(i != m_PAT->getSections().end()); tsid = (*i)->getTableIdExtension(); // in PAT this is the transport stream id m_pat_tsid = eTransportStreamID(tsid); for (; i != m_PAT->getSections().end(); ++i) { const ProgramAssociationSection &pat = **i; ProgramAssociationConstIterator program = pat.getPrograms()->begin(); for (; program != pat.getPrograms()->end(); ++program) m_pmts_to_read.insert(std::pair<unsigned short, service>((*program)->getProgramNumber(), service((*program)->getProgramMapPid()))); } m_PMT = new eTable<ProgramMapSection>; CONNECT(m_PMT->tableReady, eDVBScan::PMTready); PMTready(-2); // KabelBW HACK ... on 618Mhz and 626Mhz the transport stream id in PAT and SDT is different { int type; m_ch_current->getSystem(type); if (type == iDVBFrontend::feCable) { eDVBFrontendParametersCable parm; m_ch_current->getDVBC(parm); if ((tsid == 0x00d7 && absdiff(parm.frequency, 618000) < 2000) || (tsid == 0x00d8 && absdiff(parm.frequency, 626000) < 2000)) tsid = -1; } } } if (tsid == -1) { if (m_SDT->start(m_demux, eDVBSDTSpec())) return -1; } else if (m_SDT->start(m_demux, eDVBSDTSpec(tsid, true))) return -1; CONNECT(m_SDT->tableReady, eDVBScan::SDTready); } if (!(m_ready & readyPAT)) { m_PAT = 0; if (m_ready_all & readyPAT) { m_PAT = new eTable<ProgramAssociationSection>; if (m_PAT->start(m_demux, eDVBPATSpec(4000))) return -1; CONNECT(m_PAT->tableReady, eDVBScan::PATready); } m_NIT = 0; if (m_ready_all & readyNIT) { m_NIT = new eTable<NetworkInformationSection>; if (m_NIT->start(m_demux, eDVBNITSpec(m_networkid))) return -1; CONNECT(m_NIT->tableReady, eDVBScan::NITready); } m_BAT = 0; if (m_ready_all & readyBAT) { m_BAT = new eTable<BouquetAssociationSection>; if (m_BAT->start(m_demux, eDVBBATSpec())) return -1; CONNECT(m_BAT->tableReady, eDVBScan::BATready); } } return 0; }