高動態範圍影片播放

高動態範圍 (HDR) 影片是高品質影片解碼的下一個前沿,可提供無與倫比的場景重現品質。方法是大幅增加亮度元件的動態範圍 (從目前的 100 cd/m2 到 1000 的 cd/m2),並使用更大的色域 (BT 2020)。這項技術現在是電視領域 4K UHD 技術演進的核心元素。

Android 10 支援下列 HDR 影片。

  • HDR10
  • VP9
  • HDR10+

從 Android 9 以上版本開始,無論通道模式為何,MediaCodec 都會回報 HDR 中繼資料。您可以在非通道模式下,取得已解碼的資料與靜態/動態中繼資料。如果是使用靜態中繼資料的 HDR10 和 VP9Profile2,系統會以具有索引鍵 KEY_HDR_STATIC_INFO 的輸出格式回報。如果是使用動態中繼資料的 HDR10+,則會在輸出格式中以索引鍵 KEY_HDR10_PLUS_INFO 回報,而且每個輸出影格可能都不同。詳情請參閱「多媒體通道」。

自 Android 7.0 起,初始 HDR 支援功能包括為 HDR 影片管道探索和設定建立適當的常數。也就是說,您必須定義編碼器類型和顯示模式,並指定 HDR 資料必須如何傳遞至 MediaCodec,以及提供給 HDR 解碼器。

本文件旨在協助應用程式開發人員支援 HDR 串流播放功能,並協助原始設備製造商 (OEM) 和 SOC 啟用 HDR 功能。

支援的 HDR 技術

自 Android 7.0 以上版本來說,我們已支援下列 HDR 技術。

科技 Dolby-Vision HDR10 VP9-HLG VP9-PQ
轉碼器 AVC/HEVC HEVC VP9 VP9
轉移函式 ST-2084 ST-2084 HLG ST-2084
HDR 中繼資料類型 動態 靜態 靜態

在 Android 7.0 中,只定義透過隧道模式播放 HDR 內容,但裝置可能會在 SurfaceView 上使用不透明影片緩衝區,支援 HDR 播放功能。換句話說:

  • 目前沒有標準的 Android API,可用於檢查 HDR 播放功能是否支援使用非隧道解碼器。
  • 通告式影片解碼器必須連線至支援 HDR 的顯示器,才能播放 HDR 播放功能。
  • Android 開放原始碼計畫 Android 7.0 版本不支援 HDR 內容的 GL 組成。

探索

HDR 播放功能需使用支援 HDR 的解碼器,並連接到支援 HDR 的顯示器。有些技術需要特定的擷取器

螢幕

應用程式應使用新的 Display.getHdrCapabilities API 查詢指定螢幕支援的 HDR 技術。基本上,這就是 CTA-861.3 所定義 EDID 靜態中繼資料資料區塊中的資訊:

  • public Display.HdrCapabilities getHdrCapabilities()
    傳回螢幕的 HDR 功能。
  • Display.HdrCapabilities
    封裝特定螢幕的 HDR 功能。例如,支援哪些 HDR 類型,以及所需亮度資料的詳細資料。

常數:

  • int HDR_TYPE_DOLBY_VISION
    Dolby Vision 支援。
  • int HDR_TYPE_HDR10
    HDR10/PQ 支援。
  • int HDR_TYPE_HDR10_PLUS
    HDR10+ 支援。
  • int HDR_TYPE_HLG
    支援混合對數-伽瑪。
  • float INVALID_LUMINANCE
    亮度值無效。

公用方法:

  • float getDesiredMaxAverageLuminance()
    傳回所需內容的最大畫面格平均亮度資料 (以 cd/cd/m2 為單位),適用於此螢幕。
  • float getDesiredMaxLuminance()
    針對這個螢幕傳回所需的內容最高亮度資料 (以 cd/cd/m2 為單位)。
  • float getDesiredMinLuminance()
    傳回此螢幕所需的內容最小亮度資料,單位為 cd/cd/m2
  • int[] getSupportedHdrTypes()
    取得螢幕支援的 HDR 類型 (請參閱常數)。如果螢幕不支援 HDR,則傳回空陣列。

解碼器

應用程式應使用現有的 CodecCapabilities.profileLevels API,驗證是否支援新的 HDR 支援設定檔:

Dolby-Vision

