Bagikan melalui


Mengatur Status DXVA-HD

Selama pemrosesan video, perangkat Definisi Tinggi Akselerasi Video Microsoft DirectX (DXVA-HD) mempertahankan status persisten dari satu bingkai ke bingkai berikutnya. Setiap status memiliki default yang didokumenkan. Setelah Mengonfigurasi perangkat, atur status apa pun yang ingin Anda ubah dari defaultnya. Sebelum Anda memproses setiap bingkai, perbarui status apa pun yang harus berubah.

Catatan

Desain ini berbeda dari DXVA-VP. Dalam DXVA-VP, aplikasi harus menentukan semua parameter VP dengan setiap bingkai.

 

Status perangkat termasuk dalam dua kategori:

  • Status aliran menerapkan setiap aliran input secara terpisah. Anda dapat menerapkan pengaturan yang berbeda untuk setiap aliran.
  • Status blit berlaku secara global untuk seluruh blit pemrosesan video.

Status aliran berikut didefinisikan.

Status Aliran Deskripsi
DXVAHD_STREAM_STATE_D3DFORMAT Masukkan format video.
DXVAHD_STREAM_STATE_FRAME_FORMAT Jalinan.
DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE Ruang warna input. Status ini menentukan rentang warna RGB dan matriks transfer YCbCr untuk aliran input.
DXVAHD_STREAM_STATE_OUTPUT_RATE Kecepatan bingkai output. Status ini mengontrol konversi kecepatan bingkai.
DXVAHD_STREAM_STATE_SOURCE_RECT Persegi panjang sumber.
DXVAHD_STREAM_STATE_DESTINATION_RECT Persegi panjang tujuan.
DXVAHD_STREAM_STATE_ALPHA Alpha Planar.
DXVAHD_STREAM_STATE_PALETTE Palet warna. Status ini hanya berlaku untuk format input yang dipalsukan.
DXVAHD_STREAM_STATE_LUMA_KEY Kunci Luma.
DXVAHD_STREAM_STATE_ASPECT_RATIO Rasio aspek piksel.
DXVAHD_STREAM_STATE_FILTER_Xxxx Pengaturan filter gambar. Driver dapat mendukung kecerahan, kontras, dan filter gambar lainnya.

 

Status blit berikut didefinisikan:

Status Blit Deskripsi
DXVAHD_BLT_STATE_TARGET_RECT Persegi panjang target.
DXVAHD_BLT_STATE_BACKGROUND_COLOR Warna latar belakang.
DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE Ruang warna output.
DXVAHD_BLT_STATE_ALPHA_FILL Mode pengisian alfa.
DXVAHD_BLT_STATE_CONSTRICTION Penyempitan. Status ini mengontrol apakah perangkat melakukan downsamples output.

 

Untuk mengatur status aliran, panggil metode IDXVAHD_VideoProcessor::SetVideoProcessStreamState . Untuk mengatur status blit, panggil metode IDXVAHD_VideoProcessor::SetVideoProcessBltState . Dalam kedua metode ini, nilai enumerasi menentukan status yang akan ditetapkan. Data status diberikan menggunakan struktur data khusus status, yang dilemparkan aplikasi ke jenis void* .

Contoh kode berikut mengatur format input dan persegi panjang tujuan untuk aliran 0, dan mengatur warna latar belakang menjadi hitam.

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