admin管理员组

文章数量:1597911

前言

最近在做MIPI DSI显示屏的驱动开发,遇到了高帧率条件下D-PHY速率不够的问题。需要启用DSC对显示数据进行压缩。可是网络上关于VESA DSC压缩的资料实在太少。文本主要以官网协议文档为参考,结合自己的理解,主要阐述驱动开发中需要关注的DSC技术的关键事项。

某些难以翻译的名词,将直接采用英文,避免理解歧义。

术语

缩写解释
VESAVideo Electronics Standards Association
DSCDisplay Stream Compression Standard
bpcbits per component
bpgbits per group
bppbits per pixel
PPSPicture Parameter Set

参考文献

  1. VESA-DSC-1.2a

简介

协议简介

VESA DSC标准是一项用于图像显示流的压缩与解压缩的规范。包含了压缩视频比特流所需要的语法与语义的规范。DSC被设计用于实时系统中,具有实时压缩,传输,解压与显示的情况。

DSC定义了视频比特流的压缩规范,但是并没有规定使用什么传输层。实际使用DSC的系统中必须遵守一个合适的传输层规范,比如MIPI DSI,使用该传输层将DSC比特流从source端传输到destination端。

DSC常用场景有:手机处理器到显示屏,电脑图形输出到显示器,消费电子视频源设备到显示设备比如电视等。

目前分析的DSC版本为v1.2,DSC协议规定,v1.2的编码器能过够被v1.1的解码器解码,v1.1的编码器,能够被任何版本的解码器解码。DSC v1.0已经永久弃用了。

总览


如图所示,整个系统被设计为实时系统。未压缩的视频按照光栅扫描的顺序(从左到右,从上到下),实时地传输至encoder。encoder将输入的像素压缩为bitstream,然后暂时性地把bitstream的一部分存储至它的rate buffer。

rate buffer的输出便是DSC bitstream的图形层(包括除了PPS的部分)。通过使用一种传输层(DSC并不规定使用何种传输层),DSC bitstream将被实时地从编码器传输至解码器。

解码器接受bitstream到它的rate buffer,然后实时地按照光栅扫描顺序,解压为像素数据并传输至显示设备。解码器输出的图像与编码器输入的图像将具有相同的格式。

DSC bitstream包含了多张经过Picture Layer语法编码的图片,Picture Layer同时也包含了Slice Layer的语法。如果需要正确地解码bitstream,那么encoder使用的正确的图像信息(PPS)就需要提供给decoder。

bitstream反射了子流复用(substream multiplexing, SSM)流程,以及切片复用流程(slice multiplexing)。PPS包含了decoder解码图片所需要的参数。

Picture Layer操作的是一组图片。对于逐行扫描式视频,一张图片是一帧(frame),对于隔行扫描式视频,一张图片是一块区域(field)。每张图片包含整数n个连续的,无覆盖的,矩形的切片(slices)。图片中的slices具有完全相同的尺寸。

Slice的编码由Slice Layer来定义。每片slice是单独编码的,并且不会被其他的slice影响。每行可以具有多片slice,这种情况下,bitstream中,源自覆盖了同一行的slices的bits将被复用,这是通过一个slice复用处理器实现的。

每个slice包含了一组集合,每个集合都是由3或6个光栅扫描连续的像素组成。每个集合都是使用3或4个,增量大小单位长度可变的编码单元,来进行编码。这些编码单元是一种规格的可变长度编码器(VLC)。

有些集合具有多个bits,用于指明解码方式。这些包括了每项组件的bits构成了子流。根据输入的chroma subsampling,将会有3或4个子流,每个子流都会映射到一个集合中的编码单元。这些子流将通过子流复用处理器进行复用。

最后附一张编解码总览图

协议详解

名词解释

词汇解释
component组件,这里主要指charoma component,色度分量
slice切片,把一张图片拆分成为多个切片,并行处理加速压缩
QPQuantizer Parameter
VLCVariable Length Coding
ICHIndexed color history
RCRate Control
PPSPicture Parameter Setting

颜色空间

使用RGB输入的视频信号,在压缩前,将被先转换为YCoCg(YUV的一种)格式。

由于YCoCg-R的使用,每两个色度分量(chroma components)所占用的bits,在YCoCg-R中将比RGB中大1。

对于16bpc的输入,每种色度分量的最低有效位,将被四舍五入。用于限制语法元素的尺寸和数据路径的宽度。这意味着不可能实现无损转换。但大多数情况下,这种影响微不足道。

