TVTest TVCaptionMod2 Plugin ver.2.4

■概要
odaruさんが公開された「字幕 Plugin For TVTest(20081216)」をベースに、mark10alsさ
ん・makiさんによるCaption2Ass_PCR付属のCaption.dll改造版の改変点を選択的に取りこ
み、表示まわりを「字幕 Plugin For TVTest(20081216) 改変版(090627)」を参考にして
作成した字幕プラグインです。字幕の中央表示をしたいがために作りました。

■動作環境
・Vista以降
・TVTest/TVH264 ver.0.7.6(たぶん) 以降
・必要ランタイム: Visual Studio 2015、2017、および 2019 用 Visual C++ 再頒布可能パッケージ
  ・ビルド環境: Visual Studio Express 2017 for Windows Desktop

■以前のバージョンからの移行
TVCaptionMod2.tvtpを以前のものと置きかえてください。Caption.dllは不要です。
デフォルトの外字テーブル(!std)をUnicode5.2ベースに更新しました。Unicode5.2に対応
したフォントであれば基本的に外字フォントの導入は不要です。以前の外字テーブルが必
要な場合は"gaiji.zip"の"TVCaptionMod2_Gaiji_stdpua.txt"を使ってください。

■使い方
TVTestのプラグインフォルダにTVCaptionMod2.tvtpを入れ、右クリックメニューからプラ
グインを有効にして、字幕のある番組で字幕が表示されればOKです。

プラグイン設定は 右クリックメニュー→設定→プラグイン→TVCaptionMod2 から行いま
す。各設定について詳細は後述「設定ファイルについて」の対応する項目を参照してくだ
さい。必須ではないですが、記号の文字化けを防ぐために外字用フォントとして「和田研
ゴシック2004ARIB」(外字テーブル名!std)や「Windows TV ゴシック」(!typebank)を導入
・設定しておくことをお勧めします。
(参考)和田研フォント入手先: https://ja.osdn.net/projects/jis2004/
また、これらのフォントを導入する場合、添付の"gaiji.zip"フォルダにある
"TVCaptionMod2_Gaiji_std(typebank).txt"をプラグインフォルダに入れ、外字テーブル
名を"std"や"typebank"にしておくと、ドットの粗い文字や記号の出現をかなり抑制でき
ます(詳細は後述「設定ファイルについて」のGaijiTableNameの説明を参照)。

設定の「内蔵音再生する」を有効にする場合、プラグインフォルダに"TVCaptionMod2"と
いうフォルダをつくり、そこに適当な"00.wav"～"15.wav"を置いてください(「設定ファ
イルについて」RomSoundListを参照)。緊急地震速報の文字スーパー等で活用されます。

字幕表示時の負荷により他プラグインのオンスクリーン表示がカクつく場合は「垂直方向
アンチエイリアスしない」の項目を999ドットにしてみてください(「設定ファイルについ
て」VertAntiAliasingを参照)。

■おまけ
高水準漢字とARIB記号が収録されている丸ゴのフリーフォントは(多分)和田研ぐらいだと
思いますが、割とクセのあるフォントなのでRounded M+と混ぜたものを作ってみました。
外字テーブル名は和田研フォントと同じです。"j"などの下部を表示できるようにやや上
付きなので文字位置補正のY方向を5ぐらいに設定すると丁度いいです。
rounded-mplus-1m-arib-20131205.zip
https://www.axfc.net/u/search.pl?sha1=c5d3f3115218431e3fda0b8c25ac62e05ce48428
rounded-mplus-1m-arib-20121219.zip
https://www.axfc.net/u/search.pl?sha1=a75e3938b25c6426197d919a37b784f16474cbe8
(1年ぐらいで流れるっぽいので入り用なら再頒布してください)

■既知の不具合
たぶん色々な字幕形式に未対応です。以下思いつくもの:
・縦書き (なかなか遭遇しないのでどう表示されるかもわからない)
・PNG形式の字幕
・ORN縁取り指定の着色。いまのところ背景色で縁取り

■設定ファイルについて
設定ファイル"TVCaptionMod2.ini"は初回使用時プラグインフォルダに自動作成します。
必要な場合はこれを直接編集してカスタマイズしてください。*付きのキーはプラグイン
設定のダイアログから(完全には)設定できないものです。
EnOsdCompositor
    映像への字幕合成機能を有効にする[=1]かどうか
    # レンダラはVMR9かEVRを利用し、さらに設定キーMethod[=3]としてください。
    # TVTest設定→OSD表示→「映像と合成する」とおなじ方法で字幕を表示できるよう
    # にします。たぶんつぎの場合に効果的です:
    # ・TVTest本体のキャプチャ機能でキャプをとりたい
    # ・XPや非Aero環境での性能向上
    # TVTest ver.0.9.0未満ではAPIフックを利用する比較的リスキーな機能です。Aero
    # な環境では従来の設定キーMethod[=2]を利用することをお勧めします。
