Mengaktifkan Akselerasi Video DirectX

Bagian ini menjelaskan cara mengaktifkan Microsoft® DirectX® Video Acceleration saat memutar konten yang dialirkan di pemutar kustom.

Latar belakang

DirectX Video Acceleration (DirectX VA) adalah spesifikasi API untuk akselerasi perangkat keras operasi decoding 2-D. Ini memungkinkan dekode perangkat lunak untuk membongkar operasi intensif CPU tertentu ke kartu grafis untuk diproses. Untuk pengguna akhir, ini memungkinkan video laju bit tinggi seperti pemutaran DVD layar penuh di komputer lama yang dilengkapi dengan kartu grafis yang kompatibel dengan DirectX VA.

Dimulai dengan Windows Media Format 9 Series SDK, filter DMO Wrapper mendukung DirectX VA. Ini berarti bahwa, untuk pemutaran lokal, aplikasi dapat menggunakan filter Pembaca WM ASF untuk memutar konten berbasis Media Windows dan akselerasi perangkat keras DirectX VA akan dipanggil secara otomatis jika kartu grafis mendukungnya. Namun, filter Pembaca WM ASF tidak mendukung pemutaran konten yang dialirkan. Oleh karena itu, jika Anda ingin mendukung DirectX VA saat memutar konten yang dialirkan di pemutar kustom, Anda harus menggunakan mekanisme alternatif, yang merupakan yang digunakan oleh Pemutar Media Windows dimulai dengan Windows Media 9 Series.

Karena Pemutar Media Windows dirancang sebelum filter QASF dikembangkan, Pemutar Media Windows memiliki filter sumbernya sendiri, berdasarkan SDK Format Media Windows, untuk memutar konten berbasis media Windows. Filter Sumber WMP Windows Media memberikan data yang didekompresi ke hilir langsung ke perender audio dan video. Sebaliknya, Pembaca WM ASF mengirimkan konten terkompresi ke Windows Media Decoder DirectX Media Objects (DMO), yang dihosting di dalam DMO Wrapper. Diagram berikut mengilustrasikan perbedaan antara WM ASF Reader dan WMP Windows Media Source Filter.

custom source filter outputs uncompressed samples

qasf source filter outputs compressed samples

Untuk mengaktifkan DirectX VA untuk konten yang dialirkan, Anda harus membuat filter sumber kustom seperti yang ada di diagram atas. Pada dasarnya, filter ini akan menggunakan SDK Format Media Windows untuk membuat instans objek Pembaca WM, mendekompresi sampel, dan mengirimkannya ke hilir pada pin outputnya. Diskusi ini mengasumsikan bahwa Anda telah membuat filter sumber dan sekarang siap untuk mengimplementasikan dukungan DirectX VA.

Untuk mengaktifkan DirectX VA, tugas dasar filter sumber adalah menyediakan Video Renderer dan WMV Decoder DMO dengan antarmuka yang mereka perlukan untuk menegosiasikan koneksi DirectX VA. Filter sumber tidak berpartisipasi dalam negosiasi tersebut. Setelah streaming dimulai, satu-satunya tugas terkait Va DirectX yang dapat dilakukan filter sumber adalah memodifikasi stempel waktu pada sampel video sebelum dekoder WMV mengirimkannya ke Video Renderer. Alasan utama untuk melakukan ini adalah untuk memberikan kontrol garis waktu kustom di luar apa yang diaktifkan antarmuka DirectShow® standar.

Tiga antarmuka didefinisikan untuk mengaktifkan komunikasi yang diperlukan antara SDK Format Media Windows, filter sumber pemutar, Windows Media Video decoder DMO, dan Overlay Mixer atau Video Mixing Renderer. Antarmuka ini dijelaskan dalam tabel berikut.

Antarmuka Deskripsi
IWMCodecAMVideoAccelerator Diekspos oleh Windows Media Decoder DMO dan dipanggil oleh filter sumber pemutar media untuk menyiapkan berbagai koneksi yang diperlukan untuk mengaktifkan DirectX VA untuk pendekodean konten Video Media Windows.
IWMPlayerTimestampHook Diimplementasikan pada filter sumber pemutar. Ini memungkinkan filter untuk memodifikasi stempel waktu pada sampel video sebelum mengirimkannya ke hilir.
IWMReaderAccelerator Diimplementasikan pada objek Pembaca WM. Ini dipanggil oleh filter sumber pemutar untuk mendapatkan antarmuka dari DMO dekoder.

 

Urutan Operasi di Playback dengan dukungan DirectX VA

Bagian ini menjelaskan urutan umum operasi pada durasi untuk pemutar yang mendukung DirectX VA dan filter sumbernya. Komponen yang dimaksud di bagian ini adalah:

  • Pemutar media pihak ketiga, yang disebut sebagai pemutar.
  • Filter sumber kustom, dibuat oleh pemutar, yang menggunakan SDK Format Media Windows untuk mendekompresi konten berbasis media Windows.
  • Pin output video dari filter sumber pemutar, disebut sebagai pin output.
  • Grafik filter pemutaran video DirectShow, disebut sebagai grafik.
  • Video Mixing Renderer, disebut sebagai VMR.
  • Objek Pembaca Asinkron SDK Format Media Windows, disebut sebagai pembaca.
  • Objek Media Windows Media Video Decoder DirectX Media, disebut sebagai DMO dekoder.

