Platform SDK: DirectX

共通のビデオの問題の回避方法

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。Visual Basic for DirectX 7.0 ではビデオ ポートをサポートしていない。

[C++]

テレビ以外のディスプレイ デバイスで、ブロードキャスト ビデオを表示する場合、特有の問題がいくつか生じる。ここでは、いくつかの一般的な問題について簡単に触れ、続いて DirectDraw ビデオ ポート拡張機能がこれらの問題をどのように解決しようとしているかについて説明する。

NTSC インターレイス方式ディスプレイとインターリーブ メモリ

NTSC 信号は、毎秒約 30 フレーム、または 60 フィールドの速度でブロードキャストする。フレームと同様、NTSC 信号のフィールドはフレーム内の他のフィールドとは独立しており、異なるイメージ データを含むことができる。この動作の詳細については、「ビデオ フレームとフィールド」を参照すること。

フレーム内のフィールドの独立性に起因する問題は、2 つのフィールドがディスプレイに対してインターリーブされるときに生じる。動きの多いビデオでは、1 つのフレームにおける 2 つのフィールドで互いに適合しないイメージを含むことになり、動作異常が生じる。

この動作異常を回避するために、開発者はフィールドの 1 つを破棄するという方法をとることができる。この解決法ではイメージの質が約半分に落ちるが、目的によっては許容範囲内である。この解決法の他によくとられる方法は、表示する際に個々のフィールドを縦に 2 倍に伸ばして個別にフィールドを表示することである。この方法ではイメージの質はよくなるが、フィールドが y 方向に 1 ピクセル分オフセットされるため、アニメーションを再生するときに上下に "ジッター (ぶるぶる振動)" が生じる。

DirectDraw ビデオ ポート拡張機能では、イメージの質を改善するために、"Bob" および "Weave" と呼ばれる 2 つのより高度な技術を使うことができる。両方とも、ビデオ ポート拡張機能と共に使われる DirectDraw オーバーレイ サーフェスによりサポートされている。

最初のアルゴリズム Bob は、フレームの個々のフィールドを個別に表示するメソッドと非常に似ている。ただし、個々のフィールドに対して、オーバーレイの転送元矩形はジッター エフェクトに適応するように調整される。実際、転送元矩形は、スクリーン上のジッターを打ち消しながらフィールドと共に上下する。次の図でこのプロセスを示す。

Weave アルゴリズムは、動画をテレビに変換するためにビデオ産業界で使われる一般的な技術を使い、映画のオリジナル素材に対して最良のイメージ品質を提供する。Bob とは異なり、ビデオ ポート オブジェクトはそれ自体で組み立てていくことはない。このアルゴリズムを実現するには、両フィールドを同時に表示するデフォルト オーバーレイ動作と、カーネル モード ビデオ転送 (Windows NT 2000 と Windows 98 で提供される) を組み合わせなくてはならない。

完全を期すため、ここでアルゴリズムの概略を説明する。動画は、毎秒 24 フレームの速度でビデオがキャプチャされている。動画をテレビに変換する場合、技術者は 3:2 プルダウンと呼ばれる技術を使い、フレーム速度をテレビ放送用に毎秒 30 フレームに変換する。この技術では、必要とされるフィールド数にするために、ビデオ ストリームにおける 4 つの本物のフィールドごとに 1 つの冗長フィールドを挿入している。

組み立てる場合は、このプロセスを逆に行う。3:2 プルダウンが使用される場合、冗長フィールドを削除して元の動画フレームをリストアする。リストアされたフレームを構成するフィールドは、動作異常を生じることなくメモリでインターリーブすることができる。元のフィルム内の編集やリール破損のために、冗長フレームのパターンが変わる場合がある。これらの変化が生じるときにモニタし、動作を更新して新しいパターンに調整する必要がある。

デフォルトでは、オーバーレイ サーフェスは両フィールドを同時に表示する。Weave アルゴリズムを使用している場合はうまく機能するが、ビデオ ポートが Bob アルゴリズムを使用できなくなる。IDirectDrawSurface7::UpdateOverlay メソッドを呼び出すことにより、オーバーレイがビデオ データを処理する方法をプログラムに基づいて変更できる。オーバーレイの動作は、dwFlags パラメータのフラグにより決定される。DDOVER_BOB フラグを指定すると、ビデオ ポートは Bob アルゴリズムを使用する。フラグを指定しなければ、両フィールドを表示する。単に両フィールドを同時に表示すると、ビデオで動作異常が生じることに注意する。