Platform SDK: DirectX

ハーフラインにより引き起こされる問題の解決

[Visual Basic]

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

[C++]

ビデオ デコーダによっては、偶数フィールドの初めで意味のないデータのハーフラインを出力することがある。この余分なラインがフレーム バッファに書き込まれると、その結果で生じるイメージは歪曲したように見える。このような場合、フレーム バッファに書き込む前に、ビデオ ポート ハードウェアではこのデータを感知して破棄することができる。

IDDVideoPortContainer::GetVideoPortConnectInfo メソッドを使ってコネクション情報を取得する際に、ビデオ ポートがこのデータを破棄できるかどうかを決定できる。ビデオ ポートがハーフラインを破棄できない場合は、DDVPCONNECT_HALFLINE フラグが、サポートされる各コネクションに関連付けられた DDVIDEOPORTCONNECT 構造体の dwFlags メンバに指定される。

ビデオ ポートがハーフラインを破棄できない場合に、2 つのオプションが用意されている。フィールドの 1 つを破棄するか、ビデオ ポート オブジェクトの作成方法やターゲット オーバーレイ サーフェスでイメージを表示する方法を、いくらか調節してハードウェアの制限を回避する。

この問題を回避する方法を説明する。IDDVideoPortContainer::CreateVideoPort メソッドを呼び出してビデオ ポート オブジェクトを作成する場合、関連付けられた DDVIDEOPORTCONNECT 構造体の dwFlags メンバに、DDVPCONNECT_INVERTPOLARITY フラグを含める。これにより、ビデオ ポートはビデオ ストリームのフィールドの極性を反転し、偶数フィールドを奇数フィールドと同じように、または奇数フィールドを偶数フィールドと同じように処理する。反転されてしまうと、偶数フィールドの前のハーフラインは、各フレームの最初の走査線としてフレーム バッファに書き込まれる。意味のないデータを削除するには、必要な座標と共に IDirectDrawVideoPort::StartVideo メソッドを呼び出すことにより、イメージを表示するために使われるオーバーレイ サーフェスの転送元矩形を 1 ピクセル分だけ下に移動させる。この技術を使う場合、偶数フィールドを含むサーフェスに余分な 1 ラインを割り当てなくてはならないことに注意する。