Pemrosesan Video DXVA

Pemrosesan video DXVA merangkum fungsi perangkat keras grafis yang dikhususkan untuk memproses gambar video yang tidak dikompresi. Layanan pemrosesan video termasuk deinterlacing dan pencampuran video.

Topik ini berisi bagian berikut:

Gambaran Umum

Perangkat keras grafis dapat menggunakan unit pemrosesan grafis (GPU) untuk memproses gambar video yang tidak dikompresi. Perangkat pemrosesan video adalah komponen perangkat lunak yang merangkum fungsi-fungsi ini. Aplikasi dapat menggunakan perangkat pemrosesan video untuk melakukan fungsi seperti:

  • Mendeinterlacing dan inverse telecine
  • Mencampur sub-aliran video ke gambar video utama
  • Penyesuaian warna (ProcAmp) dan pemfilteran gambar
  • Penskalaan gambar
  • Konversi ruang warna
  • Pencampuran alfa

Diagram berikut menunjukkan tahapan dalam alur pemrosesan video. Diagram tidak dimaksudkan untuk menunjukkan implementasi aktual. Misalnya, driver grafis mungkin menggabungkan beberapa tahap ke dalam satu operasi. Semua operasi ini dapat dilakukan dalam satu panggilan ke perangkat pemrosesan video. Beberapa tahapan yang ditunjukkan di sini, seperti kebisingan dan pemfilteran detail, mungkin tidak didukung oleh driver.

diagram showing the stages of dxva video processing.

Input ke alur pemrosesan video selalu menyertakan aliran video utama , yang berisi data gambar utama. Aliran video utama menentukan kecepatan bingkai untuk video output. Setiap bingkai video output dihitung relatif terhadap data input dari aliran video utama. Piksel dalam aliran utama selalu buram, tanpa data alfa per piksel. Aliran video utama dapat progresif atau terjalin.

Secara opsional, alur pemrosesan video dapat menerima hingga 15 substream video. Sub-aliran berisi data gambar tambahan, seperti teks tertutup atau subgambar DVD. Gambar-gambar ini ditampilkan melalui aliran video utama, dan umumnya tidak dimaksudkan untuk ditampilkan sendiri. Gambar sub-aliran dapat berisi data alfa per piksel, dan selalu merupakan bingkai progresif. Perangkat pemrosesan video alpha-blends gambar sub-aliran dengan bingkai deinterlaced saat ini dari aliran video utama.

Di sisa topik ini, istilah gambar digunakan untuk data input ke perangkat pemrosesan video. Gambar mungkin terdiri dari bingkai progresif, satu bidang, atau dua bidang yang saling berhubungan. Output selalu merupakan bingkai deinterlaced.

Driver video dapat menerapkan lebih dari satu perangkat pemrosesan video, untuk menyediakan serangkaian kemampuan pemrosesan video yang berbeda. Perangkat diidentifikasi oleh GUID. GUID berikut telah ditentukan sebelumnya:

  • DXVA2_VideoProcBobDevice. Perangkat ini melakukan deinterlacing bob.
  • DXVA2_VideoProcProgressiveDevice. Perangkat ini digunakan jika video hanya berisi bingkai progresif, tanpa bingkai terjalin. (Beberapa konten video berisi campuran bingkai progresif dan terjalin. Perangkat progresif tidak dapat digunakan untuk konten video "campuran" semacam ini, karena langkah deinterlacing diperlukan untuk bingkai yang saling terkait.)

Setiap driver grafis yang mendukung pemrosesan video DXVA harus menerapkan setidaknya kedua perangkat ini. Driver grafis juga dapat menyediakan perangkat lain, yang diidentifikasi oleh GUID khusus driver. Misalnya, driver mungkin menerapkan algoritma deinterlathm eksklusif yang menghasilkan output kualitas yang lebih baik daripada bob deinterlacing. Beberapa algoritma deinterlacing mungkin memerlukan gambar referensi maju atau mundur dari aliran utama. Jika demikian, pemanggil harus memberikan gambar-gambar ini kepada driver dalam urutan yang benar, seperti yang dijelaskan nanti di bagian ini.

Perangkat lunak referensi juga disediakan. Perangkat perangkat lunak dioptimalkan untuk kualitas daripada kecepatan, dan mungkin tidak memadai untuk pemrosesan video real time. Perangkat lunak referensi menggunakan nilai GUID DXVA2_VideoProcSoftwareDevice.

Membuat Perangkat Pemrosesan Video

