The Remote Framebuffer Protocol 协议解析

Encoding Types

注:本文的中文翻译源自本人,不一定准确,但是是一种比较形象的表示

1.RRE: rise-and-run-length-encoding

2度游程编码。
1.1.取得背景色,并填充至整个区域。背景色是整个区域中出现频率最高的颜色,猜测是通过多点取样得到的。
1.2.取得子矩形,并用每个子矩形的颜色填充子矩形。每个子矩形中只有一种颜色,但是颜色可以向前继承。

2.Hextile

16瓦编码,是一种变异的RRE编码方式。

每个矩形都被分成16×16的瓦片(tile),瓦片排列方式是从左到右,从上到下,每个瓦片都被称为一个子矩形,每个子矩形只要四个字节(一般)即可描述。用到了两次位级编码,如subencoding信息只有一个字节,但是内部的后5位(或者低5位)从低到高分别表示raw、backgroundSpecified、foregroundSpecified、AnySubrects、SubrectsColored;每个subrects中的位置信息也是用位级表示的,高四位表示x-y,低四位表示w-h。这种表示方法跟RRE不同,因为前者的x-y-w-h值可能较大,分别需要用两个字节表示(>256)。如果一个矩形的长宽不能被16整除,那么最后的一个子矩形会小一些。为了方便理解,将要处理的数据从上到下分为大矩形、小矩形和子矩形三个层级。

2.1.将大矩形划分为16×16的子矩形,每个小矩形的长宽都为16×16。
2.2.小矩形为raw,那么直接将client->buffer中的数据copy至client->frameBuffer。
2.3.小矩形不为raw
2.3.1.提取background颜色并填充整个小矩形
2.3.2.提取foreground颜色
2.3.3.如果有子矩形,那么分成两类进行填充:子矩形没有特殊颜色,直接填充foreground颜色;子矩形有特殊颜色,将特殊颜色填充子矩形。

3.TRLE: Tiled Run-Length Encoding

分片调色游程编码

该编码方式结合了分片编码,游程编码和调色编码,是一种更compact的编码方式。使用了新的像素类型:CPIXEL,bPP为32,深度为24或更小。一般只需要三个字节来存储rgb。首先将矩形进行分片,每个小矩形大小为16×16,每个分片都由subencoding type开始,根据type不同,进行不同的编码。

3.1.Type = 0

类型为raw pixel data,直接复制至client->frameBuffer即可。

3.2.Type = 1

类型为solid tile,整个分片都是单色的,将该颜色填充至client->frameBuffer。

3.3.Type = 2~16

类型为packed palette,即压缩调色盘类型。这种类型比较复杂,需要根据调色盘来填充颜色,数据结构如下。比如当type=5时,调色盘大小(paletteSize)就为5,那么首先从server端读取5个大小为BPCP(CPIXEL的大小)的color。那么此时每个像素会被压缩在4位之内,也就是一个字节包含两个像素,需要读取的字节数位w×h/4。读取完像素之后,根据调色盘内的数据对像素进行上色并复制到client->frameBuffer。该过程有点类似于解压缩。
在这里插入图片描述

3.4.Type = 17~126

颜色数太多,压缩效率不如调色游程编码(palette RLE),所以这一段type不使用。

3.5.Type = 127

对packed palette进行复用

3.6.Type = 128

普通的游程编码(plain RLE),但是长度控制在256之内(16×16),数据结构如下图所示。BPCP和1分别表示数据的字节数。

在这里插入图片描述

3.7.Type= 129

调色游程编码(palette RLE),对tpye=130~255进行复用。

3.8.Type = 130~255

调色游程编码(palette RLE),调色盘大小为(type-128),跟普通的游程编码相比节约了颜色的存储空间,由3字节变为了1字节,而且使用了调色盘,每种颜色可以直接从调色盘中读取,实际只需要记录调色盘序号就可以。数据结构如下图所示。
在这里插入图片描述

4.ZRLE: Zlib Run-Length Encoding

Z库压缩游程编码

其他方面与TRLE基本相同,区别有三:

  • 分片变大,为64×64
  • 片内数据压缩方式为Zlib Data
  • 将type = 127和129都弃用,即不存在复用(也许是因为分片太大,无法复用)

关于zlib的压缩方式,有两种,分别是LZ77算法和Huffman编码,前者使用的是滑动窗口字典编码,后者采用的是频率排序二叉树构建编码。具体的实现可以参考这两个链接:
(lz77) https://www.cnblogs.com/junyuhuang/p/4138376.html;
(Huffman) https://blog.csdn.net/yang6464158/article/details/39852255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值