SPICE协议定义----显示通道(1)

本文深入解析SPICE协议的显示通道定义及其消息集,探讨如何支持远程显示区域在客户端的渲染,涵盖图像渲染、视频流、图像压缩等关键技术,并介绍了SPICE协议中的消息交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/sjin_1314/article/details/42389103


1  显示通道定义

SPICE协议定义了一组消息集支持远程显示区域在客户端显示。协议支持图像渲染(线、图像)和视频流。协议还支持在客户端缓存图片和色彩调和。显示通道支持多种图像压缩方法来减少网络流量。

1.1服务器---》客户端消息

  1. enum {  
  2.     SPICE_MSG_DISPLAY_MODE = 101,  
  3.     SPICE_MSG_DISPLAY_MARK,  
  4.     SPICE_MSG_DISPLAY_RESET,  
  5.     SPICE_MSG_DISPLAY_COPY_BITS,  
  6.     SPICE_MSG_DISPLAY_INVAL_LIST,  
  7.     SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS,  
  8.     SPICE_MSG_DISPLAY_INVAL_PALETTE,  
  9.     SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES,  
  10.     SPICE_MSG_DISPLAY_STREAM_CREATE = 122,  
  11.     SPICE_MSG_DISPLAY_STREAM_DATA,  
  12.     SPICE_MSG_DISPLAY_STREAM_CLIP,  
  13.     SPICE_MSG_DISPLAY_STREAM_DESTROY,  
  14.     SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL,  
  15.     SPICE_MSG_DISPLAY_DRAW_FILL = 302,  
  16.     SPICE_MSG_DISPLAY_DRAW_OPAQUE,  
  17.     SPICE_MSG_DISPLAY_DRAW_COPY,  
  18.     SPICE_MSG_DISPLAY_DRAW_BLEND,  
  19.     SPICE_MSG_DISPLAY_DRAW_BLACKNESS,  
  20.     SPICE_MSG_DISPLAY_DRAW_WHITENESS,  
  21.     SPICE_MSG_DISPLAY_DRAW_INVERS,  
  22.     SPICE_MSG_DISPLAY_DRAW_ROP3,  
  23.     SPICE_MSG_DISPLAY_DRAW_STROKE,  
  24.     SPICE_MSG_DISPLAY_DRAW_TEXT,  
  25.     SPICE_MSG_DISPLAY_DRAW_TRANSPARENT,  
  26.     SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND,  
  27.     SPICE_MSG_DISPLAY_SURFACE_CREATE,  
  28.     SPICE_MSG_DISPLAY_SURFACE_DESTROY,  
  29.     SPICE_MSG_DISPLAY_STREAM_DATA_SIZED,  
  30.     SPICE_MSG_DISPLAY_MONITORS_CONFIG,  
  31.     SPICE_MSG_DISPLAY_DRAW_COMPOSITE,  
  32.     SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT,  
  33.    
  34.     SPICE_MSG_END_DISPLAY  
  35. };  


1.2客户端---》服务器消息

  1. enum {  
  2.     SPICE_MSGC_DISPLAY_INIT = 101,  
  3.     SPICE_MSGC_DISPLAY_STREAM_REPORT,  
  4.    
  5.     SPICE_MSGC_END_DISPLAY  
  6. };  


1.3操作流程

SPICE服务器使用SPICE_MSG_DISPLAY_MODE消息发送到客户端指定当前画面的面积和格式,作为回应客户端创建一个显示的区域来呈现所有服务器发送来的渲染指令,客户端在收到服务器发送信息SPICE_MSG_DISPLAY_MARK将刷新远程显示区域。服务器可以使用SPICE_MSG_DISPLAY_RESET通知客户端放弃绘图区域和缓存。     SPICE_MSG_DISPLAY_MODE消息只允许在客户端不存在可用绘图区域。SPICE_MSG_DISPLAY_RESET消息只允许客户端存在可以用绘图区域。

SPICE_MSG_DISPLAY_MARK只允许在上述两消息之间发送一次。

绘图命令、复制命令和视频流命令只允许客户端存在绘图区域时发送。

在显示通道建立的时候,客户端为了使用图像缓存及glz压缩会发送SPICE_MSGC_DISPLAY_INIT消息到服务器。消息包括图像缓存ID及大小和glz压缩窗口的大小。这些尺寸和ID有客户端决定。只允许发送一次。这个大小是主通道建立的时候spice_session_set_caches_hints函数设置的。

绘图缓存是服务器管理的。缓存条目的插入是另外一组命令实现的。缓存条目的删除是通过SPICE_MSG_DISPLAY_INVAL_LIST和SPICE_MSG_DISPLAY_INVAL_PALETTE。重新设置缓存是通过发送SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS和SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES。

1、SpiceMsgDisplayMode

  1. typedef structSpiceMsgDisplayMode {  
  2.     uint32_t x_res;  
  3.     uint32_t y_res;  
  4.     uint32_t bits;  
  5. } SpiceMsgDisplayMode;  


1.4光栅操作符