Sebelum menggunakan pemrosesan video DXVA, aplikasi harus membuat perangkat pemrosesan video. Berikut adalah kerangka singkat dari langkah-langkah, yang dijelaskan secara lebih rinci di sisa bagian ini:

  1. Dapatkan penunjuk ke antarmuka IDirectXVideoProcessorService.
  2. Buat deskripsi format video untuk streaming video utama. Gunakan deskripsi ini untuk mendapatkan daftar perangkat pemrosesan video yang mendukung format video. Perangkat diidentifikasi oleh GUID.
  3. Untuk perangkat tertentu, dapatkan daftar format target render yang didukung oleh perangkat. Format dikembalikan sebagai daftar nilai D3DFORMAT . Jika Anda berencana untuk mencampur sub-aliran, dapatkan daftar format substream yang didukung juga.
  4. Mengkueri kemampuan setiap perangkat.
  5. Buat perangkat pemrosesan video.

Terkadang Anda dapat menghilangkan beberapa langkah ini. Misalnya, alih-alih mendapatkan daftar format target render, Anda cukup mencoba membuat perangkat pemrosesan video dengan format pilihan Anda, dan melihat apakah itu berhasil. Format umum seperti D3DFMT_X8R8G8B8 kemungkinan akan berhasil.

Sisa bagian ini menjelaskan langkah-langkah ini secara rinci.

Dapatkan Penunjuk IDirectXVideoProcessorService

Antarmuka IDirectXVideoProcessorService diperoleh dari perangkat Direct3D. Ada dua cara untuk mendapatkan penunjuk ke antarmuka ini:

  • Dari perangkat Direct3D.
  • Dari Manajer Perangkat Direct3D.

Jika Anda memiliki penunjuk ke perangkat Direct3D, Anda bisa mendapatkan penunjuk IDirectXVideoProcessorService dengan memanggil fungsi DXVA2CreateVideoService. Teruskan penunjuk ke antarmuka IDirect3DDevice9 perangkat, dan tentukan IID_IDirectXVideoProcessorService untuk parameter riid, seperti yang ditunjukkan dalam kode berikut:

    // Create the DXVA-2 Video Processor service.
    hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));

n beberapa kasus, satu objek membuat perangkat Direct3D dan kemudian membagikannya dengan objek lain melalui Manajer Perangkat Direct3D. Dalam situasi ini, Anda dapat memanggil IDirect3DDeviceManager9::GetVideoService pada manajer perangkat untuk mendapatkan pointer IDirectXVideoProcessorService, seperti yang ditunjukkan dalam kode berikut:

HRESULT GetVideoProcessorService(
    IDirect3DDeviceManager9 *pDeviceManager,
    IDirectXVideoProcessorService **ppVPService
    )
{
    *ppVPService = NULL;

    HANDLE hDevice;

    HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
    if (SUCCEEDED(hr))
    {
        // Get the video processor service 
        HRESULT hr2 = pDeviceManager->GetVideoService(
            hDevice, 
            IID_PPV_ARGS(ppVPService)
            );

        // Close the device handle.
        hr = pDeviceManager->CloseDeviceHandle(hDevice);

        if (FAILED(hr2))
        {
            hr = hr2;
        }
    }

    if (FAILED(hr))
    {
        SafeRelease(ppVPService);
    }

    return hr;
}

Menghitung Perangkat Pemrosesan Video

Untuk mendapatkan daftar perangkat pemrosesan video, isi struktur DXVA2_VideoDesc dengan format aliran video utama, dan teruskan struktur ini ke metode IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Metode ini mengembalikan array GUID, satu untuk setiap perangkat pemrosesan video yang dapat digunakan dengan format video ini.

Pertimbangkan aplikasi yang merender aliran video dalam format YUY2, menggunakan definisi BT.709 warna YUV, dengan kecepatan bingkai 29,97 bingkai per detik. Asumsikan bahwa konten video sepenuhnya terdiri dari bingkai progresif. Fragmen kode berikut menunjukkan cara mengisi deskripsi format dan mendapatkan GUID perangkat:

    // Initialize the video descriptor.

    g_VideoDesc.SampleWidth                         = VIDEO_MAIN_WIDTH;
    g_VideoDesc.SampleHeight                        = VIDEO_MAIN_HEIGHT;
    g_VideoDesc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2;
    g_VideoDesc.SampleFormat.NominalRange           = DXVA2_NominalRange_16_235;
    g_VideoDesc.SampleFormat.VideoTransferMatrix    = EX_COLOR_INFO[g_ExColorInfo][0];
    g_VideoDesc.SampleFormat.VideoLighting          = DXVA2_VideoLighting_dim;
    g_VideoDesc.SampleFormat.VideoPrimaries         = DXVA2_VideoPrimaries_BT709;
    g_VideoDesc.SampleFormat.VideoTransferFunction  = DXVA2_VideoTransFunc_709;
    g_VideoDesc.SampleFormat.SampleFormat           = DXVA2_SampleProgressiveFrame;
    g_VideoDesc.Format                              = VIDEO_MAIN_FORMAT;
    g_VideoDesc.InputSampleFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.InputSampleFreq.Denominator         = 1;
    g_VideoDesc.OutputFrameFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.OutputFrameFreq.Denominator         = 1;

    // Query the video processor GUID.

    UINT count;
    GUID* guids = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorDeviceGuids(&g_VideoDesc, &count, &guids);

