次の方法で共有


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;
}

DXVA-HD