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); } }
void eDVBServicePMTHandler::PATready(int) { eDebug("PATready"); ePtr<eTable<ProgramAssociationSection> > ptr; if (!m_PAT.getCurrent(ptr)) { int service_id_single = -1; int pmtpid_single = -1; int pmtpid = -1; int cnt=0; int tsid=-1; std::vector<ProgramAssociationSection*>::const_iterator i = ptr->getSections().begin(); tsid = (*i)->getTableIdExtension(); // in PAT this is the transport stream id eDebug("PAT TSID: 0x%04x (%d)", tsid, tsid); for (i = ptr->getSections().begin(); pmtpid == -1 && i != ptr->getSections().end(); ++i) { const ProgramAssociationSection &pat = **i; ProgramAssociationConstIterator program; for (program = pat.getPrograms()->begin(); pmtpid == -1 && program != pat.getPrograms()->end(); ++program) { if (eServiceID((*program)->getProgramNumber()) == m_reference.getServiceID()) pmtpid = (*program)->getProgramMapPid(); if (++cnt == 1 && pmtpid_single == -1 && pmtpid == -1) { pmtpid_single = (*program)->getProgramMapPid(); service_id_single = (*program)->getProgramNumber(); } else pmtpid_single = service_id_single = -1; } } if (pmtpid_single != -1) // only one PAT entry .. and not valid pmtpid found { eDebug("use single pat entry!"); m_reference.setServiceID(eServiceID(service_id_single)); pmtpid = pmtpid_single; } if (pmtpid == -1) { eDebug("no PAT entry found.. start delay"); m_no_pat_entry_delay->start(1000, true); } else { eDebug("use pmtpid %04x for service_id %04x", pmtpid, m_reference.getServiceID().get()); m_no_pat_entry_delay->stop(); m_PMT.begin(eApp, eDVBPMTSpec(pmtpid, m_reference.getServiceID().get()), m_demux); } } else serviceEvent(eventNoPAT); }