Microsoft DirectX 8.0

アナログ TV アプリケーションを書く

このトピックは以下のセクションが含まれる :

アナログ TV フィルタ グラフはアナログ TV チューナー キャプチャ カードをベースにしている。通常 1 枚のカードに複数のデバイスが含まれる : チューナー、信号をルーティングするゼロ以上のクロスバー、アナログ-デジタル コンバータ (アナログ ビデオ デコーダとも呼ばれる)、そして TV オーディオが別のデバイスの場合もある。カードのそれぞれのデバイスの Microsoft® Windows® Driver Model (WDM) デバイス ドライバは製作者あるいは他のサードパーティから提供される。これらのドライバは Microsoft から提供されるフィルタやプラグインといっしょに働き、フィルタグラフに参加する事ができる。Microsoft が提供するコンポーネントは TV チューナー フィルタ、TV オーディオ フィルタ、アナログ ビデオ クロスバー フィルタ、そして WDM ビデオ キャプチャ プラグインである。GraphEdit で、これらのフィルタは "WM Streaming" カテゴリに現れる、フィルタのフレンドリ名はドライバによって変わる。アプリケーションは System Device Enumerator を使ってそれらのフィルタを発見する。それらのデバイスをプログラム上で発見する方法の詳細は、デバイスとフィルタの列挙 を参照すること。DirectShow でハードウェア デバイスの使用についての一般的な情報は、ハードウェア デバイスがフィル タグラフに参加する方法」を参照すること。

上記のデバイスフィルタについては更に、アナログ TV フィルタ グラフは DirectShow の一部として Microsoft が提供する (KsProxy ベースの) カーネル モード フィルタとユーザーモード フィルタをも含む。これらのフィルタは Tee/Sink-to-Sink コンバータVBI サーフェイス アロケータCC デコーダLine 21 デコーダオーバーレイ ミキサービデオ レンダリングなどである。これらのフィルタの詳細は後のセクションで説明される。

アナログ TV ハードウェア デバイスのクラス

アナログ TV フィルタ グラフ作成のコンテキストには、2 つの基本的なアナログ キャプチャ カードのクラスがある : (1) ビデオ データを直接ビデオ メモリに送るもの、これはビデオポートを呼び出し直接ハードウェアと接続する、そして (2) ビデオ データを PCI バス、あるいは USB や IEEE 1394 接続を通してまずホストのメモリに送り、それからグラフィックス カードに送るもの。

