MFT Perangkat Keras

Catatan

Topik ini berlaku untuk Windows 7 atau yang lebih baru.

 

Topik ini menjelaskan cara menulis transformasi Media Foundation (MFT) yang bertindak sebagai proksi ke encoder perangkat keras, dekoder, atau prosesor sinyal digital (DSP).

Penting

Jika codec perangkat keras menggunakan driver kelas multimedia AVStream, itu tidak memerlukan MFT kustom. Media Foundation menyediakan proksi AVStream untuk tujuan ini. Informasi dalam topik ini hanya berlaku dalam kasus khusus di mana codec perangkat keras tidak menggunakan AVStream. Untuk informasi selengkapnya, lihat Dukungan Codec Perangkat Keras di AVStream.

 

Topik ini berisi bagian berikut:

Pengantar

Codec perangkat keras apa pun yang tidak didasarkan pada AVStream harus menyediakan MFT sendiri untuk bertindak sebagai proksi kepada driver. Codec perangkat keras mungkin menggabungkan beberapa blok fungsional yang berbeda:

  • Encoder
  • Decoder
  • Konversi penskalan/format bingkai

Masing-masing fungsi ini harus dikelola oleh MFT terpisah. MFT perangkat keras tidak boleh bertindak sebagai "transcoder" multi-tujuan. Sebagai gantinya, masukkan fungsi pengodean ke dalam MFT encoder dan fungsi decoding ke dalam MFT dekoder. Jika perangkat keras menawarkan penskalan bingkai dan konversi format, tempatkan fungsi tersebut dalam prosesor video terpisah, yang terdaftar dalam kategori MFT_CATEGORY_VIDEO_PROCESSOR . Jika perangkat keras tidak mendukung penskalaan bingkai atau konversi format, Media Foundation menyediakan prosesor video perangkat lunak.

MFTs perangkat keras memiliki persyaratan umum berikut:

  • MFTs perangkat keras harus menggunakan model pemrosesan asinkron baru, seperti yang dijelaskan dalam MFTs Asinkron.
  • MFTs perangkat keras harus mendukung perubahan format dinamis, seperti yang dijelaskan dalam Perubahan Format Dinamis.

Atribut MFT Perangkat Keras

MFT perangkat keras harus menerapkan metode berikut yang terkait dengan atribut:

Ketika MFT pertama kali dibuat, MFT harus mengatur atribut berikut pada penyimpanan atribut globalnya sendiri (yaitu, penyimpanan atribut yang dikembalikan oleh GetAttributes):

Atribut Deskripsi
MF_TRANSFORM_ASYNC Harus diatur ke TRUE. Menunjukkan bahwa MFT melakukan pemrosesan asinkron.
MFT_ENUM_HARDWARE_URL_Attribute Berisi tautan simbolis untuk perangkat keras.
Pemuat topologi menggunakan keberadaan atribut ini untuk menguji apakah MFT mewakili perangkat keras.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE Harus diatur ke TRUE. Menunjukkan bahwa MFT mendukung perubahan format dinamis.

 

Urutan Jabat Tangan Perangkat Keras

Jika dua MFT mewakili perangkat fisik yang sama, mereka dapat bertukar data dalam perangkat keras—misalnya, melalui bus perangkat keras. Tidak perlu menyalin data ke dalam memori sistem dan kemudian kembali ke perangkat.

Dalam diagram berikut, MFTs berlabel "A" dan "B" mewakili blok fungsional dalam perangkat keras yang sama. Misalnya, dalam skenario transcoding, "A" mungkin mewakili dekoder perangkat keras dan "B" mungkin mewakili encoder perangkat keras. Aliran data antara "A" dan "B" terjadi dalam perangkat keras. MFT berlabel "C" adalah MFT perangkat lunak. Aliran data dari "B" ke "C" menggunakan memori sistem.

diagram memperlihatkan kotak berlabel c, dan codec perangkat keras: titik ke b dan codec, codec menunjuk ke b, dan b menunjuk ke c