Kode untuk contoh ini diambil dari sampel SDK DXVA2_VideoProc .

Array pGuids dalam contoh ini dialokasikan oleh metode GetVideoProcessorDeviceGuids, sehingga aplikasi harus membebaskan array dengan memanggil CoTaskMemFree. Langkah-langkah yang tersisa dapat dilakukan menggunakan salah satu GUID perangkat yang dikembalikan oleh metode ini.

Menghitung Format Target Render

Untuk mendapatkan daftar format target render yang didukung oleh perangkat, teruskan GUID perangkat dan struktur DXVA2_VideoDesc ke metode IDirectXVideoProcessorService::GetVideoProcessorRenderTargets, seperti yang ditunjukkan dalam kode berikut:

    // Query the supported render-target formats.

    UINT i, count;
    D3DFORMAT* formats = NULL;

    HRESULT hr = g_pDXVAVPS->GetVideoProcessorRenderTargets(
        guid, &g_VideoDesc, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorRenderTargets failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_RENDER_TARGET_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the render-target format.\n"));
        return FALSE;
    }

Metode mengembalikan array nilai D3DFORMAT . Dalam contoh ini, di mana jenis input adalah YUY2, daftar format umum mungkin D3DFMT_X8R8G8B8 (RGB 32-bit) dan D3DMFT_YUY2 (format input). Namun, daftar yang tepat akan bergantung pada driver.

Daftar format yang tersedia untuk sub-aliran dapat bervariasi tergantung pada format target render dan format input. Untuk mendapatkan daftar format substream, teruskan GUID perangkat, struktur format, dan format target render ke metode IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats , seperti yang ditunjukkan dalam kode berikut:

    // Query the supported substream formats.

    formats = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorSubStreamFormats(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorSubStreamFormats failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_SUB_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the substream format.\n"));
        return FALSE;
    }

Metode ini mengembalikan array lain dari nilai D3DFORMAT . Format sub-aliran yang khas adalah AYUV dan AI44.

Mengkueri Kemampuan Perangkat

Untuk mendapatkan kemampuan perangkat tertentu, berikan GUID perangkat, struktur format, dan format target render ke metode IDirectXVideoProcessorService::GetVideoProcessorCaps. Metode ini mengisi struktur DXVA2_VideoProcessorCaps dengan kemampuan perangkat.

    // Query video processor capabilities.

    hr = g_pDXVAVPS->GetVideoProcessorCaps(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &g_VPCaps);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorCaps failed: 0x%x.\n", hr));
        return FALSE;
    }

Membuat Perangkat

Untuk membuat perangkat pemrosesan video, panggil IDirectXVideoProcessorService::CreateVideoProcessor. Input ke metode ini adalah GUID perangkat, deskripsi format, format target render, dan jumlah maksimum sub-aliran yang Anda rencanakan untuk dicampur. Metode ini mengembalikan penunjuk ke antarmuka IDirectXVideoProcessor , yang mewakili perangkat pemrosesan video.

    // Finally create a video processor device.

    hr = g_pDXVAVPS->CreateVideoProcessor(
        guid,
        &g_VideoDesc,
        VIDEO_RENDER_TARGET_FORMAT,
        SUB_STREAM_COUNT,
        &g_pDXVAVPD
        );

Video Process Blit

Operasi pemrosesan video utama adalah blit pemrosesan video. (Blit adalah operasi apa pun yang menggabungkan dua bitmap atau lebih ke dalam satu bitmap. Blit pemrosesan video menggabungkan gambar input untuk membuat bingkai output.) Untuk melakukan blit pemrosesan video, panggil IDirectXVideoProcessor::VideoProcessBlt. Metode ini meneruskan serangkaian sampel video ke perangkat pemrosesan video. Sebagai respons, perangkat pemrosesan video memproses gambar input dan menghasilkan satu bingkai output. Pemrosesan dapat mencakup deinterlacing, konversi ruang warna, dan pencampuran sub-aliran. Output ditulis ke permukaan tujuan yang disediakan oleh pemanggil.