预测和量化

每组像素,要么使用P-mode要么使用ICH-mode编码。
P-mode,predictive coding,可预测编码。
ICH-mode,indexed color history coding,索引颜色历史编码。

关于这两种编码方式的详细信息,可自寻资料阅读,此处不做重点讲解。

P-Mode

包括三种方式

方法描述
MMAPModified Median-Adaptive Prediction
BPBlock Prediction
MidpointPrediction

三种方式的选择由编码器和解码器自动选择,不需要在bitstream中表明选择信息。

ICH-mode

在电子信息内容比如图像中,相同的像素可能出现在接近的位置,但却不一定相邻。因此,使用ICH(Indexed Color History)跟踪最近使用过的像素值便可以利用。当编码器为一个group选择了ICH-mode时,编码器发送选中像素在ICH中的编号。这些像素值直接在解码器的像素输出流中重构出来。
ICH 是一个存储单元,用于维护一组最近使用的颜色值。编码器和解码器保持相同的 ICH 状态。
ICH 有 32 个条目,每个条目都有一个索引值。对于 ICH 编码的组,每个像素不再直接保存像素数据,而是使用 5 位 ICH 索引进行编码,该索引指向其中一个条目。
由于ICH仅有32位,因此需要使用一个状态来同步编码器与解码器两侧的ICH。
当新条目来的时候,以移位寄存器的形式更新ICH,旧的条目便被刷掉,ICH总是保存的最新的32个像素条目。
编码器按组选择 ICH 模式。 编码器通过在亮度子流中使用转义码,来表明一个组需要使用ICH-mode。

bitstream的构造

DSC标准定义了多层,其中最底层就是子流层(Substream Layer)。
每一个slice都具有3或4个子流,每个子流对应一个色度分量。这几个子流被SSM复用,来构成一个编码过的slice。如果每一行具有多个slice,则编码过的slices将被slice复用器复用。多个slice的编码结果bits将被串联在一起,来形成一个编码过的图片。每一张被编码的图片,也可以先被PPS处理。经历过这些处理步骤后,将得到bitstream,里面包含整数n(n>=1)张图片。

子流层

使用DSU-VLC熵编码架构的DSC编码器,其预测残差可以从手册的列表中查看。
对于每个像素,ICH编码使用固定长度编码。
通过一个特定值来指示是否使用ICH编码,其他的指示值将会对压缩区域的像素进行量化的调整。

slice中的像素,将以三个连续像素组成一组处理。
但是,由于SSM流程的存在,这些像素组,并不直接代表着bitstream中的编码。
一个单元(unit)被编码为一组残差,其压缩了某个色度分量中三个连续采样。
每个单元由两部分组成:字首与残差值。一个单元的残差的尺寸,将基于同一通道中的前一个单元的尺寸与量化参数的任何变化来预测。字首部分是一个一元编码,表征了该单元中最大的残差值与预测尺寸之间的非负差值。如果差值是个负数,那么字首代码将被置0。残差部分包括了三个值,一对一地对应着单元中的每一个采样。残差值被编码为二进制编码。一个单元中的所有三个残差都被赋予了同样的bits号。这个bits号表征着单元号,随单元的变化而变化。

在编码架构中,一个量化残差的尺寸等于色度分量的bit深度减去MPP的量化号等级。因此如果产生的量化残差具有的尺寸超过了该值,那么MMAP与BP就不能被该色度分量使用了。相对地,编码器将使用MPP,它所有的量化残差都被以填0或者符号扩充的形式,来满足bits深度与量化等级差的需求。

除此之外,对于一组单元的第一个单元,它的字首部分表明了这一整租单元中ICH编码是否使用。

子流复用

3或4个单色度分量子流,将依靠SSM多路复用在一起。
SSM使用固定长度的复用字段,并且没有头部。

这一块没太搞明白。。。。

速率控制

编码器与解码器采用完全相同的RC(速率控制)算法。

量化是在不降低视觉效果的前提下减少图像编码长度。
Quantizer Parameter,量化参数,反映了空间细节压缩情况。值越小,量化越精细,图像质量越高,产生的码流也越长。如QP小,大部分的细节都会被保留;QP增大,一些细节丢失,码率降低,但图像失真加强和质量下降。

