Pemutaran video HDR

Video rentang dinamis tinggi (HDR) adalah terobosan berikutnya dalam decoding video berkualitas tinggi, yang menghadirkan kualitas reproduksi adegan 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). Sekarang ini menjadi elemen utama evolusi 4K UHD 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 yang di-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 Multimedia Tunneling untuk mengetahui informasi selengkapnya.

Sejak Android 7.0, dukungan HDR awal mencakup pembuatan konstanta yang tepat untuk penemuan dan penyiapan pipeline video HDR. Artinya, Anda harus menentukan jenis codec dan mode tampilan serta menentukan cara data HDR harus diteruskan ke MediaCodec dan diberikan 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 bertunnel yang ditentukan, tetapi perangkat dapat menambahkan dukungan untuk pemutaran HDR di SurfaceView menggunakan buffer video buram. Dengan kata lain:

  • Tidak ada Android API standar untuk memeriksa apakah pemutaran HDR didukung menggunakan dekoder non-tunel.
  • Dekoder video yang di-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 7.0 AOSP.

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 membuat kueri teknologi HDR yang didukung oleh layar yang ditentukan. Ini pada dasarnya adalah informasi dalam Blok Data Metadata Statis EDID sebagaimana ditentukan dalam CTA-861.3:

  • public Display.HdrCapabilities getHdrCapabilities()
    Menampilkan kemampuan HDR layar.
  • Display.HdrCapabilities
    Mencakup kemampuan HDR dari 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 Hybrid Log-Gamma.
  • float INVALID_LUMINANCE
    Nilai luminans tidak valid.

Metode publik:

  • float getDesiredMaxAverageLuminance()
    Menampilkan data luminans rata-rata frame maksimum konten yang diinginkan dalam cd/m2 untuk tampilan ini.
  • float getDesiredMaxLuminance()
    Menampilkan data luminans maksimum konten yang diinginkan dalam cd/cd/m2 untuk layar ini.
  • float getDesiredMinLuminance()
    Menampilkan data luminans minimum konten yang diinginkan dalam cd/cd/m2 untuk layar ini.
  • int[] getSupportedHdrTypes()
    Mendapatkan jenis HDR yang didukung oleh 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 yang kompatibel dengan HDR baru:

Dolby Vision

MediaFormat konstanta MIME:

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

Profil MediaCodecInfo.CodecProfileLevel konstanta:

int VP9Profile2HDR
int VP9Profile2HDR10Plus
int VP9Profile3HDR
int VP9Profile3HDR10Plus

Jika platform mendukung dekoder yang kompatibel dengan HDR, platform tersebut juga harus mendukung ekstraktor yang kompatibel dengan HDR.

Hanya dekoder yang di-tunnel yang dijamin dapat memutar kembali konten HDR. Pemutaran oleh dekoder non-tunnel dapat menyebabkan hilangnya informasi HDR dan konten diratakan ke dalam 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 suatu trek (dari file) memerlukan dukungan HDR tidak didukung oleh platform. Aplikasi dapat mem-parsing 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 menerapkan ekstraktor yang kompatibel dengan Dolby-nya sendiri selama aplikasi tersebut mengemas unit akses dari lapisan yang sesuai ke dalam satu unit akses untuk dekoder seperti yang ditentukan oleh Dolby.
  • Platform dapat mendukung ekstraktor yang kompatibel dengan HDR, tetapi tidak ada dekoder yang kompatibel dengan HDR yang sesuai.

Pemutaran

Setelah aplikasi memverifikasi dukungan untuk pemutaran HDR, aplikasi dapat memutar kembali konten HDR dengan cara yang hampir sama seperti memutar kembali konten non-HDR, dengan peringatan berikut:

  • Untuk Dolby Vision, apakah file/track media tertentu memerlukan dekoder yang kompatibel dengan HDR atau tidak, tidak langsung tersedia. Aplikasi harus memiliki informasi ini sebelumnya atau dapat memperoleh informasi ini dengan mengurai bagian data khusus codec dari MediaFormat.
  • CodecCapabilities.isFormatSupported tidak mempertimbangkan apakah fitur decoder yang di-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 penting dalam 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 hingga rilis 7.0, tetapi prosesnya umumnya mengikuti langkah-langkah berikut:

  1. Tentukan ruang/volume warna linear yang berisi semua lapisan yang akan dikomposisikan, berdasarkan warna, mastering, dan potensi metadata dinamis lapisan.
    Jika melakukan komposit langsung ke layar, ini bisa menjadi ruang linear yang cocok dengan volume warna layar.
  2. Konversi semua lapisan ke ruang warna umum.
  3. Lakukan pencampuran.
  4. Jika menampilkan melalui HDMI:
    1. Tentukan warna, mastering, dan potensi metadata dinamis untuk adegan campuran.
    2. Konversi adegan campuran yang dihasilkan ke ruang/volume warna turunan.
  5. Jika ditampilkan langsung ke layar, konversi adegan gabungan yang dihasilkan ke sinyal layar yang diperlukan untuk menghasilkan adegan tersebut.

