Bagikan melalui


Kelas CSourceSeeking

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

hierarki kelas csourceseeking

Kelas CSourceSeeking adalah kelas abstrak untuk menerapkan pencarian dalam filter sumber dengan satu pin output.

Kelas ini mendukung antarmuka IMediaSeeking . Ini menyediakan implementasi default untuk semua metode IMediaSeeking . Variabel anggota yang dilindungi menyimpan waktu mulai, waktu berhenti, dan laju saat ini. Secara default, satu-satunya format waktu yang didukung oleh kelas adalah TIME_FORMAT_MEDIA_TIME (100 unit nanodetik). Lihat Keterangan untuk informasi selengkapnya.

Variabel Anggota yang Dilindungi Deskripsi
m_rtDuration Durasi aliran.
m_rtStart Waktu mulai.
m_rtStop Hentikan waktu.
m_dRateSeeking Laju pemutaran.
m_dwSeekingCaps Mencari kemampuan.
m_pLock Penunjuk ke objek bagian penting untuk penguncian.
Metode yang Dilindungi Deskripsi
CSourceSeeking Metode konstruktor.
Metode Virtual Murni Deskripsi
ChangeRate Dipanggil ketika laju pemutaran berubah.
ChangeStart Dipanggil ketika posisi mulai berubah.
ChangeStop Dipanggil ketika posisi berhenti berubah.
Metode IMediaSeeking Deskripsi
IsFormatSupported Menentukan apakah format waktu yang ditentukan didukung.
QueryPreferredFormat Mengambil format waktu yang disukai objek.
SetTimeFormat Mengatur format waktu.
IsUsingTimeFormat Menentukan apakah format waktu yang ditentukan adalah format yang saat ini digunakan.
GetTimeFormat Mengambil format waktu saat ini.
GetDuration Mengambil durasi aliran.
GetStopPosition Mengambil waktu di mana pemutaran akan berhenti, relatif terhadap durasi aliran.
GetCurrentPosition Mengambil posisi saat ini, relatif terhadap total durasi aliran.
GetCapabilities Mengambil semua kemampuan pencarian aliran.
CheckCapabilities Mengkueri apakah aliran telah menentukan kemampuan pencarian.
ConvertTimeFormat Mengonversi dari satu kali format ke format lainnya.
SetPositions Mengatur posisi saat ini dan posisi berhenti.
GetPositions Mengambil posisi saat ini dan posisi berhenti.
GetAvailable Mengambil rentang waktu di mana pencarian efisien.
SetRate Mengatur laju pemutaran.
GetRate Mengambil laju pemutaran.
GetPreroll Mengambil waktu pra-pendaftaran.

Keterangan

Setiap kali posisi mulai, posisi berhenti, atau laju pemutaran berubah, objek CSourceSeeking memanggil metode virtual murni yang sesuai:

Kelas turunan harus menerapkan metode ini. Setelah operasi pencarian, filter harus melakukan hal berikut:

  1. Panggil metode IPin::BeginFlush pada pin input hilir.
  2. Hentikan utas pekerja yang mengirimkan data.
  3. Panggil metode IPin::EndFlush pada pin input.
  4. Mulai ulang utas pekerja.
  5. Panggil metode IPin::NewSegment pada pin input.
  6. Atur properti penghentian pada sampel pertama. Panggil metode IMediaSample::SetDiscontinuity .

Panggilan ke BeginFlush membebaskan utas pekerja, jika utas diblokir menunggu untuk mengirimkan sampel.

Di langkah 2, pastikan bahwa utas telah berhenti mengirim data. Tergantung pada implementasinya, Anda mungkin perlu menunggu utas keluar, atau agar utas memberi sinyal respons semacam itu. Jika filter Anda menggunakan kelas CSourceStream , metode CSourceStream::Stop memblokir hingga alur pekerja membalas.

Idealnya, segmen baru (langkah 5) harus dikirimkan dari utas pekerja. Ini juga dapat dilakukan oleh objek CSourceSeeking , selama filter menserialisasikannya dengan sampel.

Contoh berikut menunjukkan kemungkinan implementasi. Ini mengasumsikan bahwa pin output filter sumber berasal dari CSourceSeeking dan CSourceStream. Contoh ini mendefinisikan metode pembantu, UpdateFromSeek, yang melakukan langkah 1 4. Metode CSourceStream::OnThreadStartPlay ditimpa untuk mengirim segmen baru, dan untuk mengatur bendera yang menunjukkan penghentian. Utas pekerja mengambil bendera ini dan memanggil metode IMediaSample::SetDiscontinuity :

void CMyStream::UpdateFromSeek()
{
    if (ThreadExists()) 
    {
        DeliverBeginFlush();
        Stop();
        DeliverEndFlush();
        Run();
    }
}

HRESULT CMyStream::OnThreadStartPlay()
{
    m_bDiscontinuity = TRUE;
    return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}

Mendukung Format Waktu Tambahan

Secara default, kelas ini hanya mendukung pencarian dalam satuan waktu referensi (TIME_FORMAT_MEDIA_TIME). Untuk mendukung format waktu tambahan, ganti metode IMediaSeeking yang menangani format waktu:

Selain itu, ambil alih metode IMediaSeeking yang tersisa untuk melakukan konversi yang diperlukan antar format waktu. Setelah metode SetTimeFormat dipanggil, semua metode IMediaSeeking harus memperlakukan parameter waktu masuk dan keluar sebagai dalam format waktu baru. Misalnya, jika variabel m_rtDuration mewakili durasi dalam satuan waktu referensi, tetapi format waktu saat ini adalah bingkai, maka metode GetDuration harus mengembalikan nilai m_rtDuration dikonversi ke bingkai. Contohnya:

STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
    HRESULT hr = CSourceSeeking::GetDuration(pDuration);
    if (SUCCEEDED(hr))
    {
        if (m_TimeFormat == TIME_FORMAT_FRAME)
        {
            // Convert from reference time to frames.
            *pDuration = TimeToFrame(*pDuration);  // Private method.
        }
    }
    return hr
} 

Selain itu, pastikan untuk memeriksa bendera AM_SEEKING_ReturnTime di metode IMediaSeeking::SetPositions . Jika bendera ini ada, konversikan nilai posisi menjadi waktu referensi saat Anda mengembalikannya ke pemanggil.

Persyaratan

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

Lihat juga

Mendukung Pencarian di Filter Sumber