Urutan operasi adalah sebagai berikut:

  1. Pemutar membuat instans filter sumbernya dan objek pembaca. Pembaca membuat DMO dekoder video dan mengatur jenis input (terkompresi) di dalamnya. Ini harus terjadi sebelum pemutar mencoba mengonfigurasi grafik pemutaran videonya karena SDK dan DMO dekoder harus terlibat dalam proses negosiasi dengan grafik, dan DMO harus mengetahui format input selama langkah 9.
  2. Pemutar memanggil IGraphBuilder::Render, menyediakan pin output filter sumber video. Pada titik ini, manajer grafik filter DirectShow mencoba menyambungkan VMR ke filter sumber video pemutar.
  3. Manajer grafik filter memanggil IPin::Koneksi pada pin output filter sumber video pemutar.

Langkah 4 hingga 10 terjadi di dalam IPin::Koneksi.

  1. Filter sumber mendapatkan antarmuka IWMCodecAMVideoAccelerator dari metode IWMReaderAccelerator::GetCodecInterface pembaca. Jika codec tidak mendukung DirectX VA, panggilan ke GetCodecInterface mungkin gagal. Dalam hal ini, negosiasi berjalan seperti biasa, tanpa dukungan DirectX VA.

  2. Filter sumber meneruskan pointer IAMVideoAccelerator dari pin yang diteruskan ke Koneksi ke DMO dekoder melalui IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Filter sumber kemudian mendelegasikan sisa operasi IPin::Koneksi ke metode CBaseOutputPin::Koneksi. Enumerasi format dengan SDK berlanjut seperti hari ini. Jika codec mendukung DirectX VA untuk konten yang terhubung, DMO codec menyajikan subjenis DirectX VA tersebut terlebih dahulu, sebelum jenis YUV dan RGB didukung. Jika dukungan DirectX VA tersedia, langkah 7 hingga 11 dicoba dalam konteks subjenis DirectX VA. Cuplikan kode berikut menunjukkan cara mengidentifikasi subjenis media DirectX VA.

    bool IsDXVASubtype( AM_MEDIA_TYPE * pmt )
    {
        // All DXVA types have the same last 3 DWORDs.
        // guidDXVA is the base GUID for all DXVA subtypes.
    
        GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } };
    
        unsigned long const * plguid;
        unsigned long const * plguidDXVA;
        plguid = (unsigned long const *)&pmt->subtype;
        plguidDXVA = (unsigned long *)&guidDXVA;
    
        if( ( plguid[1] == plguidDXVA[1] ) &&
            ( plguid[2] == plguidDXVA[2] ) &&
            ( plguid[3] == plguidDXVA[3] ) )
        {
            return true;
        }
    
        return false;
    }
    
    
  4. Implementasi CBaseOutputPin::Koneksi memanggil IPin::CompleteConnect selama langkah 3. Jika subjenis DirectX VA sedang dipertimbangkan, negosiasi DirectX VA akan dicoba. Pin output memanggil IWMCodecAMVideoAccelerator::NegotiateConnection, meneruskannya ke jenis media output saat ini.

  5. Decoder DMO melakukan negosiasi yang diperlukan dengan VMR melalui antarmuka IAMVideoAccelerator , dan mengembalikan GUID subjenis video yang telah disepakati keduanya. Pin output mendelegasikan semua panggilan IAMVideoAcceleratorNotify yang diterima selama proses ini ke antarmuka IAMVideoAcceleratorNotify decoder DMO, yang juga dapat diperoleh melalui metode IWMReaderAccelerator::GetCodecInterface .

  6. Jika NegotiateConnection berhasil, pin output memanggil IWMCodecAMVideoAccelerator::SetPlayerNotify dengan antarmuka IWMPlayerTimestampHook . Kait ini memungkinkan filter sumber untuk memperbarui stempel waktu pada sampel sebelum diserahkan ke perender.

  7. Filter sumber memanggil IWMReaderAccelerator::Notify dengan jenis media yang dinegosiasikan. Ini memungkinkan pembaca untuk memperbarui variabel internalnya dan berkomitmen pada DirectX VA. Ini adalah tempat terakhir codec atau pembaca dapat gagal. Jika salah satu langkah di atas gagal, filter sumber harus kembali ke langkah 3 dan mencoba jenis berikutnya yang dijumlahkan oleh pembaca.

  8. Pemutaran dimulai. Pembaca mengabaikan buffer output dari DMO dekoder jika jenis output koneksi adalah DirectX VA.

  9. Ketika IPin::D isconnect terjadi, filter sumber memanggil IWMCodecAMVideoAccelerator::SetAcceleratorInterface dengan NULL. Ini memutus koneksi DirectX VA antara codec dan perender.

Membaca File ASF