boday 发表于 2016-8-21 23:02:35

[HTPC] 通过修改 EDID 信息强制 macOS 输出 full range RGB(0-255)

现在很多电视都支持 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/Ex ... Identification_Data
EDID 编辑器:https://ez.analog.com/docs/DOC-2143
可以参考并魔改的 Ruby 脚本(用于抓取 EDID 信息和编码 plist 等):https://gist.github.com/adaugherity/7435890

boday 发表于 2016-8-21 23:03:09

其实我买了 mac mini 和 sony 的电视这么长时间一直是 limited 输出看的,并没觉得有什么不妥(对观感最大的影响其实还是这个低端 sony 电视用的垃圾面板)。然后几天前我闲着没事拿了个灰阶测试图放上去看了一下,明显能看到不规则的 banding 和轻微的颜色畸变,顿时就坐不住了,于是想尝试解决一下这个实际上已经困扰了我快两年的问题。

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

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

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

至于说为啥顶楼没有点几下鼠标就搞定的傻瓜式方法,主要原因是我懒,次要原因是具体情况可能会很复杂,对 EDID 做手脚也可能会导致严重的副作用,还是自己搞明白怎么回事再下手比较好。这个帖子主要还是记录和总结一下我个人的测试结果,给需要的人以参考。

kavenliang 发表于 2016-8-22 00:26:17

哈哈,黑苹果貌似简单一点,往clover一丢就行
页: [1]
查看完整版本: [HTPC] 通过修改 EDID 信息强制 macOS 输出 full range RGB(0-255)