Version*
    設定ファイルのバージョン
    # デフォルト値を出力するために使います。特にユーザがいじる必要はありません。
CaptureFolder
    キー割り当て「字幕付き画像の保存」の保存先フォルダを絶対パスで指定
    # たとえば[=C:\CapFolder]とすると、そのフォルダに画像を保存します。
    # 指定しないと「字幕付き画像の保存」は機能しません。
CaptureFileName*
    「字幕付き画像の保存」の画像ファイル名
    # たとえば[=Capture]とすると、"Capture20121231-235959.bmp"のようになります。
SettingsIndex
    現在選択中の表示設定の番号
    # このキーより下の設定は実行中に切り替え(TVTest設定→キー割り当て→表示設定
    # 切り替え)できます。つまり↓のような感じです:
    # 
    # [Settings]
    # EnOsdCompositor=0
    # Version=1
    # CaptureFolder=
    # CaptureFileName=Capture
    # SettingsIndex=1
    # FaceName=Windows TV ゴシック
    # GaijiFaceName=
    # GaijiTableName=!typebank
    # Method=2
    # ShowFlags=65535
    # ShowFlagsSuper=65535
    # DelayTime=450
    # DelayTimeSuper=0
    # IgnorePts=0
    # TextColor=-1
    # BackColor=-1
    # ...
    # [Settings1]
    # FaceName=
    # GaijiFaceName=和田研中丸ゴシック2004ARIB
    # GaijiTableName=!std
    # Method=2
    # ShowFlags=0
    # ShowFlagsSuper=65535
    # DelayTime=450
    # DelayTimeSuper=0
    # IgnorePts=0
    # TextColor=255255000
    # BackColor=000000255
    # ...
    # [Settings2]
    # ...
FaceName
    使用するフォント名を指定
    # 何も指定しないと適当な等幅フォントが使われます。
    # ARIB外字が収録されているフォントを使用すると、記号も化けずに表示できます。
GaijiFaceName
    外字に使用するフォント名を指定
    # 何も指定しないと外字も上記FaceNameのフォントが使われます。
GaijiTableName
    使用する外字テーブル名を指定
    # まず、添付の"gaiji.zip"にある"{プラグイン名}_Gaiji_{テーブル名}.txt"からフ
    # ォントに合ったもの(メモ帳などでこのファイルを開けば、フォントに合っていれ
    # ば記号が羅列されるので大体わかります)をえらび、プラグインフォルダに置いて
    # ください。{テーブル名}の部分を指定することでその外字テーブルが使われます。
    # 
    # 「Windows TV ゴシック/丸ゴシック/太丸ゴシック」についてはプラグインに組み
    # 込まれています。[=!typebank]と指定してください。
    # 
    # 上述のファイルに特定ハッシュ値のDRCS(Dynamic Redefinable Character Set)を
    # 文字列に置換するリストを記述できます。たまに出現するドットの粗い文字や記号
    # が気になる方は利用してください。記述方法は"gaiji.zip"のstdまたはtypebankの
    # ものを参考にしてください。ハッシュ値はTVTestで取得できます。
    # 置換可能な文字列は3文字まで、サロゲートペアに対応しています【ver.1.1～】。
    # 2文字や3文字の場合も表示は1文字幅に圧縮されることに注意してください。
Method
    字幕の表示方法
    # 通常ウィンドウ[=1]、レイヤードウィンドウ[=2]、もしくは映像と合成[=3](要
    # EnOsdCompositor[=1])のいずれかを指定してください。
ShowFlags* / ShowFlagsSuper*
    字幕/文字スーパーを表示するかどうかのフラグ
    # 基本的に、すべて表示する[=65535]または表示しない[=0]のどちらかを指定してく
    # ださい。
    # [かなり上級者向け]
    # この設定キーはARIB STD-B24のDMF(表示モード)と関係しています。たとえばDMFの
    # 値が10(=受信時選択表示・記録再生時選択表示)の字幕/文字スーパーは、10ビット
    # 目を立てる(=設定値に1024を加える)ことで表示されるようになります。
DelayTime / DelayTimeSuper*
    字幕/文字スーパーを受け取ってから表示するまでの遅延時間をミリ秒で指定
    # [=-5000]から[=5000]まで。
    # 
    # [上級者向け]
    # 字幕については、PTS(Presentation Time Stamp)がPCR(Program Clock Reference)
    # に同期した時点を基準[=0]とします。文字スーパー、もしくはIgnorePts[=1]のと
    # きの字幕については、データを受け取った時点を基準とします(つまり[=0]未満に
    # しても表示が早まることはない)。
