Negosiasi Alokator

[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.]

Ketika dua pin terhubung, mereka membutuhkan mekanisme untuk bertukar data media. Mekanisme ini disebut transportasi. Secara umum, arsitektur DirectShow netral tentang transportasi. Dua filter dapat setuju untuk terhubung menggunakan transportasi apa pun yang didukung keduanya.

Transportasi yang paling umum adalah transportasi memori lokal , di mana data media berada di memori utama. Ada dua rasa transportasi memori lokal, model pendorongan dan model penarikan. Dalam model pendorongan, filter sumber mendorong data ke filter hilir, menggunakan antarmuka IMemInputPin pada pin input filter hilir. Dalam model penarikan, filter hilir meminta data dari filter sumber, menggunakan antarmuka IAsyncReader pada pin output filter sumber. Untuk informasi selengkapnya tentang dua model aliran data ini, lihat Aliran Data di Grafik Filter.

Dalam transportasi memori lokal, objek yang bertanggung jawab untuk mengalokasikan buffer memori disebut alokator. Alokator mendukung antarmuka IMemAllocator . Kedua pin berbagi satu alokator. Salah satu pin dapat menyediakan alokator, tetapi pin output memilih alokator mana yang akan digunakan.

Pin output juga mengatur properti alokator, yang menentukan berapa banyak buffer yang dibuat oleh alokator, ukuran setiap buffer, dan perataan memori. Pin output mungkin menunggak pin input untuk persyaratan buffer.

Dalam koneksi IMemInputPin , negosiasi alokator berfungsi sebagai berikut:

  1. Secara opsional, pin output memanggil IMemInputPin::GetAllocatorRequirements. Metode ini mengambil persyaratan buffer pin input, seperti perataan memori. Secara umum, pin output harus mematuhi permintaan pin input, kecuali ada alasan yang baik untuk tidak melakukannya.
  2. Secara opsional, pin output memanggil IMemInputPin::GetAllocator. Metode ini meminta alokator dari pin input. Pin input menyediakan satu, atau mengembalikan kode kesalahan.
  3. Pin output memilih alokator. Ini dapat menggunakan salah satu yang disediakan oleh pin input, atau membuat sendiri.
  4. Pin output memanggil IMemAllocator::SetProperties untuk mengatur properti alokator. Namun, alokator mungkin tidak mematuhi properti yang diminta. (Misalnya, ini dapat terjadi jika pin input menyediakan alokator.) Alokator mengembalikan properti aktual sebagai parameter output dalam metode SetProperties .
  5. Outpin memanggil IMemInputPin::NotifyAllocator untuk menginformasikan pin input pilihan.
  6. Pin input harus memanggil IMemAllocator::GetProperties untuk memverifikasi apakah properti alokator dapat diterima.
  7. Pin output bertanggung jawab untuk melakukan dan menonaktifkan alokator. Ini terjadi ketika streaming dimulai dan berhenti.

Dalam koneksi IAsyncReader , negosiasi alokator berfungsi sebagai berikut:

  1. Pin input memanggil IAsyncReader::RequestAllocator pada pin output. Pin input menentukan persyaratan buffernya dan, secara opsional, menyediakan alokator.
  2. Pin output memilih alokator. Ini dapat menggunakan yang disediakan oleh pin input, jika ada, atau membuat sendiri.
  3. Pin output mengembalikan alokator sebagai parameter keluar dalam metode RequestAllocator . Pin input harus memeriksa properti alokator.
  4. Pin input bertanggung jawab untuk melakukan dan menonaktifkan alokator.
  5. Kapan saja selama proses negosiasi alokator, salah satu pin dapat gagal koneksi.
  6. Jika pin output menggunakan alokator pin input, pin tersebut hanya dapat menggunakan alokator tersebut untuk mengirimkan sampel ke pin input tersebut. Filter pemilik tidak boleh menggunakan alokator untuk mengirimkan sampel ke pin lain.

Menyediakan Alokator Kustom