Bagikan melalui


Tipe Media 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.]

Jenis media menjelaskan format yang terkait dengan aliran data media. Artikel ini menjelaskan cara DMO menangani jenis media. Ini terutama ditujukan untuk pengembang yang menulis DMO kustom mereka sendiri.

Jenis media didefinisikan menggunakan struktur DMO_MEDIA_TYPE . Struktur ini mencakup informasi berikut:

  • Jenis utamanya adalah pengidentifikasi unik global (GUID) yang mendefinisikan kategori luas, seperti audio atau video.
  • Subjenis adalah GUID yang menentukan aspek jenis yang lebih spesifik. Misalnya, dalam video, subtipe mencakup RGB 16-bit, RGB 24-bit, UYVY, video yang dikodekan DV, dan sebagainya.
  • Blok format adalah struktur sekunder yang sepenuhnya menentukan format. Tata letak blok format tergantung pada jenis data. Misalnya, audio PCM menggunakan struktur WAVEFORMATEX . Video menggunakan berbagai struktur lain, termasuk VIDEOINFOHEADER dan VIDEOINFOHEADER2. Tata letak blok format diidentifikasi oleh jenis format GUID. Misalnya, FORMAT_WaveFormatEx menentukan struktur WAVEFORMATEX .

Ketika DMO pertama kali dibuat, aliran tidak memiliki jenis media. Sebelum DMO dapat memproses data apa pun, klien harus mengatur jenis media untuk setiap aliran. Proses ini dijelaskan dari perspektif klien dalam Mengatur Jenis Media pada DMO.

Jenis Media di Registri

DMO dapat menambahkan daftar jenis media yang didukungnya ke registri, dengan memanggil fungsi DMORegister . Aplikasi dapat menggunakan informasi ini untuk mencari DMO yang cocok dengan format tertentu. Informasi dalam registri tidak dimaksudkan untuk menjadi komprehensif. Biasanya, Anda hanya akan menyertakan jenis utama yang didukung DMO. Entri registri memiliki kunci terpisah untuk jenis input dan output, tetapi tidak membedakan di antara aliran individual.

Fungsi DMORegister menggunakan struktur DMO_PARTIAL_MEDIATYPE untuk menjelaskan jenis media. Struktur ini berisi subset informasi yang ditemukan dalam struktur DMO_MEDIA_TYPE —yaitu jenis utama dan subjenis. Ini tidak termasuk blok format, karena blok format biasanya berisi informasi yang terlalu terperinci untuk disertakan dalam registri, seperti tinggi dan lebar gambar video.

Tipe Media Pilihan

Setelah aplikasi membuat DMO, aplikasi dapat meminta DMO untuk jenis media yang didukungnya. Untuk setiap aliran, DMO membuat daftar jenis media (mungkin kosong), diberi peringkat dalam urutan preferensi. Metode IMediaObject::GetInputType dan IMediaObject::GetOutputType menghitung jenis pilihan. Jenis streaming pilihan dapat berubah secara dinamis ketika aplikasi mengatur jenis media pada aliran lain. Misalnya, daftar jenis output pilihan mungkin berubah setelah jenis input diatur, atau sebaliknya. Namun, DMO tidak diperlukan untuk memperbarui jenis pilihannya secara dinamis. Aplikasi tidak dapat mengasumsikan bahwa setiap jenis yang diterimanya valid. Untuk alasan ini, metode IMediaObject::SetInputType dan IMediaObject::SetOutputType mendukung bendera untuk menguji jenis tertentu.

Metode GetInputType dan GetOutputType mengembalikan struktur DMO_MEDIA_TYPE . DMO dapat membiarkan beberapa informasi dalam struktur ini kosong, untuk menunjukkan rentang jenis. Jenis atau subjenis utama dapat GUID_NULL, dan blok format dapat kosong (nol byte). Jika blok format kosong, jenis format harus GUID_NULL.

Setelah aplikasi menetapkan semua jenis input DMO, DMO umumnya harus mengembalikan setidaknya satu jenis lengkap untuk setiap aliran output. Jenis output lengkap memfasilitasi pengujian, dan aplikasi dapat menggunakannya sebagai default yang wajar. Aplikasi pengujian DMO bergantung pada perilaku ini. (Lihat Menggunakan Aplikasi DMOTest.)

Mengatur Tipe Media

Aplikasi menggunakan metode SetInputType dan SetOutputType untuk menguji, mengatur, atau menghapus jenis pada aliran tertentu. Aplikasi harus sepenuhnya menentukan jenisnya. DMO memverifikasi apakah dapat menerima jenis yang diusulkan. Jawabannya mungkin bergantung pada jenis mana yang telah diatur pada aliran lain. Bendera DMO_SET_TYPEF_CLEAR menghapus jenis aliran, sehingga aplikasi dapat "mundur" dan mencoba kombinasi lain.

Contoh Skenario

Contoh berikut menjelaskan beberapa skenario umum, untuk mengilustrasikan poin yang dibuat di bagian sebelumnya.

  • Dekode Video. Dalam dekoder video umum, jenis input sebagian menentukan jenis output. Misalnya, biasanya kedua aliran harus memiliki kecepatan bingkai dan dimensi gambar yang sama. Salah satu opsinya adalah tidak menentukan jenis output pilihan hingga jenis input diatur. Opsi lain adalah menghitung sekumpulan jenis yang tidak lengkap, menghilangkan blok format. Gunakan subjenis untuk menunjukkan jenis yang tidak dikompresi yang didukung, seperti RGB 16-bit, RGB 24-bit, dan sebagainya. Selain itu, dekode video umumnya tidak mendukung pengaturan jenis output sebelum jenis input. Skenario yang biasa adalah mendekode dari format input yang diketahui, sehingga batasan ini masuk akal.
  • Dekode Audio. Dekoder audio mungkin mendukung serangkaian format output yang terbatas dan tetap. Dalam hal ini, mungkin dapat membuat daftar format output pilihan sebelum format input diketahui.
  • Kompresor. Dalam kebanyakan kasus, kompresor video tidak dapat sepenuhnya menentukan format output pilihannya sampai aplikasi mengatur format input, dan sebaliknya. Sebaliknya, DMO harus mengembalikan jenis yang tidak lengkap tanpa blok format. Untuk kompresi audio dan video, aplikasi biasanya perlu mengatur berbagai parameter output, seperti laju bit. Namun, setelah jenis input diatur, kompresor harus mengembalikan setidaknya satu jenis output lengkap, karena alasan yang disebutkan sebelumnya.

Menulis DMO