Metode VideoProcessBlt mengambil parameter berikut:

  • pRT menunjuk ke permukaan target render IDirect3DSurface9 yang akan menerima bingkai video yang diproses.
  • pBltParams menunjuk ke struktur DXVA2_VideoProcessBltParams yang menentukan parameter untuk blit.
  • pSamples adalah alamat array struktur DXVA2_VideoSample . Struktur ini berisi sampel input untuk blit.
  • NumSamples memberikan ukuran array pSamples .
  • Parameter Yang Dicadangkan dicadangkan dan harus diatur ke NULL.

Dalam array pSamples, pemanggil harus menyediakan sampel input berikut:

  • Gambar saat ini dari aliran video utama.
  • Gambar referensi maju dan mundur, jika diperlukan oleh algoritma deinterlacing.
  • Nol atau lebih gambar sub-aliran, hingga maksimum 15 substream.

Driver mengharapkan array ini berada dalam urutan tertentu, seperti yang dijelaskan dalam Urutan Sampel Input.

Parameter Blit

Struktur DXVA2_VideoProcessBltParams berisi parameter umum untuk blit. Parameter terpenting disimpan dalam anggota struktur berikut:

  • TargetFrame adalah waktu presentasi bingkai output. Untuk konten progresif, kali ini harus sama dengan waktu mulai untuk bingkai saat ini dari aliran video utama. Kali ini ditentukan dalam anggota Mulai dari struktur DXVA2_VideoSample untuk sampel input tersebut.

    Untuk konten terjalin, bingkai dengan dua bidang yang saling terkait menghasilkan dua bingkai output yang dipisahkan. Pada bingkai output pertama, waktu presentasi harus sama dengan waktu mulai gambar saat ini di aliran video utama, sama seperti konten progresif. Pada bingkai output kedua, waktu mulai harus sama dengan titik tengah antara waktu mulai gambar saat ini di aliran video utama dan waktu mulai gambar berikutnya di aliran. Misalnya, jika video input adalah 25 bingkai per detik (50 bidang per detik), bingkai output akan memiliki stempel waktu yang ditampilkan dalam tabel berikut. Stempel waktu ditampilkan dalam satuan 100 nanodetik.

    Input gambar TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600000
    800000 800000 1000000
    1200000 1200000 1400000

     

    Jika konten terjalin terdiri dari bidang tunggal daripada bidang yang saling terkait, waktu output selalu cocok dengan waktu input, seperti halnya konten progresif.

  • TargetRect mendefinisikan wilayah persegi panjang dalam permukaan tujuan. Blit akan menulis output ke wilayah ini. Secara khusus, setiap piksel di dalam TargetRect akan dimodifikasi, dan tidak ada piksel di luar TargetRect yang akan dimodifikasi. Persegi panjang target menentukan persegi panjang pembatas untuk semua aliran video input. Penempatan aliran individual dalam persegi panjang tersebut dikontrol melalui parameter pSamples IDirectXVideoProcessor::VideoProcessBlt.

  • BackgroundColor memberikan warna latar belakang di mana pun tidak ada gambar video yang muncul. Misalnya, ketika gambar video 16 x 9 ditampilkan dalam area 4 x 3 (kotak surat), wilayah berkotak surat ditampilkan dengan warna latar belakang. Warna latar belakang hanya berlaku dalam persegi target (TargetRect). Piksel apa pun di luar TargetRect tidak dimodifikasi.

  • DestFormat menjelaskan ruang warna untuk video output—misalnya, apakah warna ITU-R BT.709 atau BT.601 digunakan. Informasi ini dapat memengaruhi bagaimana gambar ditampilkan. Untuk informasi selengkapnya, lihat Informasi Warna yang Diperluas.

Parameter lain dijelaskan pada halaman referensi untuk struktur DXVA2_VideoProcessBltParams.

Sampel Input

Parameter pSamples dari IDirectXVideoProcessor::VideoProcessBlt menunjuk ke array struktur DXVA2_VideoSample. Masing-masing struktur ini berisi informasi tentang satu sampel input dan penunjuk ke permukaan Direct3D yang berisi sampel. Setiap sampel adalah salah satu dari yang berikut ini:

  • Gambar saat ini dari aliran utama.
  • Gambar referensi maju atau mundur dari aliran utama, digunakan untuk deinterlacing.
  • Gambar sub-aliran.

Urutan yang tepat di mana sampel harus muncul dalam array dijelaskan nanti, di bagian Input Urutan Sampel.