编码器中使用RC算法获得的量化参数(QP),在解码器中将会完整复制,这使得解码器的每个像素具有与编码器完全相同的QP。
除了压缩指数,不会消耗任何bits来传输QP参数。
RC参数是根据编码器与解码器中,过去传输过的信息来计算的。同时,RC算法可以为每一个group单独改变QP参数。
RC算法设计时考虑了以下几个参数:

  1. 编码器与解码器的QP 参数不需要通过传输来同步。
  2. 确保假设的参考解码器一致性.RC算法假定了包含了一个理想的速率buffer,用于为每一个group转换一定数量的bits为特定的常值速率。因此,实际的速率Buffer只要采用了这样的常值速率,便不会溢出。

RC算法在平坦的图像区域采用低QP,密集的图像区域采用高QP。因为在密集的区域错误更难被感知。
当然,也可以对所有像素采用完全相同的QP。
RC算法包含以下组件:

组件描述
Buffer Tracker保持对模块缓冲区填充度的追踪。这是编码器中,以理想方式运行的速率缓冲区的假设性填充度
Linear Transformation将模块的剩余部分的填充度转化为归一化值,并处理slice的第一行的初始传输延迟与额外bit分配
Long-term RC转化传输buffer的填充度为短期RC使用的参数
Short-term RC根据每一组的bias,调整QP
Flatness Adjustment为编码器提供一种可以在输入的像素相对平缓时,快速下调QP的方法,

时序

基于假设参考解码器的时序模型

词汇表

名称解释
bits_per_pixel每个像素多少个bits,一种rate比率
muxWordSize子流复用层将三个色度分量的子流混合在一起,混合后的流具有一个固定长度的复用字段,对于8bpc时,是48bits
maxSeSize
initial_dec_delay解码器延迟解码开始的一段时间,这段时间解码器把收到的bits积累在速率buffer中
initial_xmit_delay编码器中的为每个像素产生bits,所产生的传输延迟
sliceBits切片位预算,每个slice理想中应该具有预定的bits,但实际上可能需要填充0来达到这个数,来弥补实际数据的不足

RC系统采用了HRD模型,这描述了一个解码过程中理想的速率Buffer的行为。
这个标准定义了一个解码与编码均适用的速率buffer模型。
编码过程设计为保证编码buffer不会上下溢出。
解码过程被设计为保证在解码规范的DSC比特流时,解码buffer不会上下溢出。
一个理想DSC系统的端到端的延迟,将作为确定参数的偏移。
系统模型包含以下部分:

  1. 理想的编码器与解码器,两者都用三个像素的时间处理三个像素的组(group),无延迟。
  2. 编码器内的速率Buffer具有特定的大小。
  3. 维持从编码器到解码器DSC bits的通信连接,将采用特定的bit速率,称为(bits_per_pixel)
  4. 解码器的速率buffer与编码器具有相同的大小。

