Menangani Perubahan Aliran

Topik ini menjelaskan bagaimana transformasi Media Foundation (MFT) harus menangani perubahan format selama streaming.

Penting

Topik ini tidak berlaku untuk encoder. Encoder tidak boleh menyebarluaskan perubahan format seperti yang dijelaskan dalam topik ini. Encoder hanya boleh menerima jenis input yang cocok dengan jenis output yang saat ini dikonfigurasi.

 

Gambaran Umum Perubahan Format

Umumnya, ada dua alasan format dapat berubah selama streaming.

  • Klien mungkin beralih ke aliran dengan format baru. Misalnya, dalam televisi digital, ini dapat terjadi karena perubahan saluran.
  • Dalam beberapa format video, seperti H.264, bitstream dapat memberi sinyal perubahan format. Perubahan tersebut mungkin mencakup perubahan dominasi bidang, resolusi video, atau rasio aspek piksel.

Jika jenis pengodean berubah, klien mungkin perlu menghapus MFT dari alur dan menggantinya dengan MFT lain. (Misalnya, klien mungkin perlu bertukar dalam dekoder baru.) Topik ini tidak mencakup situasi tersebut. Topik ini hanya mencakup kasus di mana MFT saat ini dapat menangani format baru.

Jika format berubah, MFT mungkin memerlukan jenis input baru, jenis output baru, atau keduanya.

  • Perubahan pada jenis input dimulai oleh klien. MFT tidak pernah mengubah jenis inputnya sendiri.
  • Perubahan pada jenis output dimulai oleh MFT. MFT memberi sinyal bahwa MFT memerlukan jenis output baru, dan klien menegosiasikan jenis output baru dengan MFT.

Dengan demikian, tiga kasus yang berbeda dimungkinkan:

  • Klien menetapkan jenis input baru. MFT menggunakan format baru, tanpa perubahan pada jenis outputnya.
  • Klien menetapkan jenis input baru, dan ini memicu perubahan jenis output.
  • Jenis input tidak berubah, tetapi MFT mendeteksi perubahan format dalam bitstream, yang memerlukan jenis output baru.

Menerapkan Perubahan Format

Sisa topik ini menjelaskan bagaimana klien harus memproses perubahan format, dan cara menerapkan perubahan format dalam MFT.

Jenis Output

Setiap MFT dapat memulai perubahan pada jenis outputnya, sebagai berikut:

  1. Klien memanggil IMFTransform::P rocessOutput. MFT merespons sebagai berikut:
    1. MFT tidak menghasilkan sampel output dalam ProcessOutput.
    2. MFT menetapkan bendera MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE di anggota dwStatus dari struktur MFT_OUTPUT_DATA_BUFFER .
    3. Metode ProcessOutput mengembalikan kode kesalahan MF_E_TRANSFORM_STREAM_CHANGE.
  2. Klien memanggil IMFTransform::GetOutputAvailableType. Metode ini mengembalikan serangkaian jenis output yang diperbarui.
  3. Klien memanggil SetOutputType untuk mengatur jenis output baru.
  4. Klien melanjutkan panggilan ProcessInput/ProcessOutput.

Jenis input

Perubahan pada jenis input dimulai oleh klien, tidak pernah oleh MFT. Jika jenis input berubah, jenis input mungkin memicu perubahan pada jenis output.

Urutan peristiwa yang tepat tergantung pada nilai atribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE .

Nilai Deskripsi
FALSE Sebelum klien menetapkan jenis input baru, klien harus menguras MFT.
TRUE Klien dapat mengatur jenis input baru tanpa menguras MFT.

 