IgnorePts
    PTSを無視する[=1]かどうか
    # 番組のPTSが信用できないときに使います。
    # とにかく即時に字幕を表示させたいときにも使えます(DelayTime[=0]にする)。
TextColor* / BackColor*
    字幕文/背景枠の色
    # [=-1]のときは自動(TSに含まれる情報をそのまま使う)です。RGB値を10進数で表現
    # してください: (例) (R,G,B)=(128,64,0)のとき、[=128064000]
TextOpacity / BackOpacity
    字幕文/背景枠の透過率
    # [=-1]のときは自動(TSに含まれる情報をそのまま使う)です。0%[=0]～100%[=100]
    # で指定してください。
VertAntiAliasing
    フォントの垂直方向アンチエイリアスを行うフォント高さ(画素数)の下限
    # ClearTypeフォントの横線のジャギーが気になる場合に効果的です。
    # Method[=2,3]のときだけ効果があります。
    # 字幕表示の負荷が気になる場合は[=999]などの大きな値にしてください。
    # フォント高さがこの設定値以下のときは、StrokeByDilate以下ならばアンチエイリ
    # アス処理なし、それ以外は低品質(低負荷)なアンチエイリアスをかけます。
FontXAdjust / FontYAdjust / GaijiFontXAdjust* / GaijiFontYAdjust*
    フォント/外字フォントのX方向/Y方向の位置を補正
    # 文字が左寄りや上付きになるようなときに使います。
FontSizeAdjust / GaijiFontSizeAdjust*
    フォント/外字フォントの文字サイズを調整(単位はパーセント)
    # たとえば[=90]とすると、通常にたいして線分比で90%の大きさになります。
FontRatioAdjust / GaijiFontRatioAdjust*
    フォント/外字フォントの縦横比を調整(単位はパーセント)
StrokeWidth
    字幕文の縁取りの幅
    # [=0]以上のときは画面の大きさにかかわらず指定した幅で縁取ります。
    # [=0]より小さいときは画面に応じて縁取りの幅を調整します。
OrnStrokeWidth
    ORN縁取り指定された字幕文の縁取りの幅
    # [=0]以上で指定します。
    # 字幕データ内で明示的に縁取りを指示されているときの幅です。
StrokeSmoothLevel
    縁取りをなだらかに透過させる度合い
StrokeByDilate
    膨張アルゴリズムで縁取るフォント高さ(画素数)の上限
    # 画面を小さくしたときに縁取りが汚くなる場合は値を上下させてみてください。
PaddingWidth*
    両端の余白をふやす幅
    # 文字の左右端が背景枠からはみ出るようなときに使います。
AvoidHalfFlags
    英字/数字/その他約物(@や!など)の半角置換を回避するフラグ
    # (旧AvoidHalfAlphaから拡張)
    # プロポーショナルな文字の描画が乱れるときに使います。
    # この設定でプロポーショナルフォントが破綻なく使用できるとは限りません。等幅
    # フォントの使用をお勧めします。
IgnoreSmall
    振り仮名らしきものを除外する[=1]かどうか
    # 厳密には小型サイズ(SSZ)の字幕文を除外します。
ShiftSmall
    振り仮名らしきものの行間を詰める[=1]かどうか
    # IgnoreSmallを[=1]にしたときの行間が気になるときに使います。
Centering
    字幕を画面中央に表示する[=1]かどうか
    # 厳密には字幕の表示領域を縦横2/3にして上部中央に配置します。
ShrinkSDScale
    SD字幕の横幅をすこし縮める[=1]かどうか
    # 標準画質放送の字幕は横に引き伸ばされることが多いですが、これを補正します。
ViewXAdjust / ViewYAdjust
    字幕の表示位置を補正(単位はパーセント)
