修复绿联 UG307-95348 HDMI 采集卡颜色问题(二)

修复绿联 UG307-95348 HDMI 采集卡颜色问题(二)

💡 原文中文,约3000字,阅读约需8分钟。
📝

内容提要

绿联UG307-95348采集卡在Windows下出现颜色偏差,原因是系统将Limited range的YCbCr误解析为Full range。作者依据CEA-861与EDID规则,改用IT timing使默认输出Full range,但经HDMI Splitter连接投影仪时又恢复为Limited range。最终通过EDID设置QS=1,使AVI InfoFrame携带范围信息,并用程序轮询寄存器0x3c4a自动调整处理管线,实现Limited到Full的映射,同时EDID仅保留RGB。

🔎

延伸解读

颜色偏差的根源:范围解析错位

文章指出,Windows 下颜色偏差表现为黑色变16、白色变234,这是典型的 Limited range 被误当作 Full range 解析。显卡输出 YCbCr Limited range 时,采集卡却按 Full range 处理,导致数值整体压缩。手动切换为 RGB 4:4:4 Full range 可临时解决,但并非所有系统都提供该选项,因此需要从 EDID 和时序层面寻找自动化的根本方案。

EDID 与时序如何影响默认范围

根据 CEA-861,显卡驱动选择 CE Timing 时默认输出 Limited range,选择 IT Timing 时默认 Full range。作者最初将固件 EDID 全部改为 IT timing(如 CVT-RB),确实让默认输出变为 Full range。但经过 HDMI Splitter 连接投影仪后,因采集卡使用 CE Timing(如 VIC 97),系统又回退到 Limited range,说明单纯改时序在多设备链路中并不可靠。

利用 AVI InfoFrame 实现自动适配

文章进一步利用 AVI InfoFrame 携带范围信息的机制:在 EDID 的 VCDB 中设置 QS=1,使显卡在 InfoFrame 中明确指定 Full 或 Limited range。作者逆向发现 MS2130S 在寄存器 0x3c4a 记录该信息,于是通过程序轮询此寄存器,动态调整 luma/chroma processing 寄存器,将 Limited range 线性映射到 Full range。这样无需修改 OBS 滤镜,即可自动适应不同输入范围。

方案边界与遗留问题

最终方案在 EDID 中仅保留 RGB 支持,简化了转换逻辑,使 MateBook Pro 和 Windows 机器都能正确采集。但作者也指出,苹果电脑仍存在偏色问题,具体原因尚未找到。此外,将逻辑写入固件虽更理想,但需避免 UVC brightness 等设置覆盖寄存器,且汇编改动风险较高,因此选择了外部程序轮询的折中方案。

❓

Q&A

绿联UG307-95348采集卡在Windows下颜色偏差的具体表现是什么?

采集到的颜色值出现偏差,例如纯黑(0,0,0)变成(16,16,16),纯白(255,255,255)变成(234,234,234),纯红(255,0,0)变成(237,14,15)等。这对应的是将Limited range的YCbCr错误地当作Full range解析。

为什么采集卡在Windows下会出现颜色偏差?

因为显卡驱动根据EDID选择时序后,默认使用Limited range的YCbCr输出,而采集卡却将其当作Full range解析,导致颜色映射错误。根本原因是EDID中缺乏正确的范围信息声明。

CEA-861标准中CE Timing和IT Timing的默认颜色范围有什么区别?

根据CEA-861标准,CE Timing(VIC大于1的标准时序)默认使用Limited range,而IT Timing(非CE时序)默认使用Full range。显卡驱动根据所选时序类型决定默认范围。

如何通过修改EDID让采集卡默认输出Full range?

将固件中的EDID全部改用IT timing(如CVT-RB),这样显卡驱动就会默认选择Full range输出。但此方法在通过HDMI Splitter连接投影仪时可能失效,因为采集卡仍使用CE Timing。

AVI InfoFrame在HDMI中起什么作用?如何利用它自动识别颜色范围?

AVI InfoFrame是HDMI中传递元数据的帧,可以指定RGB或YCbCr使用Full还是Limited range。在EDID的VCDB中设置QS=1后,AVI InfoFrame会携带范围信息,采集卡通过寄存器0x3c4a记录该信息,从而实现自动检测。

最终如何实现Limited range到Full range的自动映射?

通过程序轮询寄存器0x3c4a判断输入范围,并调整luma/chroma processing pipeline的寄存器:0xfc90设为0xf0(-16),0xfc91和0xfc92设为0x95(255/219),同时开启pipeline,实现Limited到Full的线性映射。此外,EDID中仅保留RGB支持以简化处理。

🏷️

标签

➡️

继续阅读