Tentang MFTs

Transformasi Media Foundation (MFTs) menyediakan model generik untuk memproses data media. MFT digunakan untuk dekoder, encoder, dan prosesor sinyal digital (DSP). Singkatnya, apa pun yang berada di alur media antara sumber media dan sink media adalah MFT.

Untuk sebagian besar aplikasi, detail pemrosesan data MFT disembunyikan oleh lapisan arsitektur Media Foundation yang lebih tinggi. Banyak aplikasi Media Foundation tidak akan pernah melakukan panggilan langsung ke MFT. Namun, tentu saja dimungkinkan untuk menghosting MFT langsung di aplikasi Anda.

MFTs adalah evolusi model transformasi yang pertama kali diperkenalkan dengan DirectX Media Objects (DMO). Bahkan, relatif mudah untuk membuat transformasi yang mendukung kedua model. Dibandingkan dengan DMO, perilaku MFTs yang diperlukan lebih jelas ditentukan, yang membuatnya lebih mudah untuk menulis implementasi yang benar. Selain itu, MFTs dapat mendukung pemrosesan video yang dipercepat perangkat keras.

Topik ini memberikan gambaran singkat tentang model pemrosesan MFT, berfokus pada desain keseluruhan daripada panggilan metode tertentu. Untuk deskripsi langkah demi langkah yang lebih rinci, lihat Model Pemrosesan MFT Dasar.

Aliran

MFT memiliki aliran input dan aliran output. Aliran input menerima data, dan aliran output menghasilkan data. Misalnya, dekoder memiliki satu aliran input, yang menerima data yang dikodekan, dan satu aliran output, yang menghasilkan data yang didekodekan.

Aliran pada MFT tidak direpresentasikan sebagai objek COM yang berbeda. Sebaliknya, setiap aliran memiliki pengidentifikasi aliran yang ditunjuk, dan metode di antarmuka IMFTransform mengambil pengidentifikasi aliran sebagai parameter input.

Beberapa MFT memiliki jumlah aliran tetap. Misalnya, dekoder dan encoder biasanya memiliki tepat satu input dan satu output. MFT lain memiliki jumlah aliran yang dinamis. Jika MFT mendukung aliran dinamis, klien dapat menambahkan aliran input baru. Klien tidak dapat menambahkan aliran output, tetapi MFT mungkin menambahkan atau menghapus aliran output selama pemrosesan. Misalnya, multiplexers biasanya memungkinkan klien untuk menambahkan aliran input dan memiliki satu output untuk aliran multipleks. Demultiplexers adalah terbalik, dengan satu input tetapi sejumlah aliran output dinamis, tergantung pada konten aliran input. Ilustrasi berikut menunjukkan perbedaan antara multiplexer dan demultiplexer.

diagram memperlihatkan encoder/decoder (1 input, 1 output), multiplexer (2 input, 1 output), dan demultiplexer (1 input, 2 output)

Jenis Media

Ketika MFT pertama kali dibuat, tidak ada aliran yang memiliki format yang ditetapkan. Sebelum MFT dapat memproses data, klien harus mengatur format untuk aliran. Misalnya, dengan dekoder, format input adalah format kompresi yang digunakan dalam file sumber asli, dan format output adalah format yang tidak dikompresi, seperti audio PCM atau video RGB. Format aliran dijelaskan menggunakan Jenis Media.

Tergantung pada status internal MFT, MFT mungkin menyediakan daftar kemungkinan jenis media untuk setiap aliran. Anda bisa menggunakan daftar ini sebagai petunjuk ketika Anda mengatur tipe media. Mengatur jenis media pada satu aliran dapat mengubah daftar jenis yang mungkin untuk aliran lain. Misalnya, dekoder biasanya tidak dapat menyediakan jenis output apa pun sampai klien mengatur jenis input. Jenis input berisi informasi yang diperlukan dekoder untuk mengembalikan daftar kemungkinan jenis output.

Untuk mengatur jenis media pada aliran, panggil IMFTransform::SetInputType atau IMFTransform::SetOutputType. Untuk mendapatkan daftar kemungkinan jenis media untuk aliran, panggil IMFTransform::GetInputAvailableType atau IMFTransform::GetOutputAvailableType.

Memproses Data

Setelah klien mengatur jenis media pada aliran, MFT siap memproses data. Untuk melahirkan ini, klien bergantian antara menyediakan data input ke MFT dan mendapatkan data output dari MFT:

Metode ProcessInput mengambil pointer ke sampel media yang dialokasikan oleh klien. Sampel media berisi satu atau beberapa buffer, dan setiap buffer berisi data input untuk diproses oleh MFT.

Metode ProcessOutput mendukung dua model alokasi yang berbeda: Baik MFT mengalokasikan buffer output, atau klien mengalokasikan buffer output. Beberapa MFTs mendukung kedua model alokasi, tetapi tidak diperlukan bagi MFT untuk mendukung keduanya. Misalnya, MFT mungkin mengharuskan klien untuk mengalokasikan buffer output. Metode IMFTransform::GetOutputStreamInfo mengembalikan informasi tentang aliran output, termasuk model alokasi mana yang didukung MFT.

MFTs dirancang untuk buffer sesedikit mungkin data, untuk meminimalkan latensi dalam alur. Oleh karena itu, pada waktu tertentu, MFT dapat memberi sinyal salah satu kondisi berikut:

  • MFT memerlukan lebih banyak data input. Dalam status ini, MFT tidak dapat menghasilkan output sampai klien memanggil ProcessInput setidaknya sekali.
  • MFT tidak akan menerima input lagi sampai klien memanggil ProcessOutput setidaknya sekali.

Misalnya, Anda menggunakan dekoder video untuk mendekode aliran video yang berisi campuran bingkai kunci dan bingkai delta. Awalnya, MFT memerlukan beberapa input sebelum dapat mendekode bingkai apa pun. Klien memanggil ProcessInput untuk mengirimkan bingkai pertama. Misalkan bingkai pertama adalah bingkai delta (ditunjukkan dalam diagram berikut sebagai 'P' untuk bingkai yang diprediksi). Decoder memegang bingkai ini, tetapi tidak dapat menghasilkan output apa pun sampai mendapatkan bingkai kunci berikutnya.

diagram memperlihatkan mft yang membutuhkan input, menunjuk ke bingkai yang diprediksi

Klien terus memanggil ProcessInput dan akhirnya mencapai bingkai kunci berikutnya (ditunjukkan dalam diagram berikutnya sebagai 'I' untuk bingkai berkode intra). Sekarang dekoder memiliki cukup bingkai untuk mulai mendekode. Pada titik ini ia berhenti menerima input, dan klien harus memanggil ProcessOutput untuk mendapatkan bingkai yang didekodekan.

diagram memperlihatkan mft yang tidak menerima input, menunjuk ke satu bingkai berkode intra dan tiga bingkai yang diprediksi

Pendekatan paling sederhana untuk klien hanyalah alternatif panggilan ke ProcessInput dan ProcessOutput. Algoritma yang lebih canggih dijelaskan dalam topik Model Pemrosesan MFT Dasar.

Transformasi Media Foundation