[ create a new paste ] login | about

Link: http://codepad.org/LZIVHcH8    [ raw code | fork | 1 comment ]

kzmogi - C++, pasted on May 24:
// 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))));
		}
}


Create a new paste based on this one


Comments:
posted by kzmogi on May 24
EMM も対策したい場合は、OnCatTable() でも同様に CA_system_id を確認してあげてください。

1,2,沢山の法則から、CA descriptor の選択処理を別メソッドに切り出すと仕合せになれるかと。
reply