MediaFormat MIME 常數:

String MIMETYPE_VIDEO_DOLBY_VISION

MediaCodecInfo.CodecProfileLevel 設定檔常數:

int DolbyVisionProfileDvavPen
int DolbyVisionProfileDvavPer
int DolbyVisionProfileDvheDen
int DolbyVisionProfileDvheDer
int DolbyVisionProfileDvheDtb
int DolbyVisionProfileDvheDth
int DolbyVisionProfileDvheDtr
int DolbyVisionProfileDvheStn

影片應用程式必須將 Dolby Vision 影片層和中繼資料連結為每個影格中的單一緩衝區。這是由 Dolby-Vision 支援 MediaExtractor 自動執行。

HEVC HDR 10

MediaCodecInfo.CodecProfileLevel 設定檔常數:

int HEVCProfileMain10HDR10
int HEVCProfileMain10HDR10Plus

VP9 HLG 和 PQ

MediaCodecInfo.CodecProfileLevel 設定檔常數:

int VP9Profile2HDR
int VP9Profile2HDR10Plus
int VP9Profile3HDR
int VP9Profile3HDR10Plus

如果平台支援 HDR 解碼器,則也應支援 HDR 擷取器。

只有通道解碼器才能夠播放 HDR 內容。透過非隧道解碼器播放時,可能會導致 HDR 資訊遺失,並且將內容平坦化為 SDR 色彩音量。

擷取器

Android 7.0 上的多種 HDR 技術支援下列容器:

科技 Dolby-Vision HDR10 VP9-HLG VP9-PQ
容器 MP4 MP4 WebM WebM

平台不支援發現檔案音軌是否需要 HDR 支援。應用程式可剖析編碼器專屬資料,判斷音軌是否需要特定 HDR 設定檔。

摘要

下表列出各 HDR 技術的元件需求:

科技 Dolby-Vision HDR10 VP9-HLG VP9-PQ
支援的 HDR 類型 (螢幕) HDR_TYPE_DOLBY_VISION HDR_TYPE_HDR10 HDR_TYPE_HLG HDR_TYPE_HDR10
容器 (擷取器) MP4 MP4 WebM WebM
解碼器 MIMETYPE_VIDEO_DOLBY_VISION MIMETYPE_VIDEO_HEVC MIMETYPE_VIDEO_VP9 MIMETYPE_VIDEO_VP9
設定檔 (解碼器) 其中一個 Dolby 設定檔 HEVCProfileMain10HDR10 VP9Profile2HDR 或 VP9Profile3HDR VP9Profile2HDR 或 VP9Profile3HDR

注意:

  • Dolby-Vision 位元串流會以 Dolby 定義的方式封裝在 MP4 容器中。只要應用程式將存取單元從對應層封裝到解碼器的單一存取單元 (定義請見 Dolby),即可實作自身俱備 Dolby 功能的擷取器。
  • 平台可能支援 HDR 相容的擷取器,但沒有對應的 HDR 相容解碼器。

播放

應用程式驗證支援 HDR 播放功能後,能夠播放 HDR 內容的方式與播放非 HDR 內容幾乎相同,但請注意以下事項:

  • 對於 Dolby Vision,特定媒體檔案/音軌是否需要 HDR 解碼器,無法立即提供。應用程式必須事先具有這項資訊,或是能夠剖析 MediaFormat 的轉碼器專屬資料區段來取得這項資訊。
  • CodecCapabilities.isFormatSupported 不會考慮是否需要使用管道解碼器功能來支援這類設定檔。

啟用 HDR 平台支援功能

SoC 供應商和原始設備製造商 (OEM) 必須執行額外作業,才能為裝置啟用 HDR 平台。

Android 7.0 中的 HDR 平台異動

以下是 OEM 和 SOC 需要留意的平台 (應用程式/原生層) 中的一些重要變更。

螢幕

硬體組合

支援 HDR 的平台必須能將 HDR 內容與非 HDR 內容混合。從版本 7.0 開始,Android 並未定義確切的混合特性和作業,但這項程序通常會遵循下列步驟:

  1. 根據圖層的顏色、母帶和潛在的動態中繼資料,判斷含有所有要合成的圖層的線性色彩空間/音量。
    如果直接合成至螢幕,則可以是與螢幕色彩音量相符的線性空間。
  2. 將所有圖層轉換為通用色域。
  3. 執行混合作業。
  4. 如果透過 HDMI 顯示:
    1. 決定混合場景的顏色、後製化和潛在動態中繼資料。
    2. 將產生的混合場景轉換為衍生的色域/音量。
  5. 如果要直接顯示到螢幕,請將產生的混合場景轉換為所需的顯示信號,以產生該場景。

