TVH264_SPHD 0.8.1のビルド方法
2013/9/20に、TVTestの新バージョン0.8.1ソースプログラムが、デジタル放送汎用視聴プログラム実装研究資料として、https://github.com/DBCTRADO/TVTest のホームページに公開された(2013/9/25にわずかな修正有り)。
昨年9月に公開されたバージョン0.8.0は、不具合等が多数あったが、新バージョンになって動作も安定してきており、かつスカパープレミアムで使うと便利な新機能も搭載されているので、そろそろTVTest及びTVH264_SPHDのバージョンアップをお勧めする。
特に、バージョン0.8.0から追加された、「チャンネルスキャンの方法を変更」機能により、放送休止中のチャンネルもスキャンできるようになった。これまでは放送休止中の時間を避けてスキャンしないと、放送波が検出できなかったが、本機能によりその問題が解決されている。
但し公開されているのはソースコードのみであり、実行形式のファイルは含まれていない。かつ実用的に用いるためには自分でソースコードを修正してからビルドしなおす必要がある。
従い、別ページにて解説したTVTest0.8.1のビルド方法に続き、このページでは、TVH264_SPHDの修正方法、ビルド方法、TVCAS_attachmentをB1decorderに対応させる方法、を解説する。
(あわせてTVH264_SPHDのバージョンアップ方法、Windows8への対応方法、TVTest 0.8.1のビルド方法 の記事も参照願います。)
[用意+インストールするもの]
・TVTest 0.8.1ソース。(デジタル放送汎用視聴プログラム実装研究資料のサイトから入手。ホームページのソースファイルを1個ずつダウンロードするのではなく、右側のカラムにある、「Download ZIP」のボタンをクリックしてZIPファイルを入手し、解凍する。)
・TVCAS_attachment ソース(複数のサイトからダウンロードできるようなので、 tvcas_attachment_20120915.7z などの名前で検索してみてください)。
・TVTest 0.8.0ソース(複数のサイトからダウンロードできるようなので、頑張って探してみてください)。一部のソースコードを旧バージョンのものと入れ替える必要があるため、旧バージョンのソースも必要となる。
・Windows SDK for Windows 7 (「DirectShow BaseClasses」のビルドのため。マイクロソフトの当該サイトから入手)
・faad2-2.7.zip (FAAD2 Source をAudioCoding.comから入手)
・(参考)TVH264_SPHD_053.zip に含まれている、Src_s33フォルダ内の各ファイル(修正箇所を確認する際に役立つ)。 (⇒複数のサイトからダウンロードできるようなので、頑張って探してみてください)
・Visual Studio 2010 (以下VS2010)
※VS2010は、Express EditionだとMFCに対応していないので、Professional Editionが必要。VS2010 Professional 無料版の入手方法等は、Visual Studio 2010(VS2010)の入手方法として別記事にまとめた。
[手順]
1. 【「FAAD2」(libfaad.lib)】をビルド
"faad2-2.7.zip"を展開、"frontend\faad.sln"をVS2010で開いて(途中、変換ウィザードが出る)ビルドする。
2. 【「DirectShow BaseClasses」(strmbasd.lib strmbase.lib)】をビルド。
デフォルトでは "Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses" フォルダにある"baseclasses.sln"を開いてビルドする。
3. TVTest 0.8.1ソースが含まれた、"TVTest-master.zip"を展開する。
4. TVTest0.8.0のソースファイルから、
BonTsEngine\CasProcessor.cpp
BonTsEngine\CasProcessor.h
の2ファイルを抜き出し、TVTest 0.8.1ソースのBonTsEngineフォルダーにある同名のファイルに上書きコピーする。
またtvcas_attachmentのソースファイルから、
TVCAS\TVCAS.h
のファイルを抜き出し、TVTest 0.8.1ソースのBonTsEngineフォルダーにコピーする。
5. TVTest0.8.1のソースファイルの、 DtvEngine\DtvEngine.cpp に、 http://pastebin.com/Jw5FJrLE の修正を適用する。
6. ChannelScan.cpp の1601行に、下記の4行を挿入。
(2013/9現在、差分ファイルは、http://www2.wazoku.net/2sen/dtvvup/source/TVH264_SPHD_0.8.x.diff.txtから入手可能)
// for SPHD s 用変更
} else if (NetworkID==10 && ServiceID>32700) {
RemoteControlKeyID=ServiceID-32768;
// for SPHD s 用変更
7. TVTest.rc の805行を、下記のようにコメントアウトする。
// for SPHD s 用変更
// AUTOCHECKBOX "契約情報の更新(EMM処理)を行う(&M)",IDC_OPTIONS_ENABLEEMMPROCESS,8,204,136,9
8. TVTest.rc の734行にあるバージョン表示情報を、下記を参考に修正する。
// for SPHD s 用変更
CTEXT "デジタル放送総合技術研究開発機構\r\nオリジナル作者: 拡張ツール中の人 氏\r\n改造版作者: Meru-co氏\r\n\r\nTVH264 for SPHD ver.0.2.1 by DTV板スカパーHDスレ2 の 359 氏\r\nTVH264 for SPHD ver.0.5.3 (0.7.22) s33 by forepaw.",IDC_ABOUT_INFO,72,32,144,32,SS_OWNERDRAW
9. VS2010で、TVTest.slnを開く。
10. TVH264_HDのプロジェクト名をTVH264_SPHDに変更。
11. TVH264プロジェクトのプロパティを開き、上記"baseclasses"フォルダを「追加のインクルードディレクトリ」に加える。また、同フォルダにある"Release" フォルダ、および"libfaad.lib"が生成されたフォルダを「追加のライブラリディレクトリ」に加える。
12. TVH264_SPHDをビルド。
(注)
※ビルドの際、LNK2005エラーが解決できなかったら、VS2010設定のプロパティにある、「C/C++」の「コード生成」メニューにて、「ランタイムライブラリ」の項目が一致しているか再度確認。【faad.sln】、【baseclasses.sln】、【Test.sln】の設定を全て、「マルチスレッドDLL8/MD)」などで統一する。
※ビルドの際、VS2010はデフォルトだとDebugを実行する設定になっている。メニューが「Debug」になっていたら「Release」に変更した後、「ビルド」-「ソリューションのビルド」を選択、実行するとexeファイルが Release フォルダーに生成される。
以上でTVH264_SPHD 0.8.1の修正完了。
下記の修正で作成される TVCAS_B1.tvcas ファイルと併用することで、スカパープレミアムが視聴可能となる。
[用意+インストールするもの]
・TVCAS_attachment ソース(複数のサイトからダウンロードできるようなので、頑張って探してみてください)。
・TVCAS差分ファイル(2013/09現在、http://www2.wazoku.net/2sen/dtvvup/source/TVCAS_B25_SPHD.diff.txtから入手可能)
[手順]
1. TVCAS\Multi2Decoder.h の18行目にある、
#define MULTI2_SIMD_ICC
の行をコメントアウト
2. ICC\Multi2Decoder\Multi2DecoderSIMD.cpp の2行目にある、
"../../BonTsEngine/Multi2Decoder.h"
を
"../../TVCAS/Multi2Decoder.h"
など、各自のフォルダー構成に合わせて正しい場所に修正
3. http://www2.wazoku.net/2sen/dtvvup/source/TVCAS_B25_SPHD.diff.txt の記載を参考に、
TVCAS\CardReader.cpp を以下の通り修正(全角スペースはタブに置換して下さい)。
--- CardReader.cpp.orig
+++ CardReader.cpp
@@ -401,6 +401,19 @@
return false;
}
+// for SPHD
+ // 初期化コマンドでスカパーHD用CASカードかどうか確認
+ static const BYTE InitSettingCmd[] = {0x80U, 0x5EU, 0x00U, 0x00U, 0x00U};
+ BYTE tmp[256] ;
+ DWORD RecvSize = sizeof(tmp) ;
+ if ( !Transmit( InitSettingCmd, sizeof(InitSettingCmd), tmp, &RecvSize ) ||
+ RecvSize != 46 ) {
+ Close();
+ SetError(TEXT("スカパーHD用ではないカードです。"));
+ return false;
+ }
+// for SPHD
+
LPTSTR pszReaderName;
BYTE Atr[32];
DWORD dwReaderLen = SCARD_AUTOALLOCATE, dwState, dwProtocol, dwAtrLen = sizeof(Atr);
@@ -907,7 +907,7 @@
if (!GetLibraryFunc(m_hLib, pEstablishContext, "CasLinkEstablishContext")
|| !GetLibraryFunc(m_hLib, pListReaders, FUNC_NAME("CasLinkListReaders"))
|| !GetLibraryFunc(m_hLib, m_pCasLinkReleaseContext, "CasLinkReleaseContext")
- || !GetLibraryFunc(m_hLib, m_pCasLinkConnect, "CasLinkConnect")
+ || !GetLibraryFunc(m_hLib, m_pCasLinkConnect, FUNC_NAME("CasLinkConnect"))
|| !GetLibraryFunc(m_hLib, m_pCasLinkDisconnect, "CasLinkDisconnect")
|| !GetLibraryFunc(m_hLib, m_pCasLinkTransmit, "CasLinkTransmit")) {
::FreeLibrary(m_hLib);
4. http://www2.wazoku.net/2sen/dtvvup/source/TVCAS_B25_SPHD.diff.txt の記載を参考に、
TVCAS/CasCard.cpp を以下の通り修正(全角スペースはタブに置換して下さい)。
--- CasCard.cpp.orig
+++ CasCard.cpp
@@ -183,7 +183,9 @@
BYTE RecvData[RECEIVE_BUFFER_SIZE];
// 初期設定条件コマンド送信
- static const BYTE InitSettingCmd[] = {0x90U, 0x30U, 0x00U, 0x00U, 0x00U};
+// for SPHD s 用変更
+// static const BYTE InitSettingCmd[] = {0x90U, 0x30U, 0x00U, 0x00U, 0x00U};
+ static const BYTE InitSettingCmd[] = {0x80U, 0x5EU, 0x00U, 0x00U, 0x00U}; //
INITIAL_SETTING_CONDITIONS_CMD {CLA, INS, P1, P2, P3}
::ZeroMemory(RecvData, sizeof(RecvData));
dwRecvSize = sizeof(RecvData);
TRACE(TEXT("Send \"Initial Setting Conditions Command\"\n"));
@@ -192,11 +194,15 @@
return false;
}
- if (dwRecvSize < 57UL) {
+// for SPHD s 用変更
+// if (dwRecvSize < 57UL) {
+ if (dwRecvSize < 46UL) {
SetError(ERR_TRANSMITERROR, TEXT("受信データのサイズが不正です。"));
return false;
}
+// for SPHD s 用変更
+/*
// レスポンス解析
m_CasCardInfo.CASystemID = ((WORD)RecvData[6] << 8) | (WORD)RecvData[7];
::CopyMemory(m_CasCardInfo.CardID, &RecvData[8], 6); // +8 Card ID
@@ -233,6 +239,13 @@
SetError(ERR_TRANSMITERROR, TEXT("カードIDが不正です。"));
return false;
}
+*/
+ // レスポンス解析
+ m_CasCardInfo.CASystemID = ((WORD)RecvData[0] << 8) | (WORD)RecvData[1]; // +0 CA System ID
+ ::CopyMemory(m_CasCardInfo.CardID, &RecvData[2], 6UL); // +2 Card ID
+ ::CopyMemory(m_CasCardInfo.SystemKey, &RecvData[8], 32UL); // +8 Descrambling system key
+ ::CopyMemory(m_CasCardInfo.InitialCbc, &RecvData[8], 8UL); // +8 Descrambler CBC initial value
+// for SPHD s 用変更
// ECMステータス初期化
::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus));
@@ -407,7 +420,9 @@
}
// バッファ準備
- static const BYTE EcmReceiveCmd[] = {0x90, 0x34, 0x00, 0x00};
+// for SPHD s 用変更
+// static const BYTE EcmReceiveCmd[] = {0x90, 0x34, 0x00, 0x00};
+ static const BYTE EcmReceiveCmd[] = {0x80, 0x34, 0x00, 0x00}; // ECM_RECEIVE_CMD {CLA, INS, P1, P2}
BYTE SendData[MAX_ECM_DATA_SIZE + 6];
BYTE RecvData[RECEIVE_BUFFER_SIZE];
::ZeroMemory(RecvData, sizeof(RecvData));
@@ -426,6 +441,8 @@
return NULL;
}
+// for SPHD s 用変更
+/*
// サイズチェック
if (dwRecvSize != 25UL) {
::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus));
@@ -459,11 +476,35 @@
SetError(ERR_ECMREFUSED, ECM_REFUSED_ERROR_TEXT);
return NULL;
+*/
+ // サイズチェック
+ if (dwRecvSize != 22UL) {
+ ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus));
+// SetError(ERR_TRANSMITERROR, TEXT("ECMのレスポンスサイズが不正です。"));
+ SetError(ERR_ECMREFUSED, ECM_REFUSED_ERROR_TEXT);
+ return NULL;
+ }
+
+ // ECMデータを保存する
+ m_EcmStatus.dwLastEcmSize = dwEcmSize;
+ ::CopyMemory(m_EcmStatus.LastEcmData, pEcmData, dwEcmSize);
+
+ // レスポンス解析
+ ::CopyMemory(m_EcmStatus.KsData, &RecvData[0], sizeof(m_EcmStatus.KsData));
+
+ // 正常終了
+ ClearError();
+ return m_EcmStatus.KsData;
+// for SPHD s 用変更
+
}
const bool CCasCard::SendEmmSection(const BYTE *pEmmData, const DWORD dwEmmSize)
{
+
+// for SPHD s 用変更
+/*
// 「EMM Receive Command」を処理する
if (!m_pCardReader) {
SetError(ERR_CARDNOTOPEN, CARD_NOT_OPEN_ERROR_TEXT);
@@ -516,6 +557,10 @@
SetError(ERR_EMMERROR, TEXT("EMMが受け付けられません。"));
break;
}
+*/
+// for SPHD s 用変更
+
+ SetError(ERR_EMMERROR, TEXT("EMMが受け付けられません。"));
return false;
}
5. http://www2.wazoku.net/2sen/dtvvup/source/TVCAS_B25_SPHD.diff.txt の記載を参考に、
TVCAS/TsDescrambler.cpp を以下の通り修正(全角スペースはタブに置換して下さい)。
--- TVCAS/TsDescrambler.cpp.org
+++ TVCAS/TsDescrambler.cpp
@@ -1221,7 +1221,11 @@
if (PayloadSize < MIN_ECM_DATA_SIZE || PayloadSize > MAX_ECM_DATA_SIZE)
return false;
+// for SPHD s 用変更
+/*
// ECMが変わったらキー取得が成功するまで無効にする
+ // (最初ECM本体のKsが変化したか比較するようにしたが、
+ // ECM本体とECM応答のKsの変化は一致するわけではない)
m_Multi2Lock.Lock();
if (m_LastChangedKey == 1) {
m_bEvenKeyValid = false;
@@ -1229,6 +1233,7 @@
m_bOddKeyValid = false;
}
m_Multi2Lock.Unlock();
+*/
// 前のECM処理が終わるまで待つ
if (!m_EcmProcessEvent.IsSignaled()) {
6. TVCAS\TVCAS_B25.h の14行目を、以下のように修正する。
// for SPHD s 用変更
//#define TVCAS_MODULE_NAME "TVCAS B-25"
#define TVCAS_MODULE_NAME "TVCAS B-1"
// for SPHD s 用変更
7. TVCAS\TVCAS_B25.h の16行目を、以下のように修正する。
// for SPHD s 用変更
//#define TVCAS_MODULE_ORIGINAL_FILE_NAME "TVCAS_B25.tvcas"
#define TVCAS_MODULE_ORIGINAL_FILE_NAME "TVCAS_B1.tvcas"
// for SPHD s 用変更
8. TVCAS\TVCAS_B25.def のファイル名を、 TVCAS_B1.def に変更する。
9. TVCAS\CardReader.h の4行目に、以下の2行を追加する。
#define CARDREADER_SCARD_DYNAMIC_SUPPORT
#define CARDREADER_BONCASCLIENT_SUPPORT
10. TVCAS\TVCAS.sln を開く。
11. TVCAS_B25 のプロジェクト名を TVCAS_B1 に変更。
12. TVCAS_B1をビルドすると、 TVCAS_B1.tvcas ファイルが生成される。
質問/コメント等はこちらへ
2013年10月~2015年3月の質問/コメント
2012年12月~2013年9月の質問/コメント
2012年7月~11月の質問/コメント
2012/6以前の質問/コメント
FAQ
スカパー!プレミアムサービス録画TIPS
« TVTest 0.8.1のビルド方法 | トップページ | 2013年10月~2015年3月の質問/コメント »
「パソコン・インターネット」カテゴリの記事
- MultiSwitchの活用方法(2016.01.01)
- PX-TBS6982での「BonDriver_BDA改」設定(2015.12.27)
- VisualStudio2013(Express)でのTVTestビルド(2015.04.29)
- 2015年の新規開局・周波数変更情報(2015.03.28)
- スマホ/タブレットからの視聴方法(2015.03.14)