/***************************************************************************** * PATCallback *****************************************************************************/ static void PATCallback( void *_unused, dvbpsi_pat_t *p_pat ) { dvbpsi_pat_program_t *p_program; for( p_program = p_pat->p_first_program; p_program != NULL; p_program = p_program->p_next ) { if( p_program->i_number != 0 && (!i_program || i_program == p_program->i_number) ) { pi_pmt_pids[i_nb_programs] = p_program->i_pid; p_pmt_dvbpsi_fds[i_nb_programs] = dvbpsi_AttachPMT( p_program->i_number, PMTCallback, NULL ); i_nb_programs++; } } dvbpsi_DeletePAT( p_pat ); }
static void PATCallBack(void *p_cb_data, dvbpsi_pat_t* p_pat) { dvbpsi_pat_program_t* p_program = p_pat->p_first_program; CDVDDemuxSMD* demux = (CDVDDemuxSMD*) p_cb_data; CLog::Log(LOGINFO, "New PAT"); CLog::Log(LOGINFO, " transport_stream_id : %d", p_pat->i_ts_id); CLog::Log(LOGINFO, " version_number : %d", p_pat->i_version); CLog::Log(LOGINFO, " | program_number @ [NIT|PMT]_PID"); int foundPid = 0; while(p_program) { if (p_program->i_number == demux->GetProgramNumber()) { foundPid = p_program->i_pid; } CLog::Log(LOGINFO, " | %14d @ 0x%x (%d)", p_program->i_number, p_program->i_pid, p_program->i_pid); p_program = p_program->p_next; } CLog::Log(LOGINFO, " active : %d", p_pat->b_current_next); if (foundPid != 0) { CLog::Log(LOGINFO, "*********** FOUND PID: %d", foundPid); demux->SetPmtPid(foundPid); const std::vector<DvbTunerPtr>& tuners = DVBManager::GetInstance().GetTuners(); tuners[0]->AddPidFilter(foundPid, DvbTuner::DVB_FILTER_OTHER); demux->dvbpsiPMT = dvbpsi_AttachPMT(demux->GetProgramNumber(), PMTCallBack, p_cb_data); tuners[0]->RemovePidFilter(PAT_PID); dvbpsi_DeletePAT(p_pat); demux->dvbpsiPAT = NULL; demux->SetState(CDVDDemuxSMD::DEMUX_STATE_FOUND_PAT); } }
void parse::process_pat(const decoded_pat_t *decoded_pat) { dprintf("()"); for (map_decoded_pat_programs::const_iterator iter = decoded_pat->programs.begin(); iter != decoded_pat->programs.end(); ++iter) if (iter->first > 0) {// FIXME: > 0 ??? if ((!service_ids.size()) || (service_ids.count(iter->first))) { #if USING_DVBPSI_VERSION_0 h_pmt[iter->second] = dvbpsi_AttachPMT(iter->first, take_pmt, this); #else if (h_pmt.count(iter->second)) { if (dvbpsi_decoder_present(h_pmt[iter->second].get_handle())) dvbpsi_pmt_detach(h_pmt[iter->second].get_handle()); h_pmt.erase(iter->second); } if (!dvbpsi_decoder_present(h_pmt[iter->second].get_handle())) dvbpsi_pmt_attach(h_pmt[iter->second].get_handle(), iter->first, take_pmt, this); #endif add_filter(iter->second); rcvd_pmt[iter->first] = false; } } }