Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -urN src.orig/BonTsEngine/CasProcessor.cpp src/BonTsEngine/CasProcessor.cpp
- --- src.orig/BonTsEngine/CasProcessor.cpp Sat May 10 08:31:42 2014
- +++ src/BonTsEngine/CasProcessor.cpp Fri Jun 14 04:06:48 2013
- @@ -2,15 +2,11 @@
- //
- //////////////////////////////////////////////////////////////////////
- -/*
- - このクラスはstubです
- - CAS処理は実装されていません
- -*/
- -
- #include "stdafx.h"
- #include "Common.h"
- #include "CasProcessor.h"
- #include "TsStream.h"
- +#include "StdUtil.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- @@ -25,6 +21,13 @@
- CCasProcessor::CCasProcessor(IEventHandler *pEventHandler)
- : CMediaDecoder(pEventHandler, 1UL, 1UL)
- + , m_hCasLib(NULL)
- + , m_pCasManager(NULL)
- +
- + , m_bEnableDescramble(true)
- + , m_bEnableContract(false)
- + , m_Instruction(0)
- +
- , m_InputPacketCount(0)
- , m_ScramblePacketCount(0)
- {
- @@ -39,6 +42,9 @@
- {
- CBlockLock Lock(&m_DecoderLock);
- + if (m_pCasManager != NULL)
- + m_pCasManager->Reset();
- +
- m_InputPacketCount = 0;
- m_ScramblePacketCount = 0;
- }
- @@ -51,8 +57,13 @@
- CTsPacket *pPacket = static_cast<CTsPacket *>(pMediaData);
- - if (pPacket->IsScrambled())
- - m_ScramblePacketCount++;
- + if (m_pCasManager != NULL) {
- + m_pCasManager->ProcessPacket(pPacket->GetData(), pPacket->GetSize());
- + pPacket->m_Header.byTransportScramblingCtrl = pPacket->GetAt(3) >> 6;
- + } else {
- + if (pPacket->IsScrambled() && m_bEnableDescramble)
- + m_ScramblePacketCount++;
- + }
- // パケットを下流デコーダにデータを渡す
- OutputMedia(pMediaData);
- @@ -62,112 +73,283 @@
- bool CCasProcessor::LoadCasLibrary(LPCTSTR pszFileName)
- {
- - SetError(TEXT("Unimplemented"));
- + if (pszFileName == NULL || pszFileName[0] == '\0') {
- + SetError(TEXT("CASライブラリのファイル名が指定されていません。"));
- + return false;
- + }
- +
- + CBlockLock Lock(&m_DecoderLock);
- +
- + FreeCasLibrary();
- +
- + m_hCasLib = ::LoadLibrary(pszFileName);
- + if (m_hCasLib == NULL) {
- + const DWORD ErrorCode = ::GetLastError();
- + TCHAR szText[MAX_PATH + 32];
- + StdUtil::snprintf(szText, _countof(szText),
- + TEXT("CASライブラリ \"%s\" をロードできません。"), pszFileName);
- + SetError(szText);
- + switch (ErrorCode) {
- + case ERROR_MOD_NOT_FOUND:
- + SetErrorAdvise(TEXT("ファイルが見つかりません。"));
- + break;
- + case ERROR_BAD_EXE_FORMAT:
- + SetErrorAdvise(
- +#ifndef _WIN64
- + TEXT("32")
- +#else
- + TEXT("64")
- +#endif
- + TEXT("ビット用のDLLではないか、ファイルが破損している可能性があります。"));
- + break;
- + default:
- + StdUtil::snprintf(szText, _countof(szText), TEXT("エラーコード: 0x%x"), ErrorCode);
- + SetErrorAdvise(szText);
- + }
- + return false;
- + }
- +
- + TVCAS::GetModuleInfoFunc pGetModuleInfo = TVCAS::Helper::Module::GetModuleInfo(m_hCasLib);
- + if (pGetModuleInfo == NULL
- + || !pGetModuleInfo(&m_CasModuleInfo)
- + || m_CasModuleInfo.LibVersion != TVCAS::LIB_VERSION) {
- + FreeCasLibrary();
- + SetError(
- + pGetModuleInfo == NULL ?
- + TEXT("指定されたDLLがCASライブラリではありません。") :
- + TEXT("CASライブラリのバージョンが非対応です。"));
- + return false;
- + }
- +
- + TVCAS::CreateInstanceFunc pCreateInstance = TVCAS::Helper::Module::CreateInstance(m_hCasLib);
- + if (pCreateInstance == NULL) {
- + FreeCasLibrary();
- + SetError(TEXT("CASライブラリから必要な関数を取得できません。"));
- + return false;
- + }
- +
- + m_pCasManager = static_cast<TVCAS::ICasManager *>(pCreateInstance(__uuidof(TVCAS::ICasManager)));
- + if (m_pCasManager == NULL) {
- + FreeCasLibrary();
- + SetError(TEXT("CASマネージャのインスタンスを作成できません。"));
- + return false;
- + }
- +
- + if (!m_pCasManager->Initialize(this)) {
- + FreeCasLibrary();
- + SetError(TEXT("CASマネージャの初期化ができません。"));
- + return false;
- + }
- +
- + m_pCasManager->EnableDescramble(m_bEnableDescramble);
- + m_pCasManager->EnableContract(m_bEnableContract);
- + m_pCasManager->SetInstruction(m_Instruction & m_pCasManager->GetAvailableInstructions());
- - return false;
- + ClearError();
- +
- + return true;
- }
- bool CCasProcessor::FreeCasLibrary()
- {
- + CBlockLock Lock(&m_DecoderLock);
- +
- + if (m_pCasManager != NULL) {
- + m_pCasManager->Release();
- + m_pCasManager = NULL;
- + }
- +
- + if (m_hCasLib != NULL) {
- + ::FreeLibrary(m_hCasLib);
- + m_hCasLib = NULL;
- + }
- +
- return true;
- }
- bool CCasProcessor::IsCasLibraryLoaded() const
- {
- - return false;
- + return m_hCasLib != NULL;
- }
- bool CCasProcessor::GetCasModuleInfo(CasModuleInfo *pInfo) const
- {
- - return false;
- + if (m_pCasManager == NULL || pInfo == NULL)
- + return false;
- +
- + *pInfo = m_CasModuleInfo;
- +
- + return true;
- }
- bool CCasProcessor::EnableDescramble(bool bEnable)
- {
- - return false;
- + CBlockLock Lock(&m_DecoderLock);
- +
- + if (m_pCasManager != NULL) {
- + if (!m_pCasManager->EnableDescramble(bEnable))
- + return false;
- + }
- +
- + m_bEnableDescramble = bEnable;
- +
- + return true;
- }
- bool CCasProcessor::EnableContract(bool bEnable)
- {
- - return false;
- + CBlockLock Lock(&m_DecoderLock);
- +
- + if (m_pCasManager != NULL) {
- + if (!m_pCasManager->EnableContract(bEnable))
- + return false;
- + }
- +
- + m_bEnableContract = bEnable;
- +
- + return true;
- }
- int CCasProcessor::GetCasDeviceCount() const
- {
- - return 0;
- + if (m_pCasManager == NULL)
- + return 0;
- +
- + return m_pCasManager->GetCasDeviceCount();
- }
- bool CCasProcessor::GetCasDeviceInfo(int Device, CasDeviceInfo *pInfo) const
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->GetCasDeviceInfo(Device, pInfo);
- }
- bool CCasProcessor::GetCasDeviceCardList(int Device, StringList *pList)
- {
- - return false;
- + if (m_pCasManager == NULL || pList == NULL)
- + return false;
- +
- + pList->clear();
- +
- + TVCAS::ICasDevice *pDevice = m_pCasManager->OpenCasDevice(Device);
- + if (pDevice == NULL)
- + return false;
- +
- + WCHAR szName[256];
- + for (int i = 0; pDevice->GetCardName(i, szName, _countof(szName)); i++) {
- + pList->push_back(szName);
- + }
- +
- + pDevice->Release();
- +
- + return true;
- }
- bool CCasProcessor::IsCasDeviceAvailable(int Device)
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->IsCasDeviceAvailable(Device);
- }
- bool CCasProcessor::CheckCasDeviceAvailability(int Device, bool *pbAvailable, LPWSTR pszMessage, int MaxLength)
- {
- if (pszMessage == NULL || MaxLength < 1)
- return false;
- - pszMessage[0] = L'\0';
- - return false;
- + if (m_pCasManager == NULL) {
- + pszMessage[0] = L'\0';
- + return false;
- + }
- +
- + return m_pCasManager->CheckCasDeviceAvailability(Device, pbAvailable, pszMessage, MaxLength);
- }
- int CCasProcessor::GetDefaultCasDevice()
- {
- - return -1;
- + if (m_pCasManager == NULL)
- + return -1;
- +
- + return m_pCasManager->GetDefaultCasDevice();
- }
- int CCasProcessor::GetCasDeviceByID(DWORD DeviceID) const
- {
- - return -1;
- + if (m_pCasManager == NULL)
- + return -1;
- +
- + return m_pCasManager->GetCasDeviceByID(DeviceID);
- }
- int CCasProcessor::GetCasDeviceByName(LPCWSTR pszName) const
- {
- - return -1;
- + if (m_pCasManager == NULL)
- + return -1;
- +
- + return m_pCasManager->GetCasDeviceByName(pszName);
- }
- bool CCasProcessor::OpenCasCard(int Device, LPCWSTR pszName)
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + ClearError();
- +
- + if (!m_pCasManager->OpenCasCard(Device, pszName))
- + return false;
- +
- + return true;
- }
- bool CCasProcessor::CloseCasCard()
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->CloseCasCard();
- }
- bool CCasProcessor::IsCasCardOpen() const
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->IsCasCardOpen();
- }
- int CCasProcessor::GetCasDevice() const
- {
- - return -1;
- + if (m_pCasManager == NULL)
- + return -1;
- +
- + return m_pCasManager->GetCasDevice();
- }
- int CCasProcessor::GetCasCardName(LPWSTR pszName, int MaxName) const
- {
- - return 0;
- + if (m_pCasManager == NULL)
- + return 0;
- +
- + return m_pCasManager->GetCasCardName(pszName, MaxName);
- }
- bool CCasProcessor::GetCasCardInfo(CasCardInfo *pInfo) const
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->GetCasCardInfo(pInfo);
- }
- bool CCasProcessor::SendCasCommand(const void *pSendData, DWORD SendSize, void *pRecvData, DWORD *pRecvSize)
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->SendCasCommand(pSendData, SendSize, pRecvData, pRecvSize);
- }
- ULONGLONG CCasProcessor::GetInputPacketCount() const
- @@ -177,65 +359,152 @@
- ULONGLONG CCasProcessor::GetScramblePacketCount() const
- {
- - return m_ScramblePacketCount;
- + ULONGLONG Count = m_ScramblePacketCount;
- +
- + if (m_pCasManager != NULL)
- + Count += m_pCasManager->GetScramblePacketCount();
- +
- + return Count;
- }
- void CCasProcessor::ResetScramblePacketCount()
- {
- m_ScramblePacketCount = 0;
- +
- + if (m_pCasManager != NULL)
- + m_pCasManager->ResetScramblePacketCount();
- }
- bool CCasProcessor::SetTargetServiceID(WORD ServiceID)
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->SetDescrambleServiceID(ServiceID);
- }
- WORD CCasProcessor::GetTargetServiceID() const
- {
- - return 0;
- + if (m_pCasManager == NULL)
- + return 0;
- +
- + return m_pCasManager->GetDescrambleServiceID();
- }
- WORD CCasProcessor::GetEcmPIDByServiceID(WORD ServiceID) const
- {
- - return 0xFFFF;
- + if (m_pCasManager == NULL)
- + return 0xFFFF;
- +
- + return m_pCasManager->GetEcmPIDByServiceID(ServiceID);
- }
- CCasProcessor::ContractStatus CCasProcessor::GetContractStatus(WORD NetworkID, WORD ServiceID, const SYSTEMTIME *pTime)
- {
- - return CONTRACT_ERROR;
- + if (m_pCasManager == NULL)
- + return CONTRACT_ERROR;
- +
- + return (ContractStatus)m_pCasManager->GetContractStatus(NetworkID, ServiceID, pTime);
- }
- CCasProcessor::ContractStatus CCasProcessor::GetContractPeriod(WORD NetworkID, WORD ServiceID, SYSTEMTIME *pTime)
- {
- - return CONTRACT_ERROR;
- + if (m_pCasManager == NULL)
- + return CONTRACT_ERROR;
- +
- + return (ContractStatus)m_pCasManager->GetContractPeriod(NetworkID, ServiceID, pTime);
- }
- bool CCasProcessor::HasContractInfo(WORD NetworkID, WORD ServiceID) const
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->HasContractInfo(NetworkID, ServiceID);
- }
- int CCasProcessor::GetInstructionName(int Instruction, LPWSTR pszName, int MaxName) const
- {
- - return 0;
- + if (m_pCasManager == NULL)
- + return 0;
- +
- + return m_pCasManager->GetInstructionName(Instruction, pszName, MaxName);
- }
- UINT CCasProcessor::GetAvailableInstructions() const
- {
- - return 0;
- + if (m_pCasManager == NULL)
- + return 0;
- +
- + return m_pCasManager->GetAvailableInstructions();
- }
- bool CCasProcessor::SetInstruction(int Instruction)
- {
- - return false;
- + if (m_pCasManager != NULL)
- + return m_pCasManager->SetInstruction(Instruction);
- +
- + m_Instruction = Instruction;
- +
- + return true;
- }
- int CCasProcessor::GetInstruction() const
- {
- - return 0;
- + if (m_pCasManager != NULL)
- + return m_pCasManager->GetInstruction();
- +
- + return m_Instruction;
- }
- bool CCasProcessor::DescrambleBenchmarkTest(int Instruction, DWORD Round, DWORD *pTime)
- {
- - return false;
- + if (m_pCasManager == NULL)
- + return false;
- +
- + return m_pCasManager->DescrambleBenchmarkTest(Instruction, Round, pTime);
- +}
- +
- +LPCWSTR CCasProcessor::GetName() const
- +{
- + return L"CasProcessor";
- +}
- +
- +LRESULT CCasProcessor::OnEvent(UINT Event, void *pParam)
- +{
- + switch (Event) {
- + case TVCAS::EVENT_EMM_PROCESSED:
- + SendDecoderEvent(EVENT_EMM_PROCESSED);
- + return 0;
- +
- + case TVCAS::EVENT_EMM_ERROR:
- + SendDecoderEvent(EVENT_EMM_ERROR, pParam);
- + return 0;
- +
- + case TVCAS::EVENT_ECM_ERROR:
- + SendDecoderEvent(EVENT_ECM_ERROR, pParam);
- + return 0;
- +
- + case TVCAS::EVENT_ECM_REFUSED:
- + SendDecoderEvent(EVENT_ECM_REFUSED, pParam);
- + return 0;
- +
- + case TVCAS::EVENT_CARD_READER_HUNG:
- + SendDecoderEvent(EVENT_CARD_READER_HUNG);
- + return 0;
- + }
- +
- + return 0;
- +}
- +
- +LRESULT CCasProcessor::OnError(const TVCAS::ErrorInfo *pInfo)
- +{
- + SetError(pInfo->Code, pInfo->pszText, pInfo->pszAdvise, pInfo->pszSystemMessage);
- +
- + return 0;
- +}
- +
- +void CCasProcessor::OutLog(TVCAS::LogType Type, LPCWSTR pszMessage)
- +{
- + Trace(pszMessage);
- }
- diff -urN src.orig/BonTsEngine/CasProcessor.h src/BonTsEngine/CasProcessor.h
- --- src.orig/BonTsEngine/CasProcessor.h Sat May 10 08:31:42 2014
- +++ src/BonTsEngine/CasProcessor.h Fri Jun 14 04:06:48 2013
- @@ -2,21 +2,20 @@
- //
- //////////////////////////////////////////////////////////////////////
- -/*
- - このクラスはstubです
- - CAS処理は実装されていません
- -*/
- -
- #pragma once
- #include <vector>
- #include <string>
- #include "MediaDecoder.h"
- +#include "TsUtilClass.h"
- +#include "TVCAS.h"
- class CCasProcessor
- : public CMediaDecoder
- + , public TVCAS::ICasClient
- + , protected TVCAS::Helper::CBaseImplNoRef
- {
- public:
- enum {
- @@ -27,52 +26,11 @@
- EVENT_CARD_READER_HUNG = 0x00000005UL
- };
- - enum
- - {
- - MAX_DEVICE_NAME = 64,
- - MAX_DEVICE_TEXT = 64
- - };
- -
- - struct CasModuleInfo
- - {
- - DWORD LibVersion;
- - DWORD Flags;
- - LPCWSTR Name;
- - LPCWSTR Version;
- - };
- -
- - struct CasDeviceInfo
- - {
- - DWORD DeviceID;
- - DWORD Flags;
- - WCHAR Name[MAX_DEVICE_NAME];
- - WCHAR Text[MAX_DEVICE_TEXT];
- - };
- -
- - struct CasCardInfo
- - {
- - WORD CASystemID;
- - BYTE CardID[6];
- - BYTE CardType;
- - BYTE MessagePartitionLength;
- - BYTE SystemKey[32];
- - BYTE InitialCBC[8];
- - BYTE CardManufacturerID;
- - BYTE CardVersion;
- - WORD CheckCode;
- - WCHAR CardIDText[32];
- - };
- -
- - struct EcmErrorInfo
- - {
- - LPCWSTR pszText;
- - WORD EcmPID;
- - };
- -
- - struct EmmErrorInfo
- - {
- - LPCWSTR pszText;
- - };
- + typedef TVCAS::ModuleInfo CasModuleInfo;
- + typedef TVCAS::EcmErrorInfo EcmErrorInfo;
- + typedef TVCAS::EmmErrorInfo EmmErrorInfo;
- + typedef TVCAS::CasDeviceInfo CasDeviceInfo;
- + typedef TVCAS::CasCardInfo CasCardInfo;
- enum ContractStatus {
- CONTRACT_CONTRACTED,
- @@ -135,6 +93,23 @@
- bool DescrambleBenchmarkTest(int Instruction, DWORD Round, DWORD *pTime);
- protected:
- +// TVCAS::IBase
- + TVCAS_DECLARE_BASE
- + LPCWSTR GetName() const override;
- +
- +// TVCAS::ICasClient
- + LRESULT OnEvent(UINT Event, void *pParam) override;
- + LRESULT OnError(const TVCAS::ErrorInfo *pInfo) override;
- + void OutLog(TVCAS::LogType Type, LPCWSTR pszMessage) override;
- +
- + HMODULE m_hCasLib;
- + TVCAS::ICasManager *m_pCasManager;
- + CasModuleInfo m_CasModuleInfo;
- +
- + bool m_bEnableDescramble;
- + bool m_bEnableContract;
- + int m_Instruction;
- +
- ULONGLONG m_InputPacketCount;
- ULONGLONG m_ScramblePacketCount;
- };
- diff -urN src.orig/BonTsEngine/TVCAS.h src/BonTsEngine/TVCAS.h
- --- src.orig/BonTsEngine/TVCAS.h Thu Jan 1 00:00:00 1970
- +++ src/BonTsEngine/TVCAS.h Sat Sep 15 19:00:00 2012
- @@ -0,0 +1,259 @@
- +#ifndef TV_CAS_H
- +#define TV_CAS_H
- +
- +
- +#include <pshpack1.h>
- +
- +
- +namespace TVCAS
- +{
- +
- + enum
- + {
- + LIB_VERSION = 0x00000001UL,
- +
- + MAX_DEVICE_NAME = 64,
- + MAX_DEVICE_TEXT = 64
- + };
- +
- + struct ModuleInfo
- + {
- + DWORD LibVersion;
- + DWORD Flags;
- + LPCWSTR Name;
- + LPCWSTR Version;
- + };
- +
- + struct CasDeviceInfo
- + {
- + DWORD DeviceID;
- + DWORD Flags;
- + WCHAR Name[MAX_DEVICE_NAME];
- + WCHAR Text[MAX_DEVICE_TEXT];
- + };
- +
- + struct CasCardInfo
- + {
- + WORD CASystemID;
- + BYTE CardID[6];
- + BYTE CardType;
- + BYTE MessagePartitionLength;
- + BYTE SystemKey[32];
- + BYTE InitialCBC[8];
- + BYTE CardManufacturerID;
- + BYTE CardVersion;
- + WORD CheckCode;
- + WCHAR CardIDText[32];
- + };
- +
- + enum
- + {
- + EVENT_EMM_PROCESSED = 0x00000001U,
- + EVENT_EMM_ERROR = 0x00000002U,
- + EVENT_ECM_ERROR = 0x00000003U,
- + EVENT_ECM_REFUSED = 0x00000004U,
- + EVENT_CARD_READER_HUNG = 0x00000005U
- + };
- +
- + enum LogType
- + {
- + LOG_VERBOSE,
- + LOG_INFO,
- + LOG_WARNING,
- + LOG_ERROR
- + };
- +
- + struct ErrorInfo
- + {
- + int Code;
- + LPCWSTR pszText;
- + LPCWSTR pszAdvise;
- + LPCWSTR pszSystemMessage;
- + };
- +
- + struct EcmErrorInfo
- + {
- + LPCWSTR pszText;
- + WORD EcmPID;
- + };
- +
- + struct EmmErrorInfo
- + {
- + LPCWSTR pszText;
- + };
- +
- + enum ContractStatus
- + {
- + CONTRACT_CONTRACTED,
- + CONTRACT_UNCONTRACTED,
- + CONTRACT_UNKNOWN,
- + CONTRACT_ERROR
- + };
- +
- + __interface __declspec(uuid("C19221E8-CBB1-4BEF-96A8-3F294244CBB0")) IBase
- + {
- + void Refer();
- + void Release();
- + LPCWSTR GetName() const;
- + IBase * GetInterface(REFIID riid);
- + bool GetProperty(LPCWSTR pszName, void *pProperty, SIZE_T *pSize) const;
- + bool SetProperty(LPCWSTR pszName, const void *pProperty, SIZE_T Size);
- + };
- +
- + __interface __declspec(uuid("973B85B2-CF36-4DF5-A2E8-663550B3BAEA")) ICasClient : public IBase
- + {
- + LRESULT OnEvent(UINT Event, void *pParam);
- + LRESULT OnError(const ErrorInfo *pInfo);
- + void OutLog(LogType Type, LPCWSTR pszMessage);
- + };
- +
- + __interface __declspec(uuid("BC023720-CB97-462E-A142-ED37CE396FB3")) ICasDevice : public IBase
- + {
- + bool GetDeviceInfo(CasDeviceInfo *pInfo) const;
- + int GetCardCount() const;
- + bool GetCardName(int Index, LPWSTR pszName, int MaxName) const;
- + bool IsCardAvailable(LPCWSTR pszName);
- + };
- +
- + __interface __declspec(uuid("080EDD04-8215-4037-8B66-E03954FD81BD")) ICasManager : public IBase
- + {
- + bool Initialize(ICasClient *pClient);
- + bool Reset();
- +
- + bool EnableDescramble(bool Enable);
- + bool IsDescrambleEnabled() const;
- + bool EnableContract(bool Enable);
- + bool IsContractEnabled() const;
- +
- + int GetCasDeviceCount() const;
- + bool GetCasDeviceInfo(int Device, CasDeviceInfo *pInfo) const;
- + ICasDevice * OpenCasDevice(int Device);
- + bool IsCasDeviceAvailable(int Device);
- + bool CheckCasDeviceAvailability(int Device, bool *pAvailable, LPWSTR pszMessage, int MaxLength);
- + int GetDefaultCasDevice();
- + int GetCasDeviceByID(DWORD DeviceID) const;
- + int GetCasDeviceByName(LPCWSTR pszName) const;
- +
- + bool OpenCasCard(int Device, LPCWSTR pszName = NULL);
- + bool CloseCasCard();
- + bool IsCasCardOpen() const;
- + int GetCasDevice() const;
- + int GetCasCardName(LPWSTR pszName, int MaxName) const;
- + bool GetCasCardInfo(CasCardInfo *pInfo) const;
- + bool SendCasCommand(const void *pSendData, DWORD SendSize, void *pRecvData, DWORD *pRecvSize);
- +
- + bool ProcessStream(const void *pSrcData, const DWORD SrcSize,
- + void **ppDstData, DWORD *pDstSize);
- + bool ProcessPacket(void *pData, DWORD PacketSize);
- +
- + ULONGLONG GetInputPacketCount() const;
- + ULONGLONG GetScramblePacketCount() const;
- + void ResetScramblePacketCount();
- +
- + bool SetDescrambleServiceID(WORD ServiceID);
- + WORD GetDescrambleServiceID() const;
- + bool SetDescrambleServices(const WORD *pServiceIDList, int ServiceCount);
- + bool GetDescrambleServices(WORD *pServiceIDList, int *pServiceCount) const;
- + WORD GetEcmPIDByServiceID(WORD ServiceID) const;
- +
- + ContractStatus GetContractStatus(WORD NetworkID, WORD ServiceID, const SYSTEMTIME *pTime = NULL);
- + ContractStatus GetContractPeriod(WORD NetworkID, WORD ServiceID, SYSTEMTIME *pTime);
- + bool HasContractInfo(WORD NetworkID, WORD ServiceID) const;
- +
- + int GetInstructionName(int Instruction, LPWSTR pszName, int MaxName) const;
- + UINT GetAvailableInstructions() const;
- + bool SetInstruction(int Instruction);
- + int GetInstruction() const;
- + bool DescrambleBenchmarkTest(int Instruction, DWORD Round, DWORD *pTime);
- + };
- +
- + typedef BOOL (WINAPI *GetModuleInfoFunc)(ModuleInfo *pInfo);
- + typedef IBase * (WINAPI *CreateInstanceFunc)(REFIID riid);
- +
- +
- + namespace Helper
- + {
- +
- + namespace Module
- + {
- +
- + inline GetModuleInfoFunc GetModuleInfo(HMODULE hLib)
- + {
- + return reinterpret_cast<GetModuleInfoFunc>(::GetProcAddress(hLib, "TVCAS_GetModuleInfo"));
- + }
- +
- + inline CreateInstanceFunc CreateInstance(HMODULE hLib)
- + {
- + return reinterpret_cast<CreateInstanceFunc>(::GetProcAddress(hLib, "TVCAS_CreateInstance"));
- + }
- +
- + }
- +
- +#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1700))
- +#define TVCAS_FINAL override final
- +#elif defined(_MSC_VER)
- +#define TVCAS_FINAL override
- +#else
- +#define TVCAS_FINAL
- +#endif
- +
- + class CBaseImplNoRef
- + {
- + protected:
- + virtual void ReferImpl() {}
- + virtual void ReleaseImpl() {}
- +
- + virtual IBase * GetInterfaceImpl(REFIID riid)
- + {
- + return NULL;
- + }
- +
- + virtual bool GetPropertyImpl(LPCWSTR pszName, void *pProperty, SIZE_T *pSize) const
- + {
- + return false;
- + }
- +
- + virtual bool SetPropertyImpl(LPCWSTR pszName, const void *pProperty, SIZE_T Size)
- + {
- + return false;
- + }
- + };
- +
- + class CBaseImpl : public CBaseImplNoRef
- + {
- + public:
- + CBaseImpl() : m_RefCount(1) {}
- + virtual ~CBaseImpl() {}
- +
- + protected:
- + void ReferImpl() TVCAS_FINAL
- + {
- + ::InterlockedIncrement(&m_RefCount);
- + }
- +
- + void ReleaseImpl() TVCAS_FINAL
- + {
- + if (::InterlockedDecrement(&m_RefCount) == 0)
- + delete this;
- + }
- +
- + private:
- + LONG m_RefCount;
- + };
- +
- +#define TVCAS_DECLARE_BASE \
- + void Refer() TVCAS_FINAL { ReferImpl(); } \
- + void Release() TVCAS_FINAL { ReleaseImpl(); } \
- + TVCAS::IBase * GetInterface(REFIID riid) TVCAS_FINAL { return GetInterfaceImpl(riid); } \
- + bool GetProperty(LPCWSTR pszName, void *pProperty, SIZE_T *pSize) const TVCAS_FINAL { return GetPropertyImpl(pszName, pProperty, pSize); } \
- + bool SetProperty(LPCWSTR pszName, const void *pProperty, SIZE_T Size) TVCAS_FINAL { return SetPropertyImpl(pszName, pProperty, Size); }
- +
- + } // namespace Helper
- +
- +} // namespace TVCAS
- +
- +
- +#include <poppack.h>
- +
- +
- +#endif
- diff -urN src.orig/DtvEngine/DtvEngine.cpp src/DtvEngine/DtvEngine.cpp
- --- src.orig/DtvEngine/DtvEngine.cpp Sat May 10 08:31:42 2014
- +++ src/DtvEngine/DtvEngine.cpp Sun May 11 18:38:03 2014
- @@ -75,36 +75,36 @@
- ↓
- CTsAnalyzer
- ↓
- + CCasProcessor
- + ↓
- CMediaTee──────┐
- ↓ ↓
- - CEventManager CCasProcessor
- + CEventManager CCaptionDecoder
- ↓ ↓
- - CLogoDownloader CCaptionDecoder
- + CLogoDownloader CMediaGrabber
- ↓ ↓
- - CTsSelector CMediaGrabber
- + CTsSelector CMediaBuffer
- ↓ ↓
- - CFileWriter CMediaBuffer
- - ↓
- - CMediaViewer
- + CFileWriter CMediaViewer
- */
- Trace(TEXT("デコーダグラフを構築しています..."));
- // デコーダグラフ構築
- m_TsPacketParser.SetOutputDecoder(&m_TsAnalyzer);
- - m_TsAnalyzer.SetOutputDecoder(&m_MediaTee);
- + m_TsAnalyzer.SetOutputDecoder(&m_CasProcessor);
- + m_CasProcessor.SetOutputDecoder(&m_MediaTee);
- + m_CasProcessor.EnableDescramble(bDescramble);
- + m_bDescramble = bDescramble;
- if (bEventManager) {
- m_MediaTee.SetOutputDecoder(&m_EventManager, 0);
- m_EventManager.SetOutputDecoder(&m_LogoDownloader);
- } else {
- m_MediaTee.SetOutputDecoder(&m_LogoDownloader, 0);
- }
- - m_MediaTee.SetOutputDecoder(&m_CasProcessor, 1);
- + m_MediaTee.SetOutputDecoder(&m_CaptionDecoder, 1);
- m_LogoDownloader.SetOutputDecoder(&m_TsSelector);
- m_TsSelector.SetOutputDecoder(&m_FileWriter);
- - m_CasProcessor.SetOutputDecoder(&m_CaptionDecoder);
- - m_CasProcessor.EnableDescramble(bDescramble);
- - m_bDescramble = bDescramble;
- m_CaptionDecoder.SetOutputDecoder(&m_MediaGrabber);
- if (bBuffering) {
- m_MediaGrabber.SetOutputDecoder(&m_MediaBuffer);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement