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.
|
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.
- 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 .
- 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.
- 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.
- 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. |
Topik terkait