基于海思Hi3798MV200Android7.0聊聊HDMI色深模式和电视HDR

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

HDR/SDR 功能"到底在哪些环节生效、怎么算生效、怎么验证。

  1. 高动态范围 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 随视频帧送出去。


  1. 标准动态范围 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 可配。


  1. 电光转换函数 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()


  1. 静态/动态元数据 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 新 ID V4L2_CID_HDR_MDCV/CLL 随帧下推;

    -- 动态元数据 Hi3798MV200 硬件不支持,需要外挂 Dolby 芯片或走软件后处理。


  1. 色域 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。


  1. 色深 Bit Depth
  • 人话版:颜色过渡是否平滑。

  • 技术版:

    -- 8-bit:256 级灰阶;

    -- 10-bit:1024 级灰阶,带状瑕疵 (banding) 更少。

  • 落点:

    -- 解码器 vdec_set_output_bitdepth(10)

    -- Gralloc 格式 HAL_PIXEL_FORMAT_YCBCR_P010 对应 bpp=10


  1. 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 直通。

    -- 寄存器 0x2c00enable 位写 1 即生效,延迟 1 帧。


一条"端到端"HDR/SDR 链路在 Hi3798MV200 上的时间序举例

  1. 解码器拿到 HEVC_Main10_HDR10 流 → 提取 SEI 中 MDCV/CLL →

  2. 驱动把 10-bit YUV 数据送进 VDP → 同时把元数据写进 v4l2_ctrl

  3. SurfaceFlinger 识别 DATASPACE_BT2020_PQ → 调 hwc_setLayerDataspace()

  4. HDMI 驱动打包 InfoFrame(EOTF=2, MDCV/CLL 填好)→ 每 16 ms 随 TMDS 发出 →

  5. 电视 EDID 解析到 HDR_Static_Metadata → 点亮 HDR 图标,背光飙到 800 nits;

  6. 若用户拔掉 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.chdmi_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_volumecontent_light_level通过v4l2_ctrl新定义两个ID:V4L2_CID_HDR_MDCV/CLL,一路随帧送到显示驱动。


2 Android 7.x 框架(API-24/25) 2.1 SurfaceFlinger

  • hwcomposer_v2.0layer->compositionTypeCOMPOSITION_DEVICE时,新增HWC_HDR_METADATA Tag;

  • HwcLayer::setBuffer()里把从gralloc拿到的HAL_DATASPACE_BT2020_PQ写进drm_property,与内核1.2节对应。

2.2 Gralloc

  • 新增四种格式:HAL_PIXEL_FORMAT_RGBA_1010102HAL_PIXEL_FORMAT_YCBCR_P010HAL_PIXEL_FORMAT_HDR10_PQHAL_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=1ro.vendor.display.hlg=1

  • 应用层通过SystemProperties.get()判断终端是否支持HDR,避免重复弹窗提示。


3 应用层适配 3.1 播放器

  • ExoPlayer r2.6+:打开DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER,把MediaCodecVideoRendererformat.colorInfo.colorTransfer等于COLOR_TRANSFER_ST2084/PQHLG时,设置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 快速验证步骤

  1. 播放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信号。

  2. 确认TV端收到:

    索尼/小米电视按"屏显"键,若提示"HDR10"或"HLG"即成功;若提示"SDR"则检查EDID是否被正确解析。

  3. 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

  1. 峰值亮度

    -- LCD 电视 ≥ 800--1000 cd/m²(俗称 800/1000 nits)

    -- OLED 电视 ≥ 540 cd/m²

    (国标/Ultra HD Premium 认证门槛,低于 500 nits 的基本只能算"HDR 兼容")

  2. 黑位/对比度

    -- LCD 黑场 ≤ 0.05 cd/m²

    -- OLED 黑场 ≤ 0.0005 cd/m²

    对比度须 20 000:1 以上,否则亮部够亮但暗部发灰,HDR 立体感出不来。

  3. 色域

    -- ≥ 90 % DCI-P3 或 ≥ 70 % BT.2020

    低于 BT.709(约 35 % BT.2020)的屏,即使解码 HDR,颜色也显示不全。

  4. 色深与解码格式

    -- 面板物理 10 bit(8bit+FRC 也算及格);

    -- 至少支持 HDR10(最低门槛),想"通吃"再叠加 HDR10+、Dolby Vision、HLG。