下面顶一个一组标记来描述光栅操作。可以应用在源图像、源刷,目的和结果。结合这些标记定义了必要的步骤。需要预制渲染操作。

 

  1. typedef enumSpiceRopd {  
  2.     SPICE_ROPD_INVERS_SRC = (1 << 0),//源图像在渲染前需要翻转  
  3.     SPICE_ROPD_INVERS_BRUSH = (1 << 1),//画笔在渲染前需要翻转  
  4.     SPICE_ROPD_INVERS_DEST = (1 << 2),//目标区域在渲染前需要翻转  
  5.     SPICE_ROPD_OP_PUT = (1 << 3),//应该使用复制操作  
  6.     SPICE_ROPD_OP_OR = (1 << 4),//应该使用或操作  
  7.     SPICE_ROPD_OP_AND = (1 << 5),//应该使用与操作  
  8.     SPICE_ROPD_OP_XOR = (1 << 6),//应该使用异或操作  
  9.     SPICE_ROPD_OP_BLACKNESS = (1 << 7),//目标像素应该为黑色取代  
  10.     SPICE_ROPD_OP_WHITENESS = (1 << 8),//目标像素应该为白色取代  
  11.     SPICE_ROPD_OP_INVERS = (1 << 9),//目标像素应该翻转  
  12.     SPICE_ROPD_INVERS_RES = (1 << 10),//操作的结果需要被翻转  
  13.    
  14.     SPICE_ROPD_MASK = 0x7ff  
  15. } SpiceRopd;  


OP_PUT, OP_OR,OP_AND, OP_XOR, OP_BLACKNESS, OP_WHITENESS, and

OP_INVERS 是相互排斥的。

OP_BLACKNESS,OP_WHITENESS, and OP_INVERS 是独有的。

 

1.5Raw raster image

下面的部分介绍SPICE象图,象图是SPICE协议传输图像的方法之一。

1.5.1SpiceBitmapFlags宏

  1. typedef enumSpiceBitmapFlags {  
  2. SPICE_BITMAP_FLAGS_PAL_CACHE_ME = (1 << 0),  
  3. //指示客户端将此画板加到缓存  
  4. SPICE_BITMAP_FLAGS_PAL_FROM_CACHE = (1 << 1),  
  5. //指示客户端从缓存中检索画板  
  6. SPICE_BITMAP_FLAGS_TOP_DOWN = (1 << 2),  
  7. //象图行命令是从上到下  
  8.    
  9.     SPICE_BITMAP_FLAGS_MASK = 0x7  
  10. }SpiceBitmapFlags;  


1.5.2SpiceBitmapFmt格式

  1. typedef enumSpiceBitmapFmt {  
  2.     SPICE_BITMAP_FMT_INVALID,  
  3. SPICE_BITMAP_FMT_1BIT_LE,  
  4.          //每像素1bit,小端字节序存储。每个像素的值是颜色表的索引。颜色表的大小是2.  
  5. SPICE_BITMAP_FMT_1BIT_BE,  
  6.          //每像素1bit,大端字节序存储。每个像素的值是颜色表的索引。颜色表的大小是2.  
  7. SPICE_BITMAP_FMT_4BIT_LE,  
  8.          //每像素4bit,小端半字节存储。每个像素的值是颜色表的索引。颜色表的大小是16  
  9. SPICE_BITMAP_FMT_4BIT_BE,  
  10.          //每像素4bit,大端半字节存储。每个像素的值是颜色表的索引。颜色表的大小是16  
  11. SPICE_BITMAP_FMT_8BIT,  
  12.          //每像素8bit.每个像素的值是颜色表的索引。颜色表的大小是256  
  13. SPICE_BITMAP_FMT_16BIT,  
  14.          //像素格式是 16 位 RGB555  
  15. SPICE_BITMAP_FMT_24BIT,  
  16. //像素格式是 24位 RGB888  
  17. SPICE_BITMAP_FMT_32BIT,  
  18. //像素格式是 32 位 RGB888  
  19. SPICE_BITMAP_FMT_RGBA,  
  20. //像素格式是 32 位ARGB8888  
  21. SPICE_BITMAP_FMT_8BIT_A,  
  22. //不太清楚  
  23.    
  24.     SPICE_BITMAP_FMT_ENUM_END  
  25. }SpiceBitmapFmt;  


1.5.3    SpiceBitmap结构体

  1. typedef structSpiceBitmap {  
  2.  uint8_t format; // SpiceBitmapFmt格式  
  3.     uint8_t flags; // SpiceBitmapFlags 宏  
  4.     uint32_t x; //位图的宽度  
  5.     uint32_t y; //位图的高度  
  6.     uint32_t stride;//从N行到N+1行添加字节的数量。(例如stride*y+x*format)  
  7.     SpicePalette *palette;//调色板的地址,如果没有颜色表所需要的格式必须为0;  
  8.     uint64_t palette_id;//调色板的ID,如果flags设置SPICE_BITMAP_FLAGS_PAL_FROM_CACHE有效  
  9.     SpiceChunks *data;//数据  
  10. } SpiceBitmap;  


1.5.4SpicePalette结构体

  1. typedef structSpicePalette {  
  2.     uint64_t unique;//palette的唯一ID  
  3.     uint16_t num_ents;//颜色表中条目的数量  
  4.     uint32_t ents[0];// 每个条目RGB555或RGB888颜色根据当前显示区域模式。如果显示区域模式颜色深度是32岁的有效格式是RGB888。如果显示区域模式颜色深度是有效的格式是RGB555 16。  
  5. } SpicePalette; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值