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.]
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:
- Posisi mulai: CSourceSeeking::ChangeStart
- Posisi berhenti: CSourceSeeking::ChangeStop
- Laju pemutaran: CSourceSeeking::ChangeRate
Kelas turunan harus menerapkan metode ini. Setelah operasi pencarian, filter harus melakukan hal berikut:
- Panggil metode IPin::BeginFlush pada pin input hilir.
- Hentikan utas pekerja yang mengirimkan data.
- Panggil metode IPin::EndFlush pada pin input.
- Mulai ulang utas pekerja.
- Panggil metode IPin::NewSegment pada pin input.
- 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:
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::SetTimeFormat
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 |
|
Pustaka |
|