二、两分钟自检法(无需专业仪器)

  1. 读包装/官网规格

    找"Ultra HD Premium ""DisplayHDR 600/1000 ""Dolby Vision IQ"等认证小标,没有就跳下一步。

  2. 查系统菜单

    索尼/小米/华为等安卓电视:

    设置 → 显示/图像 → 高级 → HDR 模式HDMI 信号格式 → 看是否有"HDR 自动/增强格式"选项;没有则多半仅解码。

  3. U 盘实测(最直观)

    a. 拷三段 1 min 短片到 FAT32 U 盘:

    -- 4K_HDR10_PQ.mp4

    -- 4K_HLG.mp4

    -- 4K_SDR.mp4

    b. 插电视 USB,原生播放器依次播放:

    -- 真 HDR:屏幕会闪一下并弹出"HDR10""Dolby Vision"或"HLG"提示,亮度明显升高,暗部细节不丢失。

    -- 假 HDR:亮度不变或高光直接爆白,颜色发灰,且无提示。

  4. 手机照度计 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 同时吃,直播不掉链。

技术细节补充

  1. 元数据差异

    • 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 电视整条解码。

  2. 码流结构

    • HDR10+ 是单层 HEVC Main10,兼容旧盒;

    • Dolby Vision 有 Profile 5/8/9,常见 Profile 8 在单层内嵌 RPU,Profile 9 双层"基础层+增强层",老盒只能看到 10 bit 基础层。

  3. 实际体验

    • 同一片源,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 等)决定'这些颜色怎么打包上数据线'------两者是上下层关系,互不冲突,但组合错了就会偏色、断层或黑屏。"


一、先分清两层概念

  1. 内容层(HDR/SDR 规范)

    • 亮度曲线:PQ、HLG、Gamma2.4

    • 色域:BT.2020 或 BT.709

    • 色深:10-bit 或 8-bit

  2. 传输层(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 如何把"两层"绑在一起

  1. AVI InfoFrame 字节 1

    • Y1-Y0=00b → RGB

    • Y1-Y0=01b → YCBCR 4:2:2

    • Y1-Y0=10b → YCBCR 4:4:4

  2. AVI InfoFrame 字节 2

    • C1-C0=00b → BT.709

    • C1-C0=10b → BT.2020

  3. AVI InfoFrame 字节 3

    • EC2-EC0=001b → 8-bit

    • EC2-EC0=010b → 10-bit

    • EC2-EC0=011b → 12-bit

  4. HDR 动态元数据(HDR10+ / DV)

    • HF-VSIF(HDMI Forum Vendor Specific InfoFrame)或 Dolby VSIF,与上述 AVI 并行,不冲突。

四、实际案例:海思 Hi3798MV200 输出路线

  1. 芯片内部 VDP → 10-bit P010 帧缓冲

  2. HDMI 2.0 Tx 寄存器配置

    • 0x044 = 0x10 → YCBCR 4:2:2 enable

    • 0x048 = 0x02 → 10-bit depth

    • 0x04C = 0x20 → BT.2020 色度矩阵

  3. 驱动打包 AVI InfoFrame

    • byte1[7:6] = 01b (4:2:2)

    • byte2[7:6] = 10b (BT.2020)

    • byte3[2:0] = 010b (10-bit)

  4. 电视端收到后,按 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 效果。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
深圳老胡1 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡1 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
2601_955662461 天前
短剧多人对白怎么配?2026年多角色配音工具对比
大数据·人工智能·音视频·语音识别
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透