Visual Studio 2013でTVTestをビルドしたかった


もしかするとこのドキュメントは古いかもしれません。
TVTestは15907d5c1c5125e1b8b4f4ccfeef7388cafcc27bを使用しています

TVTest is 何

デジタル放送汎用視聴プログラム実装研究資料(略称 TVTest)は、パーソナルコンピュータ上において、デジタル放送の視聴を行うプログラムの実装を研究する目的で頒布される研究資料です。

この資料は MPEG-2 TS を扱うための基本的な機能を実装しています。 CAS 処理は実装されていないため、一般のテレビ放送を視聴することはできません。

TVTest/README.md at master · DBCTRADO/TVTest


必要な物

libjpegは6bでないとスムーズに事が進まないので旧バージョンを使用。
それぞれダウンロードし、今回はデスクトップに全部置いておきます。
なお、VS2013でのビルド方法なのでVS2012とかはちょっと不明です。だいたい同じだと思いますが…。
一番最後の HTML Help Workshop はヘルプファイル作成のために必要です。
無くても TVTest.exe のビルドは可能です。


BaseClasses ライブラリのビルド

BaseClasses ライブラリが必要なので、 Microsoft Windows SDK for Windows 7 and .NET Framework 4 (以下 WindowsSDK 7.1)をインストール。
C++ 2010 Runtime等がインストールされているとインストールに失敗するおそれがあるので注意。
インストール時に必要なのはSampleのみ。

Windows SDK 7.1

Visual Studioで開く (要管理者権限)

C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\baseclasses.sln

ソリューションエクスプローラ内の baseclasses を右クリックし、プロパティをクリック。
[構成プロパティ] -> [C/C++] -> [コード生成] -> [ランタイムライブラリ] を、マルチスレッドDLL (/MD) に変更。
ウィンドウ左上の [構成] を [Debug] から [Release] に変更し、ランタイムライブラリを再度 マルチスレッドDLL (/MD) に変更し、閉じる。

[ビルド] -> [ソリューションのビルド] をクリック -> ビルド
終了したらログを確認。

1>  BaseClasses.vcxproj -> C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Debug\BaseClasses.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

ウインドウ中央上部の [Debug] を [Release] に変更。

BaseClasses

そして再度、[ビルド] -> [ソリューションのビルド] をクリック -> ビルド
終了したらログを確認。

1>  BaseClasses.vcxproj -> C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Release\BaseClasses.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

FAAD2 ライブラリのビルド

faad2-2.7.zip を展開し、 faad2-2.7\frontend\faad.sln を開く。
アップグレードダイアログが出てくるのでアップグレード。

ソリューションエクスプローラ内の libfaad2 を右クリックし、プロパティをクリック。
ウィンドウ左上の [構成] を [Debug] から [Release] に変更後、 [構成プロパティ] -> [C/C++] -> [コード生成] -> [ランタイムライブラリ] を、マルチスレッドDLL (/MD) に変更。

ウインドウ中央上部の [Debug] を [Release] に変更。
この状態でビルドするとエラーが出るので、エラーを潰す。
ソリューションエクスプローラ内の libfaad -> Header Files -> common.h をダブルクリックで開き、316行目を変更

#if defined(_WIN32) && !defined(__MINGW32__)

#if defined(_WIN32) && !defined(__MINGW32__) && _MSC_VER < 1700

ソリューションエクスプローラ内の libfaad を右クリック -> ビルド
ログを確認。

1>  libfaad.vcxproj -> C:\Users\admin\Desktop\faad2-2.7\libfaad\.\Release\libfaad.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

以下のディレクトリに libfaad.lib が作成されていることを確認

C:\Users\admin\Desktop\faad2-2.7\libfaad\Release

TVTestのビルド

Githubからzipで落としてきたTVTestのソースを展開し、 TVTest-master\src\TVTest.sln を開く。
ソリューションエクスプローラ内の TVTest を右クリックし、プロパティをクリック。
ウィンドウ左上の [構成] を [Debug] から [Release] に変更後、 [構成プロパティ] -> [C/C++] -> [コード生成] -> [ランタイムライブラリ] を、マルチスレッドDLL (/MD) に変更。