Hingga 15 gambar sub-aliran dapat disediakan, meskipun sebagian besar aplikasi video hanya membutuhkan satu substream, paling banyak. Jumlah sub-aliran dapat berubah dengan setiap panggilan ke VideoProcessBlt. Gambar sub-aliran ditunjukkan dengan mengatur anggota SampleFormat.SampleFormat dari struktur DXVA2_VideoSample sama dengan DXVA2_SampleSubStream. Untuk streaming video utama, anggota ini menjelaskan interlacing video input. Untuk informasi selengkapnya, lihat enumerasi DXVA2_SampleFormat.

Untuk streaming video utama, anggota Mulai dan Akhir dari struktur DXVA2_VideoSample memberikan waktu mulai dan berakhir dari sampel input. Untuk gambar sub-aliran, atur nilai ini ke nol, karena waktu presentasi selalu dihitung dari aliran utama. Aplikasi bertanggung jawab untuk melacak kapan setiap gambar sub-aliran harus disajikan dan mengirimkannya ke VideoProcessBlt pada waktu yang tepat.

Dua persegi panjang menentukan bagaimana video sumber diposisikan untuk setiap aliran:

  • Anggota SrcRect dari struktur DXVA2_VideoSample menentukan persegi panjang sumber, wilayah persegi panjang gambar sumber yang akan muncul dalam bingkai output yang disusun. Untuk memotong gambar, atur ini ke nilai yang lebih kecil dari ukuran bingkai. Jika tidak, atur sama dengan ukuran bingkai.
  • Anggota DstRect dari struktur yang sama menentukan persegi panjang tujuan, wilayah persegi panjang dari permukaan tujuan tempat bingkai video akan muncul.

Driver blits piksel dari persegi panjang sumber ke persegi panjang tujuan. Dua persegi panjang dapat memiliki ukuran atau rasio aspek yang berbeda; driver akan menskalakan gambar sesuai kebutuhan. Selain itu, setiap aliran input dapat menggunakan faktor penskalakan yang berbeda. Bahkan, penskalaan mungkin diperlukan untuk menghasilkan rasio aspek yang benar dalam bingkai output. Driver tidak memperhitungkan rasio aspek piksel sumber, jadi jika gambar sumber menggunakan piksel non-persegi, terserah aplikasi untuk menghitung persegi panjang tujuan yang benar.

Format substream yang disukai adalah AYUV dan AI44. Yang terakhir adalah format palet dengan 16 warna. Entri palet ditentukan dalam anggota Pal dari struktur DXVA2_VideoSample . (Jika format video sumber Anda awalnya dinyatakan sebagai jenis media Media Foundation, entri palet disimpan di atribut MF_MT_PALETTE.) Untuk format yang tidak di-palet, kosongkan array ini menjadi nol.

Komposisi Gambar

Setiap operasi blit didefinisikan oleh tiga persegi berikut:

  • Persegi panjang target (TargetRect) menentukan wilayah dalam permukaan tujuan tempat output akan muncul. Gambar output diklip ke persegi ini.
  • Persegi panjang tujuan untuk setiap aliran (DstRect) menentukan tempat aliran input muncul dalam gambar yang disusun.
  • Persegi panjang sumber untuk setiap aliran (SrcRect) menentukan bagian mana dari gambar sumber yang muncul.

Persegi panjang target dan tujuan ditentukan relatif terhadap permukaan tujuan. Persegi panjang sumber ditentukan relatif terhadap gambar sumber. Semua persegi ditentukan dalam piksel.

diagram showing source, destination, and target rectangles

Alfa perangkat pemrosesan video memadukan gambar input, menggunakan salah satu sumber data alfa berikut:

  • Data alfa per piksel dari sub-aliran.
  • Nilai alfa planar untuk setiap aliran video, ditentukan dalam anggota PlanarAlpha dari struktur DXVA2_VideoSample .
  • Nilai alfa planar dari gambar yang disusun, ditentukan dalam anggota Alpha dari struktur DXVA2_VideoProcessBltParams . Nilai ini digunakan untuk memadukan seluruh gambar yang dikomposisikan dengan warna latar belakang.

Bagian ini memberikan serangkaian contoh yang menunjukkan bagaimana perangkat pemrosesan video membuat gambar output.

Contoh 1: Kotak Surat

Contoh ini menunjukkan cara kotak surat gambar sumber, dengan mengatur persegi panjang tujuan menjadi lebih kecil dari persegi panjang target. Aliran video utama dalam contoh ini adalah gambar 720 × 480, dan dimaksudkan untuk ditampilkan pada rasio aspek 16:9. Permukaan tujuan adalah 640 × 480 piksel (rasio aspek 4:3). Untuk mencapai rasio aspek yang benar, persegi panjang tujuan harus 640 × 360. Untuk kesederhanaan, contoh ini tidak menyertakan sub-aliran. Diagram berikut menunjukkan persegi panjang sumber dan tujuan.

