Mendukung DXVA 2.0 di Media Foundation

Topik ini menjelaskan cara mendukung DirectX Video Acceleration (DXVA) 2.0 dalam transformasi Media Foundation (MFT) menggunakan Microsoft Direct3D 9 Secara khusus, ini menjelaskan komunikasi antara dekoder dan perender video, yang dimediasi oleh pemuat topologi. Topik ini tidak menjelaskan cara mengimplementasikan pendekodean DXVA.

Di sisa topik ini, istilah dekoder mengacu pada MFT decoder, yang menerima video terkompresi dan menghasilkan video yang tidak dikompresi. Istilah perangkat decoder mengacu pada akselerator video perangkat keras yang diterapkan oleh driver grafis.

Tip

Untuk informasi tentang pendekodean video Microsoft Direct3D 11 lihat, Mendukung Pendekodean Video Direct3D 11 di Media Foundation.

 

Catatan

Aplikasi Windows Store harus menggunakan Direct3D 11.

 

Berikut adalah langkah-langkah dasar yang harus dilakukan dekoder untuk mendukung DXVA 2.0 di Media Foundation:

  1. Buka handel ke perangkat Direct3D 9.
  2. Temukan konfigurasi dekoder DXVA.
  3. Alokasikan Buffer yang tidak dikompresi.
  4. Dekode bingkai.

Langkah-langkah ini dijelaskan secara lebih rinci di sisa topik ini.

Membuka Handel Perangkat Direct3D

MFT menggunakan manajer perangkat Microsoft Direct3D untuk menangani perangkat Direct3D 9. Untuk membuka handel perangkat, lakukan langkah-langkah berikut:

  1. Mengekspos atribut MF_SA_D3D_AWARE dengan nilai TRUE. Pemuat topologi meminta atribut ini dengan memanggil IMFTransform::GetAttributes. Mengatur atribut ke TRUE memberi tahu pemuat topologi bahwa MFT mendukung DXVA.
  2. Ketika negosiasi format dimulai, pemuat topologi memanggil IMFTransform::P rocessMessage dengan pesan MFT_MESSAGE_SET_D3D_MANAGER . Parameter ulParam adalah penunjuk IUnknown ke manajer perangkat Direct3D perender video. Kueri pointer ini untuk antarmuka IDirect3DDeviceManager9 .
  3. Panggil IDirect3DDeviceManager9::OpenDeviceHandle untuk mendapatkan handel ke perangkat Direct3D perender.
  4. Panggil IDirect3DDeviceManager9::GetVideoService dan teruskan handel perangkat. Metode ini mengembalikan penunjuk ke antarmuka IDirectXVideoDecoderService .
  5. Cache pointer dan handel perangkat.

Menemukan Konfigurasi Decoder

MFT harus menemukan konfigurasi yang kompatibel untuk perangkat dekoder DXVA. Lakukan langkah-langkah berikut di dalam metode IMFTransform::SetInputType , setelah memvalidasi jenis input:

  1. Panggil IDirectXVideoDecoderService::GetDecoderDeviceGuids. Metode ini mengembalikan array GUID perangkat dekoder.

  2. Perulangan melalui array GUID dekoder untuk menemukan yang didukung dekoder. Misalnya, untuk dekoder MPEG-2, Anda akan mencari DXVA2_ModeMPEG2_MOCOMP, DXVA2_ModeMPEG2_IDCT, atau DXVA2_ModeMPEG2_VLD.

  3. Saat Anda menemukan GUID perangkat dekoder kandidat, teruskan GUID ke metode IDirectXVideoDecoderService::GetDecoderRenderTargets . Metode ini mengembalikan array format target render, yang ditentukan sebagai nilai D3DFORMAT .

  4. Perulangan melalui format target render dan cari format yang didukung oleh dekoder.

  5. Panggil IDirectXVideoDecoderService::GetDecoderConfigurations. Teruskan GUID perangkat decoder yang sama, bersama dengan struktur DXVA2_VideoDesc yang menjelaskan format output yang diusulkan. Metode mengembalikan array struktur DXVA2_ConfigPictureDecode . Setiap struktur menjelaskan satu kemungkinan konfigurasi untuk perangkat dekoder. Cari konfigurasi yang didukung dekoder.

  6. Simpan format dan konfigurasi target render.

Dalam metode IMFTransform::GetOutputAvailableType , kembalikan format video yang tidak dikompresi, berdasarkan format target render yang diusulkan.

Dalam metode IMFTransform::SetOutputType , periksa jenis media terhadap format target render.

Fallback ke Pendekodean Perangkat Lunak