[構成プロパティ] -> [C/C++] -> [全般] -> [追加のインクルード ディレクトリ] に以下を追加。

C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses

[構成プロパティ] -> [リンカー] -> [全般] -> [追加のライブラリ ディレクトリ] に以下を追加。

C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Release
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Debug
C:\Users\admin\Desktop\faad2-2.7\libfaad\Release

ウインドウ中央上部の [Debug] を [Release] に変更。
ソリューションエクスプローラ内の TVTest を右クリック -> ビルド
ログを確認。

1>  TVTest.vcxproj -> C:\Users\admin\Desktop\TVTest-master\src\Win32\Release\TVTest.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

TVTest_Imageのビルド

jpegsr6b.zip , lpng169.zip , zlib128.zip を展開する。
TVTest_Image\libpnglpng169.zip の中身を全て移動させる。
TVTest_Image\libjpegjpegsr6b.zip の中身を全て移動させる。
TVTest_Image\zlibzlib128.zip の中身を全て移動させる。

TVTest_Image\libjpeg 内の jconfig.vcjconfig.h にリネーム。 TVTest_Image\libpng\scripts 内の pnglibconf.h.prebuiltpnglibconf.h にリネームし、 TVTest_Image\libpng に移動

TVTest_Image\TVTest_Image_VS2010.sln を開く
アップグレードダイアログが出てくるのでアップグレード。

このままビルドしてもエラーが出るので修正。
ソリューションエクスプローラ内の libjpeg -> ヘッダー ファイル -> jmorecfg.h をダブルクリックで開き、以下の箇所を変更(158行目付近)

/* INT32 must hold at least signed 32-bit values. */
#ifndef XMD_H			/* X11/xmd.h correctly defines INT32 */
typedef long INT32;
#endif

/* INT32 must hold at least signed 32-bit values. */
#ifndef XMD_H			/* X11/xmd.h correctly defines INT32 */
#include <basetsd.h>
#if 0 
typedef long INT32;
#endif
#endif

変更し終わったら、ソリューションエクスプローラ内の TVTest_Image を右クリックし、プロパティをクリック。
ウィンドウ左上の [構成] を [Debug] から [Release] に変更後、 [構成プロパティ] -> [C/C++] -> [コード生成] -> [ランタイムライブラリ] を、マルチスレッドDLL (/MD) に変更。

ウインドウ中央上部の [Debug] を [Release] に変更。
ソリューションエクスプローラ内の TVTest_Image を右クリック -> ビルド
ログを確認。

4>  TVTest_Image.vcxproj -> C:\Users\admin\Desktop\TVTest-master\src\TVTest_Image\..\Win32\Debug\TVTest_Image.dll
========== ビルド: 4 正常終了、0 失敗、0 更新不要、0 スキップ ==========

以下の場所に TVTest.exeTVTest_Image.dll が存在するか確認。

C:\Users\admin\Desktop\TVTest-master\src\Win32\Release

適当なフォルダを作成し、 TVTest.exeTVTest_Image.dll を避難させる。

C:\Users\admin\Desktop\TVTest

ヘルプファイルの作成

htmlhelp.exe を実行し、インストール。
[スタート] -> [プログラム] -> [HTML Help Workshop] -> [HTML Help Workshop] をクリック。
[File] -> [Open] から TVTest-master\src\Help\TVTest.hhp を開く。
[File] -> [Compile] からコンパイル。

ヘルプファイルが作成されていることを確認。

C:\Users\admin\Desktop\TVTest-master\src\Help\TVTest.chm

ヘルプファイルを以下の場所に移動させ終了。

C:\Users\admin\Desktop\TVTest

TVTest x64

x86でのビルドが成功した人向けです

BaseClasses ライブラリ
baseclasses.sln を開き、[ランタイムライブラリ] を、マルチスレッドDLL (/MD) に変更。
Debug x64 / Release x64 でビルド

x64 Debug

