高動態範圍影片播放

高動態範圍 (HDR) 視訊是高品質視訊解碼的下一個前沿,帶來無與倫比的場景再現品質。它透過顯著增加亮度分量的動態範圍(從目前的 100 cd/m 2到 1000 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_HDR10_PLUS
    HDR10+ 支援。
  • 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
int HEVCProfileMain10HDR10Plus

VP9 HLG 和 PQ

MediaCodecInfo.CodecProfileLevel設定檔常數:

int VP9Profile2HDR
int VP9Profile2HDR10Plus
int VP9Profile3HDR
int VP9Profile3HDR10Plus

如果平台支援支援 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 內容混合。自 7.0 版本起,Android 尚未定義確切的混合特性和操作,但該過程通常遵循以下步驟:

  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 解碼器支援之外還提供支援杜比視界的解碼器,則它必須:

  • 提供杜比視界感知提取器,即使它不支援 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 軌道的軌道格式公開。
  • 如果平台提供支援杜比視界的解碼器,則它還必須提供支援杜比視界的提取器,即使它不支援 HDR 播放。

HDR10 和 VP9 HDR 擷取器支援

支援 HDR10 或 VP9 HLG 沒有額外的提取器要求。平台必須擴展 MP4 提取器以支援 MP4 中的 VP9 PQ。 HDR 靜態元資料必須在 VP9 PQ 位元流中傳播,以便該元資料透過正常 MediaExtractor => MediaCodec 管道傳遞到 VP9 PQ 解碼器並傳遞到顯示器。

Stagefright 擴展支援杜比視界

平台必須為 Stagefright 新增杜比視界格式支援:

  • 支援壓縮連接埠的連接埠定義查詢。
  • 支援 DV 解碼器的設定檔/等級枚舉。
  • 支援公開 DV HDR 軌道的 DV 設定檔/等級。

特定技術的實作細節

HDR10解碼器管線

圖 1. HDR10 管道

HDR10 位元流打包在 MP4 容器中。應用程式使用常規 MP4 提取器來提取幀資料並將其發送到解碼器。

  • MPEG4提取器
    MPEG4Extractor 將 HDR10 位元流識別為普通 HEVC 串流,並且將提取類型為「視訊/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 軌道必須具有與杜比軌道相同的軌道唯一 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 提取器:
    • WebM Extractor 從 容器中提取 HDR 元資料和訊框。
  • VP9解碼器:
    • 解碼器接收 Profile2 位元流並將其作為普通 VP9 流進行解碼。
    • 解碼器從框架接收任何 HDR 靜態元資料。
    • 解碼器透過 VP9 PQ 流的位元流存取單元接收靜態元資料。
    • VP9 解碼器必須能夠將 HDR 靜態/動態元資料傳播到顯示器。

供應商行動

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