mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-06 03:15:16 +00:00
LZ4: Do not reverse bottom-up images
Reversing the bottom-up images in the server is not needed since Pixman, in the client, is able to deal with them. As a result, the previous code was more complex and wrong. This commit fixes and cleans it.
This commit is contained in:
parent
d92ce3506e
commit
16412aa101
@ -49,21 +49,20 @@ void lz4_encoder_destroy(Lz4EncoderContext* encoder)
|
||||
free(encoder);
|
||||
}
|
||||
|
||||
int lz4_encode(Lz4EncoderContext *lz4, int height, int stride,
|
||||
uint8_t *io_ptr, unsigned int num_io_bytes)
|
||||
int lz4_encode(Lz4EncoderContext *lz4, int height, int stride, uint8_t *io_ptr,
|
||||
unsigned int num_io_bytes, int top_down)
|
||||
{
|
||||
Lz4Encoder *enc = (Lz4Encoder *)lz4;
|
||||
uint8_t *lines;
|
||||
int num_lines = 0;
|
||||
int total_lines = 0;
|
||||
int in_size, enc_size, out_size, already_copied;
|
||||
int stride_abs = abs(stride);
|
||||
uint8_t *in_buf, *compressed_lines;
|
||||
uint8_t *out_buf = io_ptr;
|
||||
LZ4_stream_t *stream = LZ4_createStream();
|
||||
|
||||
// Encode direction
|
||||
*(out_buf++) = stride < 0 ? 1 : 0;
|
||||
*(out_buf++) = top_down ? 1 : 0;
|
||||
num_io_bytes--;
|
||||
out_size = 1;
|
||||
|
||||
@ -74,9 +73,9 @@ int lz4_encode(Lz4EncoderContext *lz4, int height, int stride,
|
||||
LZ4_freeStream(stream);
|
||||
return 0;
|
||||
}
|
||||
in_buf = stride < 0 ? lines - (stride_abs * (num_lines - 1)) : lines;
|
||||
lines += stride * num_lines;
|
||||
in_size = stride_abs * num_lines;
|
||||
in_buf = lines;
|
||||
in_size = stride * num_lines;
|
||||
lines += in_size;
|
||||
compressed_lines = (uint8_t *) malloc(LZ4_compressBound(in_size) + 4);
|
||||
enc_size = LZ4_compress_continue(stream, (const char *) in_buf,
|
||||
(char *) compressed_lines + 4, in_size);
|
||||
|
||||
@ -43,8 +43,7 @@ struct Lz4EncoderUsrContext {
|
||||
Lz4EncoderContext* lz4_encoder_create(Lz4EncoderUsrContext *usr);
|
||||
void lz4_encoder_destroy(Lz4EncoderContext *encoder);
|
||||
|
||||
/* returns the total size of the encoded data. Images must be supplied from the
|
||||
top line to the bottom */
|
||||
int lz4_encode(Lz4EncoderContext *lz4, int height, int stride,
|
||||
uint8_t *io_ptr, unsigned int num_io_bytes);
|
||||
/* returns the total size of the encoded data. */
|
||||
int lz4_encode(Lz4EncoderContext *lz4, int height, int stride, uint8_t *io_ptr,
|
||||
unsigned int num_io_bytes, int top_down);
|
||||
#endif
|
||||
|
||||
@ -6422,7 +6422,6 @@ static int red_lz4_compress_image(DisplayChannelClient *dcc, SpiceImage *dest,
|
||||
Lz4Data *lz4_data = &worker->lz4_data;
|
||||
Lz4EncoderContext *lz4 = worker->lz4;
|
||||
int lz4_size = 0;
|
||||
int stride;
|
||||
|
||||
#ifdef COMPRESS_STAT
|
||||
stat_time_t start_time = stat_now();
|
||||
@ -6454,20 +6453,13 @@ static int red_lz4_compress_image(DisplayChannelClient *dcc, SpiceImage *dest,
|
||||
|
||||
lz4_data->data.u.lines_data.chunks = src->data;
|
||||
lz4_data->data.u.lines_data.stride = src->stride;
|
||||
lz4_data->data.u.lines_data.next = 0;
|
||||
lz4_data->data.u.lines_data.reverse = 0;
|
||||
lz4_data->usr.more_lines = lz4_usr_more_lines;
|
||||
|
||||
if ((src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
|
||||
lz4_data->data.u.lines_data.next = 0;
|
||||
lz4_data->data.u.lines_data.reverse = 0;
|
||||
stride = src->stride;
|
||||
} else {
|
||||
lz4_data->data.u.lines_data.next = src->data->num_chunks - 1;
|
||||
lz4_data->data.u.lines_data.reverse = 1;
|
||||
stride = -src->stride;
|
||||
}
|
||||
|
||||
lz4_size = lz4_encode(lz4, src->y, stride, (uint8_t*)lz4_data->data.bufs_head->buf,
|
||||
sizeof(lz4_data->data.bufs_head->buf));
|
||||
lz4_size = lz4_encode(lz4, src->y, src->stride, (uint8_t*)lz4_data->data.bufs_head->buf,
|
||||
sizeof(lz4_data->data.bufs_head->buf),
|
||||
src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN);
|
||||
|
||||
// the compressed buffer is bigger than the original data
|
||||
if (lz4_size > (src->y * src->stride)) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user