HDR 視頻播放

高動態範圍 (HDR) 視頻是高質量視頻解碼的下一個前沿,帶來無與倫比的場景再現質量。它通過顯著增加亮度分量的動態範圍(從當前的 100 cd/m 2到 1000s 的 cd/m 2 )和使用更廣泛的色彩空間(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 技術。

技術杜比視界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 播放功能的隧道視頻解碼器必須支持 HDR 播放。
  • AOSP 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
    杜比視界支持。
  • int HDR_TYPE_HDR10
    HDR10 / PQ 支持。
  • int HDR_TYPE_HLG
    混合對數伽瑪支持。
  • float INVALID_LUMINANCE
    無效的亮度值。

公共方法:

  • float getDesiredMaxAverageLuminance()
    返回此顯示器所需的內容最大幀平均亮度數據(以 cd/cd/m 2為單位)。
  • float getDesiredMaxLuminance()
    返回此顯示器所需的內容最大亮度數據(以 cd/cd/m 2為單位)。
  • float getDesiredMinLuminance()
    以 cd/cd/m 2為單位返回此顯示器所需的內容最小亮度數據。
  • int[] getSupportedHdrTypes()
    獲取此顯示器支持的 HDR 類型(請參閱常量)。如果顯示器不支持 HDR,則返回空數組。

解碼器

應用程序應使用現有的CodecCapabilities.profileLevels API 來驗證對新的支持 HDR 的配置文件的支持:

杜比視界

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

視頻應用程序必須將杜比視界視頻層和元數據連接到每幀的單個緩衝區中。這是由支持杜比視界的 MediaExtractor 自動完成的。

HEVC HDR 10

MediaCodecInfo.CodecProfileLevel配置文件常量:

int HEVCProfileMain10HDR10

VP9 HLG & PQ

MediaCodecInfo.CodecProfileLevel配置文件常量:

int VP9Profile2HDR
int VP9Profile3HDR

如果平台支持支持 HDR 的解碼器,它還應支持支持 HDR 的提取器。

只有隧道解碼器才能保證播放 HDR 內容。非隧道解碼器播放可能會導致 HDR 信息丟失並且內容被扁平化為 SDR 顏色體積。

提取器

Android 7.0 上的各種 HDR 技術支持以下容器:

技術杜比視界HDR10 VP9-HLG VP9-PQ
容器MP4 MP4網絡管理網絡管理

平台不支持發現(文件的)軌道是否需要 HDR 支持。應用程序可以解析特定於編解碼器的數據以確定軌道是否需要特定的 HDR 配置文件。

概括

下表列出了每種 HDR 技術的組件要求:

技術杜比視界HDR10 VP9-HLG VP9-PQ
支持的 HDR 類型(顯示器) HDR_TYPE_DOLBY_VISION HDR_TYPE_HDR10 HDR_TYPE_HLG HDR_TYPE_HDR10
容器(提取器) MP4 MP4網絡管理網絡管理
解碼器MIMETYPE_VIDEO_DOLBY_VISION MIMETYPE_VIDEO_HEVC MIMETYPE_VIDEO_VP9 MIMETYPE_VIDEO_VP9
配置文件(解碼器)杜比配置文件之一HEVCProfileMain10HDR10 VP9Profile2HDR 或 VP9Profile3HDR VP9Profile2HDR 或 VP9Profile3HDR

筆記:

  • 杜比視界比特流以杜比定義的方式封裝在 MP4 容器中。應用程序可以實現自己的支持杜比的提取器,只要它們將來自相應層的訪問單元打包到杜比定義的解碼器的單個訪問單元中。
  • 一個平台可能支持支持 HDR 的提取器,但不支持相應的支持 HDR 的解碼器。

回放

在應用程序驗證了對 HDR 播放的支持後,它可以播放 HDR 內容,其播放方式幾乎與播放非 HDR 內容的方式相同,但需要注意以下幾點:

  • 對於杜比視界,特定媒體文件/軌道是否需要支持 HDR 的解碼器無法立即獲得。應用程序必須事先擁有此信息,或者能夠通過解析 MediaFormat 的編解碼器特定數據部分來獲取此信息。
  • CodecCapabilities.isFormatSupported不考慮是否需要隧道解碼器功能來支持此類配置文件。

啟用 HDR 平台支持

SoC 供應商和 OEM 必須做額外的工作來為設備啟用 HDR 平台支持。

Android 7.0 中用於 HDR 的平台更改

以下是 OEM 和 SOC 需要注意的平台(應用程序/原生層)的一些關鍵變化。

展示

硬件組成

支持 HDR 的平台必須支持將 HDR 內容與非 HDR 內容混合。 Android 7.0 版尚未定義確切的混合特性和操作,但該過程通常遵循以下步驟:

  1. 根據圖層的顏色、母版和潛在的動態元數據,確定包含要合成的所有圖層的線性色彩空間/體積。
    如果直接合成到顯示器,這可能是與顯示器的顏色體積相匹配的線性空間。
  2. 將所有圖層轉換為公共色彩空間。
  3. 執行混合。
  4. 如果通過 HDMI 顯示:
    1. 確定混合場景的顏色、母帶處理和潛在的動態元數據。
    2. 將生成的混合場景轉換為派生的顏色空間/體積。
  5. 如果直接在顯示器上顯示,則將生成的混合場景轉換為所需的顯示信號以生成該場景。

顯示發現

僅通過 HWC2 支持 HDR 顯示發現。設備實現者必須選擇性地啟用隨 Android 7.0 發布的 HWC2 適配器,才能使此功能正常工作。因此,平台必須添加對 HWC2 的支持或擴展 AOSP 框架以允許提供此信息的方式。 HWC2 公開了一個新的 API 來將 HDR 靜態數據傳播到框架和應用程序。

HDMI

  • 連接的 HDMI 顯示器通過CTA-861.3第 4.2 節中定義的 HDMI EDID 宣傳其 HDR 功能。
  • 應使用以下 EOTF 映射:
    • ET_0 傳統伽瑪 - SDR 亮度範圍:未映射到任何 HDR 類型
    • ET_1 傳統伽瑪 - HDR 亮度範圍:未映射到任何 HDR 類型
    • ET_2 SMPTE ST 2084 - 映射到 HDR 類型 HDR10
  • HDMI 上的杜比視界或 HLG 支持信號由其相關機構定義完成。
  • 請注意,HWC2 API 使用浮點所需的亮度值,因此必須以適當的方式轉換 8 位 EDID 值。

解碼器

平台必須添加支持 HDR 的隧道解碼器並宣傳其 HDR 支持。通常,支持 HDR 的解碼器必須:

  • 支持隧道解碼( FEATURE_TunneledPlayback )。
  • 支持 HDR 靜態元數據 ( OMX.google.android.index.describeHDRColorInfo ) 及其對顯示器/硬件組合的傳播。對於 HLG,必須將適當的元數據提交給顯示器。
  • 支持顏色描述( OMX.google.android.index.describeColorAspects )及其傳播到顯示器/硬件組合。
  • 支持相關標准定義的 HDR 嵌入元數據。

杜比視界解碼器支持

要支持杜比視界,平台必須添加支持杜比視界的 HDR OMX 解碼器。鑑於杜比視界的細節,這通常是一個或多個 AVC 和/或 HEVC 解碼器以及合成器的封裝解碼器。此類解碼器必須:

  • 支持 mime 類型“視頻/杜比視覺”。
  • 宣傳支持的杜比視界配置文件/級別。
  • 接受包含杜比定義的所有層的子訪問單元的訪問單元。
  • 接受杜比定義的編解碼器特定數據。例如,包含杜比視界配置文件/級別的數據,可能還有內部解碼器的編解碼器特定數據。
  • 支持杜比要求的杜比視界配置文件/級別之間的自適應切換。

配置解碼器時,實際的杜比配置文件不會傳送到編解碼器。這僅在解碼器啟動後通過編解碼器特定數據完成。一個平台可以選擇支持多個杜比視界解碼器:一個用於 AVC 配置文件,另一個用於 HEVC 配置文件,以便能夠在配置期間初始化底層編解碼器。如果單個杜比視界解碼器支持這兩種類型的配置文件,它還必須支持以自適應方式在這些配置文件之間動態切換。

如果平台除了提供一般 HDR 解碼器支持外,還提供支持杜比視界的解碼器,則它必須:

  • 提供 Dolby-Vision 感知提取器,即使它不支持 HDR 播放。
  • 提供支持杜比定義的視覺配置文件的解碼器。

HDR10 解碼器支持

要支持 HDR10,平台必須添加支持 HDR10 的 OMX 解碼器。這通常是一個隧道 HEVC 解碼器,還支持解析和處理 HDMI 相關元數據。這樣的解碼器(除了一般的 HDR 解碼器支持)必須:

  • 支持 mime 類型“video/hevc”。
  • 宣傳支持的 HEVCMain10HDR10。 HEVCMain10HRD10 配置文件支持還需要支持 HEVCMain10 配置文件,這需要在相同級別支持 HEVCMain 配置文件。
  • 支持解析母帶元數據 SEI 塊,以及 SPS 中包含的其他 HDR 相關信息。

VP9解碼器支持

要支持 VP9 HDR,平台必須添加支持 VP9 Profile2 的 HDR OMX 解碼器。這通常是一個隧道 VP9 解碼器,也支持處理 HDMI 相關元數據。此類解碼器(除了一般的 HDR 解碼器支持外)必須:

  • 支持 mime 類型“video/x-vnd.on2.vp9”。
  • 宣傳支持的 VP9Profile2HDR。 VP9Profile2HDR 配置文件支持還需要在同一級別支持 VP9Profile2 配置文件。

提取器

杜比視界提取器支持

支持杜比視界解碼器的平台必須為杜比視頻內容添加杜比提取器(稱為杜比提取器)支持。

  • 常規 MP4 提取器只能從文件中提取基礎層,而不能提取增強層或元數據層。所以需要一個特殊的杜比提取器來從文件中提取數據。
  • 杜比提取器必須為每個杜比視頻軌道(組)公開 1 到 2 個軌道:
    • 具有“視頻/杜比視覺”類型的杜比視界 HDR 軌道,用於組合的 2/3 層杜比流。 HDR 軌道的訪問單元格式定義瞭如何將來自基礎/增強/元數據層的訪問單元打包到單個緩衝區中以解碼為單個 HDR 幀,由杜比定義。
    • 如果杜比視界視頻軌道包含單獨的(向後兼容的)基​​礎層 (BL),則提取器還必須將其公開為單獨的“video/avc”或“video/hevc”軌道。提取器必須為此軌道提供常規的 AVC/HEVC 訪問單元。
    • BL 軌道必須與 HDR 軌道具有相同的軌道唯一 ID(“軌道 ID”),以便應用了解這是同一視頻的兩種編碼。
    • 應用程序可以根據平台的能力決定選擇哪個軌道。
  • 杜比視界配置文件/級別必須以 HDR 軌道的軌道格式公開。
  • 如果平台提供支持 Dolby-Vision 的解碼器,則它還必須提供可識別 Dolby-Vision 的提取器,即使它不支持 HDR 播放。

HDR10 和 VP9 HDR 提取器支持

支持 HDR10 或 VP9 HLG 沒有額外的提取器要求。平台必須擴展 MP4 提取器以支持 MP4 中的 VP9 PQ。 HDR 靜態元數據必須在 VP9 PQ 比特流中傳播,以便此元數據通過正常的 MediaExtractor => MediaCodec 管道傳遞到 VP9 PQ 解碼器和顯示器。

支持杜比視界的 Stagefright 擴展

平台必須為 Stagefright 添加 Dolby Vision 格式支持:

  • 支持壓縮端口的端口定義查詢。
  • 支持 DV 解碼器的配置文件/級別枚舉。
  • 支持公開 DV HDR 軌道的 DV 配置文件/級別。

特定技術的實現細節

HDR10 解碼器流水線

圖 1. HDR10 流水線

HDR10 比特流封裝在 MP4 容器中。應用程序使用常規 MP4 提取器來提取幀數據並將其發送到解碼器。

  • MPEG4 提取器
    HDR10 比特流被 MPEG4Extractor 識別為普通的 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 解析的支持。

杜比視界解碼器管道

圖 2.杜比視界管道

杜比比特流封裝在杜比定義的 MP4 容器中。理論上,應用程序可以使用常規 MP4 提取器來獨立提取基礎層、增強層和元數據層;但是,這不適合當前的 Android MediaExtractor/MediaCodec 模型。

  • 杜比提取器:
    • 杜比比特流由 DolbyExtractor 識別,它將各個層公開為每個杜比視頻軌道(組)的 1 到 2 個軌道:
      • 用於組合 2/3 層杜比流的“視頻/杜比視覺”類型的 HDR 軌道。 HDR 軌道的訪問單元格式定義瞭如何將來自基礎/增強/元數據層的訪問單元打包到單個緩衝區中以解碼為單個 HDR 幀,由杜比定義。
      • (可選,僅當 BL 向後兼容時)BL 軌道僅包含基礎層,該基礎層必須可由常規 MediaCodec 解碼器解碼,例如 AVC/HEVC 解碼器。提取器應為此軌道提供常規的 AVC/HEVC 訪問單元。此 BL 軌道必須具有與 Dolby 軌道相同的軌道唯一 ID(“軌道 ID”),以便應用程序了解這是同一視頻的兩種編碼。
    • 應用程序可以根據平台的能力決定選擇哪個軌道。
    • 因為 HDR 軌道具有特定的 HDR 類型,所以框架將選擇一個杜比視頻解碼器來解碼該軌道。 BL 軌道將由常規 AVC/HEVC 視頻解碼器解碼。
  • 杜比解碼器:
    • DolbyDecoder 接收包含所有層(EL+BL+MD 或 BL+MD)所需的訪問單元的訪問單元
    • 各個層的 CSD(編解碼器特定數據,例如 SPS+PPS+VPS)信息可以打包到 1 個 CSD 幀中,由杜比定義。需要一個 CSD 幀。

杜比動作

  1. 為抽像杜比解碼器(即 HDR 解碼器所期望的緩衝區格式)定義各種杜比容器方案(例如 BL+EL+MD)的訪問單元封裝。
  2. 為抽像杜比解碼器定義 CSD 的封裝。

供應商行動

  1. 實現杜比提取器。這也可以由杜比完成。
  2. 將 DolbyExtractor 集成到框架中。入口點是frameworks/av/media/libstagefright/MediaExtractor.cpp
  3. 聲明 HDR 解碼器配置文件和級別 OMX 類型。示例: OMX_VIDEO_DOLBYPROFILETYPEOMX_VIDEO_DOLBYLEVELTYP
  4. 實現對索引的支持: 'OMX.google.android.index.describeColorAspects '
  5. 在每一幀中將動態 HDR 元數據傳播到應用程序和表面。通常,此信息必須按照杜比的定義打包到解碼幀中,因為 HDMI 標準不提供將其傳遞到顯示器的方法。

VP9解碼器流水線

圖 3. VP9-PQ 管道

VP9 比特流以 WebM 團隊定義的方式打包在 WebM 容器中。在將幀發送到解碼器之前,應用程序需要使用 WebM 提取器從比特流中提取 HDR 元數據。

  • WebM 提取器:
  • VP9 解碼器:
    • 解碼器接收 Profile2 比特流並將它們解碼為正常的 VP9 流。
    • 解碼器從框架接收任何 HDR 靜態元數據。
    • 解碼器通過 VP9 PQ 流的比特流訪問單元接收靜態元數據。
    • VP9 解碼器必須能夠將 HDR 靜態/動態元數據傳播到顯示器。

供應商行動

  1. 實現對索引的支持: OMX.google.android.index.describeHDRColorInfo
  2. 實現對索引的支持: OMX.google.android.index.describeColorAspects
  3. 傳播 HDR 靜態元數據