Memproses Data
[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.]
Mengurai Data Media
Jika filter Anda mengurai data media, jangan mempercayai header atau data lain yang menjelaskan sendiri dalam konten. Misalnya, jangan mempercayai nilai ukuran yang muncul dalam potongan AVI RIFF atau paket MPEG. Contoh umum kesalahan semacam ini meliputi:
- Membaca N byte data, di mana nilai N berasal dari konten, tanpa memeriksa N terhadap ukuran buffer Anda yang sebenarnya.
- Melompat ke offset byte dalam buffer, tanpa memverifikasi bahwa offset berada dalam buffer.
Kelas kesalahan umum lainnya melibatkan tidak memvalidasi deskripsi format yang ditemukan dalam konten. Contohnya:
- Struktur BITMAPINFOHEADER dapat diikuti dengan tabel warna. Struktur BITMAPINFO didefinisikan sebagai struktur BITMAPINFOHEADER diikuti oleh array nilai RGBQUAD yang membentuk tabel warna. Ukuran array ditentukan oleh nilai biClrUsed. Jangan pernah menyalin tabel warna ke 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 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) hanyalah nilai DWORD .
Jika data format dari sumber lebih besar dari buffer yang dialokasikan, jangan memotong data sumber untuk menyalinnya ke buffer Anda. Melakukannya dapat membuat struktur yang ukuran implisitnya lebih besar dari ukuran aktualnya. Misalnya, header bitmap mungkin menentukan tabel palet yang tidak ada lagi. Sebagai gantinya, realokasi buffer atau hanya gagal koneksi.
Kesalahan Selama Streaming
Saat grafik berjalan, jika filter Anda menerima konten cacat, grafik harus menghentikan streaming. Lakukan tindakan berikut:
- Mengembalikan kode kesalahan dari Terima.
- Panggil IPin::EndOfStream pada filter hilir.
- Panggil CBaseFilter::NotifyEvent untuk memposting peristiwa EC_ERRORABORT .
Format Perubahan
Beberapa mekanisme ada untuk filter untuk mengubah format mid-stream. Masing-masing melibatkan lebih dari satu langkah, yang menciptakan potensi penerimaan palsu. Jika filter Anda mendapatkan permintaan 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.