Jika MFT tidak dapat menemukan konfigurasi DXVA (misalnya, jika driver grafis tidak memiliki kemampuan yang tepat), MFT harus mengembalikan kode kesalahan MF_E_UNSUPPORTED_D3D_TYPE dari metode SetInputType dan SetOutputType . Pemuat topologi akan merespons dengan mengirim pesan MFT_MESSAGE_SET_D3D_MANAGER dengan nilai NULL untuk parameter ulParam . MFT harus merilis penunjuknya ke antarmuka IDirect3DDeviceManager9 . Pemuat topologi kemudian akan menegosiasikan ulang jenis media, dan MFT dapat menggunakan decoding perangkat lunak.

Mengalokasikan Buffer Yang Tidak Dikompresi

Di DXVA 2.0, dekoder bertanggung jawab untuk mengalokasikan permukaan Direct3D untuk digunakan sebagai buffer video yang tidak dikompresi. Dekoder harus mengalokasikan 3 permukaan untuk digunakan EVR untuk deinterlacing. Jumlah ini diperbaiki, karena Media Foundation tidak menyediakan cara bagi EVR untuk menentukan berapa banyak permukaan yang diperlukan driver grafis untuk deinterlacing. Tiga permukaan harus cukup untuk setiap pengemudi.

Dalam metode IMFTransform::GetOutputStreamInfo , atur bendera MFT_OUTPUT_STREAM_PROVIDES_SAMPLES dalam struktur MFT_OUTPUT_STREAM_INFO . Bendera ini memberi tahu Sesi Media bahwa MFT mengalokasikan sampel outputnya sendiri.

Untuk membuat permukaan, panggil IDirectXVideoAccelerationService::CreateSurface. (Antarmuka IDirectXVideoDecoderService mewarisi metode ini dari IDirectXVideoAccelerationService.) Anda dapat melakukan ini di SetInputType, setelah menemukan format target render.

Untuk setiap permukaan, panggil MFCreateVideoSampleFromSurface untuk membuat sampel media untuk menahan permukaan. Metode mengembalikan penunjuk ke antarmuka IMFSample .

Decoding

Untuk membuat perangkat decoder, panggil IDirectXVideoDecoderService::CreateVideoDecoder. Metode mengembalikan penunjuk ke antarmuka IDirectXVideoDecoder dari perangkat dekoder.

Decoding harus terjadi di dalam metode IMFTransform::P rocessOutput . Pada setiap bingkai, panggil IDirect3DDeviceManager9::TestDevice untuk menguji handel perangkat. Jika perangkat telah berubah, metode akan mengembalikan DXVA2_E_NEW_VIDEO_DEVICE. Jika ini terjadi, lakukan hal berikut:

  1. Tutup handel perangkat dengan memanggil IDirect3DDeviceManager9::CloseDeviceHandle.
  2. Rilis pointer IDirectXVideoDecoderService dan IDirectXVideoDecoder .
  3. Buka handel perangkat baru.
  4. Negosiasikan konfigurasi dekoder baru, seperti yang dijelaskan dalam "Menemukan Konfigurasi Decoder" sebelumnya di halaman ini.
  5. Buat perangkat dekoder baru.

Dengan asumsi bahwa handel perangkat valid, proses pendekodean berfungsi sebagai berikut:

  1. Dapatkan permukaan yang tersedia yang saat ini tidak digunakan. (Awalnya semua permukaan tersedia.)
  2. Kueri sampel media untuk antarmuka IMFTrackedSample .
  3. Panggil IMFTrackedSample::SetAllocator dan berikan penunjuk ke antarmuka IMFAsyncCallback , yang diimplementasikan oleh dekoder. Saat perender video merilis sampel, panggilan balik dekoder akan dipanggil.
  4. Panggil IDirectXVideoDecoder::BeginFrame.
  5. Lakukan hal berikut ini satu atau beberapa kali:
    1. Panggil IDirectXVideoDecoder::GetBuffer untuk mendapatkan buffer decoder DXVA.
    2. Isi buffer.
    3. Panggil IDirectXVideoDecoder::ReleaseBuffer.
    4. Panggil IDirectXVideoDecoder::Execute untuk melakukan operasi pendekodean pada bingkai.

DXVA 2.0 menggunakan struktur data yang sama dengan DXVA 1.0 untuk operasi pendekodean. Untuk kumpulan profil DXVA asli (untuk H.261, H.263, dan MPEG-2), struktur data ini dijelaskan dalam spesifikasi DXVA 1.0.

Dalam setiap pasangan panggilan BeginFrame/Execute , Anda dapat memanggil GetBuffer beberapa kali, tetapi hanya sekali untuk setiap jenis buffer DXVA. Jika Anda memanggilnya dua kali dengan jenis buffer yang sama, Anda akan menimpa data.

Gunakan panggilan balik dari metode SetAllocator (langkah 3) untuk melacak sampel mana yang saat ini tersedia dan yang sedang digunakan.

Akselerasi Video DirectX 2.0

Transformasi Media Foundation