Bagikan melalui


Pemisah AVStream

Minidriver AVStream dapat menggunakan fungsionalitas driver kelas AVStream untuk membagi aliran data menjadi beberapa salinan saat aliran melewati pin tertentu. Proses pemisahan ini dapat berguna jika driver Anda perlu menyalin aliran input untuk menghasilkan dua aliran output yang identik.

Untuk melakukan ini, atur KSPIN_FLAG_SPLITTER pada anggota Flags dari struktur KSPIN_DESCRIPTOR_EX pin. Saat bendera ini diatur pada pin, pin bertindak sebagai pemisah otomatis. AVStream secara otomatis menyalin semua data yang diperlukan untuk membagi aliran.

Dalam rilis setelah DirectX8.0, flag KSPIN_FLAG_SPLITTER berfungsi untuk pin pada filter filter-sentris dan pin-sentris. Rilis sebelumnya mendukung flag ini hanya untuk pin pada filter yang berfokus pada filter.

Diagram berikut menunjukkan konfigurasi filter di mana pin input membagi aliran menjadi dua pin output. Filter hilir dari pin output ini mengubah tempat data.

diagram yang mengilustrasikan filter avstream dengan pin output pemisah .

Frame tiba pada pin input dan ditempatkan ke dalam antrian input. Minidriver hanya berinteraksi dengan antrean input dan antrean output untuk pin yang asli. AVStream secara otomatis menyalin data dari antrean pin pertama ke antrean pin kedua.

Untuk kesederhanaan, diagram ini tidak menunjukkan bagaimana frame diberikan ke pin output. Untuk menyediakan frame ke pin output, misalnya, mungkin ada requester dan allocator yang terkait dengan setiap antrean dan termasuk dalam bagian pipa ini. Atau, frame dapat berasal dari filter hilir.

Dalam struktur KSFILTER_DISPATCH, minidriver menentukan penunjuk ke rutinitas panggilan balik AVStrMiniFilterProcess yang disediakan vendor. Rutinitas panggilan balik ini adalah tempat minidriver menerima penunjuk ke struktur KSPROCESSPIN_INDEXENTRY yang berisi array struktur KSPROCESSPIN yang digambarkan di bawah ini.

Diagram ini memperlihatkan bagaimana minidriver membedakan antara dua pin output dalam daftar pin proses:

diagram tabel pin proses untuk dua pin terpisah.

Dalam diagram ini, DB mengacu pada anggota DelegateBranch dari struktur KSPROCESSPIN dan CS mengacu pada anggota CopySource . Elemen DelegateBranch dan CopySource dari pin input serta pin output pertama adalah NULL. Ini menunjukkan bahwa minidriver bertanggung jawab untuk menangani frame pada pin ini.

Namun, pin output kedua memiliki CopySource yang menunjuk kembali ke pin output pertama. Ini menunjukkan bahwa pin output kedua berada dalam pipa terpisah dari pin output pertama dan bahwa AVStream secara otomatis menyalin data apa pun yang ditempatkan ke dalam antrean pin output pertama ke dalam antrean pin output kedua.

Kasus pemisah yang lebih rumit dapat muncul ketika dua pin output diintegrasikan ke dalam pipa yang sama. Minidriver dapat menyertakan dua pin output berbasis pemisah dalam pipa yang sama, misalnya, selama filter hilir tidak mengubah data yang dikirim dari pin ini. Karena data tidak dimodifikasi, pin output dianggap baca-saja; kedua filter hilir menerima buffer yang sama.

Ada kemungkinan juga bahwa beberapa filter hilir yang secara otomatis terhubung ke pin pemisah berpotensi mengubah data sementara yang lain tidak.

Dalam hal ini, tata letak filter bisa mirip dengan diagram berikut, yang menggambarkan filter yang berisi tiga instans pin output terpisah:

diagram yang mengilustrasikan filter avstream dengan tiga pin output terpisah .

Pin A dan B ditetapkan ke pipa yang sama karena filter-filter di hilir tidak mengubah data; filter-filter di hilir A dan B menerima penunjuk buffer yang sama.

Minidriver hanya berinteraksi dengan antrean input dan satu antrean output. AVStream secara otomatis menyalin dari antrean A/B dan antrean C. Ini juga membuat objek pemisah yang mengirim frame data yang sama melalui pin A dan pin B (perhatikan bahwa header stream berbeda).

Struktur array KSPROCESSPIN adalah sebagai berikut:

diagram tabel pin proses untuk tiga pin output terpisah.

Satu-satunya pin yang harus berinteraksi dengan minidriver dalam keadaan normal adalah pin A.

Untuk menyederhanakan diagram di atas, pemohon dan alokator dihilangkan dari diagram. Diagram dimaksudkan untuk menunjukkan hanya proses pemisahan bingkai.