Untuk membuat koneksi perangkat keras, dua MFT perangkat keras harus menggunakan saluran komunikasi privat. Koneksi ini dibuat selama negosiasi format, sebelum jenis media diatur dan sebelum panggilan pertama ke ProcessInput. Proses koneksi berfungsi sebagai berikut:

  1. Pemuat topologi memeriksa kedua MFT untuk keberadaan atribut MFT_ENUM_HARDWARE_URL_Attribute . Perhatikan bahwa ia tidak memeriksa nilai atribut ini.

  2. Jika MFT_ENUM_HARDWARE_URL_Attribute ada di kedua MFTs, pemuat topologi melakukan hal berikut:

    1. Pemuat topologi memanggil IMFTransform::GetOutputStreamAttributes pada MFT upstream (A). Metode ini mengembalikan penunjuk IMFAttributes . Biarkan penunjuk ini ditandai pUpstream.
    2. Pemuat topologi memanggil IMFTransform::GetInputStreamAttributes pada MFT hilir (B). Panggilan ini juga mengembalikan penunjuk IMFAttributes . Biarkan penunjuk ini ditandai pDownstream.
    3. Pemuat topologi menetapkan atribut MFT_CONNECTED_STREAM_ATTRIBUTE pada pDownstream dengan memanggil IMFAttributes::SetUnknown. Nilai atribut adalah penunjuk pUpstream .
    4. Pemuat topologi mengatur atribut MFT_CONNECTED_TO_HW_STREAM ke TRUE pada pDownstream dan pUpstream.
  3. Pada titik ini, MFT hilir memiliki penunjuk ke penyimpanan atribut MFT upstram, seperti yang ditunjukkan pada diagram berikut.

    diagram dengan setiap mft menunjuk ke alirannya, setiap aliran menunjuk ke penyimpanannya, dan penyimpanan input dengan garis putus-putus ke penyimpanan output

    Catatan

    Untuk kejelasan, diagram ini menunjukkan aliran dan penyimpanan atribut sebagai objek yang berbeda, tetapi itu tidak diperlukan untuk implementasi.

     

  4. MFT hilir menggunakan penunjuk IMFAttributes untuk membangun saluran komunikasi privat dengan MFT upstream. Karena saluran bersifat privat, mekanisme yang tepat ditentukan oleh implementasi. Misalnya, MFT mungkin meminta antarmuka COM privat.

Selama langkah 4, MFT hilir harus memverifikasi apakah kedua MFT berbagi perangkat fisik yang sama. Jika tidak, mereka harus kembali menggunakan memori sistem untuk transportasi data. Ini memungkinkan MFT beroperasi dengan benar dengan MFTs perangkat lunak dan perangkat keras lainnya.

Jika jabat tangan berhasil dan kedua MFTs berbagi saluran data privat, mereka tidak menggunakan model pemrosesan data standar (dijelaskan di bagian berikutnya) pada titik koneksi. Secara khusus, MFT hilir tidak mengirim peristiwa METransformNeedInput ; untuk detail selengkapnya, lihat bagian berikutnya dalam topik ini.

Pemrosesan Data

Ketika MFT perangkat keras menggunakan memori sistem untuk transportasi data, prosesnya berfungsi sebagai berikut:

  1. Untuk meminta lebih banyak input, MFT mengirimkan peristiwa METransformNeedInput .
  2. Peristiwa METransformNeedInput menyebabkan alur memanggil IMFTransform::P rocessInput.
  3. Ketika MFT memiliki data output, MFT mengirimkan peristiwa METransformHaveOutput .
  4. Peristiwa METransformHaveOutput menyebabkan alur memanggil IMFTransform::P rocessOutput.

Untuk detailnya, lihat MFTs Asinkron.

Namun, jika MFT menggunakan saluran perangkat keras, MFT tidak mengirim peristiwa ini di titik koneksi perangkat keras, karena semua transfer data terjadi secara internal dalam perangkat keras. Oleh karena itu, alur tidak memanggil ProcessInput atau ProcessOutput di titik koneksi.

Misalnya, pertimbangkan diagram pertama dalam topik ini. Mengingat konfigurasi ini, pemrosesan data akan terjadi sebagai berikut:

  1. "A" mengirimkan METransformNeedInput untuk meminta data.
  2. Alur memanggil ProcessInput pada "A".
  3. "A" dan "B" memproses data dalam perangkat keras.
  4. Ketika pemrosesan selesai, "B" mengirimkan peristiwa METransformHaveOutput .
  5. Alur memanggil ProcessOutput pada "B".

Decoder/Encoder Berpasangan

Jika dekoder dan encoder terletak pada chip perangkat keras yang sama, mungkin lebih baik menggunakannya bersama-sama saat transcoding. Artinya, memilih salah satu harus menyebabkan yang lain dipilih dalam alur transkode. Untuk memastikan bahwa codec perangkat keras yang cocok dipilih, kedua MFTs codec harus menawarkan jenis media kustom. Untuk membuat jenis media kustom:

Atribut jenis lainnya bersifat opsional. Decoder mengembalikan jenis kustom dari IMFTransform::GetOutputAvailableType, dan encoder mengembalikan jenis kustom dari metode IMFTransform::GetInputAvailableType-nya . Dalam kedua kasus, jenis kustom harus menjadi entri pertama dalam daftar (dwTypeIndex = 0).

Untuk bekerja dengan codec perangkat lunak, codec juga harus mengembalikan setidaknya satu format standar, seperti NV12 untuk video. Format standar akan muncul setelah jenis kustom (dwTypeIndex> 0). Jika kedua codec harus selalu dipasangkan dan tidak dapat beroperasi dengan codec perangkat lunak, MFTs hanya boleh mengembalikan format kustom dan tidak mengembalikan format standar apa pun.

Catatan

Jika dekoder tidak mengembalikan format standar apa pun, dekoder tidak dapat digunakan untuk pemutaran dengan Enhanced Video Renderer. Dalam hal ini, harus didaftarkan sebagai dekoder khusus transkode. Lihat Dekode Khusus Transkode.

 

Menulis MFT Kustom

Menerapkan Codec MFT

Transformasi Media Foundation