void CALLBACK CTsPacketCounter::OnPmtUpdated(const WORD wPID, CTsPidMapTarget *pMapTarget, CTsPidMapManager *pMapManager, const PVOID pParam) { // PMTが更新された CTsPacketCounter *pThis = static_cast<CTsPacketCounter *>(pParam); CPmtTable *pPmtTable = dynamic_cast<CPmtTable *>(pMapTarget); if (pPmtTable == nullptr) return; const WORD ServiceID = pPmtTable->m_CurSection.GetTableIdExtension(); const int ServiceIndex = pThis->GetServiceIndexByID(ServiceID); if (ServiceIndex < 0) return; ServiceInfo &Info = pThis->m_ServiceList[ServiceIndex]; const WORD EsNum = pPmtTable->GetEsInfoNum(); std::vector<WORD> EsPidList; EsPidList.resize(EsNum); for (WORD i = 0; i < EsNum; i++) EsPidList[i] = pPmtTable->GetEsPID(i); if (EsPidList != Info.EsPidList) { const bool bIsTarget = ServiceID == pThis->m_TargetServiceID; if (bIsTarget) pThis->UnmapServiceESs(ServiceIndex); Info.EsPidList = std::move(EsPidList); if (bIsTarget) pThis->MapServiceESs(ServiceIndex); } }
void CALLBACK CProgManager::CProgDatabase::OnPmtUpdated(const WORD wPID, CTsPidMapTarget *pMapTarget, CTsPidMapManager *pMapManager, const PVOID pParam) { // PMTが更新された CProgDatabase *pThis = static_cast<CProgDatabase *>(pParam); CPmtTable *pPmtTable = dynamic_cast<CPmtTable *>(pMapTarget); // サービスインデックスを検索 const WORD wServiceIndex = pThis->GetServiceIndexByID(pPmtTable->m_CurSection.GetTableIdExtension()); if(wServiceIndex == 0xFFFFU)return; // ビデオESのPIDをストア pThis->m_ServiceList[wServiceIndex].wVideoEsPID = 0xFFFFU; for(WORD wEsIndex = 0U ; wEsIndex < pPmtTable->GetEsInfoNum() ; wEsIndex++){ // 「ITU-T Rec. H.262|ISO/IEC 13818-2 Video or ISO/IEC 11172-2」のストリームタイプを検索 if(pPmtTable->GetStreamTypeID(wEsIndex) == 0x02U){ pThis->m_ServiceList[wServiceIndex].wVideoEsPID = pPmtTable->GetEsPID(wEsIndex); break; } } // オーディオESのPIDをストア pThis->m_ServiceList[wServiceIndex].wAudioEsPID = 0xFFFFU; for(WORD wEsIndex = 0U ; wEsIndex < pPmtTable->GetEsInfoNum() ; wEsIndex++){ // 「ISO/IEC 13818-7 Audio (ADTS Transport Syntax)」のストリームタイプを検索 if(pPmtTable->GetStreamTypeID(wEsIndex) == 0x0FU){ pThis->m_ServiceList[wServiceIndex].wAudioEsPID = pPmtTable->GetEsPID(wEsIndex); break; } } // 更新済みマーク pThis->m_ServiceList[wServiceIndex].bIsUpdated = true; /* 放送局によってはPATに含まれるサービス全てのPMTを流していない場合がある。 (何度もハンドラが呼び出されるのを防止するため全ての情報がそろった段階で呼び出したかった) // 他のPMTの更新状況を調べる for(WORD wIndex = 0U ; wIndex < pThis->m_ServiceList.size() ; wIndex++){ if(!pThis->m_ServiceList[wIndex].bIsUpdated)return; } */ // SDTテーブルを再マップする pMapManager->MapTarget(0x0011U, new CSdtTable, CProgDatabase::OnSdtUpdated, pParam); // イベントハンドラ呼び出し pThis->m_ProgManager.OnServiceListUpdated(); }