ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DSC显示流压缩技术全解析:从原理到DP认证测试

DSC显示流压缩技术全解析:从原理到DP认证测试 如果你这两年买过4K 144Hz以上的显示器或者折腾过8K电视大概率已经接触过DSC这项显示流压缩技术只是厂商没在你脸上贴标签。DSC全称Display Stream Compression是VESA组织制定的显示流压缩标准核心目标是在不牺牲肉眼可感知画质的前提下把一条显示链路能传输的图像数据量压到原来的三分之一左右。先说明一下这里的DSC和医学超声设备里的图像处理DSC、数据库集群里的DSC不是一个东西我们只聊显示接口领域的这个。我自己是从DP 1.2时代一路调过EDID、改过驱动、测过链路的老工程师这几年最直观的感受是没有DSC今天所谓的4K高刷、8K60甚至8K120全都得靠降色深、转YCbCr来凑体验稀碎。DSC的出现把显示接口从单纯的“带宽军备竞赛”拉回到“协议与算法协同”的赛道这也是为什么DP 1.4之后DSC几乎是中高端产品的默认配置。这篇文章想把DSC这件事讲透它到底是什么算法、在DisplayPort链路上怎么工作、以及过VESA官方认证测试时你大概会踩到哪些坑。适合三类人看做显示器和显卡/笔记本的硬件工程师、写驱动和固件的软件同学、以及纯粹想搞清楚“为什么DSC关不掉”的高级玩家。1. 带宽焦虑为什么中高端显示设备离不开DSC1.1 先算一笔带宽账显示接口的本质就是一根数字水管单位时间内能流过的像素数据有限。DisplayPort用lane通道的方式并行传数据DP 1.4时代一根线是4条lane每条lane跑HBR3速率8.1Gbps物理层还要做8b/10b编码也就是每传10个bit只有8个bit是真正有效的数据所以总有效带宽是4 × 8.1 × 0.8 25.92Gbps这个数字意味着什么我们按最常用的RGB 4:4:4、10bit色深来算几个典型需求的带宽如下4K3840×2160144Hz约35.8GbpsDP 1.4极限速率装不下需要约1.4:1的压缩5K5120×288060Hz约26.5Gbps刚好贴着DP 1.4的天花板8K7680×432060Hz约59.7GbpsDP 1.4连零头都装不下8K 120Hz约119.4Gbps即便DP 2.1的UHBR20理论有效带宽约77.6Gbps依然装不下。所以如果不想各种限制分辨率、刷新率、色深压缩几乎是唯一出路。DSC的常见压缩比是2:1到3:1把8K60压到20Gbps左右DP 1.4就能跑把8K120压到40Gbps出头DP 2.0和2.1的UHBR13.5以上也能跑。这就是DSC存在的最大理由。1.2 传统妥协方案的代价在DSC普及之前业界靠什么硬撑高刷主要就两招降色深、降色度采样。降色深最直观从10bit降到8bit立刻省掉20%带宽。代价是渐变天空、暗部场景会出现肉眼可见的色带也就是常说的banding。你在深色壁纸下看到一圈一圈的条纹多半就是8bit在作怪。降色度采样则是把RGB转成YCbCr再用4:2:2甚至4:2:0即压缩色彩信息但保留亮度信息。这套方案电视上没问题因为视频内容本身就是4:2:0格式但放在桌面显示器上就是灾难文字边缘出现彩边、UI线条发虚、鼠标指针都可能带一圈颜色。这两招本质上都是弃画质保流畅用户不傻体验一个比一个差。DSC的价值就在于你依然拿RGB 4:4:4 10bit的数据进去出来的还是RGB 4:4:4 10bit只是中间传输时被“看似有损”地压缩了一下眼睛基本看不出来。1.3 DSC的本质实时流式压缩不是普通图片压缩有人会问那DSC和压缩图片的JPEG、PNG有什么区别区别大了。JPEG可以等整张图片读完再编码压缩率可以很高但延迟以毫秒甚至秒计。显示链路不行像素是一行一行扫描出去的显示器没工夫等整帧压缩完再解压。DSC必须逐行、几乎实时地完成编码和解码每一行像素从编码到解码的延迟被压在微秒级。所以DSC的设计哲学很明确它不追求极限压缩率追求的是在极低延迟下达到“视觉无损”效果。这是它和一般图像压缩算法的根本分水岭也是后面所有技术细节的出发点。2. DSC压缩原理拆解它到底怎么做到“肉眼无损”2.1 编码器基本流程预测、量化、熵编码DSC编码器的工作流程简单说是四步预测、量化、熵编码、率控。预测这一步核心是利用已经编码完成的相邻像素猜当前像素值是多少。DSC用的是一种叫改进中值自适应预测MMAP的方案取左边、上边、左上角三个已经重建的像素按一定规则取中值或均值得到一个预测值。对于大面积纯色、渐变、自然纹理这类图像这个预测值往往非常接近真实值产生的残差接近零。残差越小后面需要编码的比特数就越少。打个比方你在纸上画一条直线后面每一个点都能用“跟上一点差不多高”来推算根本不用记录每个点的精确坐标只需要记录少数偏离很大的点。DSC就是在干这件事只不过它工作在一行一行的像素流上而且是实时完成。2.2 量化利用人眼视觉特征的“狡猾”设计预测之后的残差有大有小如果全部精确编码数据量依旧可观。DSC的做法是引入带死区的量化器对接近零的小误差直接当作零处理不花比特去记录对较大的误差用比较粗的阶梯去近似。这样能省下大量比特。关键是DSC并不是盲目粗糙它利用了人眼的对比度掩蔽效应在高纹理区域眼睛对细节误差的敏感度会显著下降因为你已经看不清细节了多一点噪声区别不大在平坦区域则尽量保证误差趋近于零避免出现肉眼可见的条纹和块状伪影。这套机制让“看起来没事”成为可能但从数值上说它确实是有损压缩。2.3 率控实时流的命门率控是DSC区别于普通图片压缩的另一个核心。显示链路要求每行、每个slice输出的比特数严格控制在带宽预算内不能超也不能太少——太少等于浪费带宽。DSC通过动态调整量化参数QP来实现这一点图像内容复杂时把QP调大一些牺牲一点细节图像内容简单时把QP调小保留更多细节。DSC定义了三种率控模式极简模式、静态模式和动态模式。前两种实现简单但画质上限低动态模式允许每个slice根据局部复杂度实时调整QP画质最好也是目前主流实现采用的方式。率控如果调得不好复杂画面下就会出现局部糊掉或者块效应这是DSC画质劣化最常见的表现。2.4 切片机制并行和低成本的基石DSC把一帧图像水平切成若干个slice每个slice独立编码。slice宽度常见取32到256像素并且必须是32的倍数具体值取决于编码器和解码器line buffer的大小。为什么要切切片两个原因。第一是并行多个slice可以同时编码降低延迟也让硬件实现更简单。第二是解码端内存有限尤其显示器里的scaler和TCON芯片内存通常只有几KB到几十KB不可能缓存整帧图像。切片越小解码器需要缓存的行数据越少芯片成本就越低。DP源端和sink端在启动DSC前会协商slice参数这个参数会在PPS里明确传递两边必须一致如果厂商在这里实现不严谨最容易出互操作问题。2.5 色彩模式、位深和HDR的处理DSC本身支持6/8/10/12/16bpc输入RGB、YCbCr 4:4:4/4:2:2/4:2:0也都支持。这就意味着它在色彩格式上相当灵活尤其能保留桌面用户最在意的RGB 4:4:4 10bit。HDR的静态元数据不参与DSC压缩走的是DisplayPort的辅助通道SDP专用包因此HDR信息和压缩流是分开传输的解码端不会被压缩影响。所有编码参数——位深、色彩格式、slice数、压缩比、QP策略等——最终会被打包成一个叫PPSPicture Parameter Set的数据结构通过DP辅助通道传给接收端。接收端必须正确解析PPS再按照里面的参数去解码压缩流。这个PPS字段众多牵一发动全身认证测试里很大一部分时间都在查它。3. 在DisplayPort上落地DSC从DP 1.4到DP 2.13.1 DSC与DP版本演进VESA在DP 1.4中首次把DSC 1.2纳入标准但它是可选功能当链路带宽不够时源端和接收端协商启用DSC。到DP 2.0和DP 2.1时代标准升级为DSC 1.2a配合UHBR10、UHBR13.5、UHBR20速率链路带宽大幅提高。很多人以为DP 2.1带宽大了就不需要DSC了其实不完全对。举个具体例子8K60 10bit RGB需要约59.7GbpsUHBR20的77.6Gbps可以容纳确实不需要DSC但8K120 10bit RGB需要约119.4GbpsUHBR20再翻倍都不够DSC依然是必需品。所以在DP 2.1的规范里DSC依然保留只是使用场景更集中在超高刷和8K以上分辨率。3.2 DSC、FEC、SDP三件套必须一起理解在DisplayPort上启用DSC并不是说把压缩流扔进主链路就完事了。这里有两个绕不开的伴随机制。第一是FEC前向纠错DP 1.4及以后的标准规定只要启用DSC就必须同时启用FEC。原因很现实压缩后的数据一旦在传输中出现bit错误错误会扩散到一片区域看起来就是一整块屏幕花掉。FEC通过里德-所罗门码等纠错算法在接收端把偶发错误先修复掉避免解码器“吞”进坏数据。第二是PPS通过辅助通道SDP传递。PPS不是走主链路视频流而是通过SDP包在辅助链路上传给接收端。所以看DSC是否正常工作不能只盯主链路还得看辅助通道上有没有正确的PPS包。曾经有产品在PPS分包时偶发丢失结果画面间歇性花屏排查了很久才定位到是SDP链路的问题。3.3 三种DSC工作形态端到端、直通、重定时不同设备里DSC的参与方式其实不太一样主要分三种。第一种是端到端压缩也是最常见的场景显卡或SoC作为源端压缩显示器作为接收端解压。大多数笔记本外接4K高刷显示器和旗舰显卡接8K电视都是这种模式。第二种是DSC直通passthrough常见于扩展坞、KVM和信号切换器。这类桥接设备不解压DSC流直接原样转发。优点是延迟低、成本低但要求桥接芯片必须完整转发PPS和相关时序参数一旦丢字段后面的显示器就无法正确解码。第三种是DSC重建rebuild桥接设备先把压缩流解压再重新压缩输出通常是为了在中间叠加OSD菜单、画中画或者做画面处理。这个模式画质和延迟都有额外损耗但功能灵活多用于会议系统和高端视频处理设备。3.4 实际体验DSC的开关、黑屏与VRR兼容很多用户最困惑的是“DSC到底怎么关”。答案是当分辨率、刷新率、色深组合起来的带宽超出物理链路限制时DSC由源端自动启用用户根本没有开关。想关掉它唯一的办法是降低规格到链路带宽范围内。比如DP 1.4下4K144 10bit必然开DSC但降到4K100或者8bit也许就能关掉DSC。另一个常见现象是黑屏。切换分辨率或刷新率、从游戏全屏退到桌面等操作都可能让DSC重新协商链路重新训练显示器黑屏1到3秒。这在DSC时代非常普遍不是显示器坏了。VRR方面VESA在DP 2.0的Adaptive-Sync能力中明确支持DSC与VRR共存但DP 1.4早期设备里DSC加VRR的组合偶尔会出现闪屏、无法进入最低刷新率的情况最后基本都是靠固件更新解决。如果你手头的设备恰好有这个问题可以先试试把刷新率固定在一个中间值排除率控和VRR冲突的可能。3.5 怎么判断当前是否启用了DSC判断DSC是否生效有几个土办法。Windows下打开NVIDIA控制面板或AMD驱动看输出色深能选到10bpc还是只能选8bpc结合当前分辨率和刷新率大致能判断是不是已经超出带宽。更直接的办法是看显示器OSD菜单很多品牌在DSC启用时会显示“DP DSC ON”之类的信息。Linux下可以用drm_info查看connector的DSC能力以及当前模式是否带DSC标志。想深入看就抓DPCD日志看源端有没有在DPCD 0x0060段的DSC控制寄存器里写入使能值。这套方法不需要额外硬件做工程排查时足够用。4. DisplayPort认证测试全解析从源端到接收端怎么过检4.1 认证测试的定位VESA的合规测试Compliance Test是为了保证不同厂商的设备能互联互通。DisplayPort CTS覆盖物理层、链路层、协议层和应用层DSC测试属于协议层和应用层之间的一块和HDCP、VRR这些功能并列。如果你的产品要打DP官方Logo必须过CTS。不过检也能卖但兼容性全看运气在成熟市场基本是卖不动的因为你无法保证用户手上的老设备能跟你配合好。DSC相关的测试核心是验证三件事源端能不能正确压缩并发送DSC流接收端能不能正确解压并显示以及两边的参数协商是否一致。下面按源端和接收端分开说。4.2 源端测试内容能力通告、PPS、压缩流校验源端要过的测试我总结下来主要有四个大项。第一是能力通告。源设备必须在DPCD的正确位置声明自己支持DSC以及支持到哪个版本、支持哪些slice配置、支持多少位深。如果这里写错了接收端会认为源端不支持DSC链路协商直接退回非DSC模式或者干脆无法点亮高刷。第二是PPS生成。测试仪会检查源端发出的PPS包含的所有字段slice数、bits_per_pixel、位深、色彩格式必须合法且和实际输出的数据流一致。这里最容易出问题的是slice相关字段比如slice_width超出接收端能力、slice_per_line算错、压缩比超过了带宽预算等等任何一个字段不对接收端解出来的画面就是花的。第三是压缩流校验。协议分析仪会把源端输出的压缩流完整抓下来解码后检查每个slice的输出比特数是否满足率控预算并对解码图像和原始图像算质量指标。VESA定义了一套标准测试图像要保证压缩后图像的各项质量指标不低于阈值。第四是FEC联动。启用DSC后FEC必须同时启动。有些早期实现会把DSC和FEC做成两个独立开关调试时单独开了DSC忘了开FEC测试仪直接判Fail。4.3 接收端测试内容能力声明、解码正确性、抗误码接收端的测试重点和源端不一样它不需要生成压缩流但要把各种压缩流都正确吃下来。首先是能力声明接收端要在DPCD里准确告诉源端自己支持什么。这个声明必须和实际解码能力完全一致不能吹牛。有的显示器为了过某些PC认证伪装支持高解压能力结果真遇到高压缩比数据流就花屏。其次是解码正确性。测试源会向接收端发送不同slice数、不同压缩比、不同位深的DSC流接收端解码后要能还原出清晰画面。压缩比越高对解码器的率控还原能力要求越高如果某些参数组合处理不到位会出现块效应、横纹等问题。再次是抗误码能力。前面提到FEC会在接收端修复部分传输错误接收端测试也要验证在注入错误比特的情况下画面不会出现大范围花屏或者至少能把错误控制在局部。这个测试对很多显示器方案是一道坎因为解码器的容错逻辑做得简陋的话一个bit错误可能导致整帧画面错乱。4.4 测试设备与实验室选择做DSC认证测试硬件投入不低。DP 1.4时代常用的协议分析仪比如Unigraf UCD-400系列能完成不少DSC测试工作。到了DP 2.0/2.1时代需要支持UHBR速率和解码更高带宽压缩流的设备UCD-500这类型号才开始接触。再往上是Teledyne LeCroy、Keysight、泰克这类家的链路分析仪和示波器组合物理层和协议层一起测价格非常高。所以实际项目里中小团队很少直接买全套设备更多是租借测试仪器或者把产品送去第三方兼容性实验室做认证。也有一些芯片原厂会提供配合测试的工具和参考方案比如验证PPS参数的脚本、抓DPCD的辅助工具能省不少事。我的建议是如果你只是开发一款显示器或者扩展坞先用协议分析仪抓一遍关键场景的log确认DPCD和PPS没有明显问题再送实验室这样通过率高很多。4.5 我实际遇到的失败案例这些年调DSC我踩过的坑不少挑几个有代表性的说说。第一个是接收端能力声明自相矛盾。某款显示器明明支持4K144但它的DPCD能力寄存器里没写DSC结果接PC时只能跑4K60或者降色深。当时我们一度以为是固件bug后来查下来是工厂烧录EDID时把DisplayID里的DSC能力块漏掉了PC拿到错误信息自然不启用DSC。第二个是PPS的slice配置不对。源端在某个分辨率下把slice_per_line算错导致每个slice的宽度超出接收端line buffer尺寸接收端解码时直接出错。这个问题最难查的是表面现象画面看起来是正常的但偶尔会闪一下马赛克频率毫无规律。后来用协议分析仪抓到PPS字段发现slice配置和一个老款sink的能力不匹配更新了slice算法才彻底解决。第三个是忘开FEC。这个我在调试早期也犯过单独验证DSC功能时只开了压缩没开FEC结果在长线传输场景下画面偶发花屏。当时先怀疑线缆换了好几条线都没解决最后翻DPCD寄存器才发现FEC没使能。从那以后我的调试清单里永远写着DSC和FEC必须成对检查。第四个是UHBR20线缆问题。DP 2.1的认证要求线缆和连接器都得满足UHBR20的物理层标准很多普通DP线在UHBR20下直接training失败。这个其实不是DSC的问题但在实测中很容易和DSC失败混在一起因为报错现象都一样点不亮或者频繁黑屏。排查时先确认链路training成功再查DSC相关参数顺序不能反。4.6 给做产品认证的三条经验第一把物理层和链路层调试稳定之后再进入DSC测试。如果link training都没调好DSC测出来的所有失败都不可信先解决基础问题能省很多时间。第二手头至少要准备三到五台不同品牌的源端或接收端做互操作验证。实验室的标准测试通过只代表符合规范真实世界的设备组合千奇百怪多试几台老设备往往能提前暴露PPS兼容性问题。第三保存完整的DPCD dump和PPS dump。DSC问题很多是偶发的没有log等于没查有了一份完整的dump反馈给芯片原厂或VESA工作组定位效率会高很多。日志里除了DSC相关寄存器EDID、DisplayID、SDP包都要一起存这些信息往往是关联的。做这些测试多了以后我最大的感受是DSC本身并不神秘真正考验工程能力的反而是那些协议细节——PPS字段是否对齐、FEC使能时序是否正确、sink的line buffer能力差异有没有被考虑到。如果你手头正好在调一个DP项目我的建议是尽早把协议分析仪接上从第一次link training就开始看log别等到画质测试阶段才反过来查DSC配置。磨刀不误砍柴工在显示协议这个领域几乎没有比这更划算的投入了。
返回列表