[Spice-devel] [PATCH spice 1/3] dcc_compress_image: Handle NULL drawable
Frediano Ziglio
fziglio at redhat.com
Tue Jan 12 09:57:16 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;
Here the change looks bigger but you just moved the ifs to add the drawable == NULL check.
> @@ -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
>
The patch looks good. From next patch this is done to use this function without
a drawable.
What looks ugly is the original code. If not really clear what the end results
will be. Beside all nested ifs and checks. Why for instance MIN_DIMENSION_TO_QUIC
is not checked when image_compression is SPICE_IMAGE_COMPRESSION_QUIC?
Is possible to compress palette images with Quic?
Not clear (at least to me) why glz require a Drawable.
Frediano
More information about the Spice-devel
mailing list