Bagikan melalui


Koneksi Ulang Dinamis

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

Di sebagian besar filter DirectShow, pin tidak dapat disambungkan kembali saat grafik secara aktif mengalirkan data. Aplikasi harus menghentikan grafik sebelum menyambungkan kembali pin. Namun, beberapa filter mendukung koneksi ulang pin saat grafik berjalan, proses yang dikenal sebagai koneksi ulang dinamis. Ini dapat dilakukan baik oleh aplikasi, atau dengan filter dalam grafik.

Sebagai contoh, pertimbangkan grafik dalam ilustrasi berikut.

diagram pembuatan grafik dinamis

Salah satu skenario untuk koneksi ulang dinamis mungkin adalah menghapus Filter 2 dari grafik, saat grafik berjalan, dan menggantinya dengan filter lain. Agar skenario ini berfungsi, hal berikut harus benar:

  • Pin input pada Filter 3 (pin D) harus mendukung antarmuka IPinConnection . Antarmuka ini memungkinkan pin untuk disambungkan kembali tanpa menghentikan filter.
  • Pin output pada Filter 1 (pin A) harus dapat memblokir aliran data media saat koneksi ulang terjadi. Tidak ada data yang dapat melakukan perjalanan antara pin A dan pin D selama koneksi ulang. Umumnya, ini berarti pin output harus mendukung antarmuka IPinFlowControl . Namun, jika Filter 1 adalah filter yang memulai koneksi ulang, filter mungkin memiliki beberapa mekanisme internal untuk memblokir aliran datanya sendiri.

Koneksi ulang dinamis akan melibatkan langkah-langkah berikut:

  1. Blokir aliran data dari pin A.
  2. Sambungkan kembali pin A ke pin D, mungkin melalui filter perantara baru.
  3. Buka blokir pin A sehingga data mulai mengalir lagi.

Langkah 1. Memblokir Aliran Data

Untuk memblokir aliran data, panggil IPinFlowControl::Block di pin A. Metode ini dapat dipanggil baik secara asinkron atau sinkron. Untuk memanggil metode secara asinkron, buat objek peristiwa Win32 dan teruskan handel peristiwa ke metode Blokir . Metode akan segera kembali. Tunggu hingga peristiwa disinyalkan, menggunakan fungsi seperti WaitForSingleObject. Pin memberi sinyal peristiwa ketika telah memblokir aliran data. Contohnya:

// Create an event
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hEvent != NULL)
{
    // Block the data flow.
    hr = pFlowControl->Block(AM_PIN_FLOW_CONTROL_BLOCK, hEvent); 
    if (SUCCEEDED(hr))
    {
        // Wait for the pin to finish.
        DWORD dwRes = WaitForSingleObject(hEvent, dwMilliseconds);
    }
}

Untuk memanggil metode secara sinkron, cukup berikan nilai NULL alih-alih handel peristiwa. Sekarang metode akan memblokir sampai operasi selesai. Ini mungkin tidak terjadi sampai pin siap untuk mengirimkan sampel baru. Jika filter dijeda, ini dapat memakan waktu yang lama. Oleh karena itu, jangan melakukan panggilan sinkron dari utas aplikasi utama Anda. Gunakan utas pekerja, atau panggil metode secara asinkron.

Langkah 2. Menyambungkan kembali pin

Untuk menyambungkan kembali pin, kueri Filter Graph Manager untuk antarmuka IGraphConfig dan panggil IGraphConfig::Reconnect atau IGraphConfig::Reconfigure. Metode Sambungkan Ulang lebih mudah digunakan; ia melakukan hal berikut:

  • Menghentikan filter perantara (Filter 2 dalam contoh) dan menghapusnya dari grafik.
  • Menambahkan filter perantara baru, jika diperlukan.
  • Menyambungkan semua pin.
  • Menjeda atau menjalankan filter baru apa pun, agar sesuai dengan status grafik.

Metode Sambungkan ulang memiliki beberapa parameter opsional yang dapat digunakan untuk menentukan jenis media untuk koneksi pin dan filter perantara yang akan digunakan. Contohnya:

pGraph->AddFilter(pNewFilter, L"New Filter for the Graph");
pConfig->Reconnect(
    pPinA,      // Reconnect this output pin...
    pPinD,      // ... to this input pin.
    pMediaType, // Use this media type.
    pNewFilter, // Connect them through this filter.
    NULL, 
    0);     

Untuk detailnya, lihat halaman referensi. Jika metode Sambungkan Ulang tidak cukup fleksibel, Anda dapat menggunakan metode Konfigurasi ulang , yang memanggil metode panggilan balik yang ditentukan aplikasi untuk menyambungkan kembali pin. Untuk menggunakan metode ini, terapkan antarmuka IGraphConfigCallback di aplikasi Anda.

Sebelum memanggil Konfigurasi Ulang, blokir aliran data dari pin output, seperti yang dijelaskan sebelumnya. Kemudian dorong data apa pun yang masih tertunda di bagian grafik yang Anda sambungkan kembali, sebagai berikut:

  1. Panggil IPinConnection::NotifyEndOfStream pada pin input terjauh di hilir dalam rantai koneksi ulang (sematkan D dalam contoh). Teruskan handel ke acara Win32.
  2. Panggil IPin::EndOfStream pada pin input yang segera downstream dari pin output tempat Anda memblokir aliran data. (Dalam contoh ini, aliran data diblokir pada pin A, sehingga Anda akan memanggil EndOfStream pada pin B.)
  3. Tunggu hingga peristiwa disinyalkan. Pin input (pin D) memberi sinyal peristiwa saat menerima pemberitahuan akhir aliran. Ini menunjukkan bahwa tidak ada data yang berjalan di antara pin, dan bahwa pemanggil dapat menyambungkan kembali pin dengan aman.

Perhatikan bahwa metode IGraphConfig::Reconnect secara otomatis menangani langkah-langkah sebelumnya. Anda hanya perlu melakukan langkah-langkah ini jika Anda menggunakan metode Konfigurasi ulang .

Setelah data didorong melalui grafik, panggil Konfigurasi Ulang dan teruskan penunjuk ke antarmuka panggilan balik IGraphConfigCallback Anda. Filter Graph Manager akan memanggil metode IGraphConfigCallback::Reconfigure yang telah Anda sediakan.

Langkah 3. Membuka blokir Aliran Data

Setelah Anda menyambungkan kembali pin, buka blokir aliran data dengan memanggil IPinFlowControl::Block dengan nilai nol untuk parameter pertama.

Catatan

Jika koneksi ulang dinamis dilakukan oleh filter, ada beberapa masalah utas yang harus Anda waspadai. Jika Filter Graph Manager mencoba menghentikan filter, filter dapat mengalami kebuntuan, karena grafik menunggu filter berhenti, sementara pada saat yang sama filter mungkin menunggu data didorong melalui grafik. Untuk mencegah kemungkinan kebuntuan, beberapa metode yang dijelaskan di bagian ini menangani peristiwa Win32. Filter harus memberi sinyal peristiwa jika Filter Graph Manager mencoba menghentikan filter. Untuk informasi selengkapnya, lihat IGraphConfig dan IPinConnection.

 

Bangunan Grafik Dinamis