アプリケーションから見ると、フィルタグラフ内でビデオポート デバイスと PCI/USB/1394 デバイスという 2 つの基本的な違いがある :

  1. ビデオポート デバイスをベースとしたグラフは別のフィルタ VBI サーフェイス アロケータを必要とする。このフィルタは VBI ビットマップ用にビデオ グラフィックス アダプタに別のビデオメモリ割り当てを必要とする。キャプチャ フィルタで VPVBI 出力ピンと接続する。PCI デバイスではオーバーレイ ミキサーがこのメモリを割り当て、VBI サーフェイス アロケータは不要である。
  2. ビデオポート デバイスをベースとしたグラフは Bt829 キャプチャ フィルタを使い、PCI (と 1394/USB) デバイスをベースとしたグラフは Bt848 キャプチャ グラフを使う。Bt848 フィルタは VBI サーフェイス アロケータを使わない。

    アナログ TV フィルタ グラフ

    次の図は ATI All-In-Wonder カードをベースとしたアナログ TV フィルタ グラフを示す。このグラフはビデオ、オーディオ、クローズドキャプション テキストをレンダリングし、ビデオとオーディオを非圧縮 AVI ファイルにキャプチャもする。(このフィルタ グラフは少し複雑だが、キャプチャ グラフ ビルダと数行のコードだけで作成できる。グラフの作成はこのセクションの終りで説明する。)

    ATI All-In-Wonder フィルタ グラフ

    TV チューナー: 実際には何のデータも通らないが、このフィルタは必ずグラフの最初のフィルタとなる。アプリケーションはその IAMTVTuner インターフェイスを使って、チャンネルから周波数へのマッピングをセットしチャンネル選択を行う、またハードウェアがサポートするビデオ規格の情報を取得する。

    アナログ ビデオ クロスバー: クロスバー フィルタはルーティング デバイスであり、それを使ってアプリケーションはハードウェアの入力信号を正しいデータパスに設定する。これフィルタは IAMCrossbar インターフェイスをサポートする。このフィルタの入力ピンはアンテナ、ケーブル、または(VTR のような) AUX ラインからの物理的な入力を表わす。どの入力信号も 1 つ以上の出力ピンにルーティングされ得る。前述の ATI グラフは 2 つのクロスバー フィルタを持っている。アップストリーム クロスバーは外部入力用で、2 つ目は (AD コンバータとも言われる) ハードウェア ビデオ デコーダへの複数入力用である、これはグラフ内のキャプチャ フィルタによって表現されている。別のカードは別のクロスバー構成を持つ場合がある。

    ビデオ キャプチャ フィルタ: このカーネル モード フィルタはハードウェア上の AD コンバータを表現する。それはビデオ信号を実際に処理する最初のフィルタである。Microsoft はビデオポートデバイスに使用される Brooktee 829 キャプチャ チップをサポートするドライバを提供し、IHV は Brooktree 848, 878 あるいは他のビデオチップ用のドライバを提供する。すべてのこれらのドライバは WDM ビデオ キャプチャ プラグインを使って、プロパティ ページを提供し、その COM インターフェイスを公開する。そのドライバとプラグインはアプリケーションには 1 つの「フィルタ」として現れる。アプリケーションはこのフィルタの IAMAnalogVideoDecoder インターフェイスを使って、サポートされているアナログ ビデオ フォーマット、水平同期の状態、出力バスを取得あるいは設定する。キャプチャ フィルタは出力として 2 つの別のビデオ ストリームを作成することができる、片方はレンダリング用、もう片方はキャプチャ用である。(VP あるいは ビデオポートという名の) レンダリング ピンは必ずオーバーレイ ミキサーの入力ピン ゼロに接続する。「オーバーレイ ミキサー フィルタ」にはビデオ ポート接続についての詳細情報が記述されている。

    キャプチャ フィルタは VBI データを異なるピンに出力する、あるカードは ロー VBI データを出力し、あるカードはハードウェア内で VBI デコードを行う。すべての Microsoft VBI フィルタは現在ロー データとデコード データの両方をサポートする。All-In-Wonder カードはビデオポートを持つので、Bt829 フィルタが使われる、それは VBI サーフェイス アロケータへの出力ピンを持ち、Line 21 デコーダが提供する CC オーバーレイ用にビデオ メモリを正しく構成する。このフィルタはオーバーレイ ミキサー上で入力ピン 1 以上のものと接続する。

    AVI デコンプレッサ: AVI デコンプレッサ フィルタはビデオ圧縮マネージャ CODEC のラッパー フィルタである。アナログ TV キャプチャ グラフでは、それは AVI マルチプレクサに送る前にビデオ ストリームを UYVY から RGB に変換する MSYUV カラー コンバータをラップする。

    オーディオ キャプチャ: オーディオ キャプチャ フィルタはクロスバーのオーディオ デコーダ出力ピンからデジタル化されたオーディオを受け取る。このピンは実際にはサウンド カードの内部入力を表現する、それは CD ドライブだけではなくホスト システムの内部ソースの場合もある。オーディオ キャプチャ フィルタの他の入力ピンは通常マイクロフォン、テーププレーヤーなどのような外部デバイスからのアナログ入力を表す。正確なピンの構成と名前はサウンドカードによって異なる。前述したグラフでは、オーディオ キャプチャ フィルタはオーディオ データを AVI Mux フィルタに出力する。

    このグラフにはオーディオ レンダリング フィルタ が含まれていないことに注意すること、このフィルタは TV カードが外部ケーブルでサウンドカードに (あるいはドングルでサウンドカードの入力ジャックに) 接続されているときは必要がない。このケーブルが使われていないなら、前述のようにグラフはスマート ティー フィルタを使い、オーディオ キャプチャ フィルタ ダウンストリームから AVI Mux への出力と同じようにデフォルト DirectSound デバイスにオーディオを出力する。

    Tee/Sink-to-Sink コンバータ: このフィルタはキャプチャ フィルタから VBI 情報を取得し、信号の各データサービスに対応して別のストリームに分割する。Microsoft は VBI CODEC をクローズド キャプション、NABTS、World Standard Teletext (WST) に対して提供する。上述のグラフではキャプチャについてのサービスはクローズド キャプションだけである。

    CC デコーダ: CC VBI デコーダはカーネル モード ストリーム クラス フィルタである。8 つまでの出力ピンを持ち、各ピンはそれ自身のラインとサブストリームを選択可能である。その仕事はキャプチャ された VBI ラインを処理し、CC データを Line 21 デコーダや他のアプリケーションに出力することである。最初の出力ピンは Line 21 デコーダに接続される。

    Line 21 デコーダ: Line 21 デコーダは CC デコーダからでコードされたクローズドキャプション データを取得し、ビデオ矩形にオーバーレイされるビットマップを生成する。次にこのデータはオーバーレイ ミキサーに渡される。

    NABTS/FEC VBI CODEC フィルタ (図にはない): NABTS/FEC VBI CODEC は ring-0 ストリームクラス フィルタである。それは VBI と HWNABTS という 2 つの入力ピンを持つ。8 つまでの出力ピンを持ち、各ピンは自身の VBI スキャンラインとサブストリームを選択することができる。その仕事はキャプチャされた VBI ラインを処理し、デコードされたあるいはフォワード エラーが付いた NABTS データを BDA SLIP デフレーマ フィルタに出力し、次に WinSock 経由でアプリケーションから利用可能な IP データを作成する BDA IP シンクに送ることである。

    WST CODECWST デコーダ フィルタ (図にはない): これらのフィルタは ring-0 ストリーム クラス フィルタであり、PAL システムの teletext データを処理する。WST CODEC は ロー VBI データを受け取る 1 つの入力ピンを持つ。それは 8 つまでの出力ピンを持ち、各ピンは自身のラインとサブストリームを選択できる。その仕事はキャプチャされた VBI ラインを処理し、デコードされた teletext データをアプリケーションに出力する事である。最初の出力ピンは WST デコーダに接続され、クローズドキャプション データで Line 21 デコーダが行うのと同じようにハードウェアオーバーレイのビットマップを作成する。

    オーバーレイ ミキサー: この DirectShow フィルタはシステムのビデオメモリで実際のビデオのレンダリングを行う。それはビデオ ポート タイプと 非ビデオ ポート タイプ両方のハードウェアで使われる。

    ビデオ レンダラ: オーバーレイ ミキサーを使ってビデオをレンダリングするすべてのグラフでは、ビデオ レンダラは単なるウィンドウ マネージャとして働き、オーバーレイ ミキサーにビデオ矩形をスクリーンのどこに置くかを指示する。

    グラフの作成

    アナログ TV グラフは単に 1 つのタイプの WDM ビデオ キャプチャ グラフである。キャプチャ グラフ ビルダを使って作成し得る、これは「キャプチャ アプリケーションの書き方」で説明され、AMCap サンプル アプリケーションでデモンストレーションされている。AMCap でデモされているように、基本原理はキャプチャ フィルタで始め、次にレンダリングあるいはキャプチャしようとする各入力ピンに対してダウンストリーム フィルタを追加する。アップストリーム フィルタは最後についたする。AMCap はクローズドキャプション データをレンダリングする CC デコーダと Line 21 デコーダ フィルタに引き込む方法を示すが、NABTS や teltetex データのキャプチャリングのために他の VBI 関連フィルタに引き込む方法はデモされていない。

    VBI データのキャプチャリング

    DirectShow はアナログ TV 放送信号の垂直同期間隔 (VBI) から NABTS と (PAL用の) World Standard Teletext (WST) をキャプチャリングするカーネルモード フィルタを提供する。これらのフィルタは GraphEdit 内で WDM ストリーミング VBI CODEC カテゴリの下に表示される。キャプチャ フィルタはロー VBI データを Tee/Sink-to-Sink コンバータに送る 1 つの出力ピンを持ち、それは NABTS IP データ、Line 21 クローズドキャプション、tetetext 情報の信号内にあるデータを調べ、各データタイプの出力ピンを作成する。クローズドキャプションや teletext データをデコードするためのフィルタを追加するには、MSTee フィルタの適切な出力ピンで ICaptureGraphBuilder2::RenderStream メソッドを使うこと。前述の図では CC データのキャプチャリングとレンダリング用のフィルタを示しており、AMCap サンプルはクローズドキャプション データをグラフに追加する方法をデモしている。(Web ページや Web イメージを含むインタラクティブ TV 拡張のような) NABTS IP データに対しては、ビデオ キャプチャ フィルタからフィルタ ダウンストリームのチェーンを手動で追加、接続しなければならない。VBI データを 2 つのストリームに分割するには Tee/Sink-to-Sink コンバータ フィルタの追加に注意すること。

    NABTS とクローズドキャプション フィルタ グラフ セグメント

    これらのカーネルモード フィルタ上にはアプリケーションから呼び出し可能なインターフェイスはない。それらは SLIP エンコードされた IP パケットを VBI 信号から抽出し、それを Winsock に渡すデータ パイプラインとしてのみ機能する。

    teletext データについては、フィルタは次の図で示されている。

    世界標準 Teletext フィルタ グラフ セグメント

    NABTS、teletext、CC デコーディング をハードウェアで処理するキャプチャデバイスもある。この場合、キャプチャ フィルタは特殊な出力ピンを公開し、ダウンストリーム デコーダはそのデータを修正せずに渡すだけである。アプリケーション開発者には特殊なプログラミングは必要ない。

    VBI の Line 21 にはクローズドキャプション テキストだけではなく、現在の放送と連携した Web ページの URL も含まれている。これは ATVEF 規格の "Transport B" として記述されている。

    アナログ TV チューニング

    TV チューナーをコントロールするときの基本的な処理順は以下のとおりである :

    1. 必要なら、アナログ ビデオ クロスバー フィルタで IAMCrossbar インターフェイスを使って、チューナーからビデオ デジタイザ (キャプチャ フィルタ) へのクロスバー経由のビデオパスを構築する。
    2. IAMTuner::put_Mode メソッドを呼び出し、受信放送タイプ (TV、AM オーディオ、FM オーディオなど) のチューナー カードをセット
    3. IAMTuner::put_CountryCode で国コードをセットして、正しい TV チャンネル-周波数マッピングを構築する。国コードの詳細については、「国際アナログ テレビのチューニング」を参照すること。
    4. チューナーの各入力に対して、IAMTVTuner::put_InputType を呼び出し、ケーブルかアンテナの入力タイプを設定する。IAMTVTuner::put_ConnectInput を使って、利用可能なチューナー入力の 1 つを選択する。
    5. IAMTVTuner::get_TVFormat を呼び出し、現在のビデオフォーマットを取得し、次にこの値を使って IAMAnalogVideoDecoder::put_TVFormat を呼び出しキャプチャ フィルタを設定する。
    6. IAMTuner::put_Channel を呼び出し、視聴を開始する。