QueryAccept (Hilir)
[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio /Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]
Mekanisme ini memungkinkan pin output untuk mengusulkan format baru ke peer hilirnya. Format baru tidak boleh memerlukan ukuran buffer yang lebih besar. Pin output melakukan hal berikut:
Panggilan IPin::QueryAccept atau IPinConnection::D ynamicQueryAccept pada pin hilir, untuk memverifikasi apakah pin lain dapat menerima jenis media baru (lihat ilustrasi, langkah A).
Jika nilai pengembalian dari langkah 1 S_OK, pin melampirkan jenis media ke sampel berikutnya. Untuk melakukan ini, pertama-tama ia memanggil IMemAllocator::GetBuffer untuk mendapatkan sampel (B). Kemudian memanggil IMediaSample::SetMediaType untuk melampirkan jenis media ke sampel tersebut (C). Dengan melampirkan jenis media ke sampel, filter menunjukkan bahwa format telah berubah, dimulai dengan sampel tersebut.
Pin memberikan sampel (D).
Saat filter hilir menerima sampel, filter memanggil IMediaSample::GetMediaType untuk mengambil jenis media baru.
Semua pin mendukung metode QueryAccept
. Namun, metode ini sedikit ambigu, karena nilai pengembalian S_OK tidak selalu menjamin bahwa Anda dapat mengubah format saat grafik aktif. Beberapa filter mungkin mengembalikan S_OK tetapi menolak perubahan jika grafik aktif. Metode DynamicQueryAccept, yang didukung oleh beberapa pin input, secara eksplisit mendefinisikan S_OK berarti pin dapat mengubah format saat aktif. Jika pin input mendukung antarmuka IPinConnection, Anda harus memanggil DynamicQueryAccept daripada QueryAccept
.
Dalam kebanyakan kasus, mekanisme ini tidak memungkinkan perubahan drastis pada format, seperti mengubah kedalaman bit. Salah satu situasi di mana ia dapat digunakan adalah ketika dekoder video mengalihkan palet. Detail dasar format tetap sama, seperti dimensi gambar dan kedalaman bit, tetapi jenis media baru memiliki serangkaian entri palet yang berbeda.
Catatan Implementasi
Dalam kelas dasar DirectShow, CBasePin::QueryAccept memanggil metode CheckMediaType, yang juga dipanggil selama koneksi pin awal. Dalam kasus filter transformasi, metode CheckMediaType pin input harus selalu memeriksa apakah pin output terhubung, dan jika demikian, apakah jenis media input kompatibel dengan jenis media output. Oleh karena itu, implementasi ini kemungkinan akan berlaku untuk QueryAccept
. Jika tidak, Anda harus mengambil alih QueryAccept
untuk melakukan pemeriksaan tambahan yang diperlukan. Perhatikan juga bahwa kelas CTransformFilter merangkum logika ini dalam metode CheckInputType dan CheckTransform. KelasCTransInPlaceFilter, di sisi lain, selalu memanggil QueryAccept
pada filter hulu atau hilir berikutnya.
Metode CBaseInputPin::Receive memeriksa jenis media pada sampel masuk, dan jika ada, panggilan CheckMediaType. Namun, itu tidak memperbarui anggota m_mt pin, yang memegang jenis media saat ini. Saat filter memproses sampel, Anda harus memeriksa sampel untuk jenis media. Jika ada jenis baru, Anda mungkin perlu menyimpannya, baik dengan memanggil SetMediaType pada pin Anda atau dengan mengatur nilai m_mt secara langsung. Di sisi lain, kelasCVideoTransformFilter, yang dirancang untuk filter transformasi video, menyimpan jenis media saat berubah. Untuk detailnya, lihat kode sumber untuk CVideoTransformFilter::Terima di pustaka kelas dasar DirectShow.
Dalam beberapa kasus, Anda mungkin hanya meneruskan panggilan QueryAccept
hilir, lalu melampirkan jenis media ke sampel output dan membiarkan filter hilir menangani perubahan format.