// TRMP 対策 (手抜き版)
// Multi2Dec\B25Decoder\BonProject\TsDescrambler.cpp から
// GetDescramblingState(), OnPmtTable() の 2 メソッドを変更
// 多分動くはず。
const DWORD CTsDescrambler::GetDescramblingState(const WORD wProgramID)
{
// PATテーブルを取得
const IPatTable *pPatTable = dynamic_cast<const IPatTable *>(m_TsInputMap.GetMapTarget(0x0000U));
if(!pPatTable)return IHalBcasCard::EC_BADARGUMENT;
// 引数に一致するPMTのPIDを検索
for(WORD wIndex = 0U ; wIndex < pPatTable->GetProgramNum() ; wIndex++){
if(pPatTable->GetProgramID(wIndex) == wProgramID){
// PMTテーブルを取得
const IPmtTable *pPmtTable = dynamic_cast<const IPmtTable *>(m_TsInputMap.GetMapTarget(pPatTable->GetPmtPID(wIndex)));
if(!pPmtTable)return IHalBcasCard::EC_BADARGUMENT;
// ECMのPIDを取得
const IDescBlock * const pDescBlock = pPmtTable->GetPmtDesc();
if(!pDescBlock)return IHalBcasCard::EC_BADARGUMENT;
const ICaMethodDesc * pCaMethodDesc = NULL;
// TRMP ではない B-CAS の CA descriptor を取得
for (DWORD dwDescIndex=0;dwDescIndex<pDescBlock->GetDescNum();dwDescIndex++) {
pCaMethodDesc = dynamic_cast<const ICaMethodDesc *>(pDescBlock->GetDescByTag(ICaMethodDesc::DESC_TAG, dwDescIndex));
if(!pCaMethodDesc) break;
const WORD wCaMethodID = pCaMethodDesc->GetCaMethodID();
if (wCaMethodID != 0x0005) {
// ca_system_id が B-CAS (0x0005) と不一致
pCaMethodDesc = NULL;
continue;
}
// B-CAS (0x0005) と一致する CA descriptor が見つかった
break;
}
// 適合する CA Descriptor が発見できなかった
if(!pCaMethodDesc)return IHalBcasCard::EC_BADARGUMENT;
const WORD wEcmPID = pCaMethodDesc->GetCaPID();
if(wEcmPID >= TS_INVALID_PID)return IHalBcasCard::EC_NO_ERROR;
// ECMプロセッサを取得
const CEcmProcessor *pEcmProcessor = dynamic_cast<const CEcmProcessor *>(m_TsInputMap.GetMapTarget(pPatTable->GetPmtPID(wEcmPID)));
if(!pEcmProcessor)return IHalBcasCard::EC_BADARGUMENT;
// 復号状態を返す
return pEcmProcessor->m_dwDescramblingState;
}
}
return IHalBcasCard::EC_BADARGUMENT;
}
void CTsDescrambler::OnPmtTable(const IPmtTable *pPmtTable)
{
// ECMのPIDを取得する
const IDescBlock * const pDescBlock = pPmtTable->GetPmtDesc();
if(!pDescBlock)return;
const ICaMethodDesc * pCaMethodDesc = NULL;
dynamic_cast<const ICaMethodDesc *>(pDescBlock->GetDescByTag(ICaMethodDesc::DESC_TAG));
// TRMP ではない B-CAS の CA descriptor を取得
for (DWORD dwDescIndex=0;dwDescIndex<pDescBlock->GetDescNum();dwDescIndex++) {
pCaMethodDesc = dynamic_cast<const ICaMethodDesc *>(pDescBlock->GetDescByTag(ICaMethodDesc::DESC_TAG, dwDescIndex));
if(!pCaMethodDesc) break;
const WORD wCaMethodID = pCaMethodDesc->GetCaMethodID();
if (wCaMethodID != 0x0005) {
// ca_system_id が B-CAS (0x0005) と不一致
pCaMethodDesc = NULL;
continue;
}
// B-CAS (0x0005) と一致する CA descriptor が見つかった
break;
}
// 適合する CA Descriptor が発見できなかった
if(!pCaMethodDesc)return;
const WORD wEcmPID = pCaMethodDesc->GetCaPID();
if(wEcmPID >= TS_INVALID_PID)return;
// 既存のECMプロセッサを確認
if(!m_TsInputMap.GetMapTarget(wEcmPID)){
// ECMプロセッサをPIDマップに追加
m_TsInputMap.MapPid(wEcmPID, dynamic_cast<ITsPidMapTarget *>(CEcmProcessor::CreateInstance(dynamic_cast<ITsDescrambler *>(this))));
}
// ESプロセッサをPIDマップに追加
for(WORD wIndex = 0U ; wIndex < pPmtTable->GetEsNum() ; wIndex++){
m_TsOutputMap.MapPid(pPmtTable->GetEsPID(wIndex), dynamic_cast<ITsPidMapTarget *>(CEsProcessor::CreateInstance(m_TsInputMap.GetMapTarget(wEcmPID))));
}
}