diagram showing letterboxing.

Diagram sebelumnya memperlihatkan persegi panjang berikut:

  • Persegi panjang target: { 0, 0, 640, 480 }

  • Video utama:

    • Persegi panjang sumber: { 0, 0, 720, 480 }
    • Persegi panjang tujuan: { 0, 60, 640, 420 }

Driver akan mendeinterlace video, menyusutkan bingkai deinterlaced menjadi 640 × 360, dan blit bingkai ke persegi panjang tujuan. Persegi panjang target lebih besar dari persegi panjang tujuan, sehingga driver akan menggunakan warna latar belakang untuk mengisi bilah horizontal di atas dan di bawah bingkai. Warna latar belakang ditentukan dalam struktur DXVA2_VideoProcessBltParams.

Contoh 2: Membentangkan Gambar Substream

Gambar sub-aliran dapat meluas di luar gambar video utama. Dalam video DVD, misalnya, aliran video utama dapat memiliki rasio aspek 4:3 sementara substream adalah 16:9. Dalam contoh ini, kedua aliran video memiliki dimensi sumber yang sama (720 × 480), tetapi substream dimaksudkan untuk ditampilkan pada rasio aspek 16:9. Untuk mencapai rasio aspek ini, gambar substream direntangkan secara horizontal. Persegi panjang sumber dan tujuan diperlihatkan dalam diagram berikut.

diagram showing substream image stretching.

Diagram sebelumnya memperlihatkan persegi panjang berikut:

  • Persegi panjang target: { 0, 0, 854, 480 }

  • Video utama:

    • Persegi panjang sumber: { 0, 0, 720, 480 }
    • Persegi panjang tujuan: { 0, 107, 474, 480 }
  • Sub-aliran:

    • Persegi panjang sumber: { 0, 0, 720, 480 }
    • Persegi panjang tujuan: { 0, 0, 854, 480 }

Nilai-nilai ini mempertahankan tinggi gambar dan menskalakan kedua gambar secara horizontal. Di wilayah tempat kedua gambar muncul, gambar tersebut di-blend alfa. Di mana gambar sub-aliran meluas di luar video utama, substream dicambel alfa dengan warna latar belakang. Campuran alfa ini menyumbang warna yang diubah di sisi kanan diagram.

Contoh 3: Tinggi Aliran Tidak Cocok

Dalam contoh sebelumnya, sub-aliran dan aliran utama memiliki tinggi yang sama. Aliran juga dapat memiliki tinggi yang tidak cocok, seperti yang ditunjukkan dalam contoh ini. Area dalam persegi panjang target di mana tidak ada video yang muncul digambar menggunakan warna latar belakang—hitam dalam contoh ini. Persegi panjang sumber dan tujuan diperlihatkan dalam diagram berikut.

diagram showing mismatched stream heights,

Diagram sebelumnya memperlihatkan persegi panjang berikut:

  • Persegi panjang target: { 0, 0, 150, 85 }
  • Video utama:
    • Persegi panjang sumber: { 0, 0, 150, 50 }
    • Persegi panjang tujuan: { 0, 17, 150, 67 }
  • Sub-aliran:
    • Persegi panjang sumber: { 0, 0, 100, 85 }
    • Persegi panjang tujuan: { 25, 0, 125, 85 }

Contoh 4: Persegi Panjang Target Lebih Kecil Dari Permukaan Tujuan

Contoh ini menunjukkan kasus di mana persegi panjang target lebih kecil dari permukaan tujuan.

diagram showing a blit to a destination rectangle.

Diagram sebelumnya memperlihatkan persegi panjang berikut:

  • Permukaan tujuan: { 0, 0, 300, 200 }
  • Persegi panjang target: { 0, 0, 150, 85 }
  • Video utama:
    • Persegi panjang sumber: { 0, 0, 150, 50 }
    • Persegi panjang tujuan: { 0, 17, 150, 67 }
  • Sub-aliran:
    • Persegi panjang sumber: { 0, 0, 100, 85 }
    • Persegi panjang tujuan: { 25, 0, 125, 85 }

Piksel di luar persegi panjang target tidak dimodifikasi, sehingga warna latar belakang hanya muncul dalam persegi panjang target. Area titik-titik menunjukkan bagian dari permukaan tujuan yang tidak terpengaruh oleh blit.

Contoh 5: Persegi Panjang Sumber

