Pemutaran video HDR

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 dari evolusi UHD 4K di ruang TV.

Android 10 mendukung video HDR berikut.

  • HDR10
  • VP9
  • HDR10+

Mulai Android 9 dan yang lebih tinggi, 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.

Mulai 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 SurfaceViews menggunakan buffer 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 AOSP Android 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 baru untuk mengkueri teknologi HDR yang didukung oleh tampilan 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 untuk tampilan 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 berkemampuan 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 platform mendukung dekoder berkemampuan HDR, platform tersebut juga akan mendukung ekstraktor berkemampuan HDR.

Hanya decoder yang disalurkan yang dijamin memutar konten HDR. Pemutaran oleh decoder tanpa tunnel dapat mengakibatkan hilangnya informasi HDR dan konten diratakan menjadi volume warna SDR.

Ekstraktor

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 ditunjukkan 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 HEVCProfilMain10HDR10 VP9Profile2HDR atau VP9Profile3HDR VP9Profile2HDR atau VP9Profile3HDR

Catatan:

  • Bitstream Dolby-Vision dikemas dalam penampung MP4 dengan cara yang ditentukan oleh Dolby. Aplikasi dapat mengimplementasikan ekstraktor berkemampuan Dolby sendiri selama aplikasi tersebut mengemas unit akses dari lapisan terkait ke dalam satu unit akses untuk decoder seperti yang didefinisikan oleh Dolby.
  • Platform mungkin mendukung ekstraktor berkemampuan HDR, tetapi tidak ada dekoder berkemampuan HDR yang sesuai.

Pemutaran

Setelah memverifikasi dukungan untuk pemutaran HDR, aplikasi dapat memutar konten HDR dengan cara yang hampir sama seperti memutar konten non-HDR, dengan peringatan 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 berkemampuan HDR harus mendukung penggabungan konten HDR dengan konten non-HDR. Karakteristik dan operasi penggabungan yang tepat tidak didefinisikan oleh Android mulai rilis 7.0, tetapi prosesnya umumnya mengikuti langkah-langkah berikut:

  1. Tentukan ruang/volume warna linear yang berisi semua lapisan yang akan disusun, berdasarkan warna lapisan, mastering, dan potensi metadata dinamis.
    Jika mengomposisikan langsung ke layar, ini bisa berupa ruang linear yang cocok dengan volume warna layar.
  2. Mengonversi semua lapisan ke ruang warna bersama.
  3. Lakukan penggabungan.
  4. Jika menampilkan melalui HDMI:
    1. Tentukan warna, mastering, dan potensi metadata dinamis untuk adegan campuran.
    2. Mengonversi scene campuran yang dihasilkan ke ruang warna/volume turunan.
  5. Jika menampilkan langsung ke layar, konversikan suasana campuran yang dihasilkan menjadi sinyal tampilan yang diperlukan untuk menghasilkan suasana 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 agar dapat menyediakan 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 Aksara Tradisional - SDR Luminance Range: 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. Umumnya, decoder berkemampuan HDR harus:

  • Mendukung decoding tunnel (FEATURE_TunneledPlayback).
  • Mendukung metadata statis HDR (OMX.google.android.index.describeHDRColorInfo) dan penerapannya ke tampilan/komposisi hardware. Untuk HLG, metadata yang sesuai harus dikirimkan ke layar.
  • Mendukung deskripsi warna (OMX.google.android.index.describeColorAspects) dan penerapannya ke tampilan/komposisi 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 secara spesifik, biasanya ini adalah decoder wrapper sekitar satu atau beberapa decoder AVC dan/atau HEVC serta compositor. Decoder 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.
  • Terima data khusus codec yang ditentukan oleh Dolby. Misalnya, data yang berisi profil/level Dolby Vision dan mungkin data khusus codec untuk decoder internal.
  • Mendukung peralihan 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 dasar 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 visi seperti yang ditentukan oleh Dolby.

Dukungan decoder HDR10

Untuk mendukung HDR10, platform harus menambahkan dekoder OMX berkemampuan 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".
  • Beriklan 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 master, 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 VP9 Profile2. Ini biasanya adalah decoder VP9 tunneling yang juga mendukung penanganan metadata terkait HDMI. Dekoder tersebut (selain dukungan dekoder HDR umum) harus:

  • Mendukung jenis mime "video/x-vnd.on2.vp9".
  • Beriklankan VP9Profile2HDR yang didukung. Dukungan profil VP9Profile2HDR juga memerlukan dukungan profil VP9Profile2 di tingkat yang sama.

Ekstraktor

