天天看點

spice圖像壓縮簡介

目前的spice圖像壓縮主要采用了quic,glz和jpeg。quic和glz是無損壓縮算法,quic主要用于照片,glz用于人工圖像,jpeg也主要用于照片壓縮但是是有損的。jpeg能節省50%的帶寬,glz隻能節省20%,但是jpeg會帶來更大的開銷,是以不能都使用jpeg進行壓縮。

spice官網對于廣域網支援的介紹:點選打開連結

spice圖像壓縮的流程:

qxl首先通過gdi接口擷取到重新整理的區域圖像,然後傳送給spice-server,spice-server擷取到圖像後通過

static inline void marshall_qxl_drawable(RedChannelClient *rcc,SpiceMarshaller *m, DrawablePipeItem *dpi)
           

函數先判斷圖像是應該當做視訊處理還是圖像處理,如果是視訊就調用

red_marshall_stream_data(rcc, m, item)
           

如果是圖像先判斷是否采用jpeg壓縮,是否采用jpeg壓縮是在

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)
           

在這個函數裡會根據image_compression,圖像的大小,圖像的格式來選擇相應的壓縮算法。

spice-server通過tcp傳輸給spice-gtk用戶端,用戶端會通過資料流來判斷出是采用何種壓縮算法并采用相應的算法進行decode。

繼續閱讀