设置 DXVA-HD 状态

在视频处理期间,Microsoft DirectX 视频加速高清 (DXVA-HD) 设备保持从一帧到另一帧的持久性状态。 每个状态都有一个记录的默认值。 配置设备后,设置希望更改其默认值的任何状态。 在处理每个帧之前,请更新应更改的任何状态。

注意

此设计不同于 DXVA-VP。 在 DXVA-VP 中,应用程序必须为每个帧指定所有 VP 参数。

 

设备状态分为两类:

  • 状态单独应用每个输入流。 可对每个流应用不同的设置。
  • 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 平面 alpha。
DXVAHD_STREAM_STATE_PALETTE 调色板。 此状态仅适用于 Palettized 输入格式。
DXVAHD_STREAM_STATE_LUMA_KEY Luma 键。
DXVAHD_STREAM_STATE_ASPECT_RATIO 像素纵横比。
DXVAHD_STREAM_STATE_FILTER_Xxxx 图像筛选器设置。 驱动程序可以支持亮度、对比度和其他图像筛选器。

 

定义了以下 blit 状态:

Blit 状态 说明
DXVAHD_BLT_STATE_TARGET_RECT 目标矩形。
DXVAHD_BLT_STATE_BACKGROUND_COLOR 背景色。
DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE 输出颜色空间。
DXVAHD_BLT_STATE_ALPHA_FILL Alpha 填充模式。
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