MFT mengekspos atribut ini melalui metode IMFTransform::GetAttributes-nya . Nilai default atribut ini adalah FALSE; jika MFT tidak mengatur atribut , perlakukan nilai sebagai FALSE.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE is FALSE

  1. Klien mengirim pesan MFT_MESSAGE_COMMAND_DRAIN .
  2. Klien menguras MFT dengan memanggil IMFTransform::P rocessOutput hingga ProcessOutput mengembalikan MF_E_TRANSFORM_NEED_MORE_INPUT.
  3. Klien memanggil IMFTransform::SetInputType untuk mengatur jenis input baru.
  4. MFT memvalidasi jenis input. Jika jenisnya tidak valid, SetInputType mengembalikan MF_E_INVALIDMEDIATYPE atau kode kesalahan lainnya. Jika tidak, SetInputType mengembalikan S_OK.
  5. Dengan asumsi jenis input valid, MFT mengevaluasi apakah jenis output juga berubah. Jika tidak, streaming berlanjut, dan tidak diperlukan tindakan lebih lanjut.
  6. Jika jenis output berubah:
    1. MFT membatalkan jenis media outputnya saat ini, dan memperbarui daftar jenis media output yang tersedia.
    2. Panggilan berikutnya ke ProcessOutput mengembalikan MF_E_TRANSFORM_STREAM_CHANGE, seperti yang dijelaskan di bagian sebelumnya.
    3. Klien memanggil IMFTransform::GetOutputAvailableType untuk mendapatkan daftar jenis output yang diperbarui.
    4. Klien memanggil SetOutputType.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE is TRUE

  1. Klien memanggil IMFTransform::SetInputType untuk mengatur jenis input baru.
  2. MFT memvalidasi jenis input. Jika jenisnya tidak valid, SetInputType mengembalikan MF_E_INVALIDMEDIATYPE atau kode kesalahan lainnya. Jika tidak, SetInputType mengembalikan S_OK.
  3. Dengan asumsi jenis input valid, MFT mengevaluasi apakah jenis output juga berubah. Jika tidak, streaming berlanjut, dan tidak diperlukan tindakan lebih lanjut.
  4. Sebelum jenis output berubah, MFT harus memproses sampel input yang di-cache, sebagai berikut:
    1. MFT tidak membatalkan tipe outputnya saat ini.
    2. MFT menghasilkan output sebanyak mungkin dari sampel input yang di-cache.
    3. Ini bersifat opsional apakah MFT menerima sampel input baru saat memproses sampel yang di-cache. Jika demikian, sampel input baru akan menggunakan format input baru, sehingga MFT harus melacak titik ketika format berubah.
  5. Setelah MFT memproses semua sampel yang diterimanya sebelum jenis input berubah, IMFTransform::P rocessOutput mengembalikan MF_E_TRANSFORM_STREAM_CHANGE.
  6. MFT membatalkan jenis outputnya saat ini, dan memperbarui daftar jenis media output yang tersedia.
  7. Klien menegosiasikan jenis output baru, seperti yang dijelaskan sebelumnya.

MFTs asinkron harus mengembalikan nilai TRUE untuk atribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE . Saat menggunakan MFT asinkron, klien dapat berasumsi bahwa atribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE diatur ke TRUE.

Ketika MFT_SUPPORT_DYNAMIC_FORMAT_CHANGETRUE, perbedaan utamanya adalah bahwa klien tidak diperlukan untuk menguras MFT sebelum mengatur jenis input baru. Akibatnya, jenis input mungkin berubah saat MFT memegang sampel input. Penting bahwa MFT tidak hanya menghilangkan sampel ini. Selain itu, jenis output tidak dapat berubah sampai MFT memproses semua data cache-nya.

Paragraf sebelumnya berlaku terutama untuk dekoder video, yang dapat menerima bingkai antarkode dari urutan temporal, dan dengan demikian perlu menyimpannya dalam cache. Jika MFT tidak menyimpan sampel input, pengurasan pada dasarnya adalah no-op. Dalam hal ini, MFT dapat mengatur MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE ke FALSE (atau membiarkan atribut tidak diatur).

Selain itu, perhatikan bahwa setiap MFT diharapkan untuk menangani perubahan format dengan benar setelah dikosongkan. Atribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE menunjukkan apakah MFT mendukung perubahan format tanpa menguras.

Perubahan dalam Mode Interlace

Perubahan dalam mode interlacing video adalah kasus khusus, karena tidak membatalkan tipe media saat ini. Sebagai gantinya, mode interlace ditentukan untuk setiap bingkai video dengan mengatur atribut pada sampel media. MFT video harus memeriksa setiap sampel input untuk keberadaan bendera ini.

Mode interlace dapat berubah saat dominasi bidang beralih dari bidang atas ke bidang bawah, atau saat video beralih antara gambar progresif dan terjajar.

Untuk informasi selengkapnya, lihat Bendera Interlace pada Sampel.

Menulis MFT Kustom