Dukungan ekstraktor Dolby Vision

Platform yang mendukung dekoder 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 meningkatkan kualitas atau lapisan metadata. Jadi, ekstraktor Dolby khusus diperlukan untuk mengekstrak data dari file.
  • Ekstraktor Dolby harus mengekspos 1 hingga 2 lagu untuk setiap trek video Dolby (grup):
    • Trek HDR Dolby Vision dengan jenis "video/dolby-vision" untuk streaming Dolby Vision 2/3 lapisan. Format unit akses jalur HDR, yang menentukan cara memaketkan unit akses dari lapisan dasar/penyempurnaan/metadata ke dalam satu buffer untuk didekode ke dalam satu frame HDR, akan ditentukan oleh Dolby.
    • Jika trek video Dolby Vision berisi lapisan dasar (BL) yang 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 mendukung Dolby-Vision, platform juga harus menyediakan pengekstrak yang peka 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 dalam 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/tingkat untuk dekoder DV.
  • Mendukung eksposur profil/level DV untuk trek DV HDR.

Detail implementasi khusus teknologi

Pipeline decoder HDR10

Gambar 1. Pipeline HDR10

Bitstream HDR10 dikemas dalam container MP4. Aplikasi menggunakan ekstraktor MP4 reguler untuk mengekstrak data frame dan mengirimkannya ke dekoder.

  • MPEG4 Extractor
    Bitstream HDR10 dikenali hanya sebagai streaming HEVC normal oleh MPEG4Extractor dan trek HDR dengan jenis "video/HEVC" akan diekstrak. Framework ini memilih dekoder video HEVC yang mendukung profil Main10HDR10 untuk mendekode trek tersebut.
  • Decoder HEVC
    Informasi HDR ada dalam SEI atau SPS. Decoder HEVC pertama-tama menerima frame yang berisi informasi HDR. Dekoder kemudian mengekstrak informasi HDR dan memberi tahu aplikasi bahwa dekoder sedang mendekode video HDR. Informasi HDR digabungkan ke dalam format output decoder, yang nantinya disebarkan ke platform.

Tindakan vendor

  1. Iklankan profil decoder HDR yang didukung dan jenis OMX level. Contoh:
    OMX_VIDEO_HEVCProfileMain10HDR10 (dan Main10)
  2. Menerapkan dukungan untuk indeks: 'OMX.google.android.index.describeHDRColorInfo'
  3. Implementasikan dukungan untuk indeks: 'OMX.google.android.index.describeColorAspects'
  4. Mengimplementasikan dukungan untuk penguraian SEI mastering metadata.

Pipeline dekoder Dolby Vision

Gambar 2. Pipeline Dolby Vision

Dolby-bitstream dikemas dalam container 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/penyempurnaan/metadata menjadi satu buffer untuk didekode ke dalam 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 jalur ini. Trek BL ini harus memiliki track-unique-ID ("track-ID") yang sama dengan trek Dolby agar aplikasi memahami bahwa kedua encoding tersebut adalah dua encoding 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 biasa.
  • 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. Diperlukan satu frame CSD.

Tindakan Dolby

  1. Tentukan paket unit akses untuk berbagai skema penampung Dolby (misalnya BL+EL+MD) untuk decoder Dolby abstrak (yaitu format buffer yang diharapkan oleh decoder HDR).
  2. Menentukan pengemasan CSD untuk decoder Dolby abstrak.

Tindakan vendor

  1. Menerapkan ekstraktor Dolby. Ini juga dapat dilakukan dengan Dolby.
  2. Integrasikan DolbyExtractor ke dalam framework. Titik entrinya adalah frameworks/av/media/libstagefright/MediaExtractor.cpp.
  3. Deklarasikan profil dekoder HDR dan jenis OMX level. Contoh: OMX_VIDEO_DOLBYPROFILETYPE dan OMX_VIDEO_DOLBYLEVELTYP.
  4. Implementasikan dukungan untuk indeks: 'OMX.google.android.index.describeColorAspects'
  5. Menyebarkan metadata HDR dinamis ke aplikasi dan muncul 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 harus menggunakan ekstraktor WebM untuk mengekstrak metadata HDR dari bitstream sebelum mengirimkan frame ke decoder.

  • Ekstraktor WebM:
  • Decoder VP9:
    • Decoder 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

  1. Mengimplementasikan dukungan untuk indeks: OMX.google.android.index.describeHDRColorInfo
  2. Mengimplementasikan dukungan untuk indeks: OMX.google.android.index.describeColorAspects
  3. Menerapkan metadata statis HDR