Video Interlacing

Topik ini menjelaskan bagaimana sumber media dan dekode harus menangani konten video yang saling terkait.

Untuk mendekode dan merender video yang saling terkait dengan benar, informasi berikut diperlukan:

  • Progresif atau interlaced. Aliran video dapat berisi bingkai progresif, bingkai yang saling terkait, atau campuran keduanya.

  • Dominasi lapangan. Dominasi bidang menjelaskan bidang mana yang muncul terlebih dahulu, bidang atas atau bidang bawah.

  • Ulangi bidang pertama. Bendera ini digunakan dalam tarik-turun 3:2, ketika bingkai progresif tetapi alirannya saling terkait. Dalam konteks ini, bidang pertama dapat berupa bidang atas atau bawah.

  • Bidang yang diselingi atau bidang tunggal. Sampel dapat menampung satu bidang, atau dua bidang yang diselingi. Jika sampel berisi satu bidang, tinggi sampel adalah setengah dari tinggi bingkai, karena sampel hanya berisi setengah dari baris pemindaian untuk bingkai. Bidang yang diselingi direkomendasikan kecuali karakteristik konten sumber menentukan sebaliknya.

Salah satu karakteristik ini dapat berubah dari satu sampel ke sampel berikutnya. Namun, komponen video perlu mengetahui sesuatu tentang konten keseluruhan sebelum streaming dimulai. Misalnya, jika video diselingi, perender video (EVR) yang disempurnakan perlu memesan memori video untuk deinterlacing. Jika video sepenuhnya bingkai progresif, di sisi lain, EVR dapat mengoptimalkan alur penyajian. Menambahkan langkah deinterlacing ke alur akan meningkatkan latensi penyajian.

Informasi tentang interlacing disimpan di dua tempat:

  • Informasi umum tentang hubungan dalam aliran ditempatkan dalam jenis media. Untuk informasi selengkapnya tentang jenis media, lihat Jenis Media.

  • Informasi yang dapat berubah dengan setiap sampel ditempatkan pada sampel sebagai atribut. Untuk informasi selengkapnya tentang sampel, lihat Sampel Media.

Informasi Interlace dalam Jenis Media

Atribut MF_MT_INTERLACE_MODE pada jenis media menjelaskan bagaimana aliran secara keseluruhan diselingi. Nilai atribut ini adalah anggota enumerasi MFVideoInterlaceMode . Jenis media video harus selalu memiliki atribut ini.

  • Jika aliran hanya berisi bingkai progresif, tanpa bingkai yang saling terkait, gunakan MFVideoInterlace_Progressive.
  • Jika aliran hanya berisi bingkai yang saling terkait, dan setiap sampel berisi dua bidang yang saling terkait, gunakan MFVideoInterlace_FieldInterleavedUpperFirst atau MFVideoInterlace_FieldInterleavedLowerFirst.
  • Jika aliran hanya berisi bingkai yang saling terkait, dan setiap sampel berisi satu bidang, gunakan MFVideoInterlace_FieldSingleUpper atau MFVideoInterlace_FieldSingleLower. Jika bidang bergantian antara atas dan bawah, maka tidak masalah mana dari kedua nilai ini yang digunakan. Jika format hanya berisi bidang atas, atau hanya bidang yang lebih rendah, maka atur nilai yang sesuai dengan konten.
  • Jika aliran berisi campuran bingkai interlaced dan progresif, atau jika dominasi bidang beralih, atur jenis media ke MFVideoInterlace_MixedInterlaceOrProgressive. Gunakan atribut sampel untuk menjelaskan setiap bingkai.

Tabel berikut ini meringkas atribut ini.

MF_MT_INTERLACE_MODE Interlaced? Sampel Bidang pertama
MFVideoInterlace_Progressive Tidak Bingkai progresif Tidak berlaku
MFVideoInterlace_FieldInterleavedUpperFirst Ya Bidang yang diselingi Atas pertama
MFVideoInterlace_FieldInterleavedLowerFirst Ya Bidang yang diselingi Lebih rendah terlebih dahulu
MFVideoInterlace_FieldSingleUpper Ya Bidang tunggal Atas pertama
MFVideoInterlace_FieldSingleLower Ya Bidang tunggal Lebih rendah terlebih dahulu
MFVideoInterlace_MixedInterlaceOrProgressive Dapat bervariasi Bidang interleaved atau bingkai progresif Dapat bervariasi

 

Bidang yang diselingi dan bidang tunggal tidak dapat dicampur. Beralih dari satu ke yang lain memerlukan perubahan tipe media.

Bendera Interlace pada Sampel

Informasi yang dapat berubah dari satu sampel ke sampel berikutnya ditunjukkan menggunakan atribut sampel. Gunakan antarmuka IMFSample untuk mendapatkan atau mengatur atribut ini.