从编码器输入到解码器输出的延迟,等于编解码器的速率buffer的最大容量除以bits_per_pixel速率,再加上一个SSM均衡FIFO引起的常值延迟。速率buffer的延迟等于编码器与解码器速率buffer的总和。系统将会有一个常值的端到端延迟,对于输入与输出端要求相同的像素时间而言,这是必须的。这个延迟的的速率buffer分量被称为HRD延迟。因此,再常值速率模式下(CBR),当编码器的速率buffer具有最大延迟时,解码器的速率buffer则具有最小延迟,反之亦然。
解码器的速率buffer等价于HRD模型。编码器的速率buffer与HRD模型buffer具有相同的大小。这个模型用于指定编码流程的初始延迟与解码流程的初始解码延迟等。
RC Buffer模型的制定是从编码器的角度来考虑的,考虑了理想编码器的速率buffer容量。明确的相同RC Buffer模型也是解码过程的一部分,模型的容量与解码器的速率Buffer容量具有相反的增长方向。比如,RC Buffer模型满的时候,编码器的速率buffer是满的,而解码器的速率buffer是空的。
SSM均衡FIFO的延迟,等于均衡FIFO需要持有的groups所消耗的像素时间数量。均衡FIFO至少需要能够持有(muxWordSize+maxSeSize-1)groups的数据。对于8bpc的RGB无分组的输入视频信号,这意味着每个均衡FIFO能够持有83units的压缩数据。均衡FIFO的总延迟为83*3d=249(pixel times).在时序模型中,均衡FIFO延迟是一个常值。端到端的总延迟等于三者的和:均衡FIFO,编码器速率Buffer,解码器的速率Buffer,是一个常值。
在实际中,均衡FIFO的延迟不是精确的常值。因为存在一个由分组压缩为复用字段时直接导致的小变化项。解码器中也存在一个出于同样原因的补充变化项。然而,这并不影响端到端延迟,因为初始延迟设定了常值的端到端延迟。在实际的编码器中,压缩位会由于均衡FIFO与速率Buffer的原因分散到任何位置,只要这个功能符合标准。解码器将推迟它的开始一段时间,称为initial_dec_delay,在这段时间内,bits在解码器的速率buffer中积累。在解码器开始后,复用字段将从速率buffer移动到熵解码器,这一过程不会引入任何延迟。
初始传输延迟是指在压缩bits进入编码器的速率buffer后的延迟(在均衡FIFO与SSM之后,在slice传输前)。编码器总的延迟将会大于均衡FIFO的延迟加上任何实现产生的延迟。
在CBR(常值比特率)模式下,HRD模型的填充度等于HRD buffer的大小减去编码器buffer的填充度。因此,解码器的buffer模型能够保证不会上下溢出。在VBR(变化比特率)模式下,HRD填充度需要小于HRD buffer的大小减去编码器的填充度,这样,解码器buffer仍能够保持不会上下溢出。
DSC的编码器速率Buffer模型定义了一种调度策略,用于bits进入和离开速率buffer:

  1. 在初始传输延迟(initial_xmit_delay)中,编码器每像素时间产生一定数量的bits,然后把这些bits放入它的均衡FIFO。从此,在经过SSM处理与相关联的均衡FIFO延迟后,编码器将这些bits转移到它的速率buffer,不会删除任何位。在这段时间内,编码器模型的填充度根据产生的bits数目而增加。延迟周期被指定为以像素时间为单位。
  2. 只要slice中有更多的像素需要被编码,编码器就会根据它的内容产生bits。bits以指定的常值速率被移除。在CBR模式下,当buffer的填充度足够低时,通常的预测方法选择将被MPP所覆盖。MPP保证一个较低的数据速率,这组织了buffer的填充度降到0.
  3. 当一个slice的最后一个group编码之后,没有更多的bits被添加到速率buffer中。bits继续从速率buffer中以固定的速率移出,直到buffer为空。在CBR模式下,编码器会发送0来填补bits,以保证压缩的slice尺寸,以bits为单位,等于切片位的预算。

在开始解码bits之前的一段时间,解码器在它的速率buffer中会积累bits。这段初始解码时间定义为initial_dec_delay,是编码器初始延迟的补充。解码器的速率buffer填充度也是作为编码器buffer填充度的补充。

CBR模式与VBR模式

DSC编码流程既可以使用CBR模式,也可以使用VBR模式。CBR模式中,比特率规定以每像素时间的bits为单位,是一个常值,取值为bits_per_pixel。在VBR模式中,对于任何像素时间,比特率可以是bits_per_pixel,也可以是0.当需要避免buffer溢出时,就会从bits_per_pixel变为0。应用规格应该在CBR与VBR中二选一。
两种模式的实际表现,体现在出线编码器速率buffer溢出时,编码过程怎么做。
在CBR模式下,编码器智能地增加使用的bits数量,来避免下溢。RC算法在下一个编码组时,决定是否有可能下溢。这个条件强制选择MPP,来保证较小的比特率。解码器不需要特定的逻辑,来处理bit填充,因为解码器直接简单解码额外的bits,就和其他的group一样。
在VBR模式下,为了避免下溢,当编码器没有bits发送时,编码器停止发送bits。特别地,编码器的RC算法每一个group就操作一次。对于每一个group,RC算法将添加该group编码的bits到buffer模型中,从缓冲区模型中减去每一group的标称bits数(3*bits_per_pixel),然后根据需要调整为一个整数bits数。在VBR模式下,如果buffer模型减去每组的bits数后,产生了一个负数结果的填充度,RC算法会把buffer填充度致0.
在实际的系统中,编码器没有bits发送时,发送端不会发送任何bits,解码器不会收到任何bits。解码器的实际速率buffer可能会满,但是,不会上溢。当编码器有bits发送时,发送端和接收端都期望继续以正常的速率传输。解码器的的实际buffer不会上下溢出,解码器也无需做任何特别处理。但发送端必须能够决定什么时候有效的数据足够发送与接受。
VBR模式对标准HRD限制和端到端缓冲模型有一定的影响。考虑到VBR模型有时候会将比特率调整为0,那么平均有效的比特率肯定会比标准的bits_per_pixel速率小。作为结果,编码器和解码器的填充度总和,可能小于buffer模型的大小。比如,编码器的buffer可能为空但解码器的填充度可能并不会满。

