DXVA-HD 状態の設定
ビデオ処理中、Microsoft DirectX Video Acceleration High Definition (DXVA-HD) デバイスは、あるフレームから次のフレームに永続的な状態を維持します。 各状態には、文書化された既定値があります。 デバイスを構成したら、既定値から変更する状態を設定します。 各フレームを処理する前に、変更する必要がある状態を更新します。
注意
この設計は DXVA-VP とは異なります。 DXVA-VP では、アプリケーションで各フレームのすべての VP パラメーターを指定する必要があります。
デバイスの状態は、次の 2 つのカテゴリに分類されます。
- ストリームの 状態は、各入力ストリームを個別に適用します。 各ストリームに異なる設定を適用できます。
- Blit 状態は 、ビデオ処理 blit 全体にグローバルに適用されます。
次のストリーム状態が定義されています。
ストリームの状態 | 説明 |
---|---|
DXVAHD_STREAM_STATE_D3DFORMAT | ビデオ形式を入力します。 |
DXVAHD_STREAM_STATE_FRAME_FORMAT | インター レース。 |
DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE | 入力色空間。 この状態は、入力ストリームの RGB カラー範囲と YCbCr 転送マトリックスを指定します。 |
DXVAHD_STREAM_STATE_OUTPUT_RATE | 出力フレーム レート。 この状態は、フレーム レート変換を制御します。 |
DXVAHD_STREAM_STATE_SOURCE_RECT | ソースの四角形。 |
DXVAHD_STREAM_STATE_DESTINATION_RECT | 変換先の四角形。 |
DXVAHD_STREAM_STATE_ALPHA | 平面アルファ。 |
DXVAHD_STREAM_STATE_PALETTE | カラー パレット。 この状態は、淡色化された入力形式にのみ適用されます。 |
DXVAHD_STREAM_STATE_LUMA_KEY | Luma キー。 |
DXVAHD_STREAM_STATE_ASPECT_RATIO | ピクセル縦横比。 |
DXVAHD_STREAM_STATE_FILTER_Xxxx | 画像フィルターの設定。 ドライバーは、明るさ、コントラスト、およびその他の画像フィルターをサポートできます。 |
次の blit 状態が定義されています。
Blit State | 説明 |
---|---|
DXVAHD_BLT_STATE_TARGET_RECT | ターゲットの四角形。 |
DXVAHD_BLT_STATE_BACKGROUND_COLOR | 背景色。 |
DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE | 出力色空間。 |
DXVAHD_BLT_STATE_ALPHA_FILL | アルファ塗りつぶしモード。 |
DXVAHD_BLT_STATE_CONSTRICTION | 収縮。 この状態は、デバイスが出力をダウンサンプリングするかどうかを制御します。 |
ストリームの状態を設定するには、 IDXVAHD_VideoProcessor::SetVideoProcessStreamState メソッドを 呼び出します。 blit 状態を設定するには、 IDXVAHD_VideoProcessor::SetVideoProcessBltState メソッドを 呼び出します。 どちらのメソッドでも、列挙値は設定する状態を指定します。 状態データは、状態固有のデータ構造を使用して提供されます。この構造体は、アプリケーションによって void* 型にキャストされます。
次のコード例では、ストリーム 0 の入力形式と変換先の四角形を設定し、背景色を黒に設定します。
HRESULT SetDXVAHDStates(HWND hwnd, D3DFORMAT inputFormat)
{
// Set the initial stream states.
// Set the format of the input stream
DXVAHD_STREAM_STATE_D3DFORMAT_DATA d3dformat = { inputFormat };
HRESULT hr = g_pDXVAVP->SetVideoProcessStreamState(
0, // Stream index
DXVAHD_STREAM_STATE_D3DFORMAT,
sizeof(d3dformat),
&d3dformat
);
if (SUCCEEDED(hr))
{
// For this example, the input stream contains progressive frames.
DXVAHD_STREAM_STATE_FRAME_FORMAT_DATA frame_format = { DXVAHD_FRAME_FORMAT_PROGRESSIVE };
hr = g_pDXVAVP->SetVideoProcessStreamState(
0, // Stream index
DXVAHD_STREAM_STATE_FRAME_FORMAT,
sizeof(frame_format),
&frame_format
);
}
if (SUCCEEDED(hr))
{
// Compute the letterbox area.
RECT rcDest;
GetClientRect(hwnd, &rcDest);
RECT rcSrc;
SetRect(&rcSrc, 0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);
rcDest = LetterBoxRect(rcSrc, rcDest);
// Set the destination rectangle, so the frame is displayed within the
// letterbox area. Otherwise, the frame is stretched to cover the
// entire surface.
DXVAHD_STREAM_STATE_DESTINATION_RECT_DATA DstRect = { TRUE, rcDest };
hr = g_pDXVAVP->SetVideoProcessStreamState(
0, // Stream index
DXVAHD_STREAM_STATE_DESTINATION_RECT,
sizeof(DstRect),
&DstRect
);
}
if (SUCCEEDED(hr))
{
DXVAHD_COLOR_RGBA rgbBackground = { 0.0f, 0.0f, 0.0f, 1.0f }; // RGBA
DXVAHD_BLT_STATE_BACKGROUND_COLOR_DATA background = { FALSE, rgbBackground };
hr = g_pDXVAVP->SetVideoProcessBltState(
DXVAHD_BLT_STATE_BACKGROUND_COLOR,
sizeof (background),
&background
);
}
return hr;
}
関連トピック