Bagikan melalui


Memanggil DDI Deinterlace dari Komponen User-Mode

Komponen mode pengguna, seperti VMR, memulai panggilan ke DDI yang mendesinterlacing.

Sehingga VMR dapat mendeinterlace dan melakukan konversi kecepatan bingkai pada konten video, driver tampilan harus menerapkan fungsi panggilan balik kompensasi gerakan, yang didefinisikan oleh anggota struktur DD_MOTIONCOMPCALLBACKS .

Untuk menyederhanakan pengembangan driver, penulis driver dapat menggunakan templat kode kompensasi gerakan dan mengimplementasikan fungsi sampel deinterlacing. Templat kompensasi gerakan memanggil fungsi sampel deinterlacing untuk melakukan deinterlacing dan konversi frame-rate pada konten video. Untuk informasi selengkapnya tentang menggunakan templat kompensasi gerakan, lihat Contoh Kode untuk Perangkat DirectX VA.

Langkah-langkah berikut menjelaskan bagaimana VMR memulai panggilan ke DDI deinterlace:

  1. Ketika VMR ditambahkan ke grafik filter, VMR memulai panggilan ke fungsi panggilan balik DdMoCompGetGuids yang disediakan driver untuk mengambil daftar perangkat yang didukung oleh driver. Anggota GetMoCompGuids dari struktur DD_MOTIONCOMPCALLBACKS menunjuk ke fungsi panggilan balik ini. Untuk informasi selengkapnya tentang grafik filter, lihat Arsitektur KS Minidriver.

  2. Jika GUID perangkat kontainer deinterlace ada, VMR memulai panggilan ke fungsi panggilan balik DdMoCompCreate untuk membuat instans perangkat. Anggota CreateMoComp DD_MOTIONCOMPCALLBACKS menunjuk ke fungsi panggilan balik. Dalam panggilan DdMoCompCreate , penunjuk ke GUID perangkat kontainer ditentukan dalam anggota lpGuid dari struktur DD_CREATEMOCOMPDATA . GUID perangkat kontainer didefinisikan sebagai berikut:

    DEFINE_GUID(DXVA_DeinterlaceContainerDevice, 0x0e85cb93,0x3046,0x4ff0,0xae,0xcc,0xd5,0x8c,0xb5,0xf0,0x35,0xfd);
    
  3. Untuk menentukan mode deinterlacing atau frame-rate conversion yang tersedia untuk format video input tertentu, VMR memulai panggilan ke fungsi panggilan balik DdMoCompRender yang disediakan driver. Anggota RenderMoCompdari DD_MOTIONCOMPCALLBACKS menunjuk ke fungsi panggilan balik. Dalam panggilan DdMoCompRender , konstanta DXVA_ProcAmpControlQueryCapsFnCode (ditentukan dalam dxva.h) diatur dalam anggota dwFunction dari struktur DD_RENDERMOCOMPDATA . Anggota lpInputData DD_RENDERMOCOMPDATA meneruskan parameter input ke driver dengan menunjuk ke struktur DXVA_VideoDesc yang telah selesai. Driver mengembalikan outputnya melalui anggota lpOutputData dari DD_RENDERMOCOMPDATA; lpOutputData menunjuk ke struktur DXVA_DeinterlaceQueryAvailableModes .

    Jika driver mengimplementasikan fungsi sampel DeinterlaceQueryAvailableModes , fungsi panggilan balik DdMoCompRender memanggil DeinterlaceQueryAvailableModes.

  4. Untuk setiap mode deinterlace yang didukung oleh driver, VMR memulai panggilan ke fungsi panggilan balik DdMoCompRenderyang disediakan driver. Dalam panggilan DdMoCompRender , konstanta DXVA_DeinterlaceQueryModeCapsFnCode (ditentukan dalam dxva.h) diatur dalam anggota dwFunction DD_RENDERMOCOMPDATA. Anggota lpInputData DD_RENDERMOCOMPDATA meneruskan parameter input ke driver dengan menunjuk ke struktur DXVA_DeinterlaceQueryModeCaps yang telah selesai. Driver mengembalikan outputnya melalui anggota lpOutputData dari DD_RENDERMOCOMPDATA; lpOutputData menunjuk ke struktur DXVA_DeinterlaceCaps .

    Jika driver menerapkan fungsi sampel DeinterlaceQueryModeCaps , fungsi panggilan balik DdMoCompRender memanggil DeinterlaceQueryModeCaps.

  5. Setelah VMR menentukan kemampuan deinterlacing dari mode deinterlace tertentu (misalnya, bob deinterlacing), VMR memulai panggilan ke DdMoCompCreate untuk membuat instans perangkat mode deinterlace (misalnya, perangkat bob deinterlace). Dalam panggilan DdMoCompCreate , penunjuk ke GUID perangkat mode deinterlace ditentukan dalam anggota lpGuid DD_CREATEMOCOMPDATA. GUID perangkat bob deinterlace didefinisikan sebagai berikut:

    DEFINE_GUID(DXVAp_DeinterlaceBobDevice, 0x335aa36e,0x7884,0x43a4,0x9c,0x91,0x7f,0x87,0xfa,0xf3,0xe3,0x7e);
    

    Jika driver menerapkan fungsi sampel DeinterlaceOpenStream , fungsi panggilan balik DdMoCompCreate memanggil DeinterlaceOpenStream.

  6. Untuk setiap operasi deinterlacing, VMR memulai panggilan ke fungsi panggilan balik DdMoCompRender yang disediakan driver. Dalam panggilan DdMoCompRender , konstanta DXVA_ProcAmpControlQueryCapsFnCode (ditentukan dalam dxva.h) diatur dalam anggota dwFunction DD_RENDERMOCOMPDATA. Anggota lpBufferInfo dari DD_RENDERMOCOMPDATA menunjuk ke array buffer yang menjelaskan permukaan tujuan dan setiap sampel sumber video input. Anggota lpInputData dari DD_RENDERMOCOMPDATA meneruskan parameter input ke driver dengan menunjuk ke struktur DXVA_DeinterlaceBlt yang telah selesai. Driver tidak mengembalikan output apa pun; artinya, anggota lpOutputData dari DD_RENDERMOCOMPDATA adalah NULL.

    Jika driver menerapkan fungsi sampel DeinterlaceBlt , fungsi panggilan balik DdMoCompRender memanggil DeinterlaceBlt.

  7. Untuk setiap kombinasi yang mendesinterlacing dan operasi komposit substream, VMR pada Microsoft Windows Server 2003 SP1 dan yang lebih baru dan Windows XP SP2 dan kemudian memulai panggilan ke fungsi panggilan balik DdMoCompRender yang disediakan driver. Dalam panggilan DdMoCompRender , konstanta DXVA_DeinterlaceBltExFnCode (ditentukan dalam dxva.h) diatur dalam anggota dwFunction DD_RENDERMOCOMPDATA. Anggota lpBufferInfo dari DD_RENDERMOCOMPDATA menunjuk ke array buffer yang menjelaskan permukaan tujuan dan permukaan untuk setiap sampel sumber video input. Anggota lpInputData dari DD_RENDERMOCOMPDATA meneruskan parameter input ke driver dengan menunjuk ke struktur DXVA_DeinterlaceBltEx yang telah selesai. Driver tidak mengembalikan output apa pun; artinya, anggota lpOutputData dari DD_RENDERMOCOMPDATA adalah NULL.

    Jika driver menerapkan fungsi sampel DeinterlaceBltEx , fungsi panggilan balik DdMoCompRender memanggil DeinterlaceBltEx.

  8. Ketika VMR tidak perlu lagi melakukan operasi deinterlace lagi, fungsi panggilan balik DdMoCompDestroy yang disediakan driver dipanggil. Anggota DestroyMoComp dari DD_MOTIONCOMPCALLBACKS menunjuk ke fungsi panggilan balik.

    Jika driver menerapkan fungsi sampel DeinterlaceCloseStream , fungsi panggilan balik DdMoCompDestroy memanggil DeinterlaceCloseStream.

  9. Driver kemudian melepaskan sumber daya apa pun yang digunakan oleh perangkat mode deinterlace.