Jika Anda menentukan persegi panjang sumber yang lebih kecil dari gambar sumber, driver akan blit hanya bagian gambar tersebut. Dalam contoh ini, persegi panjang sumber menentukan kuadrian kanan bawah aliran video utama dan kuadrian kiri bawah sub-aliran (ditunjukkan oleh tanda hash dalam diagram). Persegi panjang tujuan berukuran sama dengan persegi panjang sumber, sehingga video tidak direntangkan. Persegi panjang sumber dan tujuan diperlihatkan dalam diagram berikut.

diagram showing a blit from two source rectangles.

Diagram sebelumnya memperlihatkan persegi panjang berikut:

  • Persegi panjang target: { 0, 0, 720, 576 }
  • Video utama:
    • Ukuran permukaan sumber: { 0, 0, 720, 480 }
    • Persegi panjang sumber: { 360, 240, 720, 480 }
    • Persegi panjang tujuan: { 0, 0, 360, 240 }
  • Sub-aliran:
    • Ukuran permukaan sumber: { 0, 0, 640, 576 }
    • Persegi panjang sumber: { 0, 288, 320, 576 }
    • Persegi panjang tujuan: { 400, 0, 720, 288 }

Contoh 6: Berpotangan Persegi Tujuan

Contoh ini mirip dengan yang sebelumnya, tetapi persegi panjang tujuan bersinggungan. Dimensi permukaan sama seperti pada contoh sebelumnya, tetapi persegi panjang sumber dan tujuan tidak. Sekali lagi, video dipotong tetapi tidak direntangkan. Persegi panjang sumber dan tujuan diperlihatkan dalam diagram berikut.

diagram showing intersecting destination rectangles.

Diagram sebelumnya memperlihatkan persegi panjang berikut:

  • Persegi panjang target: { 0, 0, 720, 576 }
  • Video utama:
    • Ukuran permukaan sumber: { 0, 0, 720, 480 }
    • Persegi panjang sumber: { 260, 92, 720, 480 }
    • Persegi panjang tujuan: { 0, 0, 460, 388 }
  • Sub-aliran:
    • Ukuran permukaan sumber: { 0, 0, 640, 576 }
    • Persegi panjang sumber: { 0, 0, 460, 388 }
    • Persegi panjang tujuan: { 260, 188, 720, 576 }

Contoh 7: Video Peregangan dan Pemangkasan

Dalam contoh ini, video direntangkan serta dipotong. 180 × 120 wilayah dari setiap aliran direntangkan untuk mencakup area 360 × 240 di persegi panjang tujuan.

diagram showing stretching and cropping.

Diagram sebelumnya memperlihatkan persegi panjang berikut:

  • Persegi panjang target: { 0, 0, 720, 480 }
  • Video utama:
    • Ukuran permukaan sumber: { 0, 0, 360, 240 }
    • Persegi panjang sumber: { 180, 120, 360, 240 }
    • Persegi panjang tujuan: { 0, 0, 360, 240 }
  • Sub-aliran:
    • Ukuran permukaan sumber: { 0, 0, 360, 240 }
    • Persegi panjang sumber: { 0, 0, 180, 120 }
    • Persegi panjang tujuan: { 360, 240, 720, 480 }

Urutan Sampel Input

Parameter pSamples dari metode VideoProcessBlt adalah penunjuk ke array sampel input. Sampel dari aliran video utama muncul terlebih dahulu, diikuti oleh gambar sub-aliran dalam urutan Z. Sampel harus ditempatkan ke dalam array dalam urutan berikut:

  • Sampel untuk aliran video utama muncul terlebih dahulu dalam array, dalam urutan temporal. Tergantung pada mode deinterlace, driver mungkin memerlukan satu atau beberapa sampel referensi dari aliran video utama. Anggota NumForwardRefSamples dan NumBackwardRefSamples dari struktur DXVA2_VideoProcessorCaps menentukan berapa banyak sampel referensi maju dan mundur yang diperlukan. Pemanggil harus memberikan sampel referensi ini meskipun konten video progresif dan tidak memerlukan deinterlacing. (Ini dapat terjadi ketika bingkai progresif diberikan ke perangkat deinterlacing, misalnya ketika sumber berisi campuran bingkai interlaced dan progressive.)
  • Setelah sampel untuk aliran video utama, array dapat berisi hingga 15 sampel substream, yang disusun dalam urutan Z, dari bawah ke atas. Sub-aliran selalu progresif dan tidak memerlukan gambar referensi.

Kapan saja, aliran video utama dapat beralih antara konten yang terjalin dan progresif, dan jumlah substream dapat berubah.

