Bagikan melalui


Proses Koneksi CBasePin

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

Bagian ini menjelaskan bagaimana kelas CBasePin mengimplementasikan proses koneksi pin.

Filter Graph Manager memulai semua koneksi pin. Ini memanggil metode IPin::Connect pin output, menentukan pin input. Pin output menyelesaikan koneksi dengan memanggil metode IPin::ReceiveConnection pin input. Pin input dapat menerima atau menolak koneksi.

Filter Graph Manager juga dapat menentukan jenis media untuk koneksi. Jika demikian, pin mencoba terhubung dengan jenis tersebut. Jika tidak, pin harus menegosiasikan jenisnya. Filter Graph Manager juga dapat menentukan jenis media parsial , yang memiliki nilai GUID_NULL untuk jenis utama, subjenis, atau jenis format. Dalam hal ini, pin mencoba mencocokkan bagian mana pun dari jenis media yang ditentukan; nilai GUID_NULL bertindak sebagai kartubebas.

Metode CBasePin::Connect dimulai dengan memverifikasi bahwa pin dapat menerima koneksi. Misalnya, memeriksa bahwa pin belum tersambung. Ini mendelegasikan sisa proses koneksi ke metode CBasePin::AgreeMediaType . Semua yang mengikuti dilakukan oleh AgreeMediaType.

Jika jenis media sepenuhnya ditentukan, pin memanggil metode CBasePin::AttemptConnection untuk mencoba koneksi. Jika tidak, ini mencoba jenis media dalam urutan berikut:

  1. Jenis pilihan pin input.
  2. Jenis pilihan pin output.

Anda dapat membalikkan urutan ini dengan mengatur bendera CBasePin::m_bTryMyTypesFirst ke TRUE.

Dalam setiap kasus, pin memanggil IPin::EnumMediaTypes untuk menghitung jenis media. Metode ini mengambil objek enumerator, yang diteruskan ke metode CBasePin::TryMediaTypes . Metode TryMediaTypes mengulang setiap jenis media dan memanggil AttemptConnection untuk setiap jenis.

Dalam metode AttemptConnection , pin output memanggil metode berikut:

Perhatikan hal-hal berikut:

  • CheckConnect adalah metode virtual. Di kelas dasar, metode ini memeriksa apakah arah pin kompatibel. Pin output harus terhubung ke pin input, dan sebaliknya. Kelas pin turunan biasanya akan mengambil alih metode ini untuk melakukan pemeriksaan lain. Misalnya, mungkin mengkueri pin lain untuk antarmuka yang diperlukan untuk koneksi. Jika kelas turunan mengambil alih CheckConnect, kelas tersebut juga harus memanggil metode CBasePin .
  • CheckMediaType adalah metode virtual murni, yang harus diterapkan oleh kelas turunan.
  • CompleteConnect adalah metode virtual yang tidak melakukan apa pun di kelas dasar. Kelas turunan dapat mengambil alih metode ini untuk melakukan pekerjaan tambahan apa pun yang diperlukan untuk menyelesaikan koneksi, seperti memutuskan alokator memori.

Jika salah satu langkah ini gagal, pin output memanggil metode CBasePin::BreakConnect untuk membatalkan langkah apa pun yang diambil oleh CheckConnect.

Metode ReceiveConnection pin input memanggil metode CheckConnect, CheckMediaType, dan CompleteConnect pin input. Jika salah satu dari ini gagal, upaya koneksi juga gagal.

Diagram berikut menunjukkan proses koneksi di CBasePin:

Proses koneksi cbasepin

CBasePin