spice图像压缩简介
2015-07-29 16:21
1186 查看
转自:http://blog.csdn.net/zhoujiaxq/article/details/11201893
目前的spice图像压缩主要采用了quic,glz和jpeg。quic和glz是无损压缩算法,quic主要用于照片,glz用于人工图像,jpeg也主要用于照片压缩但是是有损的。jpeg能节省50%的带宽,glz只能节省20%,但是jpeg会带来更大的开销,所以不能都使用jpeg进行压缩。
spice官网对于广域网支持的介绍:http://spice-space.org/page/Features/WanSupport
spice图像压缩的流程:
qxl首先通过gdi接口获取到刷新的区域图像,然后传送给spice-server,spice-server获取到图像后通过
static inline void marshall_qxl_drawable(RedChannelClient *rcc,SpiceMarshaller *m, DrawablePipeItem *dpi)
[cpp]
view plaincopy
static inline void marshall_qxl_drawable(RedChannelClient *rcc,SpiceMarshaller *m, DrawablePipeItem *dpi)
函数先判断图像是应该当做视频处理还是图像处理,如果是视频就调用
red_marshall_stream_data(rcc, m, item)
[cpp]
view plaincopy
red_marshall_stream_data(rcc, m, item)
如果是图像先判断是否采用jpeg压缩,是否采用jpeg压缩是在
static void red_init(RedWorker *worker, WorkerInitData *init_data)
[cpp]
view plaincopy
static void red_init(RedWorker *worker, WorkerInitData *init_data)
里设置,worker->jpeg_state = init_data->jpeg_state;
如果想采用jpeg压缩可以直接更改为worker->jpeg_state =SPICE_WAN_COMPRESSION_ALWAYS;或者在Reds.c里把
spice_wan_compression_t jpeg_state = SPICE_WAN_COMPRESSION_AUTO;更改为
spice_wan_compression_t jpeg_state = SPICE_WAN_COMPRESSION_ALWAYS;
spice-server中图像的最终压缩都是在
static inline int red_compress_image(DisplayChannelClient *dcc,SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,int can_lossy,compress_send_data_t* o_comp_data)
[cpp]
view plaincopy
static inline int red_compress_image(DisplayChannelClient *dcc,SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,int can_lossy,compress_send_data_t* o_comp_data)
在这个函数里会根据image_compression,图像的大小,图像的格式来选择相应的压缩算法。spice-server通过tcp传输给spice-gtk客户端,客户端会通过数据流来判断出是采用何种压缩算法并采用相应的算法进行decode。
目前的spice图像压缩主要采用了quic,glz和jpeg。quic和glz是无损压缩算法,quic主要用于照片,glz用于人工图像,jpeg也主要用于照片压缩但是是有损的。jpeg能节省50%的带宽,glz只能节省20%,但是jpeg会带来更大的开销,所以不能都使用jpeg进行压缩。
spice官网对于广域网支持的介绍:http://spice-space.org/page/Features/WanSupport
spice图像压缩的流程:
qxl首先通过gdi接口获取到刷新的区域图像,然后传送给spice-server,spice-server获取到图像后通过
static inline void marshall_qxl_drawable(RedChannelClient *rcc,SpiceMarshaller *m, DrawablePipeItem *dpi)
[cpp]
view plaincopy
static inline void marshall_qxl_drawable(RedChannelClient *rcc,SpiceMarshaller *m, DrawablePipeItem *dpi)
函数先判断图像是应该当做视频处理还是图像处理,如果是视频就调用
red_marshall_stream_data(rcc, m, item)
[cpp]
view plaincopy
red_marshall_stream_data(rcc, m, item)
如果是图像先判断是否采用jpeg压缩,是否采用jpeg压缩是在
static void red_init(RedWorker *worker, WorkerInitData *init_data)
[cpp]
view plaincopy
static void red_init(RedWorker *worker, WorkerInitData *init_data)
里设置,worker->jpeg_state = init_data->jpeg_state;
如果想采用jpeg压缩可以直接更改为worker->jpeg_state =SPICE_WAN_COMPRESSION_ALWAYS;或者在Reds.c里把
spice_wan_compression_t jpeg_state = SPICE_WAN_COMPRESSION_AUTO;更改为
spice_wan_compression_t jpeg_state = SPICE_WAN_COMPRESSION_ALWAYS;
spice-server中图像的最终压缩都是在
static inline int red_compress_image(DisplayChannelClient *dcc,SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,int can_lossy,compress_send_data_t* o_comp_data)
[cpp]
view plaincopy
static inline int red_compress_image(DisplayChannelClient *dcc,SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,int can_lossy,compress_send_data_t* o_comp_data)
在这个函数里会根据image_compression,图像的大小,图像的格式来选择相应的压缩算法。spice-server通过tcp传输给spice-gtk客户端,客户端会通过数据流来判断出是采用何种压缩算法并采用相应的算法进行decode。
相关文章推荐
- VMS Software, Inc.
- 小白学开发(iOS)OC_property和synthesize(2015-07-28)
- EJB学习笔记六(EJB中的拦截器)
- 浅谈Android数据库版本升级及数据的迁移
- linux中解决SSH连接慢问题
- redis常用操作(持续更新)
- 网络流最大流除草计划
- PHP之正则表达式捕获组与非捕获组(详解)
- oracle笔记之管理员
- 黑马程序员——高新技术---Java基础-GUI编程
- android webView.loadData乱码解决方法
- jQuery选择器
- 限制某个进程只能在某个CPU上运行
- UIKit框架-12.UITableView数据刷新
- Perf -- Linux下的系统性能调优工具,第1部分
- js之 prototype 理解补充
- c语言1
- This web page has a redirect loop
- HDU 5318 (dp+矩阵快速幂优化)
- ubuntu 14.04 安装chrome及给chromium 安装 flash player