RomSoundList*
    内蔵音0～18のリストを':'区切りで指定
    # フォーマット: [;]{内蔵音0}:{内蔵音1}: ... :{内蔵音18}
    # 何も指定しないか';'でコメントアウトすると内蔵音再生しません。
    # 
    # {内蔵音0}～については、プラグインフォルダにプラグインと同名(通常は
    # "TVCaptionMod2")のフォルダをつくり、そこに配置した"{ファイル名}.wav"という
    # 音声ファイルの{ファイル名}の部分を指定してください。何も指定しないかファイ
    # ルがなければ再生しません。また、先頭を'!'にするとシステムサウンドのエイリ
    # アスを参照します。エイリアスについては
    # http://dobon.net/vb/dotnet/programing/playsystemsound.html などを参考に、
    # 例えば「Windowsログオン」時のサウンドは !WindowsLogon となります。
    # 
    # 参考-地デジの内蔵音定義(詳細はARIB TR-B14参照):
    # ・内蔵音0～4   速報チャイム1～5
    # ・内蔵音5～12  ボタン操作音1～8
    # ・内蔵音13     アラート音
    # ・内蔵音14～15 未定義
    # 
    # 独自定義の内蔵音(再生テストなどに便利):
    # ・内蔵音16     表示設定切り替え
    # ・内蔵音17     プラグイン有効時
    # ・内蔵音18     プラグイン無効時

■ソースについて
Caption.dll(現CaptionLib.lib)のソースコードはodaruさんのもの、または
Caption2Ass_PCR付属のものとなるべく差分をとれるように改変してます(WinMergeなどつ
かうとよいかも)。TVCaptionMod2.tvtpのほうは基本的にスクラッチです。

