先看图,在Android机顶盒或电视机中常常能看到这些高级设置


HDR/SDR 功能"到底在哪些环节生效、怎么算生效、怎么验证。
- 高动态范围 HDR(High Dynamic Range)
-
人话版:让亮的地方更亮、暗的地方更暗,同时都看得见。
-
技术版:峰值亮度 ≥ 1000 cd/m²、黑场 ≤ 0.05 cd/m²,同时色域 BT.2020、色深 10-bit、光电转换函数 PQ(Perceptual Quantizer,EOTF-2)或 HLG(Hybrid Log-Gamma,EOTF-3)。
-
Hi3798MV200 落点:
-- 解码器
VDEC_CAP_HDR10 | VDEC_CAP_HLG
能力位置寄存器0x1f00[21:20]
;-- HDMI 2.0 Tx 模块
HDR_INFOFRAME
寄存器0x4a0~0x4af
负责把 EOTF/Metadata 随视频帧送出去。
- 标准动态范围 SDR(Standard Dynamic Range)
-
人话版:传统电视/手机能直接看的"正常"画面。
-
技术版:峰值亮度 100 cd/m²、色域 BT.709、色深 8-bit、伽马 2.4(EOTF-0)。
-
落点:
-- VDP 后级
HDR2SDR_GAMUT
模块,寄存器0x2c00~0x2cff
存放 3DLUT/1DLUT 系数表;-- 目标亮度 100 nits 在
0x2c10
可配。
- 电光转换函数 EOTF(Electro-Optical Transfer Function)
-
人话版:把"数字码值"翻译成"屏幕到底该发多少光"的公式。
-
技术版:
-- SDR:BT.1886 幂函数(gamma 2.4);
-- HDR10:SMPTE ST 2084 PQ 曲线;
-- HLG:ARIB STD-B67 对数+线性分段。
-
落点:
-- HDMI InfoFrame 字节 1 的
EOTF
字段写 0/2/3;-- 驱动
dw_hdmi_drm_infoframe_pack()
里infoframe->eotf = drm_property_get_eotf()
。
- 静态/动态元数据 Static vs Dynamic Metadata
-
人话版:告诉显示器"这片子最亮能到多少、平均到多少",静态的一整部电影不变,动态的一帧一帧变。
-
技术版:
-- Static:Mastering Display Color Volume (MDCV) + Content Light Level (CLL);
-- Dynamic:SMPTE ST 2094-10/40,HDR10+ 或 Dolby Vision。
-
落点:
-- 静态元数据通过
v4l2_ctrl
新 IDV4L2_CID_HDR_MDCV/CLL
随帧下推;-- 动态元数据 Hi3798MV200 硬件不支持,需要外挂 Dolby 芯片或走软件后处理。
- 色域 Color Space / Gamut
-
人话版:能显示的颜色范围。
-
技术版:
-- BT.709 ≈ 35% 可见光;
-- BT.2020 ≈ 75% 可见光。
-
落点:
-- 解码器输出
PIXEL_FORMAT_YCBCR_P010
时,驱动把VDP_CS_BT2020
写寄存器0x1a8[3:0]
;-- HDMI InfoFrame 字节 3 的
Colorimetry = 2
表示 BT.2020。
- 色深 Bit Depth
-
人话版:颜色过渡是否平滑。
-
技术版:
-- 8-bit:256 级灰阶;
-- 10-bit:1024 级灰阶,带状瑕疵 (banding) 更少。
-
落点:
-- 解码器
vdec_set_output_bitdepth(10)
;-- Gralloc 格式
HAL_PIXEL_FORMAT_YCBCR_P010
对应bpp=10
。
- HDR→SDR 色调映射 Tone Mapping / Gamut Mapping
-
人话版:在"老电视"上也能看 HDR 片,不会过曝或发灰。
-
技术版:把 0--10000 nits 的 PQ 码值压缩到 0--100 nits,同时把 BT.2020 映射到 BT.709,保持肤色。
-
落点:
-- Hi3798MV200 内置
HDR2SDR
硬件模块,驱动vdp_hdr_lut.c
提供 3 组 LUT:-- PQ→SDR(亮度裁剪 1000→100 nits);
-- HLG→SDR(系统 gamma 1.2);
-- SDR 直通。
-- 寄存器
0x2c00
的enable
位写 1 即生效,延迟 1 帧。
一条"端到端"HDR/SDR 链路在 Hi3798MV200 上的时间序举例
-
解码器拿到
HEVC_Main10_HDR10
流 → 提取 SEI 中 MDCV/CLL → -
驱动把 10-bit YUV 数据送进 VDP → 同时把元数据写进
v4l2_ctrl
→ -
SurfaceFlinger 识别
DATASPACE_BT2020_PQ
→ 调hwc_setLayerDataspace()
→ -
HDMI 驱动打包 InfoFrame(EOTF=2, MDCV/CLL 填好)→ 每 16 ms 随 TMDS 发出 →
-
电视 EDID 解析到
HDR_Static_Metadata
→ 点亮 HDR 图标,背光飙到 800 nits; -
若用户拔掉 HDR 电视,系统检测到 EDID 无 HDR → Property
ro.vendor.display.hdr=0
→ SurfaceFlinger 把同一 layer 的dataspace
重设成SDR
→ VDP 自动加载 HDR2SDR LUT → 画面回到 100 nits,肤色正常。
一句话总结,HDR/SDR 的"功能"其实就是:
"在解码→色彩空间转换→色调映射→HDMI 打包→显示五个检查点上,都能把'亮度范围、色域、EOTF、元数据'这四张标签写对、读对、转对,就算 HDR 链路通了;一旦检测到下游只能 SDR,就把同一帧数据用硬件 LUT 压回 100 nits、BT.709、gamma2.4,用户不刺眼、不偏色,就叫 SDR 兼容。"
海思平台HDR验证流程:
海思Hi3798MV200芯片在硬件层面具备对HDR(HDR10、HLG、HDR Vivid)和SDR的完整支持能力,包括HDR转SDR、多路图形/视频叠加、BT.2020色域、10bit解码、HDMI 2.0 4K@60fps输出等关键特性。
但在Android 7.0系统上"能否直接点亮HDR/SDR"取决于软件栈是否把芯片能力全部打开。下面给出一份可直接落地的适配check-list,按"底层→框架→应用"三层说明需要改动的位置和验证方法,供研发参照执行。
1 底层内核与驱动(Linux 4.9/3.18) 1.1 HDMI驱动
-
打开HDR InfoFrame:在
drivers/gpu/drm/bridge/sii902x.c
(或平台对应bridge驱动)里把HDMI_INFOFRAME_TYPE_DRM
写进0x83寄存器; -
在
dw-hdmi.c
的hdmi_drm_infoframe_pack()
里把EOTF=2/3(PQ/HLG)、Metadata Type=1(Dynamic)填进去; -
把EDID 861扩展块里的"HDR Static Metadata"0x23字节解析出来,通过
drm_property
暴露给用户空间,供后续框架读取。
1.2 显示通路(VDP)
-
确认
hi_vdp
驱动把HDR2SDR_GAMUT
模块时钟打开; -
在
vdp_layer_set()
里根据HAL_PIXEL_FORMAT_HDR10_PQ
选择HDR→SDR
系数表(海思SDK里vdp_hdr_lut.h
已自带三组PQ/HLG/SDR系数,直接加载即可)。
1.3 解码器
-
打开
hisi_vdec
的10bit输出flag:VDEC_CAP_HDR10 | VDEC_CAP_HLG
; -
把SEI中
mastering_display_colour_volume
和content_light_level
通过v4l2_ctrl
新定义两个ID:V4L2_CID_HDR_MDCV
/CLL
,一路随帧送到显示驱动。
2 Android 7.x 框架(API-24/25) 2.1 SurfaceFlinger
-
把
hwcomposer_v2.0
的layer->compositionType
为COMPOSITION_DEVICE
时,新增HWC_HDR_METADATA
Tag; -
在
HwcLayer::setBuffer()
里把从gralloc拿到的HAL_DATASPACE_BT2020_PQ
写进drm_property
,与内核1.2节对应。
2.2 Gralloc
-
新增四种格式:
HAL_PIXEL_FORMAT_RGBA_1010102
、HAL_PIXEL_FORMAT_YCBCR_P010
、HAL_PIXEL_FORMAT_HDR10_PQ
、HAL_PIXEL_FORMAT_HLG_10
; -
在
ion_alloc
里把ION_FLAG_HDR
标记位保留,底层驱动据此决定buffer是否走10bit通道。
2.3 MediaCodec
-
在
ACodec
里识别OMX_IndexConfigHdr10Metadata
,把SEI中的mDCv/mCLL
通过AMessage
抛给NuPlayer; -
NuPlayer在
Renderer
里把kKeyHdrStaticInfo
写进native_window_set_buffers_hdr_metadata()
,最终到SurfaceFlinger。
2.4 Framework API
-
由于API-24原生没有
HDR_DISPLAY_*
系列API,需要在DisplayDevice
里手动新增property:ro.vendor.display.hdr10=1
、ro.vendor.display.hlg=1
; -
应用层通过
SystemProperties.get()
判断终端是否支持HDR,避免重复弹窗提示。
3 应用层适配 3.1 播放器
-
ExoPlayer r2.6+:打开
DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER
,把MediaCodecVideoRenderer
的format.colorInfo.colorTransfer
等于COLOR_TRANSFER_ST2084/PQ
或HLG
时,设置surface.setBuffersDataSpace()
为DATASPACE_BT2020_PQ
; -
如果走MediaPlayer,需要在
libmediaplayerservice
里把Metadata
键值kKeyDisplayHDR
提前解析出来,通过onInfo(MEDIA_INFO_HDR_AVAILABLE)
回调给应用。
3.2 UI后向兼容(HDR→SDR)
-
芯片已支持硬件HDR→SDR,应用什么都不用做;
-
如果要在不支持HDR的电视机上保持色彩一致,可在Setting里给用户一个"HDR输出开关",关闭时框架把
layer->dataspace
强制设为DATASPACE_SDR
,驱动自动走1.2节的系数表。
4 快速验证步骤
-
播放HDR10片段:
adb shell am start -n com.android.gallery3d/.app.MovieActivity -d file:///sdcard/4k_HDR10.mp4
观察
dmesg | grep -i hdr
出现"Send HDR InfoFrame EOTF=2"即表示底层已发出HDR信号。 -
确认TV端收到:
索尼/小米电视按"屏显"键,若提示"HDR10"或"HLG"即成功;若提示"SDR"则检查EDID是否被正确解析。
-
10bit输出验证:
用色彩分析仪(CA-410)测峰值亮度,HDR片源应≥400 nits;SDR片源≤100 nits,证明HDR/SDR路径切换无误。
5 常见问题FAQ
-
Q:Android7.0原生不支持HDR,需要升级到Android9.0吗?
A:不需要。HDR pipeline可以完全在HAL/驱动层闭环,只要按第2节把colorSpace/dataspace打通,7.0也能正常输出HDR10。
-
Q:播放HDR片源颜色发灰?
A:99%是解码器把10bit数据当成8bit送到显示层,检查
vdec
驱动output_format
是否设成PIXEL_FORMAT_YCBCR_P010
,同时gralloc的bpp
必须=10。 -
Q:切换到SDR电视画面过曝?
A:芯片HDR→SDR模块默认目标亮度100 nits,如需150 nits,可在
vdp_hdr_lut.h
里把target_lum
值改大重新编译驱动。
Hi3798MV200 + Android7.0实现HDR/SDR完整链路,只需"驱动开HDR InfoFrame → 框架识别10bit dataspace → 应用把SEI元数据送进SurfaceFlinger"三步即可。芯片已内置PQ/HLG→SDR硬件转换,后向兼容问题无需应用层介入,按上文check-list逐项验证即可在1--2周内完成量产级适配。
如何判断一台电视是否真正支持 HDR?
一、先看"硬指标"------同时满足才算真 HDR
-
峰值亮度
-- LCD 电视 ≥ 800--1000 cd/m²(俗称 800/1000 nits)
-- OLED 电视 ≥ 540 cd/m²
(国标/Ultra HD Premium 认证门槛,低于 500 nits 的基本只能算"HDR 兼容")
-
黑位/对比度
-- LCD 黑场 ≤ 0.05 cd/m²
-- OLED 黑场 ≤ 0.0005 cd/m²
对比度须 20 000:1 以上,否则亮部够亮但暗部发灰,HDR 立体感出不来。
-
色域
-- ≥ 90 % DCI-P3 或 ≥ 70 % BT.2020
低于 BT.709(约 35 % BT.2020)的屏,即使解码 HDR,颜色也显示不全。
-
色深与解码格式
-- 面板物理 10 bit(8bit+FRC 也算及格);
-- 至少支持 HDR10(最低门槛),想"通吃"再叠加 HDR10+、Dolby Vision、HLG。
二、两分钟自检法(无需专业仪器)
-
读包装/官网规格
找"Ultra HD Premium ""DisplayHDR 600/1000 ""Dolby Vision IQ"等认证小标,没有就跳下一步。
-
查系统菜单
索尼/小米/华为等安卓电视:
设置 → 显示/图像 → 高级 → HDR 模式 或 HDMI 信号格式 → 看是否有"HDR 自动/增强格式"选项;没有则多半仅解码。
-
U 盘实测(最直观)
a. 拷三段 1 min 短片到 FAT32 U 盘:
--
4K_HDR10_PQ.mp4
--
4K_HLG.mp4
--
4K_SDR.mp4
b. 插电视 USB,原生播放器依次播放:
-- 真 HDR:屏幕会闪一下并弹出"HDR10""Dolby Vision"或"HLG"提示,亮度明显升高,暗部细节不丢失。
-- 假 HDR:亮度不变或高光直接爆白,颜色发灰,且无提示。
-
手机照度计 App(粗略定量)
播放全白 HDR10 片段,把手机光线传感器贴屏幕中心,读数 ×2 即峰值亮度近似值;< 400 nits 直接判"伪 HDR"。
三、跟"分辨率"到底啥关系?
-
逻辑关系:HDR 是"亮度/色域/元数据"规范,与分辨率无关;1080p 蓝光也可带 HDR10 元数据。
-
市场关系:厂商通常把 4K 与 HDR 打包销售,于是出现"4K 电视=HDR"的错觉。实际上很多廉价 4K 机只支持 4K@60 Hz,亮度 250 nits,解码后直接转 SDR,画面仍是"假 HDR"。
-
接口带宽关系:若播放 4K@60 Hz + HDR10,需 HDMI 2.0b 以上(18 Gbps);1080p@60 Hz + HDR 只需 HDMI 1.4b 即可,所以老电视 1080p 面板理论上也能"真 HDR",只要亮度色域达标。
一句话总结
分辨率只是"能不能播 4K",HDR 是"能不能亮起来、彩起来" 。
想 2 分钟判断:先看菜单里有没有"HDR 模式",再用 U 盘放段 HDR10 片,电视若能自动弹 HDR 标、亮度明显飙高、暗部有细节,就是真 HDR;否则 4K 再高也只是"亮一点的 SDR"。
流进阶 HDR 格式对比:
维度 | HDR10 | HDR10+ | Dolby Vision | HLG |
---|---|---|---|---|
元数据类型 | 静态(片头一次) | 动态(帧/场景级) | 动态(帧级+双层) | 无元数据,靠混合曲线 |
色深 | 10-bit(1024 级) | 10-bit | 10/12-bit(4096 级) | 10-bit |
峰值亮度 | 最高 1000 nits(理论 10 000) | 最高 4000 nits(理论 10 000) | 最高 10 000 nits(影院 4000) | 不规定绝对值,用相对亮度 |
授权费用 | 免费 | 免费 | 每台设备收 3 USD 左右 | 免费 |
向下兼容 | 通用 | 需播放器/电视支持,否则回退 HDR10 | 需专用芯片,否则回退 HDR10 | 同一信号 SDR 电视直接看 |
应用场景 | 基础 HDR、UHD 蓝光、流媒体 | 流媒体、UHD 蓝光、三星/小米电视 | Apple TV、Netflix 顶级层、高端影院 | 直播卫星、央视 4K、广电 |
终端普及 | 2025 年约 90% 电视 | 2025 年约 35% 电视 | 20% 电视,95% 手机旗舰 | 90% 机顶盒、50% 电视 |
-
HDR10+ = "免费版动态 HDR",亮暗逐帧变,画质比 HDR10 好一截,三星/小米最爱。
-
Dolby Vision = "土豪顶配",12 bit+双层码流+帧级元数据,颜色最细,但要交保护费。
-
HLG = "广电老好人",无元数据一条曲线走天下,HDR/SDR 同时吃,直播不掉链。
技术细节补充
-
元数据差异
-
HDR10+ 用 SMPTE ST 2094-40,每帧带"亮度膝点+贝塞尔曲线锚点",告诉电视怎么压高光、保肤色。
-
Dolby Vision 除 ST 2094 外还有自家 RPU(Enhancement Layer),可把 12 bit 4 000 nits 母带一次性映射到 600 nits 手机屏或 10 000 nits 影院投影。
-
HLG 没有 SEI 元数据,靠混合对数+Gamma 2.0 曲线,让 SDR 电视忽略对数段,HDR 电视整条解码。
-
-
码流结构
-
HDR10+ 是单层 HEVC Main10,兼容旧盒;
-
Dolby Vision 有 Profile 5/8/9,常见 Profile 8 在单层内嵌 RPU,Profile 9 双层"基础层+增强层",老盒只能看到 10 bit 基础层。
-
-
实际体验
- 同一片源,DV 肤色更稳、天空渐变无 banding;HDR10+ 偶尔高光爆掉;HLG 在暗场噪点控制略逊,但直播延迟最低。
选型建议
-
做流媒体 App:优先 HDR10+(免费、易编辑),再加 DV 供高端用户;
-
做直播/电视台:直接 HLG,一条信号喂 SDR/HDR 两套系统;
-
买电视:预算够上 DV,预算一般 HDR10+ 也能看爽;只看 CCTV4K 的话 HLG 足矣。
HDR与HDMI色彩空间之间的联系:
"HDR/SDR 决定'亮度和颜色范围',HDMI 色彩空间(YCBCR 4:4:4/4:2:2/RGB 等)决定'这些颜色怎么打包上数据线'------两者是上下层关系,互不冲突,但组合错了就会偏色、断层或黑屏。"
一、先分清两层概念
-
内容层(HDR/SDR 规范)
-
亮度曲线:PQ、HLG、Gamma2.4
-
色域:BT.2020 或 BT.709
-
色深:10-bit 或 8-bit
-
-
传输层(HDMI 色彩空间)
-
像素编码方式:RGB、YCBCR 4:4:4、YCBCR 4:2:2、YCBCR 4:2:0(仅内部)
-
位深:8/10/12/16 bit
-
色度采样位置:Cositing 0/1
-
色彩矩阵:BT.2020 NC、BT.709、BT.601
-
二、HDR/SDR 与 HDMI 色彩空间的"组合表
内容格式 | 色深 | HDMI 编码 | 位深 | 是否可行 | 备注 |
---|---|---|---|---|---|
SDR BT.709 | 8-bit | RGB 或 YCBCR 4:4:4 | 8-bit | ✅ | 传统模式,零问题 |
SDR BT.709 | 8-bit | YCBCR 4:2:2 | 8-bit | ✅ | 带宽减半,画质肉眼难辨 |
HDR10 BT.2020 | 10-bit | RGB 10bpc | 10-bit | ✅ | 游戏显卡常用,带宽最高 |
HDR10 BT.2020 | 10-bit | YCBCR 4:4:4 10bpc | 10-bit | ✅ | 发烧级,需 HDMI 2.0 18 Gbps |
HDR10 BT.2020 | 10-bit | YCBCR 4:2:2 10bpc | 10-bit | ✅ | 最通用:画质/带宽平衡,广电/碟机默认 |
HDR10 BT.2020 | 10-bit | YCBCR 4:2:0 10bpc | --- | ❌ | HDMI 不直接支持 4:2:0 像素编码,仅内部解码 |
HLG BT.2020 | 10-bit | YCBCR 4:2:2 10bpc | 10-bit | ✅ | 央视 4K 机顶盒实际输出 |
Dolby Vision | 12-bit | YCBCR 4:2:2 12bpc | 12-bit | ✅ | 双层码流通过 4:2:2 隧道传输 |
Dolby Vision | 12-bit | RGB 12bpc | 12-bit | ⚠️ | 带宽 48 Gbps,需 HDMI 2.1 Ultra 高速线 |
三、HDMI InfoFrame 如何把"两层"绑在一起
-
AVI InfoFrame 字节 1
-
Y1-Y0
=00b → RGB -
Y1-Y0
=01b → YCBCR 4:2:2 -
Y1-Y0
=10b → YCBCR 4:4:4
-
-
AVI InfoFrame 字节 2
-
C1-C0
=00b → BT.709 -
C1-C0
=10b → BT.2020
-
-
AVI InfoFrame 字节 3
-
EC2-EC0
=001b → 8-bit -
EC2-EC0
=010b → 10-bit -
EC2-EC0
=011b → 12-bit
-
-
HDR 动态元数据(HDR10+ / DV)
- 走
HF-VSIF
(HDMI Forum Vendor Specific InfoFrame)或Dolby VSIF
,与上述 AVI 并行,不冲突。
- 走
四、实际案例:海思 Hi3798MV200 输出路线
-
芯片内部 VDP → 10-bit P010 帧缓冲
-
HDMI 2.0 Tx 寄存器配置
-
0x044
= 0x10 → YCBCR 4:2:2 enable -
0x048
= 0x02 → 10-bit depth -
0x04C
= 0x20 → BT.2020 色度矩阵
-
-
驱动打包 AVI InfoFrame
-
byte1[7:6] = 01b (4:2:2)
-
byte2[7:6] = 10b (BT.2020)
-
byte3[2:0] = 010b (10-bit)
-
-
电视端收到后,按
C1-C0
选择反矩阵,按EC
选择 10-bit 去量化,再按 HDR InfoFrame 的 EOTF=2 走 PQ 曲线。
五、常见"踩坑"现象与原因
现象 | 根因 |
---|---|
画面发灰、饱和度低 | 电视收到 BT.2020 码流,却误用 BT.709 反矩阵 → 检查 AVI byte2 |
暗部断层、色带 | 8-bit 链路传 10-bit HDR → 量化台阶被放大 |
黑屏 2 s 后恢复 | 色深 12-bit 超出 HDMI 2.0 18 Gbps,握手失败降档 |
HDR 标不亮 | 只发了 AVI,没发 HDR InfoFrame → 补发 0x87 类型 InfoFrame |
HDR/SDR 规定"什么颜色、多亮",HDMI 色彩空间决定"怎么打包、占多少带宽";
只要内容色深≤链路色深、内容色域≤链路色域、AVI/HDR InfoFrame 写对,就能在任何组合下无损还原 HDR 效果。