Bagikan melalui


Direct3D-Aware MFTs

Topik ini menjelaskan cara mengimplementasikan transformasi Media Foundation (MFT) yang sadar Direct3D untuk video.

MFT video dianggap sadar Direct3D jika dapat memproses sampel yang berisi permukaan Direct3D. Alasan umum untuk mendukung Direct3D dalam video MFT adalah untuk mengaktifkan decoding yang dipercepat perangkat keras, menggunakan DirectX Video Acceleration (DXVA).

Topik ini menjelaskan langkah-langkah yang diperlukan untuk membuat MFT Direct3D Anda sadar. Topik ini tidak mencakup mekanisme dekode DXVA. Untuk informasi tentang DXVA, lihat DirectX Video Acceleration 2.0.

Penting

Mulai dari Windows 8, IMFDXGIDeviceManager dapat digunakan alih-alihIDirect3DDeviceManager9 . Untuk aplikasi Windows Store, Anda harus menggunakan IMFDXGIDeviceManager dan Microsoft Direct3D 11. Untuk informasi selengkapnya, lihat API Video Direct3D 11.

 

  1. Terapkan metodeIMFTransform::GetAttributes. Metode ini mengembalikan pointer ke penyimpanan atribut.
  2. MFT harus mengatur nilai atribut MF_SA_D3D_AWARE ke TRUE di penyimpanan atributnya sendiri. Dimulai di Windows 8, jika menggunakan Direct3D 11 gunakan MF_SA_D3D11_AWARE.
  3. Selama negosiasi format, jika atribut MF_SA_D3D_AWARE (atau MF_SA_D3D11_AWARE jika menggunakan Direct3D 11) TRUE, klien dapat mengirim pesan MFT_MESSAGE_SET_D3D_MANAGER ke MFT. Parameter peristiwa ulParam adalah penunjuk ke antarmukaIDirect3DDeviceManager9. Mulai dari Windows 8, Anda dapat menggunakan IMFDXGIDeviceManager alih-alih IDirect3DDeviceManager9. Klien tidak diharuskan untuk mengirim pesan ini.
  4. MFT memanggil IDirect3DDeviceManager9::GetVideoService untuk mengkueri layanan DXVA yang dibutuhkan. Mulai Windows 8, jika IMFDXGIDeviceManager digunakan panggilan MFT IMFDXGIDeviceManager::GetVideoService. Biasanya dekoder akan meminta IDirectXVideoDecoderService, dan prosesor video akan meminta IDirectXVideoProcessorService.
  5. Dengan asumsi langkah sebelumnya berhasil, metode IMFTransform::GetInputAvailableType dan IMFTransform::GetOutputAvailableType harus mengembalikan format yang kompatibel dengan DXVA.
  6. Klien mengonfigurasi jenis media pada MFT. Jika jenis media tidak kompatibel dengan DXVA, MFT harus mengembalikan kode kesalahan MF_E_UNSUPPORTED_D3D_TYPE.
  7. Pada titik ini, ada dua opsi, tergantung pada apakah klien menemukan format DXVA yang sesuai.
    • Jika klien berhasil mengonfigurasi format DXVA, klien mungkin mulai memproses. Pada titik ini, MFT dapat menggunakan DXVA untuk diproses, atau kembali ke pemrosesan perangkat lunak.
    • Atau, jika klien tidak menemukan format DXVA yang dapat diterima, klien dapat mengirim pesan MFT_MESSAGE_SET_D3D_MANAGER lain, pengaturan kali ini ulParam ke NULL. MFT harus merilis pointer IDirect3DDeviceManager9 (penunjuk IMFDXGIDeviceManager, jika IMFDXGIDeviceManager digunakan) dan antarmuka DXVA lainnya, dan kembali ke pemrosesan perangkat lunak. Pada titik ini, MFT tidak boleh menggunakan pemrosesan DXVA.

MFT sadar Direct3D harus disiapkan untuk menangani sampel yang berisi permukaan Direct3D. Sampel akan berisi persis satu buffer media. Untuk mendapatkan permukaan Direct3D dari buffer, panggil fungsiMFGetService dan tentukan layanan MR_BUFFER_SERVICE. Untuk informasi selengkapnya, lihat DirectX Surface Buffer.

MFT yang menggunakan DXVA harus mengalokasikan sampel outputnya sendiri, sebagai berikut:

  1. Dalam metodeIMFTransform::GetOutputStreamInfo, atur bendera MFT_OUTPUT_STREAM_PROVIDES_SAMPLES.
  2. Buat kumpulan permukaan DXVA, seperti yang dijelaskan dalam spesifikasi DXVA.
  3. Buat sampel media dengan memanggil MFCreateVideoSampleFromSurface.

MFT harus selalu mendukung pemrosesan perangkat lunak sebagai fallback, karena pemrosesan DXVA mungkin tidak tersedia, karena beberapa alasan:

  • GPU mungkin tidak mendukung DXVA.
  • Klien mungkin tidak menggunakan Direct3D.
  • Profil DXVA tidak ditentukan untuk setiap format video.

MFT sadar Direct3D harus memiliki satu aliran output. Ini tidak dapat memiliki beberapa output.

Menulis MFT Kustom