设置 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;
}
相关主题