TSファイルの解析のために、tsselect-0.1.8(
http://www.marumo.ne.jp/junk/tsselect-0.1.8.lzh)よりソースコードを改変利用してい
ます。
また、TVTest ver.0.7.23から"PseudoOSD.cpp"、"PseudoOSD.h"、ほかソースコードを改
変利用しています(ソースコメントに流用元を記述しています)。
また、Caption.dll改造版より多くを参考にしているので、このプラグインもCaption.dll
オリジナル版の以下ライセンスに従います(TVCaptionMod2.tvtpのソースの取り扱いにつ
いても同様です)。改変や流用にあたって当方に連絡は不要です。

------引用開始------
●EpgDataCap_Bon、TSEpgView_Sample、NetworkRemocon、Caption、TSEpgViewServerの
ソースの取り扱いについて
　特にGPLとかにはしないので自由に改変してもらって構わないです。
　改変して公開する場合は改変部分のソースぐらいは一緒に公開してください。
　（強制ではないので別に公開しなくてもいいです）
　EpgDataCap.dllの使い方の参考にしてもらうといいかも。

●EpgDataCap.dll、Caption.dllの取り扱いについて
　フリーソフトに組み込む場合は特に制限は設けません。ただし、dllはオリジナルのまま
　組み込んでください。
　このdllを使用したことによって発生した問題について保証は一切行いません。
　商用、シェアウェアなどに組み込むのは不可です。
------引用終了------

■更新履歴
ver.1.9 (2016-02-03)
・ソース管理をGitHubに移行した。以後の更新内容は省略
・https://github.com/xtne6f/TVCaptionMod2
ver.1.8 (2013-12-10)
・文字の縦横比を調整できるようにした
・半角英字への置換をオフにできるようにした
・文字サイズを調整したときに両端の余白幅が微妙に狂うのを修正
・コード微整理
ver.1.7 (2013-12-06)
・x86/x64ビルド環境をVC++2010Expressに統一
・Caption.dllを静的リンク
・OpenTypeフォント等が一覧に表示されないのを修正
・DRCS出現時のレンダリングをより正確にした
・(万が一)非常に複雑な字幕が送られても描画しきれるようにした
・おまけフォントの更新とDRCS追加
ver.1.6r2 (2013-06-06)
・ARIB8CharDecode.cppのデフォルトマクロ文の誤りを修正
・ついでにCaption.dllのビルドオプションを微調整
ver.1.6 (2013-03-05)
・TVTestスレPart50>>57を参考にサイドカット表示を考慮
  ・ただし設定キーMethod[=1,2]のときのみ
・字幕表示のちらつきを軽減
・VertAntiAliasingの定義を微妙に変更
・振り仮名の文字の縁取りが太すぎてバランスが悪いように感じたので微調整
・OsdCompositorを更新(他プラグインとのすり合わせ)
・その他コード整理とDRCS追加
ver.1.5 (2012-12-21)
・一部局がMPEGヘッダのアスペクト比4:3で16:9の映像を送っている?ようなので考慮
  ・この辺詳しい方居れば解説を…→TVTestスレで解決済
・半角置換対象の記号を拡大、英数字も置換するようにした
ver.1.4r2 (2012-11-26)
・両端の余白を増やしたとき、字幕背景に隙間や重なりができる場合があったのを修正
ver.1.4 (2012-11-25)
・外字フォントの文字位置/サイズ補正をベースフォントと別に指定できるようにした
・外字テーブルファイルを更新
・設定キーが増えてきたのでiniをセクション単位読み込みに変更
・若干の冗長コード削除
ver.1.3 (2012-11-17)
・プラグイン設定ダイアログを追加
  ・一部の設定はiniを直接編集する必要あり
・文字位置補正機能を追加
・振り仮名除外機能を追加
・両端の余白を増やせるようにした
ver.1.2 (2012-08-26)
・「字幕Plugin改変版(090627)」やTVTest本体のコードを参考に、映像への字幕合成機能
  を追加(設定キーEnOsdCompositor)
・設定キーFixRatioを廃止(今後は常に[=1]相当)
ver.1.1 (2012-08-14)
・サロゲートペアに対応
  ・Windows TV ゴシックの通称「つちよし」などを表示できるようになった
  ・関連して外字テーブルのファイルを修正
・約物の半角置換処理を改善
・スレを参考にフラッシング制御(FLC)を背景も含めて明滅させるようにした
ver.1.0 (2012-07-19)
・0.9→1.0だけど特に大きなバージョンアップではない
・フラッシング制御(FLC)に対応
  ・初めて見ました。サンプル提供感謝します
・1/2幅で描画すべき約物について、可能なら一部を半角に置きかえるようにした
・「字幕付き画像の保存」機能を追加
・レンダラによっては「字幕付き画像のコピー」の比率がおかしくなるのを修正
・囲み制御(HLC)の囲み線にも膨張処理がかかってしまうのを修正
・デフォルトの字幕以外の字幕が混在して表示される場合があったのを修正
  ・0.9r4以前はサービスごとに字幕および文字スーパーそれぞれ最大1つであることを仮
    定していたため。1.0以降はコンポーネントタグを確認するようにした
  ・情報、サンプル提供サンクスです
・ver.0.9r4でワンセグ字幕が表示されなくなっていたのを修正
ver.0.9r4 (2012-07-16)
・CM明けなどに字幕が表示されない可能性を排除(できたかもしれない)
・文字サイズ小のときは垂直方向アンチエイリアスを切れるようにした
  ・設定キーVertAntiAliasingとStrokeByDilateのデフォルト値に変更があるので注意
ver.0.9r3 (2012-07-04)
・通常フォントと外字フォントの(上端ではなく)下端を揃えるようにしてみた
  ・この修正でメイリオなどのレディングの大きいフォントは下付き→上付きになるが、
    こういうフォントは横方向の合わせも必要だったりするのでとりあえず対応を保留
ver.0.9r2 (2012-07-01)
・Caption.dll 0111改造版の公開停止要望があったとの書き込みをうけ、関連するコード
  (10行ぐらい)を変更
  ・変更点はdiff_09_09r2.txtを参照
  ・機能変更はなし
ver.0.9 (2012-06-29)
・垂直方向アンチエイリアスを利かせてみた(設定キーVertAntiAliasing)
・文字サイズを微調整できるようにした(設定キーFontSizeAdjust)
・レンダリングの細かな最適化
ver.0.8 (2012-06-13)
・字幕付きでクリップボードに画像コピーできるようにした
・DRCSを文字列置換できるようにした(設定キーGaijiTableNameの説明を参照)
ver.0.7 (2012-06-08)
・スレ報告より以下3点を修正・追加
  ・マルチ放送などでのサービス切り替え動作をチェックしてなかったのを修正
  ・PTSが信用できないソースに対するフォローを追加 (設定キーIgnorePts)
  ・プラグイン有効/無効時の内蔵音を追加
ver.0.6 (2012-06-02)
・文字スーパーに対応(未検証)
・字幕ウィンドウがなるべく前面に来ないようにした
・TVTestが非表示状態(最小化起動を含む)のときに字幕が表示されてしまうのを修正
  ・スレの指摘サンクスです
・言語切り替えを改善
  ・実質機能してなかったので修正
  ・第2言語のない番組は第1言語の字幕/文字スーパーを表示するようにした
  ・切り替え時にTVTestのログに出すようにした
ver.0.5 (2012-05-28)
・外字用のフォントを別に指定できるようにした
・内蔵音再生(PRA)に対応(未検証)
  ・文字スーパーに未対応なのであまり意味ないかも
ver.0.4 (2012-05-26)
・TVH264のワンセグ字幕に対応
・Caption.dll:冗長なバイナリを吐いていた部分をすこし改変
・人柱表記をはずした
ver.0.3 (2012-05-20)
・字幕表示のちらつき防止と効率化
ver.0.2 (2012-05-17)
・画面左上の字幕の位置がずれる場合があったのを修正
・映像とウィンドウのアスペクト比がことなる場合の動作を改善
・縁取りがあんまり綺麗じゃなかったので修正
ver.0.1 (2012-05-14)
・初版
