Sunday, August 21, 2016

通过修改 EDID 信息强制 macOS 输出 full range RGB(已失效)

20170914 更新:补上一个迟来的更新。自从 macOS 也增加了 Night Shift 功能之后,这里描述的修改方式在我的系统上会触发强制变色的 bug,且无法修改,原因不明。因此,本文已无实用价值。

=======================================================


现在很多电视都支持 full range RGB (0-255)信号输入了,但是 macOS 使用 HDMI 接电视默认仍然会输出 limited (TV)range(16-235),而且无法像 Windows 上那样可以在显卡驱动设置里更改。

理论上说,显卡输出 limited range,只要电视那边也设置为接受 limited range 信号,黑位仍然是正确的,然而实际上,显卡驱动在进行 YC 压缩运算时会造成画面质量的劣化。所以,仍然有必要让 macOS 尽量使用 full range 输出。

思路:

1. 参考 EDID 定义文档,本体部分(前 128 字节)的第 24 个字节的第 4-3 比特需要改为 00,即只支持 RGB 4:4:4;

2. 扩展部分(extension block,后 128 字节)其实可以完全删除不要,但是这样会造成无法在设置中更改屏幕刷新率,所以仍然需要保留;

3. 扩展部分开头的第 3 字节的第 5、4 两位需改为 0,即 YCbCr 4:4:4、4:2:2 均不支持;

4. 加上几个 short video descriptor block,对应电视所支持的刷新率(以及你需要的分辨率),其他信息可以全部删除。

方法:

找个 EDID 编辑器,把电视的 EDID 信息拉出来,导入编辑器中,按照以上思路进行修改,然后导出,按照 MacOS 的格式编码为 plist;如果是 10.11 或以上,禁用 SIP(System Integrity Protection);把前面的文件放进 /System/Library/Displays/Contents/Resources/Overrides 下对应 VendorID 的文件夹里;重启,完工。

参考:

EDID 定义文档:https://en.wikipedia.org/wiki/Extended_Display_Identification_Data
EDID 编辑器:https://ez.analog.com/docs/DOC-2143
可以参考并魔改的 Ruby 脚本(用于抓取 EDID 信息和编码 plist 等):https://gist.github.com/adaugherity/7435890

另附上我自己的灰阶测试结果供参考:

1. 默认不做任何修改,可以看到有比较严重的 banding 和明显的颜色畸变(怀疑此时实际输出的是 YCbCr 信号);
2. 修改本体部分,删除扩展部分,灰阶表现接近完美,但无法调整刷新率(此时为正常 full RGB 信号);
3. 修改本体部分,保留扩展部分但不作修改,结果比默认有所改善,但仍有轻微 banding 可见(怀疑此时输出的是 limited RGB 信号);
4. 修改本体部分,保留扩展部分并修改第 3 字节,此时可以看出输出信号已经是 full RGB,但是很奇怪的是灰阶结果仍然和 3 相同;
5. 修改本体部分,保留扩展部分并修改第 3 字节,删除扩展部分其余所有和 SVD 无关的部分,结果终于和 2 一致了……

这也是为什么顶楼我说要把扩展部分无关部分删除的原因。具体是哪里的“多余”信息导致了显卡内部仍然做了两次转换(?)我就不知道也懒得再多做测试了。

No comments:

Post a Comment