mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-24 17:01:43 +00:00
Move image_encoders_compress_lz to dcc-encoders.c
Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
This commit is contained in:
parent
c5caf0dddd
commit
cff7950aa3
@ -782,4 +782,84 @@ int image_encoders_compress_quic(ImageEncoders *enc, SpiceImage *dest,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const LzImageType bitmap_fmt_to_lz_image_type[] = {
|
||||
LZ_IMAGE_TYPE_INVALID,
|
||||
LZ_IMAGE_TYPE_PLT1_LE,
|
||||
LZ_IMAGE_TYPE_PLT1_BE,
|
||||
LZ_IMAGE_TYPE_PLT4_LE,
|
||||
LZ_IMAGE_TYPE_PLT4_BE,
|
||||
LZ_IMAGE_TYPE_PLT8,
|
||||
LZ_IMAGE_TYPE_RGB16,
|
||||
LZ_IMAGE_TYPE_RGB24,
|
||||
LZ_IMAGE_TYPE_RGB32,
|
||||
LZ_IMAGE_TYPE_RGBA,
|
||||
LZ_IMAGE_TYPE_A8
|
||||
};
|
||||
|
||||
int image_encoders_compress_lz(ImageEncoders *enc,
|
||||
SpiceImage *dest, SpiceBitmap *src,
|
||||
compress_send_data_t* o_comp_data,
|
||||
stat_info_t *stats)
|
||||
{
|
||||
LzData *lz_data = &enc->lz_data;
|
||||
LzContext *lz = enc->lz;
|
||||
LzImageType type = bitmap_fmt_to_lz_image_type[src->format];
|
||||
int size; // size of the compressed data
|
||||
|
||||
stat_start_time_t start_time;
|
||||
stat_start_time_init(&start_time, stats);
|
||||
|
||||
#ifdef COMPRESS_DEBUG
|
||||
spice_info("LZ LOCAL compress");
|
||||
#endif
|
||||
|
||||
encoder_data_init(&lz_data->data);
|
||||
|
||||
if (setjmp(lz_data->data.jmp_env)) {
|
||||
encoder_data_reset(&lz_data->data);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
lz_data->data.u.lines_data.chunks = src->data;
|
||||
lz_data->data.u.lines_data.stride = src->stride;
|
||||
lz_data->data.u.lines_data.next = 0;
|
||||
lz_data->data.u.lines_data.reverse = 0;
|
||||
|
||||
size = lz_encode(lz, type, src->x, src->y,
|
||||
!!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
|
||||
NULL, 0, src->stride,
|
||||
lz_data->data.bufs_head->buf.bytes,
|
||||
sizeof(lz_data->data.bufs_head->buf));
|
||||
|
||||
// the compressed buffer is bigger than the original data
|
||||
if (size > (src->y * src->stride)) {
|
||||
longjmp(lz_data->data.jmp_env, 1);
|
||||
}
|
||||
|
||||
if (bitmap_fmt_is_rgb(src->format)) {
|
||||
dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_RGB;
|
||||
dest->u.lz_rgb.data_size = size;
|
||||
|
||||
o_comp_data->comp_buf = lz_data->data.bufs_head;
|
||||
o_comp_data->comp_buf_size = size;
|
||||
} else {
|
||||
/* masks are 1BIT bitmaps without palettes, but they are not compressed
|
||||
* (see fill_mask) */
|
||||
spice_assert(src->palette);
|
||||
dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_PLT;
|
||||
dest->u.lz_plt.data_size = size;
|
||||
dest->u.lz_plt.flags = src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN;
|
||||
dest->u.lz_plt.palette = src->palette;
|
||||
dest->u.lz_plt.palette_id = src->palette->unique;
|
||||
o_comp_data->comp_buf = lz_data->data.bufs_head;
|
||||
o_comp_data->comp_buf_size = size;
|
||||
|
||||
o_comp_data->lzplt_palette = dest->u.lz_plt.palette;
|
||||
}
|
||||
|
||||
stat_compress_add(stats, start_time, src->stride * src->y,
|
||||
o_comp_data->comp_buf_size);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -179,6 +179,11 @@ typedef struct compress_send_data_t {
|
||||
int image_encoders_compress_quic(ImageEncoders *enc, SpiceImage *dest,
|
||||
SpiceBitmap *src, compress_send_data_t* o_comp_data,
|
||||
stat_info_t *stats);
|
||||
int image_encoders_compress_lz(ImageEncoders *enc,
|
||||
SpiceImage *dest, SpiceBitmap *src,
|
||||
compress_send_data_t* o_comp_data,
|
||||
stat_info_t *stats);
|
||||
|
||||
#define RED_RELEASE_BUNCH_SIZE 64
|
||||
|
||||
#endif /* DCC_ENCODERS_H_ */
|
||||
|
||||
66
server/dcc.c
66
server/dcc.c
@ -784,72 +784,6 @@ glz:
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int image_encoders_compress_lz(ImageEncoders *enc,
|
||||
SpiceImage *dest, SpiceBitmap *src,
|
||||
compress_send_data_t* o_comp_data,
|
||||
stat_info_t *stats)
|
||||
{
|
||||
LzData *lz_data = &enc->lz_data;
|
||||
LzContext *lz = enc->lz;
|
||||
LzImageType type = bitmap_fmt_to_lz_image_type[src->format];
|
||||
int size; // size of the compressed data
|
||||
|
||||
stat_start_time_t start_time;
|
||||
stat_start_time_init(&start_time, stats);
|
||||
|
||||
#ifdef COMPRESS_DEBUG
|
||||
spice_info("LZ LOCAL compress");
|
||||
#endif
|
||||
|
||||
encoder_data_init(&lz_data->data);
|
||||
|
||||
if (setjmp(lz_data->data.jmp_env)) {
|
||||
encoder_data_reset(&lz_data->data);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
lz_data->data.u.lines_data.chunks = src->data;
|
||||
lz_data->data.u.lines_data.stride = src->stride;
|
||||
lz_data->data.u.lines_data.next = 0;
|
||||
lz_data->data.u.lines_data.reverse = 0;
|
||||
|
||||
size = lz_encode(lz, type, src->x, src->y,
|
||||
!!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
|
||||
NULL, 0, src->stride,
|
||||
lz_data->data.bufs_head->buf.bytes,
|
||||
sizeof(lz_data->data.bufs_head->buf));
|
||||
|
||||
// the compressed buffer is bigger than the original data
|
||||
if (size > (src->y * src->stride)) {
|
||||
longjmp(lz_data->data.jmp_env, 1);
|
||||
}
|
||||
|
||||
if (bitmap_fmt_is_rgb(src->format)) {
|
||||
dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_RGB;
|
||||
dest->u.lz_rgb.data_size = size;
|
||||
|
||||
o_comp_data->comp_buf = lz_data->data.bufs_head;
|
||||
o_comp_data->comp_buf_size = size;
|
||||
} else {
|
||||
/* masks are 1BIT bitmaps without palettes, but they are not compressed
|
||||
* (see fill_mask) */
|
||||
spice_assert(src->palette);
|
||||
dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_PLT;
|
||||
dest->u.lz_plt.data_size = size;
|
||||
dest->u.lz_plt.flags = src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN;
|
||||
dest->u.lz_plt.palette = src->palette;
|
||||
dest->u.lz_plt.palette_id = src->palette->unique;
|
||||
o_comp_data->comp_buf = lz_data->data.bufs_head;
|
||||
o_comp_data->comp_buf_size = size;
|
||||
|
||||
o_comp_data->lzplt_palette = dest->u.lz_plt.palette;
|
||||
}
|
||||
|
||||
stat_compress_add(stats, start_time, src->stride * src->y,
|
||||
o_comp_data->comp_buf_size);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int dcc_compress_image_jpeg(DisplayChannelClient *dcc, SpiceImage *dest,
|
||||
SpiceBitmap *src, compress_send_data_t* o_comp_data)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user