Anggota SampleFormat.SampleFormat dari struktur DXVA2_VideoSample menunjukkan jenis gambar. Untuk gambar sub-aliran, atur nilai ini ke DXVA2_SampleSubStream. Untuk gambar progresif, nilainya DXVA2_SampleProgressiveFrame. Untuk gambar terjalin, nilai tergantung pada tata letak bidang.

Jika driver memerlukan sampel referensi maju dan mundur, jumlah lengkap sampel mungkin tidak tersedia di awal urutan video. Dalam hal ini, sertakan entri untuk mereka dalam array pSamples , tetapi tandai sampel yang hilang sebagai memiliki jenis DXVA2_SampleUnknown.

Anggota Mulai dan Akhir dari struktur DXVA2_VideoSample memberikan lokasi temporal dari setiap sampel. Nilai-nilai ini hanya digunakan untuk sampel dari aliran video utama. Untuk gambar sub-aliran, atur kedua anggota ke nol.

Contoh berikut dapat membantu mengklarifikasi persyaratan ini.

Contoh 1

Kasus paling sederhana terjadi ketika tidak ada substream dan algoritma deinterlacing tidak memerlukan sampel referensi (NumForwardRefSamples dan NumBackwardRefSamples keduanya nol). Bob deinterlacing adalah contoh algoritma seperti itu. Dalam hal ini, array pSamples harus berisi satu permukaan input, seperti yang ditunjukkan dalam tabel berikut.

Indeks Jenis permukaan Lokasi temporal
pSamples[0] Gambar terjalin. T

 

Nilai waktu T diasumsikan sebagai waktu mulai bingkai video saat ini.

Contoh 2

Dalam contoh ini, aplikasi mencampur dua substream dengan aliran utama. Algoritma deinterlacing tidak memerlukan sampel referensi. Tabel berikut ini memperlihatkan bagaimana sampel ini disusun dalam array pSamples .

Indeks Jenis permukaan Lokasi temporal Z-order
pSamples[0] Gambar terjalin T 0
pSamples[1] Sub-aliran 0 1
pSamples[2] Sub-aliran 0 2

 

Contoh 3

Sekarang misalkan algoritma deinterlacing memerlukan satu sampel referensi mundur dan satu sampel referensi maju. Selain itu, dua gambar sub-aliran disediakan, untuk total lima permukaan. Urutan yang benar diperlihatkan dalam tabel berikut.

Indeks Jenis permukaan Lokasi temporal Z-order
pSamples[0] Gambar terjalin (referensi) T −1 Tidak berlaku
pSamples[1] Gambar terjalin T 0
pSamples[2] Gambar terjalin (referensi) T +1 Tidak berlaku
pSamples[3] Sub-aliran 0 1
pSamples[4] Sub-aliran 0 2

 

Waktu T −1 adalah waktu mulai bingkai sebelum bingkai saat ini, dan T +1 adalah waktu mulai bingkai berikut.

Jika aliran video beralih ke konten progresif, menggunakan mode deinterlacing yang sama, aplikasi harus menyediakan jumlah sampel yang sama, seperti yang ditunjukkan dalam tabel berikut.

Indeks Jenis permukaan Lokasi temporal Z-order
pSamples[0] Gambar progresif (referensi) T −1 Tidak berlaku
pSamples[1] Gambar progresif T 0
pSamples[2] Gambar progresif (referensi) T +1 Tidak berlaku
pSamples[3] Sub-aliran 0 1
pSamples[4] Sub-aliran 0 2

 

Contoh 4

Pada awal urutan video, sampel referensi maju dan mundur mungkin tidak tersedia. Ketika ini terjadi, entri untuk sampel yang hilang disertakan dalam array pSamples , dengan jenis sampel DXVA2_SampleUnknown.

Dengan asumsi bahwa mode deinterlacing membutuhkan satu sampel referensi maju dan satu mundur, tiga panggilan pertama ke VideoProcessBlt akan memiliki urutan input yang ditunjukkan dalam tiga tabel berikut.

Indeks Jenis permukaan Lokasi temporal
pSamples[0] Tidak dikenal 0
pSamples[1] Tidak dikenal 0
pSamples[2] Gambar terjalin (referensi) T +1

 

Indeks Jenis permukaan Lokasi temporal
pSamples[0] Tidak dikenal 0
pSamples[1] Gambar terjalin T
pSamples[2] Gambar terjalin (referensi) T +1

 

Indeks Jenis permukaan Lokasi temporal
pSamples[0] Gambar terjalin T −1
pSamples[1] Gambar terjalin T
pSamples[2] Gambar terjalin (referensi) T +1

 

Akselerasi Video DirectX 2.0

Sampel DXVA2_VideoProc