[Spice-devel] [PATCH spice 1/3] dcc_compress_image: Handle NULL drawable
Pavel Grunt
pgrunt at redhat.com
Tue Jan 12 08:21:19 PST 2016
---
server/dcc.c | 38 +++++++++++++++++++++-----------------
1 file changed, 21 insertions(+), 17 deletions(-)
diff --git a/server/dcc.c b/server/dcc.c
index eb5e4d1..b617b99 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -1056,6 +1056,7 @@ int dcc_compress_image(DisplayChannelClient *dcc,
DisplayChannel *display_channel = DCC_TO_DC(dcc);
SpiceImageCompression image_compression = dcc->image_compression;
int quic_compress = FALSE;
+ uint32_t group_id;
if ((image_compression == SPICE_IMAGE_COMPRESSION_OFF) ||
((src->y * src->stride) < MIN_SIZE_TO_COMPRESS)) { // TODO: change the size cond
@@ -1086,7 +1087,8 @@ int dcc_compress_image(DisplayChannelClient *dcc,
if ((src->x < MIN_DIMENSION_TO_QUIC) || (src->y < MIN_DIMENSION_TO_QUIC)) {
quic_compress = FALSE;
} else {
- if (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_INVALID) {
+ if (drawable == NULL ||
+ drawable->copy_bitmap_graduality == BITMAP_GRADUAL_INVALID) {
quic_compress = bitmap_fmt_has_graduality(src->format) &&
bitmap_get_graduality_level(src) == BITMAP_GRADUAL_HIGH;
} else {
@@ -1099,6 +1101,12 @@ int dcc_compress_image(DisplayChannelClient *dcc,
}
}
+ if (drawable != NULL) {
+ group_id = drawable->group_id;
+ } else {
+ group_id = red_worker_get_memslot(display_channel->common.worker)->internal_groupslot_id;
+ }
+
if (quic_compress) {
#ifdef COMPRESS_DEBUG
spice_info("QUIC compress");
@@ -1109,24 +1117,22 @@ int dcc_compress_image(DisplayChannelClient *dcc,
(image_compression == SPICE_IMAGE_COMPRESSION_AUTO_GLZ))) {
// if we use lz for alpha, the stride can't be extra
if (src->format != SPICE_BITMAP_FMT_RGBA || !bitmap_has_extra_stride(src)) {
- return dcc_compress_image_jpeg(dcc, dest,
- src, o_comp_data, drawable->group_id);
+ return dcc_compress_image_jpeg(dcc, dest, src, o_comp_data, group_id);
}
}
- return dcc_compress_image_quic(dcc, dest,
- src, o_comp_data, drawable->group_id);
+ return dcc_compress_image_quic(dcc, dest, src, o_comp_data, group_id);
} else {
int glz;
int ret;
- if ((image_compression == SPICE_IMAGE_COMPRESSION_AUTO_GLZ) ||
- (image_compression == SPICE_IMAGE_COMPRESSION_GLZ)) {
- glz = bitmap_fmt_has_graduality(src->format) && (
- (src->x * src->y) < glz_enc_dictionary_get_size(
- dcc->glz_dict->dict));
- } else if ((image_compression == SPICE_IMAGE_COMPRESSION_AUTO_LZ) ||
- (image_compression == SPICE_IMAGE_COMPRESSION_LZ) ||
- (image_compression == SPICE_IMAGE_COMPRESSION_LZ4)) {
+ if ((image_compression == SPICE_IMAGE_COMPRESSION_AUTO_LZ) ||
+ (image_compression == SPICE_IMAGE_COMPRESSION_LZ) ||
+ (image_compression == SPICE_IMAGE_COMPRESSION_LZ4) ||
+ drawable == NULL) {
glz = FALSE;
+ } else if ((image_compression == SPICE_IMAGE_COMPRESSION_AUTO_GLZ) ||
+ (image_compression == SPICE_IMAGE_COMPRESSION_GLZ)) {
+ glz = bitmap_fmt_has_graduality(src->format) &&
+ ((src->x * src->y) < glz_enc_dictionary_get_size(dcc->glz_dict->dict));
} else {
spice_error("invalid image compression type %u", image_compression);
return FALSE;
@@ -1151,12 +1157,10 @@ int dcc_compress_image(DisplayChannelClient *dcc,
bitmap_fmt_is_rgb(src->format) &&
red_channel_client_test_remote_cap(&dcc->common.base,
SPICE_DISPLAY_CAP_LZ4_COMPRESSION)) {
- ret = dcc_compress_image_lz4(dcc, dest, src, o_comp_data,
- drawable->group_id);
+ ret = dcc_compress_image_lz4(dcc, dest, src, o_comp_data, group_id);
} else
#endif
- ret = dcc_compress_image_lz(dcc, dest, src, o_comp_data,
- drawable->group_id);
+ ret = dcc_compress_image_lz(dcc, dest, src, o_comp_data, group_id);
#ifdef COMPRESS_DEBUG
spice_info("LZ LOCAL compress");
#endif
--
2.5.0
More information about the Spice-devel
mailing list