Penemuan iklan Display

Penemuan layar HDR hanya didukung melalui HWC2. Pengimplementasi perangkat harus mengaktifkan adaptor HWC2 yang dirilis dengan Android 7.0 secara selektif 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 sebagaimana ditentukan dalam bagian 4.2 CTA-861.3.
  • Pemetaan EOTF berikut harus 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 HDR10 HDR
  • Pensinyalan dukungan Dolby Vision atau HLG melalui HDMI dilakukan sebagaimana ditentukan oleh badan terkait.
  • Perhatikan bahwa HWC2 API menggunakan nilai luminans yang diinginkan float, sehingga nilai EDID 8-bit harus diterjemahkan dengan cara yang sesuai.

Decoder

Platform harus menambahkan dekoder yang di-tunnel dan kompatibel dengan HDR serta mengiklankan dukungan HDR-nya. Secara umum, dekoder yang kompatibel dengan HDR harus:

  • Mendukung decoding yang di-tunnel (FEATURE_TunneledPlayback).
  • Mendukung metadata statis HDR (OMX.google.android.index.describeHDRColorInfo) dan propagasi ke komposisi hardware/layar. Untuk HLG, metadata yang sesuai harus dikirimkan ke layar.
  • Mendukung deskripsi warna (OMX.google.android.index.describeColorAspects) dan propagasinya ke komposisi layar/hardware.
  • Mendukung metadata tersemat HDR sebagaimana ditentukan oleh standar yang relevan.

Dukungan dekoder Dolby Vision

Untuk mendukung Dolby Vision, platform harus menambahkan decoder HDR OMX yang kompatibel dengan Dolby Vision. Mengingat spesifikasi Dolby Vision, biasanya ini adalah decoder wrapper di sekitar satu atau beberapa decoder AVC dan/atau HEVC serta compositor. Dekoder tersebut harus:

  • Mendukung jenis MIME "video/dolby-vision".
  • Mengiklankan profil/level Dolby Vision yang didukung.
  • Menerima unit akses yang berisi sub-unit-akses semua lapisan sebagaimana ditentukan oleh Dolby.
  • Menerima 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 sesuai persyaratan Dolby.

Saat mengonfigurasi dekoder, profil Dolby 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 menginisialisasi codec yang mendasarinya selama waktu konfigurasi. Jika satu decoder Dolby Vision mendukung kedua jenis profil, decoder tersebut juga harus mendukung peralihan di 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 kompatibel dengan Dolby Vision, meskipun tidak mendukung pemutaran HDR.
  • Menyediakan dekoder yang mendukung profil visual sebagaimana ditentukan oleh Dolby.

Dukungan decoder HDR10

Untuk mendukung HDR10, platform harus menambahkan dekoder OMX yang kompatibel dengan HDR10. Decoder HEVC yang di-tunnel ini biasanya juga mendukung penguraian dan penanganan metadata terkait HDMI. Decoder tersebut (selain dukungan decoder HDR umum) harus:

  • Mendukung jenis MIME "video/hevc".
  • Mengiklankan HEVCMain10HDR10 yang didukung. Dukungan profil HEVCMain10HRD10 juga memerlukan dukungan profil HEVCMain10, yang memerlukan dukungan profil HEVCMain pada tingkat yang sama.
  • Mendukung parsing blok SEI metadata mastering, serta info terkait HDR lainnya yang terdapat dalam SPS.

Dukungan decoder VP9

Untuk mendukung HDR VP9, platform harus menambahkan decoder OMX HDR yang kompatibel dengan VP9 Profile2. Biasanya ini adalah decoder VP9 yang di-tunnel dan juga mendukung penanganan metadata terkait HDMI. Dekoder tersebut (selain dukungan dekoder HDR umum) harus:

  • Mendukung jenis MIME "video/x-vnd.on2.vp9."
  • Mengiklankan VP9Profile2HDR yang didukung. Dukungan profil VP9Profile2HDR juga memerlukan dukungan profil VP9Profile2 pada tingkat yang sama.

Pengekstrak

Dukungan ekstraktor Dolby Vision

