看了下开源的一些项目,使用 AVSampleBufferDisplayLayer 和 CAMetalLayer 等方式渲染画面。
其中 AVSampleBufferDisplayLayer 是相对比较高级一点的 API ,将 sample buffer 发送到这个 layer 系统就可以进行渲染展示。其中这是苹果自己内部的渲染,只要 sample buffer 包含颜色信息,就会正常显示到显示器。
而 CAMetalLayer 是相对底层的东西,需要根据画面手动设定颜色空间和像素格式等信息(预设一个场景),这样画面渲染的时候基于这些信息进行绘制。
但不论是哪一种方式,对于 HDR 或者杜比视界来说,都是有相应的颜色空间/色彩原色/转换函数。讲的更详细一点,比如从视频中解码出一帧视频:
1. format: 视频帧包含色深和色彩编码方式( RGB, YUV )
2. color_range: 对于 YUV 又会有 full range 和 limited range
3. colorspace: 相应的转换矩阵( RGB YUV)
4. color_trc: 转移函数将 RGB 转换成线性 RGB
对于 HDR 画面来讲,会在不同区域显示出不同的高亮(简单通俗来讲),对于杜比视界,动态元数据可以针对每一帧画面做到调节颜色和亮度(普通 HDR 只能预设一种)。
在一个不支持 HDR 的显示设备上显示 HDR 画面时候,系统会自动做相应的映射,有的是将超过 Reference-White 部分直接变成 Reference-White ,而有的映射是进行一个线性转换。
所以我的疑问是,杜比视界也是有相应的色彩空间/转换函数( PQ )等元素,系统都是支持这些的,为什么还会发生偏色?