深入解析Android HDR转SDR的色彩管线:从理论到GPU实现
在移动设备上处理高动态范围(HDR)视频内容已经成为现代Android开发者的必备技能。当HDR内容需要在标准动态范围(SDR)屏幕上显示时,简单的亮度调整远远不够——我们需要构建一个完整的色彩处理管线。这个管线涉及从10位YUV数据解码开始,经过一系列色彩空间转换、色调映射和量化处理,最终输出适合SDR显示的8位RGB像素。
1. HDR与SDR的核心差异解析
HDR(高动态范围)和SDR(标准动态范围)的根本区别体现在三个维度上:
- 亮度范围:HDR的亮度范围通常达到0-10,000尼特,而SDR限制在0-100尼特
- 色域空间:HDR常用BT.2020色域,比SDR的BT.709色域宽约75%
- 位深度:HDR采用10位或更高位深,SDR通常使用8位
关键问题:当HDR内容在SDR设备上直接显示时,会出现以下现象:
- 图像整体变暗(亮度范围不匹配)
- 色彩发灰(色域不匹配)
- 出现色带(位深度不匹配)
注意:简单的线性缩放无法解决这些问题,因为人眼对亮度的感知是非线性的。
2. 完整的HDR转SDR处理管线
2.1 管线架构概览
一个完整的HDR转SDR处理管线包含以下关键阶段:
-
数据获取阶段:
- 通过MediaCodec解码获取YUV420 10位数据
- 数据格式可能是I420、YV12、NV12或NV21
-
色彩转换阶段:
// 示例:YUV到RGB的转换矩阵(BT.2020) mat3 yuvToRgb = mat3( 1.0, 0.0, 1.4746, 1.0, -0.1645, -0.5714, 1.0, 1.8814, 0.0 ); -
电光转换(EOTF):
- 将非线性编码的RGB转换到线性光空间
- 对于PQ曲线:
L = 10000 * max((c1 + c2 * Y^n) / (1 + c3 * Y^n), 0)^m
-
色调映射(Tone Mapping):
- 将高动态范围压缩到低动态范围
- 常用算法包括:
- Reinhard算子
- ACES曲线
- 基于场景参考的映射
-
色域转换:
// BT.2020



被折叠的 条评论
为什么被折叠?