Semua atribut interlacing yang tercantum di bagian ini memiliki nilai Boolean. Secara efektif, masing-masing atribut ini dapat memiliki tiga nilai: TRUE, FALSE, atau tidak diatur. Jika atribut tidak diatur, nilai diambil dari jenis media. Jika atribut diatur, nilai akan mengambil alih jenis media. Beberapa kombinasi bendera dan tipe media tidak valid.

Atribut Deskripsi
MFSampleExtension_Interlaced Jika TRUE, bingkai akan terjajar. Jika FALSE, bingkainya progresif.
Atur atribut ini pada setiap sampel jika jenis media MFVideoInterlace_MixedInterlaceOrProgressive.
MFSampleExtension_BottomFieldFirst Arti dari bendera ini tergantung pada apakah sampel berisi bidang yang saling terkait atau bidang tunggal.
  • Bidang yang diselingi: Jika TRUE, bidang bawah adalah yang pertama. Jika FALSE, bidang atas adalah yang pertama.
  • Bidang tunggal: Jika TRUE, sampel berisi bidang yang lebih rendah. Jika FALSE, sampel berisi bidang atas.
Atur atribut ini pada setiap sampel interlace jika jenis media MFVideoInterlace_FieldSingleUpper, MFVideoInterlace_FieldSingleLower, atau MFVideoInterlace_MixedInterlaceOrProgressive.
MFSampleExtension_RepeatFirstField Jika TRUE, bidang pertama akan diulang. Jika FALSE atau tidak diatur, bidang pertama tidak diulang.
MFSampleExtension_SingleField Jika TRUE, sampel berisi satu bidang. Jika FALSE, sampel berisi bidang yang diselingi.

 

Tabel berikut ini memperlihatkan bendera mana yang diperlukan, opsional, atau dilarang, berdasarkan jenis media.

Jenis Media Bendera Terjajar Bendera BottomFieldFirst Bendera RepeatFirstField Bendera SingleField
Progresif Opsional; jika diatur, harus FALSE. Jangan disetel. Jangan disetel. Jangan disetel.
Bidang interleaved Opsional; jika diatur, harus TRUE. Opsional; jika disetel, harus cocok dengan jenis media. Jangan disetel. Opsional; jika diatur, harus FALSE.
Bidang tunggal Opsional; jika diatur, harus TRUE. Wajib diisi. Jangan disetel. Atur ke TRUE.
Campuran Wajib diisi. Wajib diisi. Wajib diisi. Opsional; jika diatur, harus FALSE.

 

Dalam kasus di mana atribut bersifat opsional, jenis media sudah menentukan informasi. Ini valid untuk mengatur atribut agar cocok, tetapi tidak diperlukan.

Misalnya, jika jenis media MFVideoInterlace_Progressive, itu menyiratkan bahwa semua bingkai dalam aliran bersifat progresif. Oleh karena itu, Anda dapat mengatur atribut MFSampleExtension_Interlaced ke FALSE, atau membiarkan atribut tidak diatur.

Rekomendasi

Bagian ini berisi rekomendasi untuk berbagai jenis konten.

  1. Video ini adalah semua bingkai progresif.
  • Atur jenis media ke MFVideoInterlace_Progressive.

  • Jangan atur atribut MFSampleExtension_Interlaced , atau atur ke FALSE pada setiap bingkai.

  • Jangan atur atribut MFSampleExtension_BottomFieldFirst, MFSampleExtension_RepeatFirstField, atau MFSampleExtension_SingleField .

  1. Video adalah semua bidang yang terjalin dengan dominasi bidang yang sama. Sampel berisi bidang yang diselingi.
  • Atur jenis media ke MFVideoInterlace_FieldInterleavedUpperFirst atau MFVideoInterlace_FieldInterleavedLowerFirst.

  • Jangan atur atribut MFSampleExtension_Interlaced , atau atur ke TRUE pada setiap bingkai.

  • Jangan atur atribut MFSampleExtension_BottomFieldFirst , atau atur nilai pada setiap bingkai agar sesuai dengan jenis media.

  • Jangan atur atribut MFSampleExtension_RepeatFirstField , atau atur ke FALSE pada setiap bingkai.

  • Jangan atur atribut MFSampleExtension_SingleField , atau atur ke FALSE pada setiap bingkai.

  1. Video berisi campuran bingkai interlaced dan progresif, dengan bidang berulang dan dominasi bidang yang bervariasi (misalnya, video DVD).
  • Atur jenis media ke MFVideoInterlace_MixedInterlaceOrProgressive.

  • Pada setiap bingkai, atur atribut MFSampleExtension_Interlaced, MFSampleExtension_BottomFieldFirst, dan MFSampleExtension_RepeatFirstField .

  • Jangan atur atribut MFSampleExtension_SingleField , atau atur ke FALSE pada setiap bingkai.

  1. Video diselingi dan sampel berisi bidang tunggal.
  • Atur jenis media ke MFVideoInterlace_FieldSingleUpper atau MFVideoInterlace_FieldSingleLower.

  • Pada setiap bingkai, atur atribut MFSampleExtension_BottomFieldFirst .

  • Jangan atur atribut MFSampleExtension_Interlaced , atau atur ke TRUE pada setiap bingkai.

  • Jangan atur atribut MFSampleExtension_RepeatFirstField , atau atur ke FALSE pada setiap bingkai.

  • Jangan atur atribut MFSampleExtension_SingleField , atau atur ke TRUE pada setiap bingkai.

