設定 DXVA-HD 狀態
在影片處理期間,Microsoft DirectX 影片加速高定義 (DXVA-HD) 裝置會維持從一個畫面到下一個畫面的持續性狀態。 每個狀態都有記載的預設值。 設定裝置之後,請設定您想要從預設值變更的任何狀態。 處理每個畫面之前,請先更新任何應該變更的狀態。
注意
此設計與 DXVA-VP 不同。 在 DXVA-VP 中,應用程式必須指定每個畫面的所有 VP 參數。
裝置狀態分為兩個類別:
- 資料流程 狀態會個別套用每個輸入資料流程。 您可以將不同的設定套用至每個資料流程。
- Blit 狀態會全域套用至整個影片處理 blit。
定義下列資料流程狀態。
資料流程狀態 | Description |
---|---|
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 | 調色板。 此狀態僅適用于分色輸入格式。 |
DXVAHD_STREAM_STATE_LUMA_KEY | Luma 機碼。 |
DXVAHD_STREAM_STATE_ASPECT_RATIO | 圖元外觀比例。 |
DXVAHD_STREAM_STATE_FILTER_Xxxx | 影像篩選設定。 驅動程式可以支援亮度、對比和其他影像篩選。 |
定義下列 blit 狀態:
Blit 狀態 | Description |
---|---|
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;
}
相關主題