slice与timing

在CBR模式中,DSC操作需要编码一张图片的bits,等于该图片的像素数乘以指定的bits_per_pixel比率。此外,DSC需要支持slices,其中可以通过覆盖每个相应切片的先前版本,在压缩帧缓冲区内就地更新图片切片的任何子集。一张图片可以作为包含整个图片的一系列连续切片传输,并且作为一系列连续切片传输的整个图片必须满足与切片相同的要求(比如,无论是整张图片还是单个切片,其bits数都必须等于像素数诚意bits_per_pixel比率)。除此之外,整张图片的切片一定要适配契合的HRD模型,来保证这种模式下进行操作时,正确的实时buffer行为。因此,从开始传输到开始解码之间的延迟,与传输结束到解码结束的延迟,一定是相同的,并且每一个切片都是相同的。DSC在设计时就保证了这些需求。

RC算法使用了一个速率Buffer。这个算法允许编码器的速率buffer在每个切片的结束时,达到一个指定的上界填充度。在CBR模式下,如果编码器的buffer在编码一个slice的末尾时,其bits数小于了最大值,那么编码器会填充0至末尾,来达到指定需求的bits数。在切片末尾时,编码器的速率buffer中存留的bits总数(包括填充的部分),占据一个指定的像素倍率,乘以传输时所使用的bits_per_rate比率。这个像素倍数就是从编码结束到传输结束的延迟,可以称为“最终传输延迟”。在一个理想的编码器与解码器中,总的速率buffer的延迟,以像素倍率为单位,等于速率buffer的尺寸,除以bits_per_pixel比率。初始传输延迟与最终传输延迟相同。初始解码延迟被设为等于总的端到端速率buffer延迟,减去初始传输延迟。这些需求保证了正确的操作。

RC算法定义了一个参数,在slice末尾时编码器速率buffer中可拥有的最大bits数,通常等于4kbits。结束的传输延迟,是bits_per_pixel的函数。假设值等于4096bits,那么比率就是4096/bits_per_pixel。在8bpp时,这个延迟等于512像素倍。在12bpp时,延迟是341像素倍。这个参数的实际值,是由initial_xmit_delay决定的。initial_xmit_delay和此处描述的末端传输延迟是相同的。

端到端的HRD延迟,等于HRD buffer尺寸除以bits_per_pixel比率。以buffer size = 19836bits, bits_per_pixel = 12为例

delay = 19836 / 12 = 1653 pixel times

初始解码延迟,应该等于HRD延迟,减去初始传输延迟。根据之前所属,初始传输延迟应该等于341 pixel times。那么初始解码延迟为

initial decoding delay = 1653 - 341 = 1312 pixel times

一个实际的解码器可能还具有其他的延迟,因为理想的传输流程与实际还是有些区别。
速率buffer的尺寸,是bits_per_pixel和slices的宽度的函数。
在实际系统中,一张图片使用多个slices,slices是连续传输与接受的,编码器与解码器的速率buffer持有的数据可能不止源于一个slices,由于缓冲区模型延迟以及在解码前一个切片或编码下一个切片时一个切片的传输比特之间的相关重叠。尽管可能存在来自多个切片的数据,但编码器或解码器中垂直相邻切片所需的速率缓冲区大小不会大于单个切片所需的速率缓冲区大小。

在编码器中slice开始的位置,编码器的buffer模型为空,速率buffer具有4096bits的上一个slice的剩余数据需要发送。假设 slice 宽度大于 initial_xmit_delay,在转换时间期间(即,当前一个 slice 的比特等待传输,当前 slice 的比特被添加到速率缓冲区时),最大净累积 来自新切片的比特受速率控制的限制,不大于以下值

rc_model_size - initial_pffset + 
(first_line_bpg_offset + pixelsPerGroup * bits_per_pixel) * number_of_group_processed

slice选项

DSC支持较多的slice宽高的种类。以下两个示例配置适合实际系统使用

slice_width = ¼ pic_width; slice_height = 108 lines
slice_width = pic_width; slice_height = 108 lines

