Bagikan melalui


Direct3D-Aware MFTs

Topik ini menjelaskan cara mengimplementasikan transformasi Media Foundation (MFT) 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 pendekodean DXVA. Untuk informasi tentang DXVA, lihat DirectX Video Acceleration 2.0.

Penting

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

 

  1. Terapkan metode IMFTransform::GetAttributes . Metode ini mengembalikan penunjuk ke penyimpanan atribut.
  2. MFT harus menetapkan nilai atribut MF_SA_D3D_AWARE ke TRUE di penyimpanan atributnya sendiri. Mulai 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) adalah TRUE, klien dapat mengirim pesan MFT_MESSAGE_SET_D3D_MANAGER ke MFT. Parameter peristiwa ulParam adalah penunjuk ke antarmuka IDirect3DDeviceManager9 . Mulai dari Windows 8, Anda dapat menggunakan IMFDXGIDeviceManager alih-alih IDirect3DDeviceManager9. Klien tidak diperlukan untuk mengirim pesan ini.
  4. MFT memanggil IDirect3DDeviceManager9::GetVideoService untuk meminta layanan DXVA yang dibutuhkannya. 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, kali ini mengatur 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 tepat satu buffer media. Untuk mendapatkan permukaan Direct3D dari buffer, panggil fungsi MFGetService 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 metode IMFTransform::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