Beispiel #1
0
/*****************************************************************************
 * 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 );
}
Beispiel #2
0
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);
  }
}
Beispiel #3
0
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;
			}
		}
}