1>  BaseClasses.vcxproj -> C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\x64\Debug\BaseClasses.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

x64 Release

1>  BaseClasses.vcxproj -> C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\x64\Release\BaseClasses.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

FAAD2 ライブラリ
faad.sln を開き、画面中央の Debug をクリック、[構成マネージャ] -> [アクティブ ソリューション プラットフォーム] -> [プラットフォーム新規作成]
設定のコピー元 : Win32 で作成。
[ランタイムライブラリ] を、マルチスレッドDLL (/MD) に変更。

common.h を開き、66行目のコメントを外す

#define USE_DOUBLE_PRECISION

その後、x64で Release ビルド。

1>  libfaad.vcxproj -> C:\Users\admin\Desktop\faad2-2.7\libfaad\x64\Release\libfaad.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

ただ、上記の場所にファイルが出力されていないので以下の場所を確認(x86版は上書きされます)

C:\Users\admin\Desktop\faad2-2.7\libfaad\Release\libfaad.lib

TVTest x64
TVTest.sln を開き、Release x64 に変更
[ランタイムライブラリ] を、マルチスレッドDLL (/MD) に変更。

[構成プロパティ] -> [C/C++] -> [全般] -> [追加のインクルード ディレクトリ] に以下を追加。

C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses

[構成プロパティ] -> [リンカー] -> [全般] -> [追加のライブラリ ディレクトリ] に以下を追加。

C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\x64\Debug
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\x64\Release
C:\Users\admin\Desktop\faad2-2.7\libfaad\Release

ソリューションエクスプローラ内の TVTestを右クリック -> ビルド

1>  TVTest.vcxproj -> C:\Users\admin\Desktop\TVTest-master\src\x64\Release\TVTest.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

TVTest_Image
TVTest_Image_VS2010.sln を開き、 Release x64 に変更
ソリューションエクスプローラ内の TVTest_Image を右クリック -> アップグレード
[プロジェクト] -> [ビルド] でビルド

4>  TVTest_Image.vcxproj -> C:\Users\admin\Desktop\TVTest-master\src\TVTest_Image\..\x64\Release\TVTest_Image.dll
========== すべてリビルド: 4 正常終了、0 失敗、0 スキップ ==========

TVTest.exe を起動するとエラーが出る -> 大人の事情

Error

348 名前:名無しさん@編集中[sage] 投稿日:2013/09/20(金) 01:09:27.00 ID:jz1ilbJn
・CCasProcessorのStub化
・「現在のサービスのみスクランブル解除する」設定機能の削除
・BonDriver専用のwinscard.dllを読み込む機能の削除

435 名前:名無しさん@編集中[sage] 投稿日:2013/09/20(金) 19:02:35.44 ID:VcZcAzFD
>>348の上から順に
0.8.0のCasProcessor.cpp・CasProcessor.hを上書きコピー
tvcas_attachmentのTVCAS.hを↑と同じフォルダにコピー
DtvEngine.cppにttp://pastebin.com/Jw5FJrLEの修正を適用

0.8.0のRecord.cpp・Record.h・RecordOptions.cpp・RecordOptions.hを上書きコピー
0.8.0のTVTest.rcの1162~1179行目を0.8.1のTVTest.rcの1167~1183行目に上書き
0.8.0のRecource.hの723行目を0.8.1のRecource.hの727行と728行の間に挿入

0.8.0のCoreEngine.cppの370~379行目を0.8.1のCoreEngine.cppの352行目と353行目の間に挿入
0.8.0のCoreEngine.cppの324~338行目を0.8.1のCoreEngine.cppの321行目と322行目の間に挿入
0.8.0のCoreEngine.hの69行目を0.8.1のCoreEngine.hの68行目と69行目の間に挿入
0.8.0のTVTest.cppの1071~1072行目を0.8.1のTVTest.cppの1082行目に上書き

DtvEngine.diff - Pastebin.com

--- TVTest_0.8.0_Src/DtvEngine/DtvEngine.cpp.orig
+++ TVTest_0.8.0_Src/DtvEngine/DtvEngine.cpp
@@ -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);