Platform yang mendukung decoder Dolby Vision harus menambahkan dukungan ekstraktor Dolby (disebut Ekstraktor Dolby) untuk konten Dolby Video.

  • Ekstraktor MP4 biasa 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 2/3 lapisan gabungan. Format unit akses trek HDR, yang menentukan cara mengemas unit akses dari lapisan dasar/peningkatan/metadata ke dalam satu buffer untuk didekode menjadi satu frame HDR, akan ditentukan oleh Dolby.
    • Jika trek video Dolby Vision berisi lapisan dasar (BL) terpisah (yang kompatibel mundur), ekstraktor juga harus mengeksposnya sebagai trek "video/avc" atau "video/hevc" terpisah. Ekstraktor harus menyediakan unit akses AVC/HEVC reguler untuk jalur ini.
    • Track BL harus memiliki ID unik per track ("track-ID") yang sama dengan track HDR sehingga aplikasi memahami bahwa ini adalah dua encoding dari video yang sama.
    • Aplikasi dapat memutuskan trek mana yang akan dipilih berdasarkan kemampuan platform.
  • Profil/level Dolby Vision harus ditampilkan dalam format trek trek HDR.
  • Jika platform menyediakan dekoder yang kompatibel dengan Dolby Vision, platform tersebut juga harus menyediakan ekstraktor yang kompatibel dengan 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 PQ VP9 dalam MP4. Metadata statis HDR harus dipropagasi dalam bitstream PQ VP9, sehingga metadata ini diteruskan ke decoder PQ VP9 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 pengeksposan profil/level DV untuk trek HDR DV.

Detail penerapan khusus teknologi

Pipeline dekoder 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 aliran HEVC biasa oleh MPEG4Extractor dan trek HDR dengan jenis "video/HEVC" akan diekstrak. Framework memilih decoder video HEVC yang mendukung profil Main10HDR10 untuk mendekode trek tersebut.
  • Decoder HEVC
    Informasi HDR ada di SEI atau SPS. Dekoder HEVC pertama-tama menerima frame yang berisi informasi HDR. Kemudian, dekoder mengekstrak informasi HDR dan memberi tahu aplikasi bahwa dekoder sedang mendekode video HDR. Informasi HDR digabungkan ke dalam format output decoder, yang kemudian diteruskan ke permukaan.

Tindakan vendor

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

Pipeline dekoder Dolby Vision

Gambar 2. Pipeline Dolby Vision

Bitstream Dolby dikemas dalam penampung MP4 sebagaimana ditentukan oleh Dolby. Secara teoretis, aplikasi dapat menggunakan ekstraktor MP4 biasa untuk mengekstrak lapisan dasar, lapisan peningkatan, dan lapisan metadata secara independen; namun, 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 mengemas unit akses dari lapisan dasar/peningkatan/metadata ke dalam satu buffer untuk didekode menjadi satu frame HDR, akan ditentukan oleh Dolby.
      • (Opsional, hanya jika BL kompatibel mundur) Trek BL hanya berisi lapisan dasar, yang harus dapat didekode oleh dekoder MediaCodec biasa, misalnya, dekoder AVC/HEVC. Ekstraktor harus menyediakan unit akses AVC/HEVC reguler untuk trek ini. Jalur BL ini harus memiliki ID unik jalur yang sama ("track-ID") dengan jalur Dolby sehingga aplikasi memahami bahwa ini adalah dua encoding dari video yang sama.
    • Aplikasi dapat memutuskan trek mana yang akan dipilih berdasarkan kemampuan platform.
    • Karena trek HDR memiliki jenis HDR tertentu, framework akan memilih decoder video Dolby untuk mendekode trek tersebut. Track 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 untuk ditentukan oleh Dolby. Memiliki satu frame CSD diperlukan.

Tindakan Dolby

  1. Tentukan pengemasan unit akses untuk berbagai skema container 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. Terapkan ekstraktor Dolby. Hal ini juga dapat dilakukan oleh Dolby.
  2. Integrasikan DolbyExtractor ke dalam framework. Titik entri adalah frameworks/av/media/libstagefright/MediaExtractor.cpp.
  3. Mendeklarasikan profil dan level dekoder HDR jenis OMX. Contoh: OMX_VIDEO_DOLBYPROFILETYPE dan OMX_VIDEO_DOLBYLEVELTYP.
  4. Menerapkan dukungan untuk indeks: 'OMX.google.android.index.describeColorAspects'
  5. Sebarkan metadata HDR dinamis ke aplikasi dan tampilkan di setiap frame. Biasanya informasi ini harus dikemas ke dalam frame yang didekodekan seperti yang ditentukan oleh Dolby, karena standar HDMI tidak menyediakan cara untuk meneruskan informasi ini 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 mengirim frame ke dekoder.

  • WebM Extractor:
  • Decoder VP9:
    • Decoder menerima bitstream Profile2 dan mendekodenya sebagai stream VP9 normal.
    • Decoder menerima metadata statis HDR apa pun dari framework.
    • Decoder menerima metadata statis melalui unit akses bitstream untuk streaming PQ VP9.
    • Decoder VP9 harus dapat menyebarkan metadata statis/dinamis HDR ke layar.

Tindakan vendor

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