Mengaktifkan Akselerasi Video DirectX

[Fitur yang terkait dengan halaman ini, Windows Media Format 11 SDK, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber dan Penulis Sink. Pembaca Sumber dan Penulis Sink telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan Pembaca Sumber dan Penulis Sink alih-alih Windows Media Format 11 SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

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 Pembungkus DMO mendukung DirectX VA. Ini berarti bahwa, untuk pemutaran lokal, aplikasi dapat menggunakan filter Pembaca WM ASF untuk memutar konten berbasis Windows Media 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 Windows Media Format SDK, untuk memutar konten berbasis Windows Media. Filter Sumber Media Windows WMP mengirimkan 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 Pembungkus DMO. Diagram berikut mengilustrasikan perbedaan antara WM ASF Reader dan WMP Windows Media Source Filter.

output filter sumber kustom sampel yang tidak dikompresi

sampel terkompresi output filter sumber qasf

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 Windows Media Format SDK 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 butuhkan 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 Windows Media Format SDK, filter sumber pemutar, DMO dekoder Windows Media Video, 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 Windows Media Video.
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 diaktifkan Va DirectX 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 Windows Media Format SDK untuk mendekompresi konten berbasis Windows Media.
  • 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 Windows Media Format SDK Asynchronous Reader, disebut sebagai pembaca.
  • Objek Media Decoder Windows Media 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::Connect pada pin output filter sumber video pemutar.

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

  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 Sambungkan ke DMO dekoder melalui IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Filter sumber kemudian mendelegasikan sisa operasi IPin::Connect ke metode CBaseOutputPin::Connect . 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::Connect 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