共用方式為


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

DXVA-HD