多媒體探索

只有透過 HWC2 才能偵測 HDR 螢幕。裝置實作者必須選擇性啟用搭載 Android 7.0 的 HWC2 轉接器,這項功能才能正常運作。因此,平台必須新增 HWC2 支援功能,或擴充 Android 開放原始碼計畫架構,才能提供這項資訊。HWC2 會公開新的 API,將 HDR 靜態資料傳播至架構和應用程式。

HDMI

  • 連接的 HDMI 螢幕會透過 HDMI EDID 宣告 HDR 功能,如 CTA-861.3 的第 4.2 節所定義。
  • 應使用下列 EOTF 對應:
    • ET_0 傳統伽馬 - SDR 亮度範圍:未對應至任何 HDR 類型
    • ET_1 傳統伽瑪 - HDR 亮度範圍:未對應至任何 HDR 類型
    • ET_2 SMPTE ST 2084 - 對應至 HDR 類型 HDR10
  • 透過 HDMI 支援 Dolby Vision 或 HLG 的信號,是根據相關機構的定義完成。
  • 請注意,HWC2 API 使用所需的浮點亮度值,因此 8 位元 EDID 值必須以適當方式轉譯。

解碼器

平台必須新增支援 HDR 的管道解碼器,並宣傳 HDR 支援功能。一般來說,支援 HDR 的解碼器必須:

  • 支援隧道解碼 (FEATURE_TunneledPlayback)。
  • 支援 HDR 靜態中繼資料 (OMX.google.android.index.describeHDRColorInfo) 及其傳播至螢幕/硬體組合。對於 HLG,必須將適當的中繼資料提交至螢幕。
  • 支援色彩說明 (OMX.google.android.index.describeColorAspects) 及其對顯示/硬體組合的傳播。
  • 支援相關標準定義的 HDR 內嵌中繼資料。

支援 Dolby Vision 解碼器

如要支援 Dolby Vision,平台必須新增支援 Dolby Vision 的 HDR OMX 解碼器。有鑑於 Dolby Vision 的具體細節,這通常是在一或多個 AVC 和/或 HEVC 解碼器及合成器周圍的包裝函式解碼器。這類解碼器必須:

  • 支援 MIME 類型「video/dolby-vision」。
  • 宣傳支援的 Dolby Vision 設定檔/層級。
  • 接受含有 Dolby 定義所有層的子存取單元的存取單元。
  • 接受 Dolby 定義的轉碼器專屬資料。例如,包含 Dolby Vision 設定檔/等級的資料,以及內部解碼器的可能編解碼器專屬資料。
  • 根據 Dolby 規定,支援在 Dolby Vision 設定檔/等級之間進行自動切換。

設定解碼器時,實際的 Dolby 設定檔不會傳送給轉碼器,只會在解碼器啟動後,透過轉碼器專屬資料進行。平台可以選擇支援多個 Dolby Vision 解碼器,一個用於 AVC 設定檔,另一個則用於 HEVC 設定檔,可在設定期間初始化基礎轉碼器。如果單一 Dolby Vision 解碼器支援兩種設定檔,則必須以動態方式在兩者之間切換。

如果平台除了支援一般 HDR 解碼器外,也提供 Dolby Vision 解碼器,則必須符合下列條件:

  • 提供 Dolby Vision 感知擷取工具,即使該工具不支援 HDR 播放也一樣。
  • 提供可支援 Dolby 定義的視覺設定檔的解碼器。

HDR10 解碼器支援

如要支援 HDR10,平台必須新增支援 HDR10 的 OMX 解碼器。這通常是經過隧道化的 HEVC 解碼器,也支援剖析及處理 HDMI 相關中繼資料。除了支援一般 HDR 解碼器外,這類解碼器還必須符合下列條件:

  • 支援 MIME 類型「video/hevc」。
  • 廣告支援 HEVCMain10HDR10。支援 HEVCMain10HRD10 設定檔也必須支援 HEVCMain10 設定檔,而 HEVCMain10 設定檔也必須支援 HEVCMain 設定檔。
  • 支援剖析後製中繼資料 SEI 區塊,以及 SPS 中包含的其他 HDR 相關資訊。

