Advertisement
Guest User

TVTest CasProcess

a guest
May 15th, 2014
1,664
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.43 KB | None | 0 0
  1. diff -urN src.orig/BonTsEngine/CasProcessor.cpp src/BonTsEngine/CasProcessor.cpp
  2. --- src.orig/BonTsEngine/CasProcessor.cpp Sat May 10 08:31:42 2014
  3. +++ src/BonTsEngine/CasProcessor.cpp Fri Jun 14 04:06:48 2013
  4. @@ -2,15 +2,11 @@
  5. //
  6. //////////////////////////////////////////////////////////////////////
  7.  
  8. -/*
  9. - このクラスはstubです
  10. - CAS処理は実装されていません
  11. -*/
  12. -
  13. #include "stdafx.h"
  14. #include "Common.h"
  15. #include "CasProcessor.h"
  16. #include "TsStream.h"
  17. +#include "StdUtil.h"
  18.  
  19. #ifdef _DEBUG
  20. #undef THIS_FILE
  21. @@ -25,6 +21,13 @@
  22.  
  23. CCasProcessor::CCasProcessor(IEventHandler *pEventHandler)
  24. : CMediaDecoder(pEventHandler, 1UL, 1UL)
  25. + , m_hCasLib(NULL)
  26. + , m_pCasManager(NULL)
  27. +
  28. + , m_bEnableDescramble(true)
  29. + , m_bEnableContract(false)
  30. + , m_Instruction(0)
  31. +
  32. , m_InputPacketCount(0)
  33. , m_ScramblePacketCount(0)
  34. {
  35. @@ -39,6 +42,9 @@
  36. {
  37. CBlockLock Lock(&m_DecoderLock);
  38.  
  39. + if (m_pCasManager != NULL)
  40. + m_pCasManager->Reset();
  41. +
  42. m_InputPacketCount = 0;
  43. m_ScramblePacketCount = 0;
  44. }
  45. @@ -51,8 +57,13 @@
  46.  
  47. CTsPacket *pPacket = static_cast<CTsPacket *>(pMediaData);
  48.  
  49. - if (pPacket->IsScrambled())
  50. - m_ScramblePacketCount++;
  51. + if (m_pCasManager != NULL) {
  52. + m_pCasManager->ProcessPacket(pPacket->GetData(), pPacket->GetSize());
  53. + pPacket->m_Header.byTransportScramblingCtrl = pPacket->GetAt(3) >> 6;
  54. + } else {
  55. + if (pPacket->IsScrambled() && m_bEnableDescramble)
  56. + m_ScramblePacketCount++;
  57. + }
  58.  
  59. // パケットを下流デコーダにデータを渡す
  60. OutputMedia(pMediaData);
  61. @@ -62,112 +73,283 @@
  62.  
  63. bool CCasProcessor::LoadCasLibrary(LPCTSTR pszFileName)
  64. {
  65. - SetError(TEXT("Unimplemented"));
  66. + if (pszFileName == NULL || pszFileName[0] == '\0') {
  67. + SetError(TEXT("CASライブラリのファイル名が指定されていません。"));
  68. + return false;
  69. + }
  70. +
  71. + CBlockLock Lock(&m_DecoderLock);
  72. +
  73. + FreeCasLibrary();
  74. +
  75. + m_hCasLib = ::LoadLibrary(pszFileName);
  76. + if (m_hCasLib == NULL) {
  77. + const DWORD ErrorCode = ::GetLastError();
  78. + TCHAR szText[MAX_PATH + 32];
  79. + StdUtil::snprintf(szText, _countof(szText),
  80. + TEXT("CASライブラリ \"%s\" をロードできません。"), pszFileName);
  81. + SetError(szText);
  82. + switch (ErrorCode) {
  83. + case ERROR_MOD_NOT_FOUND:
  84. + SetErrorAdvise(TEXT("ファイルが見つかりません。"));
  85. + break;
  86. + case ERROR_BAD_EXE_FORMAT:
  87. + SetErrorAdvise(
  88. +#ifndef _WIN64
  89. + TEXT("32")
  90. +#else
  91. + TEXT("64")
  92. +#endif
  93. + TEXT("ビット用のDLLではないか、ファイルが破損している可能性があります。"));
  94. + break;
  95. + default:
  96. + StdUtil::snprintf(szText, _countof(szText), TEXT("エラーコード: 0x%x"), ErrorCode);
  97. + SetErrorAdvise(szText);
  98. + }
  99. + return false;
  100. + }
  101. +
  102. + TVCAS::GetModuleInfoFunc pGetModuleInfo = TVCAS::Helper::Module::GetModuleInfo(m_hCasLib);
  103. + if (pGetModuleInfo == NULL
  104. + || !pGetModuleInfo(&m_CasModuleInfo)
  105. + || m_CasModuleInfo.LibVersion != TVCAS::LIB_VERSION) {
  106. + FreeCasLibrary();
  107. + SetError(
  108. + pGetModuleInfo == NULL ?
  109. + TEXT("指定されたDLLがCASライブラリではありません。") :
  110. + TEXT("CASライブラリのバージョンが非対応です。"));
  111. + return false;
  112. + }
  113. +
  114. + TVCAS::CreateInstanceFunc pCreateInstance = TVCAS::Helper::Module::CreateInstance(m_hCasLib);
  115. + if (pCreateInstance == NULL) {
  116. + FreeCasLibrary();
  117. + SetError(TEXT("CASライブラリから必要な関数を取得できません。"));
  118. + return false;
  119. + }
  120. +
  121. + m_pCasManager = static_cast<TVCAS::ICasManager *>(pCreateInstance(__uuidof(TVCAS::ICasManager)));
  122. + if (m_pCasManager == NULL) {
  123. + FreeCasLibrary();
  124. + SetError(TEXT("CASマネージャのインスタンスを作成できません。"));
  125. + return false;
  126. + }
  127. +
  128. + if (!m_pCasManager->Initialize(this)) {
  129. + FreeCasLibrary();
  130. + SetError(TEXT("CASマネージャの初期化ができません。"));
  131. + return false;
  132. + }
  133. +
  134. + m_pCasManager->EnableDescramble(m_bEnableDescramble);
  135. + m_pCasManager->EnableContract(m_bEnableContract);
  136. + m_pCasManager->SetInstruction(m_Instruction & m_pCasManager->GetAvailableInstructions());
  137.  
  138. - return false;
  139. + ClearError();
  140. +
  141. + return true;
  142. }
  143.  
  144. bool CCasProcessor::FreeCasLibrary()
  145. {
  146. + CBlockLock Lock(&m_DecoderLock);
  147. +
  148. + if (m_pCasManager != NULL) {
  149. + m_pCasManager->Release();
  150. + m_pCasManager = NULL;
  151. + }
  152. +
  153. + if (m_hCasLib != NULL) {
  154. + ::FreeLibrary(m_hCasLib);
  155. + m_hCasLib = NULL;
  156. + }
  157. +
  158. return true;
  159. }
  160.  
  161. bool CCasProcessor::IsCasLibraryLoaded() const
  162. {
  163. - return false;
  164. + return m_hCasLib != NULL;
  165. }
  166.  
  167. bool CCasProcessor::GetCasModuleInfo(CasModuleInfo *pInfo) const
  168. {
  169. - return false;
  170. + if (m_pCasManager == NULL || pInfo == NULL)
  171. + return false;
  172. +
  173. + *pInfo = m_CasModuleInfo;
  174. +
  175. + return true;
  176. }
  177.  
  178. bool CCasProcessor::EnableDescramble(bool bEnable)
  179. {
  180. - return false;
  181. + CBlockLock Lock(&m_DecoderLock);
  182. +
  183. + if (m_pCasManager != NULL) {
  184. + if (!m_pCasManager->EnableDescramble(bEnable))
  185. + return false;
  186. + }
  187. +
  188. + m_bEnableDescramble = bEnable;
  189. +
  190. + return true;
  191. }
  192.  
  193. bool CCasProcessor::EnableContract(bool bEnable)
  194. {
  195. - return false;
  196. + CBlockLock Lock(&m_DecoderLock);
  197. +
  198. + if (m_pCasManager != NULL) {
  199. + if (!m_pCasManager->EnableContract(bEnable))
  200. + return false;
  201. + }
  202. +
  203. + m_bEnableContract = bEnable;
  204. +
  205. + return true;
  206. }
  207.  
  208. int CCasProcessor::GetCasDeviceCount() const
  209. {
  210. - return 0;
  211. + if (m_pCasManager == NULL)
  212. + return 0;
  213. +
  214. + return m_pCasManager->GetCasDeviceCount();
  215. }
  216.  
  217. bool CCasProcessor::GetCasDeviceInfo(int Device, CasDeviceInfo *pInfo) const
  218. {
  219. - return false;
  220. + if (m_pCasManager == NULL)
  221. + return false;
  222. +
  223. + return m_pCasManager->GetCasDeviceInfo(Device, pInfo);
  224. }
  225.  
  226. bool CCasProcessor::GetCasDeviceCardList(int Device, StringList *pList)
  227. {
  228. - return false;
  229. + if (m_pCasManager == NULL || pList == NULL)
  230. + return false;
  231. +
  232. + pList->clear();
  233. +
  234. + TVCAS::ICasDevice *pDevice = m_pCasManager->OpenCasDevice(Device);
  235. + if (pDevice == NULL)
  236. + return false;
  237. +
  238. + WCHAR szName[256];
  239. + for (int i = 0; pDevice->GetCardName(i, szName, _countof(szName)); i++) {
  240. + pList->push_back(szName);
  241. + }
  242. +
  243. + pDevice->Release();
  244. +
  245. + return true;
  246. }
  247.  
  248. bool CCasProcessor::IsCasDeviceAvailable(int Device)
  249. {
  250. - return false;
  251. + if (m_pCasManager == NULL)
  252. + return false;
  253. +
  254. + return m_pCasManager->IsCasDeviceAvailable(Device);
  255. }
  256.  
  257. bool CCasProcessor::CheckCasDeviceAvailability(int Device, bool *pbAvailable, LPWSTR pszMessage, int MaxLength)
  258. {
  259. if (pszMessage == NULL || MaxLength < 1)
  260. return false;
  261. - pszMessage[0] = L'\0';
  262. - return false;
  263. + if (m_pCasManager == NULL) {
  264. + pszMessage[0] = L'\0';
  265. + return false;
  266. + }
  267. +
  268. + return m_pCasManager->CheckCasDeviceAvailability(Device, pbAvailable, pszMessage, MaxLength);
  269. }
  270.  
  271. int CCasProcessor::GetDefaultCasDevice()
  272. {
  273. - return -1;
  274. + if (m_pCasManager == NULL)
  275. + return -1;
  276. +
  277. + return m_pCasManager->GetDefaultCasDevice();
  278. }
  279.  
  280. int CCasProcessor::GetCasDeviceByID(DWORD DeviceID) const
  281. {
  282. - return -1;
  283. + if (m_pCasManager == NULL)
  284. + return -1;
  285. +
  286. + return m_pCasManager->GetCasDeviceByID(DeviceID);
  287. }
  288.  
  289. int CCasProcessor::GetCasDeviceByName(LPCWSTR pszName) const
  290. {
  291. - return -1;
  292. + if (m_pCasManager == NULL)
  293. + return -1;
  294. +
  295. + return m_pCasManager->GetCasDeviceByName(pszName);
  296. }
  297.  
  298. bool CCasProcessor::OpenCasCard(int Device, LPCWSTR pszName)
  299. {
  300. - return false;
  301. + if (m_pCasManager == NULL)
  302. + return false;
  303. +
  304. + ClearError();
  305. +
  306. + if (!m_pCasManager->OpenCasCard(Device, pszName))
  307. + return false;
  308. +
  309. + return true;
  310. }
  311.  
  312. bool CCasProcessor::CloseCasCard()
  313. {
  314. - return false;
  315. + if (m_pCasManager == NULL)
  316. + return false;
  317. +
  318. + return m_pCasManager->CloseCasCard();
  319. }
  320.  
  321. bool CCasProcessor::IsCasCardOpen() const
  322. {
  323. - return false;
  324. + if (m_pCasManager == NULL)
  325. + return false;
  326. +
  327. + return m_pCasManager->IsCasCardOpen();
  328. }
  329.  
  330. int CCasProcessor::GetCasDevice() const
  331. {
  332. - return -1;
  333. + if (m_pCasManager == NULL)
  334. + return -1;
  335. +
  336. + return m_pCasManager->GetCasDevice();
  337. }
  338.  
  339. int CCasProcessor::GetCasCardName(LPWSTR pszName, int MaxName) const
  340. {
  341. - return 0;
  342. + if (m_pCasManager == NULL)
  343. + return 0;
  344. +
  345. + return m_pCasManager->GetCasCardName(pszName, MaxName);
  346. }
  347.  
  348. bool CCasProcessor::GetCasCardInfo(CasCardInfo *pInfo) const
  349. {
  350. - return false;
  351. + if (m_pCasManager == NULL)
  352. + return false;
  353. +
  354. + return m_pCasManager->GetCasCardInfo(pInfo);
  355. }
  356.  
  357. bool CCasProcessor::SendCasCommand(const void *pSendData, DWORD SendSize, void *pRecvData, DWORD *pRecvSize)
  358. {
  359. - return false;
  360. + if (m_pCasManager == NULL)
  361. + return false;
  362. +
  363. + return m_pCasManager->SendCasCommand(pSendData, SendSize, pRecvData, pRecvSize);
  364. }
  365.  
  366. ULONGLONG CCasProcessor::GetInputPacketCount() const
  367. @@ -177,65 +359,152 @@
  368.  
  369. ULONGLONG CCasProcessor::GetScramblePacketCount() const
  370. {
  371. - return m_ScramblePacketCount;
  372. + ULONGLONG Count = m_ScramblePacketCount;
  373. +
  374. + if (m_pCasManager != NULL)
  375. + Count += m_pCasManager->GetScramblePacketCount();
  376. +
  377. + return Count;
  378. }
  379.  
  380. void CCasProcessor::ResetScramblePacketCount()
  381. {
  382. m_ScramblePacketCount = 0;
  383. +
  384. + if (m_pCasManager != NULL)
  385. + m_pCasManager->ResetScramblePacketCount();
  386. }
  387.  
  388. bool CCasProcessor::SetTargetServiceID(WORD ServiceID)
  389. {
  390. - return false;
  391. + if (m_pCasManager == NULL)
  392. + return false;
  393. +
  394. + return m_pCasManager->SetDescrambleServiceID(ServiceID);
  395. }
  396.  
  397. WORD CCasProcessor::GetTargetServiceID() const
  398. {
  399. - return 0;
  400. + if (m_pCasManager == NULL)
  401. + return 0;
  402. +
  403. + return m_pCasManager->GetDescrambleServiceID();
  404. }
  405.  
  406. WORD CCasProcessor::GetEcmPIDByServiceID(WORD ServiceID) const
  407. {
  408. - return 0xFFFF;
  409. + if (m_pCasManager == NULL)
  410. + return 0xFFFF;
  411. +
  412. + return m_pCasManager->GetEcmPIDByServiceID(ServiceID);
  413. }
  414.  
  415. CCasProcessor::ContractStatus CCasProcessor::GetContractStatus(WORD NetworkID, WORD ServiceID, const SYSTEMTIME *pTime)
  416. {
  417. - return CONTRACT_ERROR;
  418. + if (m_pCasManager == NULL)
  419. + return CONTRACT_ERROR;
  420. +
  421. + return (ContractStatus)m_pCasManager->GetContractStatus(NetworkID, ServiceID, pTime);
  422. }
  423.  
  424. CCasProcessor::ContractStatus CCasProcessor::GetContractPeriod(WORD NetworkID, WORD ServiceID, SYSTEMTIME *pTime)
  425. {
  426. - return CONTRACT_ERROR;
  427. + if (m_pCasManager == NULL)
  428. + return CONTRACT_ERROR;
  429. +
  430. + return (ContractStatus)m_pCasManager->GetContractPeriod(NetworkID, ServiceID, pTime);
  431. }
  432.  
  433. bool CCasProcessor::HasContractInfo(WORD NetworkID, WORD ServiceID) const
  434. {
  435. - return false;
  436. + if (m_pCasManager == NULL)
  437. + return false;
  438. +
  439. + return m_pCasManager->HasContractInfo(NetworkID, ServiceID);
  440. }
  441.  
  442. int CCasProcessor::GetInstructionName(int Instruction, LPWSTR pszName, int MaxName) const
  443. {
  444. - return 0;
  445. + if (m_pCasManager == NULL)
  446. + return 0;
  447. +
  448. + return m_pCasManager->GetInstructionName(Instruction, pszName, MaxName);
  449. }
  450.  
  451. UINT CCasProcessor::GetAvailableInstructions() const
  452. {
  453. - return 0;
  454. + if (m_pCasManager == NULL)
  455. + return 0;
  456. +
  457. + return m_pCasManager->GetAvailableInstructions();
  458. }
  459.  
  460. bool CCasProcessor::SetInstruction(int Instruction)
  461. {
  462. - return false;
  463. + if (m_pCasManager != NULL)
  464. + return m_pCasManager->SetInstruction(Instruction);
  465. +
  466. + m_Instruction = Instruction;
  467. +
  468. + return true;
  469. }
  470.  
  471. int CCasProcessor::GetInstruction() const
  472. {
  473. - return 0;
  474. + if (m_pCasManager != NULL)
  475. + return m_pCasManager->GetInstruction();
  476. +
  477. + return m_Instruction;
  478. }
  479.  
  480. bool CCasProcessor::DescrambleBenchmarkTest(int Instruction, DWORD Round, DWORD *pTime)
  481. {
  482. - return false;
  483. + if (m_pCasManager == NULL)
  484. + return false;
  485. +
  486. + return m_pCasManager->DescrambleBenchmarkTest(Instruction, Round, pTime);
  487. +}
  488. +
  489. +LPCWSTR CCasProcessor::GetName() const
  490. +{
  491. + return L"CasProcessor";
  492. +}
  493. +
  494. +LRESULT CCasProcessor::OnEvent(UINT Event, void *pParam)
  495. +{
  496. + switch (Event) {
  497. + case TVCAS::EVENT_EMM_PROCESSED:
  498. + SendDecoderEvent(EVENT_EMM_PROCESSED);
  499. + return 0;
  500. +
  501. + case TVCAS::EVENT_EMM_ERROR:
  502. + SendDecoderEvent(EVENT_EMM_ERROR, pParam);
  503. + return 0;
  504. +
  505. + case TVCAS::EVENT_ECM_ERROR:
  506. + SendDecoderEvent(EVENT_ECM_ERROR, pParam);
  507. + return 0;
  508. +
  509. + case TVCAS::EVENT_ECM_REFUSED:
  510. + SendDecoderEvent(EVENT_ECM_REFUSED, pParam);
  511. + return 0;
  512. +
  513. + case TVCAS::EVENT_CARD_READER_HUNG:
  514. + SendDecoderEvent(EVENT_CARD_READER_HUNG);
  515. + return 0;
  516. + }
  517. +
  518. + return 0;
  519. +}
  520. +
  521. +LRESULT CCasProcessor::OnError(const TVCAS::ErrorInfo *pInfo)
  522. +{
  523. + SetError(pInfo->Code, pInfo->pszText, pInfo->pszAdvise, pInfo->pszSystemMessage);
  524. +
  525. + return 0;
  526. +}
  527. +
  528. +void CCasProcessor::OutLog(TVCAS::LogType Type, LPCWSTR pszMessage)
  529. +{
  530. + Trace(pszMessage);
  531. }
  532. diff -urN src.orig/BonTsEngine/CasProcessor.h src/BonTsEngine/CasProcessor.h
  533. --- src.orig/BonTsEngine/CasProcessor.h Sat May 10 08:31:42 2014
  534. +++ src/BonTsEngine/CasProcessor.h Fri Jun 14 04:06:48 2013
  535. @@ -2,21 +2,20 @@
  536. //
  537. //////////////////////////////////////////////////////////////////////
  538.  
  539. -/*
  540. - このクラスはstubです
  541. - CAS処理は実装されていません
  542. -*/
  543. -
  544. #pragma once
  545.  
  546.  
  547. #include <vector>
  548. #include <string>
  549. #include "MediaDecoder.h"
  550. +#include "TsUtilClass.h"
  551. +#include "TVCAS.h"
  552.  
  553.  
  554. class CCasProcessor
  555. : public CMediaDecoder
  556. + , public TVCAS::ICasClient
  557. + , protected TVCAS::Helper::CBaseImplNoRef
  558. {
  559. public:
  560. enum {
  561. @@ -27,52 +26,11 @@
  562. EVENT_CARD_READER_HUNG = 0x00000005UL
  563. };
  564.  
  565. - enum
  566. - {
  567. - MAX_DEVICE_NAME = 64,
  568. - MAX_DEVICE_TEXT = 64
  569. - };
  570. -
  571. - struct CasModuleInfo
  572. - {
  573. - DWORD LibVersion;
  574. - DWORD Flags;
  575. - LPCWSTR Name;
  576. - LPCWSTR Version;
  577. - };
  578. -
  579. - struct CasDeviceInfo
  580. - {
  581. - DWORD DeviceID;
  582. - DWORD Flags;
  583. - WCHAR Name[MAX_DEVICE_NAME];
  584. - WCHAR Text[MAX_DEVICE_TEXT];
  585. - };
  586. -
  587. - struct CasCardInfo
  588. - {
  589. - WORD CASystemID;
  590. - BYTE CardID[6];
  591. - BYTE CardType;
  592. - BYTE MessagePartitionLength;
  593. - BYTE SystemKey[32];
  594. - BYTE InitialCBC[8];
  595. - BYTE CardManufacturerID;
  596. - BYTE CardVersion;
  597. - WORD CheckCode;
  598. - WCHAR CardIDText[32];
  599. - };
  600. -
  601. - struct EcmErrorInfo
  602. - {
  603. - LPCWSTR pszText;
  604. - WORD EcmPID;
  605. - };
  606. -
  607. - struct EmmErrorInfo
  608. - {
  609. - LPCWSTR pszText;
  610. - };
  611. + typedef TVCAS::ModuleInfo CasModuleInfo;
  612. + typedef TVCAS::EcmErrorInfo EcmErrorInfo;
  613. + typedef TVCAS::EmmErrorInfo EmmErrorInfo;
  614. + typedef TVCAS::CasDeviceInfo CasDeviceInfo;
  615. + typedef TVCAS::CasCardInfo CasCardInfo;
  616.  
  617. enum ContractStatus {
  618. CONTRACT_CONTRACTED,
  619. @@ -135,6 +93,23 @@
  620. bool DescrambleBenchmarkTest(int Instruction, DWORD Round, DWORD *pTime);
  621.  
  622. protected:
  623. +// TVCAS::IBase
  624. + TVCAS_DECLARE_BASE
  625. + LPCWSTR GetName() const override;
  626. +
  627. +// TVCAS::ICasClient
  628. + LRESULT OnEvent(UINT Event, void *pParam) override;
  629. + LRESULT OnError(const TVCAS::ErrorInfo *pInfo) override;
  630. + void OutLog(TVCAS::LogType Type, LPCWSTR pszMessage) override;
  631. +
  632. + HMODULE m_hCasLib;
  633. + TVCAS::ICasManager *m_pCasManager;
  634. + CasModuleInfo m_CasModuleInfo;
  635. +
  636. + bool m_bEnableDescramble;
  637. + bool m_bEnableContract;
  638. + int m_Instruction;
  639. +
  640. ULONGLONG m_InputPacketCount;
  641. ULONGLONG m_ScramblePacketCount;
  642. };
  643. diff -urN src.orig/BonTsEngine/TVCAS.h src/BonTsEngine/TVCAS.h
  644. --- src.orig/BonTsEngine/TVCAS.h Thu Jan 1 00:00:00 1970
  645. +++ src/BonTsEngine/TVCAS.h Sat Sep 15 19:00:00 2012
  646. @@ -0,0 +1,259 @@
  647. +#ifndef TV_CAS_H
  648. +#define TV_CAS_H
  649. +
  650. +
  651. +#include <pshpack1.h>
  652. +
  653. +
  654. +namespace TVCAS
  655. +{
  656. +
  657. + enum
  658. + {
  659. + LIB_VERSION = 0x00000001UL,
  660. +
  661. + MAX_DEVICE_NAME = 64,
  662. + MAX_DEVICE_TEXT = 64
  663. + };
  664. +
  665. + struct ModuleInfo
  666. + {
  667. + DWORD LibVersion;
  668. + DWORD Flags;
  669. + LPCWSTR Name;
  670. + LPCWSTR Version;
  671. + };
  672. +
  673. + struct CasDeviceInfo
  674. + {
  675. + DWORD DeviceID;
  676. + DWORD Flags;
  677. + WCHAR Name[MAX_DEVICE_NAME];
  678. + WCHAR Text[MAX_DEVICE_TEXT];
  679. + };
  680. +
  681. + struct CasCardInfo
  682. + {
  683. + WORD CASystemID;
  684. + BYTE CardID[6];
  685. + BYTE CardType;
  686. + BYTE MessagePartitionLength;
  687. + BYTE SystemKey[32];
  688. + BYTE InitialCBC[8];
  689. + BYTE CardManufacturerID;
  690. + BYTE CardVersion;
  691. + WORD CheckCode;
  692. + WCHAR CardIDText[32];
  693. + };
  694. +
  695. + enum
  696. + {
  697. + EVENT_EMM_PROCESSED = 0x00000001U,
  698. + EVENT_EMM_ERROR = 0x00000002U,
  699. + EVENT_ECM_ERROR = 0x00000003U,
  700. + EVENT_ECM_REFUSED = 0x00000004U,
  701. + EVENT_CARD_READER_HUNG = 0x00000005U
  702. + };
  703. +
  704. + enum LogType
  705. + {
  706. + LOG_VERBOSE,
  707. + LOG_INFO,
  708. + LOG_WARNING,
  709. + LOG_ERROR
  710. + };
  711. +
  712. + struct ErrorInfo
  713. + {
  714. + int Code;
  715. + LPCWSTR pszText;
  716. + LPCWSTR pszAdvise;
  717. + LPCWSTR pszSystemMessage;
  718. + };
  719. +
  720. + struct EcmErrorInfo
  721. + {
  722. + LPCWSTR pszText;
  723. + WORD EcmPID;
  724. + };
  725. +
  726. + struct EmmErrorInfo
  727. + {
  728. + LPCWSTR pszText;
  729. + };
  730. +
  731. + enum ContractStatus
  732. + {
  733. + CONTRACT_CONTRACTED,
  734. + CONTRACT_UNCONTRACTED,
  735. + CONTRACT_UNKNOWN,
  736. + CONTRACT_ERROR
  737. + };
  738. +
  739. + __interface __declspec(uuid("C19221E8-CBB1-4BEF-96A8-3F294244CBB0")) IBase
  740. + {
  741. + void Refer();
  742. + void Release();
  743. + LPCWSTR GetName() const;
  744. + IBase * GetInterface(REFIID riid);
  745. + bool GetProperty(LPCWSTR pszName, void *pProperty, SIZE_T *pSize) const;
  746. + bool SetProperty(LPCWSTR pszName, const void *pProperty, SIZE_T Size);
  747. + };
  748. +
  749. + __interface __declspec(uuid("973B85B2-CF36-4DF5-A2E8-663550B3BAEA")) ICasClient : public IBase
  750. + {
  751. + LRESULT OnEvent(UINT Event, void *pParam);
  752. + LRESULT OnError(const ErrorInfo *pInfo);
  753. + void OutLog(LogType Type, LPCWSTR pszMessage);
  754. + };
  755. +
  756. + __interface __declspec(uuid("BC023720-CB97-462E-A142-ED37CE396FB3")) ICasDevice : public IBase
  757. + {
  758. + bool GetDeviceInfo(CasDeviceInfo *pInfo) const;
  759. + int GetCardCount() const;
  760. + bool GetCardName(int Index, LPWSTR pszName, int MaxName) const;
  761. + bool IsCardAvailable(LPCWSTR pszName);
  762. + };
  763. +
  764. + __interface __declspec(uuid("080EDD04-8215-4037-8B66-E03954FD81BD")) ICasManager : public IBase
  765. + {
  766. + bool Initialize(ICasClient *pClient);
  767. + bool Reset();
  768. +
  769. + bool EnableDescramble(bool Enable);
  770. + bool IsDescrambleEnabled() const;
  771. + bool EnableContract(bool Enable);
  772. + bool IsContractEnabled() const;
  773. +
  774. + int GetCasDeviceCount() const;
  775. + bool GetCasDeviceInfo(int Device, CasDeviceInfo *pInfo) const;
  776. + ICasDevice * OpenCasDevice(int Device);
  777. + bool IsCasDeviceAvailable(int Device);
  778. + bool CheckCasDeviceAvailability(int Device, bool *pAvailable, LPWSTR pszMessage, int MaxLength);
  779. + int GetDefaultCasDevice();
  780. + int GetCasDeviceByID(DWORD DeviceID) const;
  781. + int GetCasDeviceByName(LPCWSTR pszName) const;
  782. +
  783. + bool OpenCasCard(int Device, LPCWSTR pszName = NULL);
  784. + bool CloseCasCard();
  785. + bool IsCasCardOpen() const;
  786. + int GetCasDevice() const;
  787. + int GetCasCardName(LPWSTR pszName, int MaxName) const;
  788. + bool GetCasCardInfo(CasCardInfo *pInfo) const;
  789. + bool SendCasCommand(const void *pSendData, DWORD SendSize, void *pRecvData, DWORD *pRecvSize);
  790. +
  791. + bool ProcessStream(const void *pSrcData, const DWORD SrcSize,
  792. + void **ppDstData, DWORD *pDstSize);
  793. + bool ProcessPacket(void *pData, DWORD PacketSize);
  794. +
  795. + ULONGLONG GetInputPacketCount() const;
  796. + ULONGLONG GetScramblePacketCount() const;
  797. + void ResetScramblePacketCount();
  798. +
  799. + bool SetDescrambleServiceID(WORD ServiceID);
  800. + WORD GetDescrambleServiceID() const;
  801. + bool SetDescrambleServices(const WORD *pServiceIDList, int ServiceCount);
  802. + bool GetDescrambleServices(WORD *pServiceIDList, int *pServiceCount) const;
  803. + WORD GetEcmPIDByServiceID(WORD ServiceID) const;
  804. +
  805. + ContractStatus GetContractStatus(WORD NetworkID, WORD ServiceID, const SYSTEMTIME *pTime = NULL);
  806. + ContractStatus GetContractPeriod(WORD NetworkID, WORD ServiceID, SYSTEMTIME *pTime);
  807. + bool HasContractInfo(WORD NetworkID, WORD ServiceID) const;
  808. +
  809. + int GetInstructionName(int Instruction, LPWSTR pszName, int MaxName) const;
  810. + UINT GetAvailableInstructions() const;
  811. + bool SetInstruction(int Instruction);
  812. + int GetInstruction() const;
  813. + bool DescrambleBenchmarkTest(int Instruction, DWORD Round, DWORD *pTime);
  814. + };
  815. +
  816. + typedef BOOL (WINAPI *GetModuleInfoFunc)(ModuleInfo *pInfo);
  817. + typedef IBase * (WINAPI *CreateInstanceFunc)(REFIID riid);
  818. +
  819. +
  820. + namespace Helper
  821. + {
  822. +
  823. + namespace Module
  824. + {
  825. +
  826. + inline GetModuleInfoFunc GetModuleInfo(HMODULE hLib)
  827. + {
  828. + return reinterpret_cast<GetModuleInfoFunc>(::GetProcAddress(hLib, "TVCAS_GetModuleInfo"));
  829. + }
  830. +
  831. + inline CreateInstanceFunc CreateInstance(HMODULE hLib)
  832. + {
  833. + return reinterpret_cast<CreateInstanceFunc>(::GetProcAddress(hLib, "TVCAS_CreateInstance"));
  834. + }
  835. +
  836. + }
  837. +
  838. +#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1700))
  839. +#define TVCAS_FINAL override final
  840. +#elif defined(_MSC_VER)
  841. +#define TVCAS_FINAL override
  842. +#else
  843. +#define TVCAS_FINAL
  844. +#endif
  845. +
  846. + class CBaseImplNoRef
  847. + {
  848. + protected:
  849. + virtual void ReferImpl() {}
  850. + virtual void ReleaseImpl() {}
  851. +
  852. + virtual IBase * GetInterfaceImpl(REFIID riid)
  853. + {
  854. + return NULL;
  855. + }
  856. +
  857. + virtual bool GetPropertyImpl(LPCWSTR pszName, void *pProperty, SIZE_T *pSize) const
  858. + {
  859. + return false;
  860. + }
  861. +
  862. + virtual bool SetPropertyImpl(LPCWSTR pszName, const void *pProperty, SIZE_T Size)
  863. + {
  864. + return false;
  865. + }
  866. + };
  867. +
  868. + class CBaseImpl : public CBaseImplNoRef
  869. + {
  870. + public:
  871. + CBaseImpl() : m_RefCount(1) {}
  872. + virtual ~CBaseImpl() {}
  873. +
  874. + protected:
  875. + void ReferImpl() TVCAS_FINAL
  876. + {
  877. + ::InterlockedIncrement(&m_RefCount);
  878. + }
  879. +
  880. + void ReleaseImpl() TVCAS_FINAL
  881. + {
  882. + if (::InterlockedDecrement(&m_RefCount) == 0)
  883. + delete this;
  884. + }
  885. +
  886. + private:
  887. + LONG m_RefCount;
  888. + };
  889. +
  890. +#define TVCAS_DECLARE_BASE \
  891. + void Refer() TVCAS_FINAL { ReferImpl(); } \
  892. + void Release() TVCAS_FINAL { ReleaseImpl(); } \
  893. + TVCAS::IBase * GetInterface(REFIID riid) TVCAS_FINAL { return GetInterfaceImpl(riid); } \
  894. + bool GetProperty(LPCWSTR pszName, void *pProperty, SIZE_T *pSize) const TVCAS_FINAL { return GetPropertyImpl(pszName, pProperty, pSize); } \
  895. + bool SetProperty(LPCWSTR pszName, const void *pProperty, SIZE_T Size) TVCAS_FINAL { return SetPropertyImpl(pszName, pProperty, Size); }
  896. +
  897. + } // namespace Helper
  898. +
  899. +} // namespace TVCAS
  900. +
  901. +
  902. +#include <poppack.h>
  903. +
  904. +
  905. +#endif
  906. diff -urN src.orig/DtvEngine/DtvEngine.cpp src/DtvEngine/DtvEngine.cpp
  907. --- src.orig/DtvEngine/DtvEngine.cpp Sat May 10 08:31:42 2014
  908. +++ src/DtvEngine/DtvEngine.cpp Sun May 11 18:38:03 2014
  909. @@ -75,36 +75,36 @@
  910. CTsAnalyzer
  911. + CCasProcessor
  912. + ↓
  913. CMediaTee──────┐
  914. ↓ ↓
  915. - CEventManager CCasProcessor
  916. + CEventManager CCaptionDecoder
  917. ↓ ↓
  918. - CLogoDownloader CCaptionDecoder
  919. + CLogoDownloader CMediaGrabber
  920. ↓ ↓
  921. - CTsSelector CMediaGrabber
  922. + CTsSelector CMediaBuffer
  923. ↓ ↓
  924. - CFileWriter CMediaBuffer
  925. - ↓
  926. - CMediaViewer
  927. + CFileWriter CMediaViewer
  928. */
  929.  
  930. Trace(TEXT("デコーダグラフを構築しています..."));
  931.  
  932. // デコーダグラフ構築
  933. m_TsPacketParser.SetOutputDecoder(&m_TsAnalyzer);
  934. - m_TsAnalyzer.SetOutputDecoder(&m_MediaTee);
  935. + m_TsAnalyzer.SetOutputDecoder(&m_CasProcessor);
  936. + m_CasProcessor.SetOutputDecoder(&m_MediaTee);
  937. + m_CasProcessor.EnableDescramble(bDescramble);
  938. + m_bDescramble = bDescramble;
  939. if (bEventManager) {
  940. m_MediaTee.SetOutputDecoder(&m_EventManager, 0);
  941. m_EventManager.SetOutputDecoder(&m_LogoDownloader);
  942. } else {
  943. m_MediaTee.SetOutputDecoder(&m_LogoDownloader, 0);
  944. }
  945. - m_MediaTee.SetOutputDecoder(&m_CasProcessor, 1);
  946. + m_MediaTee.SetOutputDecoder(&m_CaptionDecoder, 1);
  947. m_LogoDownloader.SetOutputDecoder(&m_TsSelector);
  948. m_TsSelector.SetOutputDecoder(&m_FileWriter);
  949. - m_CasProcessor.SetOutputDecoder(&m_CaptionDecoder);
  950. - m_CasProcessor.EnableDescramble(bDescramble);
  951. - m_bDescramble = bDescramble;
  952. m_CaptionDecoder.SetOutputDecoder(&m_MediaGrabber);
  953. if (bBuffering) {
  954. m_MediaGrabber.SetOutputDecoder(&m_MediaBuffer);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement