Bagikan melalui


Memproses Data dalam DMO

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

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 Pemrosesan Di Tempat.

Mengalokasikan Buffer

Klien bertanggung jawab atas semua alokasi buffer. Setelah Anda mengatur jenis media di DMO, kueri DMO untuk setiap persyaratan buffer aliran. Ini dapat berubah tergantung pada jenis media. Untuk setiap aliran, panggil metode IMediaObject::GetInputSizeInfo atau IMediaObject::GetOutputSizeInfo . Metode ini mengembalikan informasi berikut:

  • Ukuran buffer minimum, dalam byte.
  • Persyaratan penyelarasan, jika ada. Buffer diselaraskan jika alamat mulai adalah kelipatan dari beberapa bilangan bulat yang ditentukan.
  • Jumlah maksimum data yang akan dipegang DMO untuk lookahead. Angka ini hanya berlaku untuk aliran input. Untuk beberapa jenis data (misalnya, pengodean MPEG), DMO mungkin perlu melihat ke depan dalam aliran. Nilai lookahead menunjukkan berapa banyak data input yang akan 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 metode IMediaObject::GetInputStreamInfo . Metode IMediaObject::GetOutputStreamInfo mengembalikan informasi serupa tentang aliran output.

Dalam model streaming default, klien tidak meneruskan penunjuk buffer mentah ke DMO. Sebaliknya, 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.

Catatan

Antarmuka IMediaBuffer melayani fungsi yang mirip dengan antarmuka IMediaSample di DirectShow.

 

Klien harus mengimplementasikan objek IMediaBuffer . Untuk informasi selengkapnya, lihat Menerapkan IMediaBuffer.

Memproses Data

Untuk memproses data, lakukan hal berikut:

  1. Untuk setiap aliran input, isi buffer dengan data input.
  2. Panggil IMediaObject::P rocessInput untuk mengirimkan setiap buffer.
  3. Panggil IMediaObject::P rocessOutput untuk memproses data. Metode ini mengambil array buffer, satu untuk setiap aliran output.
  4. Ulangi hingga tidak ada lagi data input.

Metode ProcessInput menerima input untuk satu aliran pada satu waktu. Biasanya metode segera kembali, dan DMO memegang 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 bendera DMO_INPUT_STATUSF_ACCEPT_DATA jika aliran dapat menerima lebih banyak input.

Metode ProcessOutput menghasilkan output untuk semua aliran output sekaligus. Aplikasi lolos dalam array 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 dalam 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, itu harus memanggil ProcessInput dengan lebih banyak data input. DMO tidak pernah memodifikasi data dalam buffer input; hanya menulis ke buffer output.

Setelah Anda mengirimkan semua data ke aliran input, panggil metode IMediaObject::D iscontinuity . DMO tidak menerima input lebih lanjut ke aliran tersebut sampai Anda memproses output yang tersisa (atau membersihkan 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 terus mengalirkan data dengan menguji bendera ini dan memanggil ProcessInput atau ProcessOutput yang sesuai. Untuk mengganggu aliran data, panggil metode IMediaObject::Flush . Metode ini menyebabkan DMO membuang buffer apa pun yang dipegangnya secara internal.

Langsung Hosting DMO

Pemrosesan di Tempat