VP9 解碼器支援

如要支援 VP9 HDR,平台必須新增支援 VP9 Profile2 的 HDR OMX 解碼器。通常是經過通道的 VP9 解碼器,同樣支援處理 HDMI 相關中繼資料。除了一般 HDR 解碼器之外,這類解碼器必須:

  • 支援 MIME 類型「video/x-vnd.on2.vp9」。
  • 宣傳支援的 VP9Profile2HDR。如要支援 VP9Profile2HDR 設定檔,也必須在相同層級支援 VP9Profile2 設定檔。

Extractor

支援 Dolby Vision Extractor

支援 Dolby Vision 解碼器的平台必須新增 Dolby Extractor (稱為 Dolby Extractor),以便支援 Dolby Video 內容。

  • 一般 MP4 擷取器只能從檔案擷取基本圖層,但無法從強化項目或中繼資料層擷取。因此您需要使用特殊的 Dolby 擷取工具從檔案擷取資料
  • Dolby 擷取器必須為每個 Dolby 視訊音軌 (群組) 公開 1 到 2 個音軌:
    • 以「video/dolby-vision」類型,提供結合 2/3 層 Dolby 串流的 Dolby Vision HDR 音軌。HDR 音軌的存取單位格式會定義如何將基本/強化/中繼資料層的存取單元封裝成單一緩衝區,並解碼為單一 HDR 影格,需由 Dolby 定義。
    • 如果 Dolby Vision 視訊音軌包含獨立 (回溯相容) 的基礎層 (BL),擷取器也必須以獨立的「video/avc」或「video/hevc」音軌公開發布。擷取器必須為這個測試群組提供一般 AVC/HEVC 存取單位。
    • BL 音軌的軌跡-專屬 ID (「track-ID」) 必須與 HDR 音軌相同,讓應用程式知道這兩個影片是同一影片的兩個編碼。
    • 應用程式可以根據平台的功能決定要選擇哪個音軌。
  • Dolby Vision 設定檔/層級必須以 HDR 音軌的軌跡格式公開。
  • 如果平台提供支援 HDR 播放功能的 Dolby-Vision,同樣也必須提供 Dolby-Vision 感知擷取器。

HDR10 和 VP9 HDR 擷取器支援

沒有額外的擷取器要求可以支援 HDR10 或 VP9 HLG。平台必須擴充 MP4 Extractor,才能支援 MP4 中的 VP9 PQ。HDR 靜態中繼資料必須在 VP9 PQ 位元串中傳播,以便透過一般 MediaExtractor => MediaCodec 管道,將這項中繼資料傳遞至 VP9 PQ 解碼器和顯示器。

支援 Dolby Vision 的 Stagefright 擴充功能

平台必須在 Stagefright 中新增 Dolby Vision 格式支援功能:

  • 支援壓縮通訊埠的通訊埠定義查詢。
  • 支援 DV 解碼器的設定檔/層級列舉。
  • 支援為 DV HDR 音軌公開 DV 設定檔/等級。

特定技術的實作詳細資料

HDR10 解碼器管道

圖 1. HDR10 管道

HDR10 位元串流會封裝在 MP4 容器中。應用程式會使用一般 MP4 Extractor 擷取影格資料,並將資料傳送至解碼器。

  • MPEG4 擷取器
    MPEG4Extractor 將 HDR10 位元串流視為正常的 HEVC 串流,並擷取類型為「video/HEVC」的 HDR 音軌。該架構會挑選支援 Main10HDR10 設定檔的 HEVC 視訊解碼器,用於解碼該音軌。
  • HEVC 解碼器
    HDR 資訊位於 SEI 或 SPS 中。HEVC 解碼器會先接收含 HDR 資訊的影格。解碼器會接著擷取 HDR 資訊,並通知應用程式正在解碼 HDR 影片。HDR 資訊會與解碼器輸出格式合併,再套用至途徑。

