Video dengan rentang dinamis tinggi (HDR) adalah terobosan berikutnya dalam decoding video berkualitas tinggi, yang menghadirkan kualitas reproduksi scene yang tak tertandingi. Hal ini dilakukan dengan meningkatkan rentang dinamis komponen luminans secara signifikan (dari 100 cd/m2 saat ini menjadi 1000-an cd/m2) dan dengan menggunakan ruang warna yang jauh lebih luas (BT 2020). Hal ini kini menjadi elemen sentral dalam evolusi UHD 4K di ruang TV.
Android 10 mendukung video HDR berikut.
- HDR10
- VP9
- HDR10+
Mulai Android 9 dan yang lebih baru, MediaCodec melaporkan metadata HDR terlepas dari mode tunnel.
Anda bisa mendapatkan data yang didekode bersama dengan metadata statis/dinamis dalam mode non-tunnel. Untuk HDR10
dan VP9Profile2 yang menggunakan metadata statis, metadata ini dilaporkan dalam format output dengan kunci
KEY_HDR_STATIC_INFO
. Untuk HDR10+ yang menggunakan metadata dinamis, hal ini dilaporkan dengan
kunci KEY_HDR10_PLUS_INFO
pada format output dan dapat berubah untuk setiap frame output.
Lihat Tunneling Multimedia untuk mengetahui informasi selengkapnya.
Sejak Android 7.0, dukungan HDR awal mencakup pembuatan konstanta yang tepat untuk penemuan dan penyiapan pipeline video HDR. Artinya, menentukan jenis codec dan mode tampilan serta menentukan cara data HDR harus diteruskan ke MediaCodec dan disediakan ke dekoder HDR.
Tujuan dokumen ini adalah untuk membantu developer aplikasi mendukung pemutaran streaming HDR, dan membantu OEM dan SOC mengaktifkan fitur HDR.
Teknologi HDR yang didukung
Mulai Android 7.0 dan yang lebih tinggi, teknologi HDR berikut didukung.
Teknologi | Dolby-Vision | HDR10 | VP9-HLG | VP9-PQ |
---|---|---|---|---|
Codec | AVC/HEVC | HEVC | VP9 | VP9 |
Fungsi Transfer | ST-2084 | ST-2084 | HLG | ST-2084 |
Jenis Metadata HDR | Dinamis | Statis | Tidak ada | Statis |
Di Android 7.0, hanya pemutaran HDR melalui mode tunnel yang ditentukan, tetapi perangkat dapat menambahkan dukungan untuk pemutaran HDR di SurfaceView menggunakan buffering video buram. Dengan kata lain:
- Tidak ada API Android standar untuk memeriksa apakah pemutaran HDR didukung menggunakan dekoder non-tunnel.
- Dekoder video tunnel yang mengiklankan kemampuan pemutaran HDR harus mendukung pemutaran HDR saat terhubung ke layar yang kompatibel dengan HDR.
- Komposisi GL konten HDR tidak didukung oleh rilis Android AOSP 7.0.
Penemuan
Pemutaran HDR memerlukan dekoder yang kompatibel dengan HDR dan koneksi ke layar yang kompatibel dengan HDR. Secara opsional, beberapa teknologi memerlukan ekstraktor tertentu.
Tampilan
Aplikasi harus menggunakan Display.getHdrCapabilities
API
yang baru untuk membuat kueri teknologi HDR yang didukung oleh layar yang ditentukan. Ini
pada dasarnya adalah informasi dalam Blok Data Metadata Statis EDID seperti yang ditentukan
dalam CTA-861.3:
public Display.HdrCapabilities getHdrCapabilities()
Menampilkan kemampuan HDR layar.Display.HdrCapabilities
Mengenkapsulasi kemampuan HDR layar tertentu. Misalnya, jenis HDR yang didukung dan detail tentang data luminans yang diinginkan.
Konstanta:
int HDR_TYPE_DOLBY_VISION
Dukungan Dolby Vision.int HDR_TYPE_HDR10
Dukungan HDR10 / PQ.int HDR_TYPE_HDR10_PLUS
Dukungan HDR10+.int HDR_TYPE_HLG
Dukungan Log-Gamma Hybrid.float INVALID_LUMINANCE
Nilai luminans tidak valid.
Metode publik:
float getDesiredMaxAverageLuminance()
Menampilkan data luminans rata-rata frame maksimum konten yang diinginkan dalam cd/cd/m2 untuk layar ini.float getDesiredMaxLuminance()
Menampilkan data luminans maksimum konten yang diinginkan dalam cd/cd/m2 untuk layar ini.float getDesiredMinLuminance()
Menampilkan data luminans min konten yang diinginkan dalam cd/cd/m2 untuk layar ini.int[] getSupportedHdrTypes()
Mendapatkan jenis HDR yang didukung dari layar ini (lihat konstanta). Menampilkan array kosong jika HDR tidak didukung oleh layar.
Decoder
Aplikasi harus menggunakan
CodecCapabilities.profileLevels
API yang ada untuk memverifikasi dukungan untuk
profil baru yang kompatibel dengan HDR:
Dolby-Vision
Konstanta mime MediaFormat
:
String MIMETYPE_VIDEO_DOLBY_VISION
Konstanta profil MediaCodecInfo.CodecProfileLevel
:
int DolbyVisionProfileDvavPen int DolbyVisionProfileDvavPer int DolbyVisionProfileDvheDen int DolbyVisionProfileDvheDer int DolbyVisionProfileDvheDtb int DolbyVisionProfileDvheDth int DolbyVisionProfileDvheDtr int DolbyVisionProfileDvheStn
Lapisan dan metadata video Dolby Vision harus digabungkan menjadi satu buffer per frame oleh aplikasi video. Hal ini dilakukan secara otomatis oleh MediaExtractor yang kompatibel dengan Dolby Vision.
HEVC HDR 10
Konstanta profil MediaCodecInfo.CodecProfileLevel
:
int HEVCProfileMain10HDR10 int HEVCProfileMain10HDR10Plus
VP9 HLG & PQ
Konstanta profil
MediaCodecInfo.CodecProfileLevel
:
int VP9Profile2HDR int VP9Profile2HDR10Plus int VP9Profile3HDR int VP9Profile3HDR10Plus
Jika mendukung dekoder yang kompatibel dengan HDR, platform juga harus mendukung ekstraktor yang kompatibel dengan HDR.
Hanya dekoder yang di-tunnel yang dijamin dapat memutar konten HDR. Pemutaran oleh dekoder non-tunnel dapat menyebabkan informasi HDR hilang dan konten diratakan menjadi volume warna SDR.
Pengekstrak
Penampung berikut didukung untuk berbagai teknologi HDR di Android 7.0:
Teknologi | Dolby-Vision | HDR10 | VP9-HLG | VP9-PQ |
---|---|---|---|---|
Penampung | MP4 | MP4 | WebM | WebM |
Penemuan apakah trek (file) memerlukan dukungan HDR tidak didukung oleh platform. Aplikasi dapat mengurai data khusus codec untuk menentukan apakah trek memerlukan profil HDR tertentu.
Ringkasan
Persyaratan komponen untuk setiap teknologi HDR ditampilkan dalam tabel berikut:
Teknologi | Dolby-Vision | HDR10 | VP9-HLG | VP9-PQ |
---|---|---|---|---|
Jenis HDR yang didukung (Layar) | HDR_TYPE_DOLBY_VISION | HDR_TYPE_HDR10 | HDR_TYPE_HLG | HDR_TYPE_HDR10 |
Container (Extractor) | MP4 | MP4 | WebM | WebM |
Decoder | MIMETYPE_VIDEO_DOLBY_VISION | MIMETYPE_VIDEO_HEVC | MIMETYPE_VIDEO_VP9 | MIMETYPE_VIDEO_VP9 |
Profil (Decoder) | Salah satu profil Dolby | HEVCProfileMain10HDR10 | VP9Profile2HDR atau VP9Profile3HDR | VP9Profile2HDR atau VP9Profile3HDR |
Catatan:
- Bitstream Dolby-Vision dikemas dalam penampung MP4 dengan cara yang ditentukan oleh Dolby. Aplikasi dapat mengimplementasikan ekstraktor yang kompatibel dengan Dolby-nya sendiri selama mengemas unit akses dari lapisan yang sesuai ke dalam satu unit akses untuk dekoder seperti yang ditentukan oleh Dolby.
- Platform mungkin mendukung ekstraktor yang kompatibel dengan HDR, tetapi tidak ada decoder yang kompatibel dengan HDR.
Pemutaran
Setelah memverifikasi dukungan untuk pemutaran HDR, aplikasi dapat memutar konten HDR hampir dengan cara yang sama seperti memutar konten non-HDR, dengan pengecualian berikut:
- Untuk Dolby-Vision, apakah file/trek media tertentu memerlukan dekoder yang kompatibel dengan HDR atau tidak, tidak langsung tersedia. Aplikasi harus memiliki informasi ini terlebih dahulu atau dapat memperoleh informasi ini dengan memecah bagian data khusus codec dari MediaFormat.
CodecCapabilities.isFormatSupported
tidak mempertimbangkan apakah fitur dekoder tunnel diperlukan untuk mendukung profil tersebut.
Mengaktifkan dukungan platform HDR
Vendor SoC dan OEM harus melakukan pekerjaan tambahan untuk mengaktifkan dukungan platform HDR untuk perangkat.
Perubahan platform di Android 7.0 untuk HDR
Berikut beberapa perubahan utama pada platform (lapisan aplikasi/native) yang perlu diketahui OEM dan SOC.
Tampilan
Komposisi hardware
Platform yang kompatibel dengan HDR harus mendukung penggabungan konten HDR dengan konten non-HDR. Karakteristik dan operasi penggabungan yang tepat tidak ditentukan oleh Android mulai rilis 7.0, tetapi prosesnya umumnya mengikuti langkah-langkah berikut:
- Tentukan ruang/volume warna linear yang berisi semua lapisan yang akan
dikomposisi, berdasarkan warna, mastering, dan metadata
dinamis potensial lapisan.
Jika komposisi langsung ke layar, ini bisa berupa ruang linear yang cocok dengan volume warna layar. - Mengonversi semua lapisan ke ruang warna umum.
- Lakukan penggabungan.
- Jika menampilkan melalui HDMI:
- Tentukan warna, mastering, dan metadata dinamis potensial untuk adegan gabungan.
- Konversikan tampilan gabungan yang dihasilkan ke ruang/volume warna turunan.
- Jika ditampilkan langsung ke layar, konversikan tampilan gabungan yang dihasilkan ke sinyal tampilan yang diperlukan untuk menghasilkan tampilan tersebut.
Penemuan layar
Penemuan layar HDR hanya didukung melalui HWC2. Implementator perangkat harus mengaktifkan adaptor HWC2 secara selektif yang dirilis dengan Android 7.0 agar fitur ini berfungsi. Oleh karena itu, platform harus menambahkan dukungan untuk HWC2 atau memperluas framework AOSP untuk memungkinkan cara memberikan informasi ini. HWC2 mengekspos API baru untuk menyebarkan Data Statis HDR ke framework dan aplikasi.
HDMI
- Layar HDMI yang terhubung mengiklankan kemampuan HDR-nya melalui HDMI EDID seperti yang ditentukan dalam CTA-861.3 bagian 4.2.
- Pemetaan EOTF berikut akan digunakan:
- ET_0 Gamma tradisional - Rentang Luminans SDR: tidak dipetakan ke jenis HDR apa pun
- ET_1 Gamma tradisional - Rentang Luminans HDR: tidak dipetakan ke jenis HDR apa pun
- ET_2 SMPTE ST 2084 - dipetakan ke jenis HDR HDR10
- Sinyal dukungan Dolby Vision atau HLG melalui HDMI dilakukan seperti yang ditentukan oleh badan yang relevan.
- Perhatikan bahwa HWC2 API menggunakan nilai luminans yang diinginkan float, sehingga nilai DID 8-bit harus diterjemahkan dengan cara yang sesuai.
Decoder
Platform harus menambahkan dekoder tunnel yang kompatibel dengan HDR dan mengiklankan dukungan HDR mereka. Secara umum, decoder yang kompatibel dengan HDR harus:
- Mendukung decoding tunnel (
FEATURE_TunneledPlayback
). - Mendukung metadata statis HDR
(
OMX.google.android.index.describeHDRColorInfo
) dan penyebarannya ke komposisi layar/hardware. Untuk HLG, metadata yang sesuai harus dikirim ke layar. - Mendukung deskripsi warna
(
OMX.google.android.index.describeColorAspects
) dan penyebarannya ke komposisi tampilan/hardware. - Mendukung metadata tersemat HDR seperti yang ditentukan oleh standar yang relevan.
Dukungan dekoder Dolby Vision
Untuk mendukung Dolby Vision, platform harus menambahkan dekoder OMX HDR yang kompatibel dengan Dolby-Vision. Mengingat spesifikasi Dolby Vision, ini biasanya dekoder wrapper di sekitar satu atau beberapa dekoder AVC dan/atau HEVC serta komponer. Dekoder tersebut harus:
- Mendukung jenis mime "video/dolby-vision".
- Iklankan profil/level Dolby Vision yang didukung.
- Menerima unit akses yang berisi sub-unit akses dari semua lapisan seperti yang ditentukan oleh Dolby.
- Menerima data khusus codec yang ditentukan oleh Dolby. Misalnya, data yang berisi profil/tingkat Dolby Vision dan mungkin data khusus codec untuk decoder internal.
- Mendukung pengalihan adaptif antara profil/level Dolby Vision seperti yang diperlukan oleh Dolby.
Saat mengonfigurasi dekoder, profil Dolby yang sebenarnya tidak dikomunikasikan ke codec. Hal ini hanya dilakukan melalui data khusus codec setelah dekoder dimulai. Platform dapat memilih untuk mendukung beberapa dekoder Dolby Vision: satu untuk profil AVC, dan satu lagi untuk profil HEVC agar dapat melakukan inisialisasi codec yang mendasarinya selama waktu konfigurasi. Jika satu decoder Dolby Vision mendukung kedua jenis profil, decoder tersebut juga harus mendukung pengalihan antara keduanya secara dinamis dengan cara adaptif.
Jika platform menyediakan dekoder yang kompatibel dengan Dolby Vision selain dukungan dekoder HDR umum, platform tersebut harus:
- Menyediakan ekstraktor yang mendukung Dolby Vision, meskipun tidak mendukung pemutaran HDR.
- Menyediakan dekoder yang mendukung profil vision seperti yang ditentukan oleh Dolby.
Dukungan decoder HDR10
Untuk mendukung HDR10, platform harus menambahkan dekoder OMX yang kompatibel dengan HDR10. Ini biasanya adalah dekoder HEVC yang di-tunnel yang juga mendukung penguraian dan penanganan metadata terkait HDMI. Decoder tersebut (selain dukungan decoder HDR umum) harus:
- Mendukung jenis mime "video/hevc".
- Iklankan HEVCMain10HDR10 yang didukung. Dukungan profil HEVCMain10HRD10 juga memerlukan dukungan profil HEVCMain10, yang memerlukan dukungan profil HEVCMain pada tingkat yang sama.
- Mendukung penguraian blok SEI metadata mastering, serta info terkait HDR lainnya yang terdapat dalam SPS.
Dukungan decoder VP9
Untuk mendukung VP9 HDR, platform harus menambahkan dekoder OMX HDR yang kompatibel dengan Profil2 VP9. Ini biasanya adalah dekoder VP9 yang di-tunnel yang juga mendukung penanganan metadata terkait HDMI. Dekoder tersebut (selain dukungan dekoder HDR umum) harus:
- Mendukung jenis mime "video/x-vnd.on2.vp9".
- Beriklan dengan VP9Profile2HDR yang didukung. Dukungan profil VP9Profile2HDR juga memerlukan dukungan profil VP9Profile2 pada level yang sama.
Ekstraktor
Dukungan ekstraktor Dolby Vision
Platform yang mendukung decoder Dolby Vision harus menambahkan dukungan ekstraktor Dolby (disebut Dolby Extractor) untuk konten Dolby Video.
- Ekstraktor MP4 reguler hanya dapat mengekstrak lapisan dasar dari file, tetapi tidak dapat mengekstrak lapisan peningkatan atau metadata. Jadi, ekstraktor Dolby khusus diperlukan untuk mengekstrak data dari file.
- Ekstraktor Dolby harus mengekspos 1 hingga 2 trek untuk setiap trek video Dolby
(grup):
- Trek HDR Dolby Vision dengan jenis "video/dolby-vision" untuk streaming Dolby gabungan 2/3 lapisan. Format unit akses trek HDR, yang menentukan cara memaketkan unit akses dari lapisan dasar/peningkatan/metadata ke dalam satu buffering untuk didekode menjadi satu frame HDR, akan ditentukan oleh Dolby.
- Jika trek video Dolby Vision berisi lapisan dasar (BL) terpisah (kompatibel dengan versi lama), ekstraktor juga harus mengeksposnya sebagai trek "video/avc" atau "video/hevc" terpisah. Ekstraktor harus menyediakan unit akses AVC/HEVC reguler untuk trek ini.
- Jalur BL harus memiliki ID unik jalur ("ID jalur") yang sama dengan jalur HDR sehingga aplikasi memahami bahwa ini adalah dua encoding dari video yang sama.
- Aplikasi dapat menentukan jalur mana yang akan dipilih berdasarkan kemampuan platform.
- Profil/level Dolby Vision harus ditampilkan dalam format trek trek HDR.
- Jika menyediakan dekoder yang kompatibel dengan Dolby Vision, platform juga harus menyediakan ekstraktor yang mendukung Dolby Vision, meskipun tidak mendukung pemutaran HDR.
Dukungan ekstraktor HDR10 dan VP9 HDR
Tidak ada persyaratan ekstraktor tambahan untuk mendukung HDR10 atau VP9 HLG. Platform harus memperluas ekstraktor MP4 untuk mendukung VP9 PQ di MP4. Metadata statis HDR harus disebarkan dalam bitstream VP9 PQ, sehingga metadata ini diteruskan ke dekoder VP9 PQ dan ke layar melalui pipeline MediaExtractor => MediaCodec normal.
Ekstensi Stagefright untuk dukungan Dolby Vision
Platform harus menambahkan dukungan format Dolby Vision ke Stagefright:
- Dukungan untuk kueri definisi port untuk port terkompresi.
- Mendukung enumerasi profil/level untuk dekoder DV.
- Mendukung eksposur profil/level DV untuk trek HDR DV.
Detail penerapan khusus teknologi
Pipeline decoder HDR10
Gambar 1. Pipeline HDR10
Bitstream HDR10 dikemas dalam penampung MP4. Aplikasi menggunakan ekstraktor MP4 reguler untuk mengekstrak data frame dan mengirimkannya ke dekoder.
- MPEG4 Extractor
Bitstream HDR10 dikenali sebagai streaming HEVC normal oleh MPEG4Extractor dan trek HDR dengan jenis "video/HEVC" akan diekstrak. Framework memilih dekoder video HEVC yang mendukung profil Main10HDR10 untuk mendekode trek tersebut. - HEVC Decoder
Informasi HDR ada di SEI atau SPS. Decoder HEVC pertama-tama menerima frame yang berisi informasi HDR. Dekoder kemudian mengekstrak informasi HDR dan memberi tahu aplikasi bahwa dekoder mendekode video HDR. Informasi HDR dipaketkan ke dalam format output dekoder, yang didistribusikan ke platform nanti.
Tindakan vendor
- Iklankan profil dekoder HDR dan jenis OMX level yang didukung. Contoh:
OMX_VIDEO_HEVCProfileMain10HDR10
(danMain10
) - Menerapkan dukungan untuk indeks:
'
OMX.google.android.index.describeHDRColorInfo
' - Menerapkan dukungan untuk indeks:
'
OMX.google.android.index.describeColorAspects
' - Mengimplementasikan dukungan untuk penguraian SEI metadata mastering.
Pipeline dekoder Dolby Vision
Gambar 2. Pipeline Dolby Vision
Bitstream Dolby dikemas dalam penampung MP4 seperti yang ditentukan oleh Dolby. Secara teori, aplikasi dapat menggunakan ekstraktor MP4 reguler untuk mengekstrak lapisan dasar, lapisan peningkatan, dan lapisan metadata secara independen; tetapi, hal ini tidak sesuai dengan model MediaExtractor/MediaCodec Android saat ini.
- DolbyExtractor:
- Bitstream Dolby dikenali oleh DolbyExtractor, yang mengekspos
berbagai lapisan sebagai 1 hingga 2 trek untuk setiap trek video dolby (grup):
- Trek HDR dengan jenis "video/dolby-vision" untuk streaming dolby 2/3 lapisan gabungan. Format unit akses trek HDR, yang menentukan cara memaketkan unit akses dari lapisan dasar/peningkatan/metadata ke dalam satu buffering untuk didekode menjadi satu frame HDR, akan ditentukan oleh Dolby.
- (Opsional, hanya jika BL kompatibel dengan versi sebelumnya) Trek BL hanya berisi lapisan dasar, yang harus dapat didekode oleh dekoder MediaCodec reguler, misalnya, dekoder AVC/HEVC. Ekstraktor harus menyediakan unit akses AVC/HEVC reguler untuk trek ini. Jalur BL ini harus memiliki ID unik jalur ("ID jalur") yang sama dengan jalur Dolby sehingga aplikasi memahami bahwa ini adalah dua encoding dari video yang sama.
- Aplikasi dapat menentukan jalur mana yang akan dipilih berdasarkan kemampuan platform.
- Karena trek HDR memiliki jenis HDR tertentu, framework akan memilih decoder video Dolby untuk mendekode trek tersebut. Trek BL akan didekode oleh dekoder video AVC/HEVC reguler.
- Bitstream Dolby dikenali oleh DolbyExtractor, yang mengekspos
berbagai lapisan sebagai 1 hingga 2 trek untuk setiap trek video dolby (grup):
- DolbyDecoder:
- DolbyDecoder menerima unit akses yang berisi unit akses yang diperlukan untuk semua lapisan (EL+BL+MD atau BL+MD)
- Informasi CSD (data khusus codec, seperti SPS+PPS+VPS) untuk setiap lapisan dapat dikemas ke dalam 1 frame CSD yang akan ditentukan oleh Dolby. Anda harus memiliki satu frame CSD.
Tindakan Dolby
- Tentukan pengemasan unit akses untuk berbagai skema penampung Dolby (misalnya, BL+EL+MD) untuk dekoder Dolby abstrak (yaitu format buffer yang diharapkan oleh dekoder HDR).
- Menentukan pengemasan CSD untuk dekoder Dolby abstrak.
Tindakan vendor
- Menerapkan ekstraktor Dolby. Hal ini juga dapat dilakukan oleh Dolby.
- Mengintegrasikan DolbyExtractor ke dalam framework. Titik entrinya adalah
frameworks/av/media/libstagefright/MediaExtractor.cpp
. - Deklarasikan profil dekoder HDR dan jenis
OMX level. Contoh:
OMX_VIDEO_DOLBYPROFILETYPE
danOMX_VIDEO_DOLBYLEVELTYP
. - Terapkan dukungan untuk indeks:
'OMX.google.android.index.describeColorAspects
' - Sebarkan metadata HDR dinamis ke aplikasi dan platform di setiap frame. Biasanya, informasi ini harus dikemas ke dalam frame yang didekode seperti yang ditentukan oleh Dolby, karena standar HDMI tidak menyediakan cara untuk meneruskannya ke layar.
Pipeline decoder VP9
Gambar 3. Pipeline VP9-PQ
Bitstream VP9 dikemas dalam penampung WebM dengan cara yang ditentukan oleh tim WebM. Aplikasi perlu menggunakan ekstraktor WebM untuk mengekstrak metadata HDR dari bitstream sebelum mengirim frame ke dekoder.
- Ekstraktor WebM:
- Decoder VP9:
- Dekoder menerima bitstream Profile2 dan mendekodenya sebagai streaming VP9 normal.
- Dekoder menerima metadata statis HDR dari framework.
- Dekoder menerima metadata statis melalui unit akses bitstream untuk streaming VP9 PQ.
- Dekoder VP9 harus dapat menyebarkan metadata statis/dinamis HDR ke layar.
Tindakan vendor
- Mengimplementasikan dukungan untuk indeks:
OMX.google.android.index.describeHDRColorInfo
- Mengimplementasikan dukungan untuk indeks:
OMX.google.android.index.describeColorAspects
- Menerapkan metadata statis HDR