如何将显示像素格式从 YCbCr 4:4:4 更改为全 RGB 4:4:4

如何将显示像素格式从 YCbCr 4:4:4 更改为全 RGB 4:4:4

我的显示器显示的所有内容都是粉绿色

我在 Windows 中遇到了同样的问题,但通过更改显示器的像素格式解决了这个问题YCbCr 4:4:4全 RGB 4:4:4AMD Radeon 软件。但是我如何在 Ubuntu 中做到这一点?

查看我的显示器的图像

我有Ryzen 5 5600G(无独立显卡)+三星显示器

答案1

驱动amdgpu程序不支持切换显示像素格式。人们正在/曾经致力于修复该功能,但由于各种问题,尚未完成。请参阅这个 GitLab 问题了解详情。

然而,黑客涉及更改显示器的 EDID 数据,以便它仅报告支持 RGB 而不是 YCbCr。其工作原理如下:

  1. 安装wxedid(必须启用宇宙知识库首先)使用
sudo apt update && sudo apt install wxedid
  1. 使用 查找显示器的 EDID 存储位置xrandr --props,然后查找显示器的 EDID 列出位置。如果您使用的是 Wayland,则可能需要切换到 xorg首先,为了使这个工作正常进行。

  2. 从显示器获取 EDID 数据并将其复制到设备上的文件中

cp /substitute/this/with/whatever/you/found/from/the/last/step  ~/edid.bin
  1. 运行wxedid并编辑edid.bin主目录中的文件。执行以下操作:

    1. 查找 SPF:支持的功能 -> vsig_format -> 将 0b01 替换为 0b00
    2. 找到 CHD: CEA-861 标头 -> 将 YCbCr420 和 YCbCr444 的值更改为 0
    3. 重新计算校验和:选项 > 重新计算校验和
    4. 保存文件
  2. 告诉内核使用该文件:

    1. sudo mkdir /lib/firmware/edid
    2. sudo mv edid.bin /lib/firmware/edid/edid.bin
    3. 编辑 Grub添加以下内核参数:drm.edid_firmware=HDMI-A-1:edid/edid.bin
    4. 重新生成你的 initramfs
    5. 重启

答案2

我尝试使用这些说明,但在转储 edid.bin 时遇到了麻烦。混合使用 printf 和 perl 似乎终于可以将 ascii 转换为 hex:

printf '%b' $(xrandr --props | perl -pe 's/^((?![[:xdigit:]]{32}).)*$//g ; s/[\s\t]+//g ; s/([[:xdigit:]]{2})/\\x\1/g') > edid.bin

单独使用表达式来检查输出:

 xrandr --props | perl -pe 's/^((?![[:xdigit:]]{32}).)*$//g ; s/[\s\t]+//g'
 xrandr --props | perl -pe 's/^((?![[:xdigit:]]{32}).)*$//g ; s/[\s\t]+//g ; s/([[:xdigit:]]{2})/\\x\1/g'

perl 仅捕获包含 32 个十六进制字符的行,删除空格/制表符,然后将每个两位数字对重新格式化为 \x##,以便 printf 解释转义序列以输出十六进制。另一个接受方法使用 edid-decode:

 xrandr --verbose | edid-decode - edid.bin

由于存在多个 edid,因此它无法在多显示器环境中工作。

相关内容