Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
[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.]
Penguraian Data Media
Jika filter Anda menguraikan data media, jangan percayai header atau data lain yang menjelaskan sendiri dalam konten. Misalnya, jangan mempercayai nilai ukuran yang muncul dalam gugus AVI RIFF atau paket MPEG. Contoh umum kesalahan semacam ini meliputi:
- Membaca N data, yang mana nilai N berasal dari konten, tanpa memeriksa kecocokan N dengan ukuran buffer Anda yang sebenarnya.
- Melompat ke offset byte dalam buffer, tanpa memverifikasi bahwa offset terletak di dalam buffer.
Kelas kesalahan umum lainnya melibatkan tidak memvalidasi deskripsi format yang ditemukan dalam konten. Misalnya:
- Struktur BITMAPINFOHEADER dapat diikuti oleh tabel warna. Struktur BITMAPINFO didefinisikan sebagai struktur BITMAPINFOHEADER diikuti dengan array nilai RGBQUAD yang membentuk tabel warna. Ukuran array ditentukan oleh nilai biClrUsed. Jangan pernah menyalin tabel warna ke dalam BITMAPINFO tanpa terlebih dahulu memeriksa ukuran buffer yang dialokasikan untuk struktur BITMAPINFO.
- Struktur WAVEFORMATEX mungkin memiliki informasi format tambahan yang ditambahkan ke struktur. Anggota cbSize menentukan ukuran dari informasi tambahan.
Selama koneksi pin, filter harus memverifikasi bahwa semua struktur format terbentuk dengan baik dan berisi nilai yang wajar. Jika tidak, tolak koneksi. Dalam kode yang memvalidasi struktur format, berhati-hatilah dengan luapan aritmatika. Misalnya, dalam BITMAPINFOHEADER, lebar dan tinggi adalah nilai panjang 32-bit tetapi ukuran gambar (yang merupakan fungsi dari produk keduanya) hanya merupakan nilai DWORD.
Jika data format dari sumber lebih besar dari buffer yang dialokasikan, jangan memotong data sumber untuk menyalinnya ke buffer Anda. Melakukannya dapat menciptakan struktur yang ukuran implisitnya lebih besar dari ukuran sebenarnya. Misalnya, header bitmap mungkin menentukan tabel palet yang tidak lagi ada. Sebagai gantinya, lakukan realokasi buffer atau langsung putuskan koneksi.
Kesalahan Selama Streaming
Saat grafik berjalan, jika filter Anda menerima konten cacat, filter tersebut harus menghentikan streaming. Lakukan hal berikut:
- Kembalikan kode kesalahan dari Terima.
- Panggil IPin::EndOfStream pada filter hilir.
- Panggil CBaseFilter::NotifyEvent untuk memposting peristiwa EC_ERRORABORT.
Perubahan Format
Beberapa mekanisme ada bagi filter untuk mengubah format di tengah proses. Masing-masing melibatkan lebih dari satu langkah, yang menciptakan potensi penerimaan palsu. Jika filter Anda mendapatkan permintaan untuk perubahan format dinamis, filter harus menolak permintaan, atau menghormati format baru saat tiba. Demikian pula, jangan pernah beralih format kecuali filter lain setuju. Untuk informasi selengkapnya, lihat Perubahan Format Dinamis.