Sebagian besar konten video termasuk dalam salah satu kategori ini.

Pemetaan MPEG-2

Untuk konten MPEG-2, gunakan pemetaan berikut untuk mengonversi bendera MPEG-2 ke atribut sampel Media Foundation.

picture_structure

Nilai Atribut Sampel
Frame = MFSampleExtension_SingleField PALSU
top_field = MFSampleExtension_SingleField BENAR
= MFSampleExtension_BottomFieldFirst PALSU
bottom_field = MFSampleExtension_SingleField BENAR
= MFSampleExtension_BottomFieldFirst BENAR

 

progressive_frame

Nilai Atribut Sampel
0 = MFSampleExtension_Interlaced BENAR
1 = MFSampleExtension_Interlaced PALSU

 

top_field_first

Nilai Atribut Sampel
0 = MFSampleExtension_BottomFieldFirst BENAR
1 = MFSampleExtension_BottomFieldFirst PALSU

 

repeat_first_field

Nilai Atribut Sampel
0 = MFSampleExtension_RepeatFirstField PALSU
1 = MFSampleExtension_RepeatFirstField BENAR

 

Sampel Single-Field

Jika jenis media MFVideoInterlace_FieldSingleUpper atau MFVideoInterlace_FieldSingleLower, itu berarti bahwa setiap sampel berisi satu bidang. Namun, jenis media menjelaskan seluruh bingkai. Oleh karena itu, setiap buffer hanya berisi setengah dari jumlah baris bidang yang diberikan dalam jenis media. Misalnya, jika jenis media menjelaskan video sebagai 720 × 480, setiap bidang berisi 240 baris pemindaian, dan oleh karena itu setiap buffer hanya berisi 240 baris piksel. Jika Anda menulis komponen yang menerima jenis media dengan sampel bidang tunggal, Anda harus mempertimbangkan fakta ini saat mengakses data di buffer.

Aturan yang sama berlaku untuk bukaan geometris (atribut MF_MT_GEOMETRIC_APERTURE ) dan bukaan tampilan minimum (atribut MF_MT_MINIMUM_DISPLAY_APERTURE ). Wilayah ini ditentukan dalam hal seluruh bingkai, bukan bidang individual.

Pemetaan DirectShow

Dalam DirectShow, informasi interlacing per sampel terkandung dalam anggota dwTypeSpecificFlags dari struktur AM_SAMPLE2_PROPERTIES . Tabel berikut menunjukkan atribut yang setara untuk Media Foundation.

Bendera sampel DirectShow Atribut sampel Media Foundation
AM_VIDEO_FLAG_INTERLEAVED_FRAME = MFSampleExtension_SingleField FALSE.
AM_VIDEO_FLAG_FIELD1 = MFSampleExtension_Interlaced BENAR.
= MFSampleExtension_SingleField BENAR.
= MFSampleExtension_BottomFieldFirst FALSE.
AM_VIDEO_FLAG_FIELD2 = MFSampleExtension_Interlaced BENAR.
= MFSampleExtension_SingleField BENAR.
= MFSampleExtension_BottomFieldFirst BENAR.
AM_VIDEO_FLAG_WEAVE = MFSampleExtension_Interlaced FALSE. (Bendera ini menunjukkan bahwa driver tidak boleh mendeinterlace dua bidang.)
AM_VIDEO_FLAG_FIELD1FIRST = MFSampleExtension_BottomFieldFirst FALSE. Jika konten diselingi dan bendera AM_VIDEO_FLAG_FIELD1FIRST tidak ada, atur atribut ini ke TRUE.
AM_VIDEO_FLAG_REPEAT_FIELD = MFSampleExtension_RepeatFirstField BENAR. Jika bendera AM_VIDEO_FLAG_REPEAT_FIELD tidak ada, atur atribut ini ke FALSE.

 

Jika sampel DirectShow tidak berisi bendera sampel, gunakan nilai dwInterlaceFlags dari struktur VIDEOINFOHEADER2 :

Bendera interlace DirectShow Atribut sampel Media Foundation
AMINTERLACE_IsInterlaced = MFSampleExtension_Interlaced BENAR.
AMINTERLACE_1FieldPerSample = MFSampleExtension_SingleField BENAR.
AMINTERLACE_Field1First = MFSampleExtension_BottomFieldFirst FALSE.

 

Tipe Media Video

Jenis Media