Memproses Data dalam DMO
[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.]
Bagian ini menjelaskan cara memproses aliran data menggunakan DMO. Langkah-langkah yang tercantum di bagian ini adalah perilaku default; semua DMO harus mendukung metode yang dijelaskan di sini. Metode ini menggunakan buffer terpisah untuk input dan output. Beberapa DMO juga mendukung pemrosesan di tempat, menggunakan satu buffer. Untuk informasi selengkapnya tentang pemrosesan di tempat, lihat In-Place Pemrosesan.
Mengalokasikan Buffer
Klien bertanggung jawab atas semua alokasi buffer. Setelah Anda mengatur jenis media pada DMO, lakukan permintaan kepada DMO untuk mengetahui persyaratan buffer setiap aliran. Ini dapat berubah tergantung pada jenis media. Untuk setiap aliran, panggil metode IMediaObject::GetInputSizeInfo atau metode IMediaObject::GetOutputSizeInfo . Metode ini mengembalikan informasi berikut:
- Ukuran buffer minimum, dalam byte.
- Persyaratan perataan, jika ada. Buffer terselaraskan jika alamat mulai adalah kelipatan dari bilangan bulat tertentu.
- Jumlah data maksimum yang akan ditahan oleh DMO untuk lookahead. Angka ini hanya berlaku untuk aliran input. Untuk beberapa jenis data (misalnya, pengodean MPEG), DMO mungkin perlu melihat ke depan dalam rangkaian data. Nilai lookahead menunjukkan berapa banyak data input yang diperlukan DMO sebelum dapat menghasilkan output.
Klien harus mengalokasikan buffer yang sesuai dengan persyaratan ini. Selain itu, DMO mungkin memiliki persyaratan tentang cara klien mengemas data input. Misalnya, DMO mungkin mengharuskan setiap buffer berisi tepat satu sampel (atau bingkai video). Untuk menentukan persyaratan ini, panggil metodeIMediaObject::GetInputStreamInfo. Metode IMediaObject::GetOutputStreamInfo mengembalikan informasi serupa tentang aliran output.
Dalam model streaming default, klien tidak meneruskan penunjuk buffer mentah ke DMO. Sebagai gantinya, ia menggunakan objek COM ringan yang mengekspos antarmuka IMediaBuffer. Antarmuka IMediaBuffer bertindak sebagai pembungkus COM untuk blok memori. Karena merupakan objek COM, ini mendukung penghitungan referensi, yang membantu memastikan bahwa buffer tidak dirilis saat masih digunakan.
Nota
Antarmuka IMediaBuffer menyajikan fungsi yang mirip dengan antarmuka IMediaSample di DirectShow.
Klien harus menerapkan objek IMediaBuffer. Untuk informasi selengkapnya, lihat Menerapkan IMediaBuffer.
Pemrosesan Data
Untuk memproses data, lakukan hal berikut:
- Untuk setiap aliran input, isi buffer dengan data input.
- Panggil IMediaObject::P rocessInput untuk mengirimkan setiap buffer.
- Panggil IMediaObject::P rocessOutput untuk memproses data. Metode ini menerima array buffer, masing-masing untuk setiap aliran keluaran.
- Ulangi hingga tidak ada lagi data input.
Metode ProcessInput menerima input untuk satu aliran pada satu waktu. Biasanya metode tersebut langsung kembali, dan DMO menyimpan jumlah referensi pada objek IMediaBuffer. Ini merilis objek setelah memproses semua data dalam buffer, atau ketika aplikasi menghapus DMO. Jangan gunakan kembali buffer sampai DMO telah merilisnya. Untuk menentukan apakah aliran input dapat menerima lebih banyak data, panggil metode IMediaObject::GetInputStatus. Metode ini mengembalikan nilai flag DMO_INPUT_STATUSF_ACCEPT_DATA jika aliran dapat menerima lebih banyak input.
Metode ProcessOutput menghasilkan output untuk semua aliran output sekaligus. Aplikasi memasukkan array dari struktur DMO_OUTPUT_DATA_BUFFER, satu untuk setiap aliran output. Setiap struktur dalam array memiliki penunjuk ke objek IMediaBuffer. DMO menulis data output sebanyak mungkin ke buffer. Ini juga menetapkan berbagai bendera untuk melaporkan status operasi. Bendera DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE menunjukkan DMO dapat menghasilkan lebih banyak output dari input yang ada. Dalam hal ini, klien dapat memanggil ProcessOutput lagi. Jika tidak, harus memanggil ProcessInput dengan data input yang lebih banyak. DMO tidak pernah memodifikasi data dalam buffer input; ini hanya menulis ke buffer output.
Setelah Anda mengirimkan semua data ke aliran input, panggil metode IMediaObject::Discontinuity. DMO tidak menerima input lebih lanjut ke aliran tersebut sampai Anda memproses output yang tersisa (atau menghapus DMO).
Kapan saja setelah streaming dimulai, DMO dapat menerima input atau menghasilkan output, atau keduanya. Oleh karena itu, GetInputStatus mengembalikan DMO_INPUT_STATUSF_ACCEPT_DATA, atau ProcessOutput mengembalikan DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE. Aplikasi ini mempertahankan aliran data dengan menguji flag ini dan memanggil ProcessInput atau ProcessOutput sesuai. Untuk mengganggu aliran data, panggil metode IMediaObject::Flush. Metode ini menyebabkan DMO membuang buffer apa pun yang dipegangnya secara internal.
Topik terkait