高動態範圍 (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 中繼資料類型 | 動態 | 靜態 | None | 靜態 |
在 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
支援 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 平台異動
以下是平台 (應用程式/原生層) 的幾項重大異動,原始設備製造商和系統單晶片供應商必須留意。
螢幕
硬體組合
支援 HDR 的平台必須支援將 HDR 內容與非 HDR 內容混合。Android 7.0 版並未定義確切的混合特徵和作業,但這個程序通常會依下列步驟進行:
- 根據圖層的顏色、母帶處理和潛在動態中繼資料,判斷包含所有要合成圖層的線性色彩空間/體積。
如果直接合成到螢幕,這可能是與螢幕色域相符的線性空間。 - 將所有圖層轉換為通用色域。
- 執行混合作業。
- 如果透過 HDMI 顯示:
- 判斷混合場景的顏色、母帶處理和潛在動態中繼資料。
- 將混合場景轉換為衍生色域/體積。
- 如果直接顯示在螢幕上,請將產生的混合場景轉換為必要的螢幕信號,以產生該場景。
顯示探索
只有 HWC2 支援探索 HDR 螢幕。裝置實作人員必須選擇性啟用隨 Android 7.0 發布的 HWC2 介面卡,這項功能才能運作。因此,平台必須新增 HWC2 支援功能,或擴充 AOSP 架構,以便提供這項資訊。HWC2 會公開新的 API,將 HDR 靜態資料傳播至架構和應用程式。
HDMI
- 連線的 HDMI 螢幕會透過 HDMI EDID 宣傳 HDR 功能,如 CTA-861.3 第 4.2 節所定義。
- 請使用下列 EOTF 對應:
- ET_0 傳統 Gamma - SDR 亮度範圍:未對應至任何 HDR 類型
- ET_1 傳統 Gamma - 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 解碼器以及合成器的封裝解碼器。這類解碼器必須:
- 支援「video/dolby-vision」MIME 類型。
- 宣傳支援的 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 解碼器外) 必須:
- 支援「video/hevc」MIME 類型。
- 宣傳支援 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 設定檔。
擷取器
支援 Dolby Vision 擷取器
支援 Dolby Vision 解碼器的平台必須為 Dolby 影片內容新增 Dolby 擷取器 (稱為 Dolby Extractor) 支援。
- 一般的 MP4 擷取器只能從檔案擷取基礎層,但無法擷取強化或中繼資料層。因此需要使用特殊的 Dolby 擷取器,才能從檔案中擷取資料。
- Dolby 擷取器必須為每個 Dolby 視訊軌 (群組) 公開 1 到 2 個音軌:
- 類型為「video/dolby-vision」的 Dolby Vision HDR 軌,適用於合併的 2/3 層 Dolby 串流。HDR 軌的存取單元格式 (定義如何將基礎/增強/中繼資料層的存取單元封裝成單一緩衝區,解碼為單一 HDR 影格) 將由 Dolby 定義。
- 如果 Dolby Vision 視訊軌包含獨立的 (可向後相容) 基礎層 (BL),擷取器也必須將此層顯示為獨立的「video/avc」或「video/hevc」軌。擷取器必須定期提供這個軌的 AVC/HEVC 存取單元。
- BL 軌必須與 HDR 軌具有相同的軌專屬 ID (「軌 ID」),應用程式才能瞭解這是同一部影片的兩種編碼。
- 應用程式可以根據平台的效能決定要選擇哪個軌。
- Dolby Vision 設定檔/層級必須顯示在 HDR 軌的軌道格式中。
- 如果平台提供支援 Dolby Vision 的解碼器,即使不支援 HDR 播放,也必須提供支援 Dolby Vision 的擷取器。
支援 HDR10 和 VP9 HDR 擷取器
如要支援 HDR10 或 VP9 HLG,不需要其他擷取器。平台必須擴充 MP4 擷取器,才能支援 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 擷取器擷取影格資料,並傳送至解碼器。
- MPEG4 擷取器
MPEG4Extractor 會將 HDR10 位元串流辨識為一般 HEVC 串流,並擷取類型為「video/HEVC」的 HDR 軌。架構會選取支援 Main10HDR10 設定檔的 HEVC 視訊解碼器,解碼該軌。 - HEVC 解碼器
HDR 資訊位於 SEI 或 SPS。HEVC 解碼器會先收到包含 HDR 資訊的影格。解碼器接著會擷取 HDR 資訊,並通知應用程式正在解碼 HDR 影片。HDR 資訊會封裝至解碼器輸出格式,稍後會傳播至介面。
廠商應採取的行動
- 宣傳支援的 HDR 解碼器設定檔和層級 OMX 類型。示例:
OMX_VIDEO_HEVCProfileMain10HDR10
(和Main10
) - 實作 index:'
OMX.google.android.index.describeHDRColorInfo
' 的支援 - 實作 index:'
OMX.google.android.index.describeColorAspects
' 的支援 - 實作 SEI 剖析功能,支援母帶製作中繼資料。
Dolby Vision 解碼器管道
圖 2. Dolby Vision 管道
Dolby 位元串流會封裝在 MP4 容器中,如 Dolby 所定義。理論上,應用程式可以使用一般 MP4 擷取器,分別擷取基礎層、強化層和中繼資料層,但這不符合目前的 Android MediaExtractor/MediaCodec 模型。
- DolbyExtractor:
- DolbyExtractor 會辨識 Dolby 位元串流,並為每個 Dolby 視訊軌 (群組) 將各個層公開為 1 到 2 個音軌:
- 類型為「video/dolby-vision」的 HDR 軌,適用於合併的 2/3 層 Dolby 串流。HDR 軌的存取單元格式 (定義如何將基礎/強化/中繼資料層的存取單元封裝到單一緩衝區,解碼為單一 HDR 影格) 將由 Dolby 定義。
- (選用,僅限 BL 回溯相容時) BL 軌道只包含基礎層,必須可由一般 MediaCodec 解碼器解碼,例如 AVC/HEVC 解碼器。擷取器應為這條音軌提供規律的 AVC/HEVC 存取單元。這個 BL 音軌必須與 Dolby 音軌具有相同的音軌專屬 ID (「track-ID」),應用程式才能瞭解這是同一部影片的兩種編碼。
- 應用程式可以根據平台的效能決定要選擇哪個軌。
- 由於 HDR 軌具有特定 HDR 類型,架構會選擇 Dolby 視訊解碼器來解碼該軌。BL 軌會由一般的 AVC/HEVC 影片解碼器解碼。
- DolbyExtractor 會辨識 Dolby 位元串流,並為每個 Dolby 視訊軌 (群組) 將各個層公開為 1 到 2 個音軌:
- DolbyDecoder:
- DolbyDecoder 會收到存取單元,其中包含所有圖層 (EL+BL+MD 或 BL+MD) 的必要存取單元
- 個別層的 CSD (編解碼器專屬資料,例如 SPS+PPS+VPS) 資訊可封裝成 1 個 CSD 影格,由 Dolby 定義。必須要有單一 CSD 影格。
Dolby 動作
- 針對抽象 Dolby 解碼器 (即 HDR 解碼器預期的緩衝區格式),為各種 Dolby 容器架構 (例如 BL+EL+MD) 定義存取單位的封裝。
- 為抽象 Dolby 解碼器定義 CSD 的封裝。
廠商應採取的行動
- 實作 Dolby 擷取器。Dolby 也能提供這項服務。
- 將 DolbyExtractor 整合至架構中。進入點為
frameworks/av/media/libstagefright/MediaExtractor.cpp
。 - 宣告 HDR 解碼器設定檔和層級 OMX
型別。例如:
OMX_VIDEO_DOLBYPROFILETYPE
和OMX_VIDEO_DOLBYLEVELTYP
。 - 實作索引支援:
'OMX.google.android.index.describeColorAspects
' - 將動態 HDR 中繼資料傳播至每個影格的應用程式和介面。通常這項資訊必須封裝到 Dolby 定義的已解碼影格中,因為 HDMI 標準無法將這項資訊傳遞至螢幕。
VP9 解碼器管道
圖 3. VP9-PQ 管道
VP9 位元串會封裝在 WebM 容器中,封裝方式由 WebM 團隊定義。應用程式必須使用 WebM 擷取器,從位元串流擷取 HDR 中繼資料,然後再將影格傳送至解碼器。
- WebM 擷取工具:
- VP9 解碼器:
- 解碼器會接收 Profile2 位元串流,並將其解碼為一般 VP9 串流。
- 解碼器會從架構接收任何 HDR 靜態中繼資料。
- 解碼器會透過 VP9 PQ 串流的位元串流存取單元接收靜態中繼資料。
- VP9 解碼器必須能夠將 HDR 靜態/動態中繼資料傳播至螢幕。
廠商應採取的行動
- 實作索引支援功能:
OMX.google.android.index.describeHDRColorInfo
- 實作索引支援功能:
OMX.google.android.index.describeColorAspects
- 傳播 HDR 靜態中繼資料