Metode CBaseInputPin.Receive

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan 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 Audio/Video Capture 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.]

Metode ini Receive menerima sampel media berikutnya di aliran. Metode ini mengimplementasikan metode IMemInputPin::Receive .

Sintaks

HRESULT Receive(
   IMediaSample *pSample
);

Parameter

pSample

Arahkan ke antarmuka IMediaSample sampel.

Nilai kembali

Mengembalikan nilai HRESULT . Nilai yang mungkin menyertakan nilai yang tercantum dalam tabel berikut ini.

Menampilkan kode Deskripsi
S_OK
Berhasil.
S_FALSE
Pin saat ini sedang di-flushing; sampel ditolak.
E_POINTER
Argumen penunjuk NULL.
VFW_E_INVALIDMEDIATYPE
Tipe media tidak valid.
VFW_E_RUNTIME_ERROR
Terjadi kesalahan run-time.
VFW_E_WRONG_STATE
Pin dihentikan.

Keterangan

Pin output upstream memanggil metode ini untuk mengirimkan sampel ke pin input. Pin input harus melakukan salah satu hal berikut:

  • Proses sampel sebelum kembali.
  • Kembalikan, dan proses sampel dalam utas pekerja.
  • Tolak sampel.

Jika pin menggunakan utas pekerja untuk memproses sampel, tambahkan jumlah referensi ke sampel di dalam metode ini. Setelah metode kembali, pin upstram merilis sampel. Saat jumlah referensi sampel mencapai nol, sampel kembali ke alokator untuk digunakan kembali.

Metode ini sinkron dan dapat memblokir. Jika metode mungkin memblokir, metode CBaseInputPin::ReceiveCanBlock pin harus mengembalikan S_OK.

Di kelas dasar, metode ini melakukan langkah-langkah berikut:

  1. Memanggil metode CBaseInputPin::CheckStreaming untuk memverifikasi bahwa pin dapat memproses sampel sekarang. Jika tidak dapat misalnya, jika pin dihentikan, metode gagal.
  2. Mengambil properti sampel dan memeriksa apakah format telah berubah (lihat di bawah).
  3. Jika format telah berubah, metode memanggil metode CBasePin::CheckMediaType untuk menentukan apakah format baru dapat diterima.
  4. Jika format baru tidak dapat diterima, metode memanggil metode CBasePin::EndOfStream , memposting peristiwa EC_ERRORABORT, dan mengembalikan kode kesalahan.
  5. Dengan asumsi tidak ada kesalahan, metode mengembalikan S_OK.

Uji perubahan format sebagai berikut:

  • Jika sampel mendukung antarmuka IMediaSample2 , periksa anggota dwSampleFlags dari struktur AM_SAMPLE2_PROPERTIES . Jika bendera AM_SAMPLE_TYPECHANGED ada, format telah berubah.
  • Jika tidak, jika sampel tidak mendukung IMediaSample2, panggil metode IMediaSample::GetMediaType . Jika metode mengembalikan nilai non-NULL , format telah berubah.

Di kelas dasar, metode ini tidak memproses sampel. Kelas turunan harus mengambil alih metode ini untuk melakukan pemrosesan. (Apa yang diperlukan ini sepenuhnya tergantung pada filter.) Kelas turunan harus memanggil metode kelas dasar, untuk memeriksa kesalahan yang dijelaskan sebelumnya.

Persyaratan

Persyaratan Nilai
Header
Amfilter.h (termasuk Streams.h)
Pustaka
Strmbase.lib (build ritel);
Strmbasd.lib (build debug)

Lihat juga

Kelas CBaseInputPin