slice的维度最多可以指定为图片的维度(宽与高)。为了减小额外的无用数据的传输消耗,系统应该选择切片的宽高能分别被图片的宽高整除。
更高的切片允许更好的压缩,但收益递减。额外的位被分配到每个切片的第一行以最大化质量并避免在切片之间的边界处产生伪影。分配给每一组的额外bits由PPS设置。每一slice中第一行之后的所有行,包含的可用bits,必须减小到一定的值,使得每个slice的bits数等于像素数乘以bits_per_times。随着片内行数的增加,减少位分配的需求减少。比如,108行高度的slice,比8行高度的slice表现的要好。slice高度不会产生额外消耗。DSC支持slice的尺寸等于整个图片的尺寸。然而,更高的切片也可能产生更大的部分更新大小,并且对位错误有更明显的影响。

对于各种实际目的,可能需要比全屏宽度窄的切片。 一些可能的动机包括通过部分更新来更新较窄切片的能力,或促进在一个图像内进行并行处理。 实际上,每行多个切片可以使用一个等于图片宽度的行缓冲区。 对于每行多个切片,图片中每个不同列的切片都有单独的速率缓冲区。 例如,每行有四个切片,就有四个速率缓冲器。 每个速率缓冲区的大小部分由切片宽度确定。 例如,对于 4 个切片/行的情况,速率缓冲区的总大小小于对于 1 个切片/行的情况的速率缓冲区大小的四倍。 可能还需要一些额外的缓冲和硬件; 因此,通常希望限制每行的切片数。

Slice复用

在系统配置为每行超过1 slice时,压缩的数据将根据指定的格式复用,以减小编码器与解码器实现过程中的消耗。格式如下:对于W pixel宽,S slice每行,每个slice中 每行P pixel。对于所有的slices, P是相同的,如果W/S是整数,那么P等于W/S。否则,P等于ceil(W/S),并且该行的最后一个slice,将被添加上赋值的像素,一边一张图片中slices的不同列中P是相同的。
复用的比特流包含一系列块。对于slices中第一行的第一个slice,第一块具有ceil(P * bits_per_pixel / 8)个字节,slices中第一行的其他slice以此类推。同一行中的所有块,总共含有S * ceil(P * bits_per_pixel / 8)个字节。然后,该模式会重复传输第一行切片的所有位所需的尽可能多的块。该过程对图片内的所有压缩切片线行重复。
一次传输可能被设计为以分包的形式传输不同slices的数据。在这种情况下,一个slice的最后的bits,将放在源于其他的slice的分隔包,包括垂直紧邻于第一个slice之下的slice中的开始bits。对bits属于哪个slice或者每个slice的开始bits在哪,DSC字节流不包含任何这样的信息。这些信息是传输层的责任,不是属于DSC标准规范。

对于每行超过1 slice并使用了slice复用的编码器,应考虑切片复用对编码器操作时序和相关缓冲要求的影响。

DSC与MIPI DSI

前面说了,DSC需要依赖特定的传输层来实现。而实际使用中常常依赖的传输层为DSI,这里有比较分析一下DSC与DSI的协同工作。

DSI概述


通过基本的猜想,我们可以知道DSC应该是属于DSI的应用层协议。
从Low level Protocol层看,数据格式如下。MIPI中所有的数据传输都是基本如此,只不过具有不同的Data ID,这个Data ID就表明了这一包数据的含义。

一阵图像的发送,通常就是如下图所示的众多包组成。图中每一个方块,都是具有一个不同Data ID的包。图像数据就在RGB的方块中。通常一次RGB包,包含一次完整的像素扫描行。当然,必要的话,也可以把一次水平扫描行拆分成多个RGB数据包。然而,每个像素不应该被拆分到不同的包,保证数据的完整性。

这些特征并非是绝对的,有些格式内容是可以选择的,这取决于你的爱好,正常来说MIPI 屏幕并不会在意这些格式,一般都会支持。
如下图,你可以看到,一张完整的图像数据传输,包含多个RGB包,每个RGB包之间,间隔有HFP。多张图像数据间,使用VFP等作为间隔。

带DSC的DSI包

上面描述了正常的非DSC的MIPI DSI图像发送格式,但是如果开启了DSC压缩,则有一些不同。
在正常的图像数据中,RGB图像采用的是Datat ID = 0x3E的包进行发送,如手册中描述的。

而如果采用了DSC,那么压缩的数据,采用的是Data ID = 0x0B发送的。值得注意的是,这个0x0B并没有写入MIPI手册,也没有写入DSC手册,只是在实际应用中有这样使用,不清楚这一规范到底源自于哪里。

本文标签: 简单VESADSC