供應商採取的行動

  1. 宣傳支援的 HDR 解碼器設定檔和 OMX 類型等級。例如:
    OMX_VIDEO_HEVCProfileMain10HDR10 (和 Main10)
  2. 實作索引支援:'OMX.google.android.index.describeHDRColorInfo'
  3. 實作索引「OMX.google.android.index.describeColorAspects」的支援
  4. 實作對主化中繼資料的 SEI 剖析功能支援。

Dolby Vision 解碼器管道

圖 2. Dolby Vision 管道

Dolby-bit-stream 會依照 Dolby 定義的 MP4 容器封裝。理論上,應用程式可以使用一般 MP4 擷取器來單獨擷取基本層、強化層和中繼資料層,但並不符合目前的 Android MediaExtractor/MediaCodec 模型。

  • DolbyExtractor:
    • DolbyExtractor 會辨識 Dolby 位元流,並將各種層公開為每個 Dolby 影片軌道 (群組) 的 1 到 2 個音軌:
      • 類型為「video/dolby-vision」類型的 HDR 音軌,其類型為合併後的 2/3 層 Dolby 串流。HDR 音軌的存取單位格式會定義如何將基本/強化/中繼資料層中的存取單位封裝成單一緩衝區,並由 Dolby 定義。
      • (選用,僅適用於 BL 回溯相容時選用) BL 音軌僅包含基本層,且必須使用一般 MediaCodec 解碼器進行解碼,例如 AVC/HEVC 解碼器。擷取器應為此音軌提供一般 AVC/HEVC 存取單位。這個 BL 音軌的軌跡-專屬 ID (「track-ID」) 必須與 Dolby 音軌相同,讓應用程式知道這兩個影片是同一部影片的兩種編碼。
    • 應用程式可以根據平台的功能決定要選擇哪個音軌。
    • 由於 HDR 音軌具有特定 HDR 類型,因此架構會挑選 Dolby 影像解碼器來解碼該音軌。系統會使用一般 AVC/HEVC 影片解碼器解碼 BL 音軌。
  • DolbyDecoder:
    • DolbyDecoder 收到的存取單元含有所有層 (EL+BL+MD 或 BL+MD) 所需的存取單位
    • 個別圖層的 CSD (編解碼專屬資料,例如 SPS+PPS+VPS) 資訊可封裝至 1 個 CSD 影格,以便由 Dolby 定義。必須有單一 CSD 影格。

Dolby 動作

  1. 為各種 Dolby 容器配置 (例如 BL+EL+MD) 為抽象 Dolby 解碼器 (也就是 HDR 解碼器預期的緩衝區格式) 定義存取單位。
  2. 為抽象 Dolby 解碼器定義 CSD 的封裝。

廠商應採取的行動

  1. 實作 Dolby Extractor。Dolby 也能執行這項操作。
  2. 將 DolbyExtractor 整合至架構。進入點為 frameworks/av/media/libstagefright/MediaExtractor.cpp
  3. 宣告 HDR 解碼器設定檔和 OMX 類型等級。例如 OMX_VIDEO_DOLBYPROFILETYPEOMX_VIDEO_DOLBYLEVELTYP
  4. 實作索引的支援:'OMX.google.android.index.describeColorAspects'
  5. 將動態 HDR 中繼資料傳播至應用程式,並在每個影格中顯示。通常,這類資訊必須按照 Dolby 定義的方式,封裝至解碼影格,因為 HDMI 標準並未提供將這類資訊傳遞至螢幕的方法。

VP9 解碼器管道

圖 3. VP9-PQ 管道

WebM 團隊定義的封裝方式,會將 VP9 位元串流封裝在 WebM 容器中。應用程式必須使用 WebM Extractor,才能從位元串流中擷取 HDR 中繼資料,然後再將影格傳送至解碼器。

  • WebM 擷取器:
  • VP9 解碼器:
    • 解碼器會接收 Profile2 位元流,將其解碼為一般 VP9 串流。
    • 解碼器會從架構接收任何 HDR 靜態中繼資料。
    • 解碼器會透過 VP9 PQ 串流的位元存取單位接收靜態中繼資料。
    • VP9 解碼器必須能將 HDR 靜態/動態中繼資料傳播至螢幕上。

供應商採取的行動

  1. 實作索引支援功能: OMX.google.android.index.describeHDRColorInfo
  2. 實作索引支援功能:OMX.google.android.index.describeColorAspects
  3. 散發 HDR 靜態中繼資料