基于海思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 效果。

相关推荐
向阳花开_miemie3 小时前
Android音频学习(二十一)——ALSA简介
学习·音视频
范纹杉想快点毕业3 小时前
单片机开发中的队列数据结构详解,队列数据结构在单片机软件开发中的应用详解,C语言
c语言·数据库·stm32·单片机·嵌入式硬件·mongodb·fpga开发
Brian Xia3 小时前
Social-Auto-Upload - 多平台社交媒体视频自动化上传工具
自动化·音视频·媒体
come112343 小时前
ptyhon 基础语法学习(对比php)
android·学习
ClassOps3 小时前
Android 12 SplashScreen启动屏
android·kotlin
一直向钱3 小时前
android 增强版 RecyclerView
android
sun0077003 小时前
网络配置config.xml的android.mk解析
android·xml
三佛科技-134163842123 小时前
鼻毛修剪器MCU方案开发设计
单片机·嵌入式硬件·智能家居·pcb工艺
奶糖 肥晨4 小时前
视频抽帧完全指南:使用PowerShell批量提取与优化图片序列
音视频