找回密码
 立即注册
搜索
查看: 4418|回复: 10

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

[复制链接]
     
发表于 2016-8-21 21:14 | 显示全部楼层 |阅读模式
本帖最后由 boday 于 2016-8-21 23:02 编辑

现在很多电视都支持 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
回复

使用道具 举报

     
 楼主| 发表于 2016-8-21 21:22 | 显示全部楼层
本帖最后由 boday 于 2016-8-21 21:34 编辑

其实我买了 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 做手脚也可能会导致严重的副作用,还是自己搞明白怎么回事再下手比较好。这个帖子主要还是记录和总结一下我个人的测试结果,给需要的人以参考。
回复

使用道具 举报

发表于 2016-8-22 11:30 | 显示全部楼层
airplay 呗...
回复

使用道具 举报

头像被屏蔽
     
发表于 2016-8-22 12:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2016-8-23 06:57 来自手机 | 显示全部楼层
电视哦如何看支不支持0-255呢?还有win10电脑hdmi接电视怎么输出0-255?

—— 来自 samsung SM-N9006, Android 5.0
回复

使用道具 举报

     
 楼主| 发表于 2016-8-23 07:24 | 显示全部楼层
本帖最后由 boday 于 2016-8-23 07:27 编辑
天气姐姐 发表于 2016-8-23 06:57
电视哦如何看支不支持0-255呢?还有win10电脑hdmi接电视怎么输出0-255?

—— 来自 samsung SM-N9006, And ...

如果支持 0-255 的话,电视里应该会有设置选项让你选择。在我这里这个选项在 settings - display - input settings - dynamic range 里。

另外顺便说,sony 家的电视只有选择图表和游戏这两个模式时才会接受 4:4:4 信号,且只有图表模式是不包含任何电视自带后处理的。其他牌子的电视很可能类似。

windows 下要确保输出 rgb full range 很简单,我没记错的话 n、a、i 三家的显示驱动设置里都有选项可以改。叫法可能不太一样,比如可能叫 full/limited range 也有可能叫 pc/tv range,有的还把 rgb 和 ycbcr 的也放在一起,当然,最理想的情况是输出 rgb 4:4:4 full range。
如果显示驱动设置里没有,madshi 写过一个叫做 madLevelsTweaker.exe 的东西,搜索一下就能找到,不过这个只对 n 和 i 有效。
回复

使用道具 举报

     
发表于 2016-8-23 08:01 来自手机 | 显示全部楼层
boday 发表于 2016-8-23 07:24
如果支持 0-255 的话,电视里应该会有设置选项让你选择。在我这里这个选项在 settings - display - input  ...

看到了,有自动/全部/和限制,选了自动是不是根据输入信号匹配呢?另外我接电脑看视频一般选电影/动画模式,是不是不用折腾了。。。

—— 来自 samsung SM-N9006, Android 5.0
回复

使用道具 举报

     
 楼主| 发表于 2016-8-23 10:04 | 显示全部楼层
天气姐姐 发表于 2016-8-23 08:01
看到了,有自动/全部/和限制,选了自动是不是根据输入信号匹配呢?另外我接电脑看视频一般选电影/动画模 ...

1. 是。

2. 这个嘛……htpc 玩家们的一个基本逻辑是:电视自带的后期处理太太太重口了,因此我们的目标就是把电视纯粹当成一个尺寸很大的显示器来用,任何对图像的处理全部由 pc 来完成。顶楼说我要尽量让电视直接接受 rgb 4:4:4 full range 信号,也是基于这个逻辑。
说到底这也只是一种取向而已,自己看得高兴想怎么折腾或是不折腾都是可以的……
回复

使用道具 举报

     
发表于 2016-8-23 13:42 | 显示全部楼层
马克一下 回去瞅瞅电视设置
另外大法的动画模式好顶赞,看B站动画感觉完全不同
回复

使用道具 举报

     
发表于 2018-11-9 16:14 | 显示全部楼层
baby DP有这问题么
回复

使用道具 举报

     
发表于 2018-11-9 16:17 | 显示全部楼层
baby 你个大骗纸 说好的macOS色彩管理专题呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-29 05:26 , Processed in 0.062089 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表