[Spice-devel] [PATCH v2 09/30] Move image_encoders_compress_jpeg to dcc-encoders.c

Jonathon Jongsma jjongsma at redhat.com
Thu Jun 9 20:47:38 UTC 2016


Acked-by: Jonathon Jongsma <jjongsma at redhat.com>

On Thu, 2016-06-09 at 13:31 +0100, Frediano Ziglio wrote:
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/dcc-encoders.c | 127
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  server/dcc-encoders.h |   4 ++
>  server/dcc.c          | 127 -----------------------------------------------
> ---
>  3 files changed, 131 insertions(+), 127 deletions(-)
> 
> diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c
> index 279c134..0b8ef46 100644
> --- a/server/dcc-encoders.c
> +++ b/server/dcc-encoders.c
> @@ -862,4 +862,131 @@ int image_encoders_compress_lz(ImageEncoders *enc,
>      return TRUE;
>  }
>  
> +int image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest,
> +                                 SpiceBitmap *src, compress_send_data_t*
> o_comp_data,
> +                                 stat_info_t *jpeg_stats, // FIXME put all
> stats in a structure
> +                                 stat_info_t *jpeg_alpha_stats)
> +{
> +    JpegData *jpeg_data = &enc->jpeg_data;
> +    LzData *lz_data = &enc->lz_data;
> +    JpegEncoderContext *jpeg = enc->jpeg;
> +    LzContext *lz = enc->lz;
> +    volatile JpegEncoderImageType jpeg_in_type;
> +    int jpeg_size = 0;
> +    volatile int has_alpha = FALSE;
> +    int alpha_lz_size = 0;
> +    int comp_head_filled;
> +    int comp_head_left;
> +    int stride;
> +    uint8_t *lz_out_start_byte;
> +    stat_start_time_t start_time;
> +    stat_start_time_init(&start_time, jpeg_alpha_stats);
> +
> +#ifdef COMPRESS_DEBUG
> +    spice_info("JPEG compress");
> +#endif
> +
> +    switch (src->format) {
> +    case SPICE_BITMAP_FMT_16BIT:
> +        jpeg_in_type = JPEG_IMAGE_TYPE_RGB16;
> +        break;
> +    case SPICE_BITMAP_FMT_24BIT:
> +        jpeg_in_type = JPEG_IMAGE_TYPE_BGR24;
> +        break;
> +    case SPICE_BITMAP_FMT_32BIT:
> +        jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
> +        break;
> +    case SPICE_BITMAP_FMT_RGBA:
> +        jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
> +        has_alpha = TRUE;
> +        break;
> +    default:
> +        return FALSE;
> +    }
> +
> +    encoder_data_init(&jpeg_data->data);
> +
> +    if (setjmp(jpeg_data->data.jmp_env)) {
> +        encoder_data_reset(&jpeg_data->data);
> +        return FALSE;
> +    }
> +
> +    if (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE) {
> +        spice_chunks_linearize(src->data);
> +    }
> +
> +    jpeg_data->data.u.lines_data.chunks = src->data;
> +    jpeg_data->data.u.lines_data.stride = src->stride;
> +    if ((src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
> +        jpeg_data->data.u.lines_data.next = 0;
> +        jpeg_data->data.u.lines_data.reverse = 0;
> +        stride = src->stride;
> +    } else {
> +        jpeg_data->data.u.lines_data.next = src->data->num_chunks - 1;
> +        jpeg_data->data.u.lines_data.reverse = 1;
> +        stride = -src->stride;
> +    }
> +    jpeg_size = jpeg_encode(jpeg, enc->jpeg_quality, jpeg_in_type,
> +                            src->x, src->y, NULL,
> +                            0, stride, jpeg_data->data.bufs_head->buf.bytes,
> +                            sizeof(jpeg_data->data.bufs_head->buf));
> +
> +    // the compressed buffer is bigger than the original data
> +    if (jpeg_size > (src->y * src->stride)) {
> +        longjmp(jpeg_data->data.jmp_env, 1);
> +    }
> +
> +    if (!has_alpha) {
> +        dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG;
> +        dest->u.jpeg.data_size = jpeg_size;
> +
> +        o_comp_data->comp_buf = jpeg_data->data.bufs_head;
> +        o_comp_data->comp_buf_size = jpeg_size;
> +        o_comp_data->is_lossy = TRUE;
> +
> +        stat_compress_add(jpeg_stats, start_time, src->stride * src->y,
> +                          o_comp_data->comp_buf_size);
> +        return TRUE;
> +    }
> +
> +    lz_data->data.bufs_head = jpeg_data->data.bufs_tail;
> +    lz_data->data.bufs_tail = lz_data->data.bufs_head;
> +
> +    comp_head_filled = jpeg_size % sizeof(lz_data->data.bufs_head->buf);
> +    comp_head_left = sizeof(lz_data->data.bufs_head->buf) - comp_head_filled;
> +    lz_out_start_byte = lz_data->data.bufs_head->buf.bytes +
> comp_head_filled;
> +
> +    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;
> +
> +    alpha_lz_size = lz_encode(lz, LZ_IMAGE_TYPE_XXXA, src->x, src->y,
> +                               !!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
> +                               NULL, 0, src->stride,
> +                               lz_out_start_byte,
> +                               comp_head_left);
> +
> +    // the compressed buffer is bigger than the original data
> +    if ((jpeg_size + alpha_lz_size) > (src->y * src->stride)) {
> +        longjmp(jpeg_data->data.jmp_env, 1);
> +    }
> +
> +    dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG_ALPHA;
> +    dest->u.jpeg_alpha.flags = 0;
> +    if (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN) {
> +        dest->u.jpeg_alpha.flags |= SPICE_JPEG_ALPHA_FLAGS_TOP_DOWN;
> +    }
> +
> +    dest->u.jpeg_alpha.jpeg_size = jpeg_size;
> +    dest->u.jpeg_alpha.data_size = jpeg_size + alpha_lz_size;
> +
> +    o_comp_data->comp_buf = jpeg_data->data.bufs_head;
> +    o_comp_data->comp_buf_size = jpeg_size + alpha_lz_size;
> +    o_comp_data->is_lossy = TRUE;
> +    stat_compress_add(jpeg_alpha_stats, start_time, src->stride * src->y,
> +                      o_comp_data->comp_buf_size);
> +    return TRUE;
> +}
> +
>  
> diff --git a/server/dcc-encoders.h b/server/dcc-encoders.h
> index 5bb0208..939221f 100644
> --- a/server/dcc-encoders.h
> +++ b/server/dcc-encoders.h
> @@ -188,6 +188,10 @@ int image_encoders_compress_lz(ImageEncoders *enc,
>                                 SpiceImage *dest, SpiceBitmap *src,
>                                 compress_send_data_t* o_comp_data,
>                                 stat_info_t *stats);
> +int image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest,
> +                                 SpiceBitmap *src, compress_send_data_t*
> o_comp_data,
> +                                 stat_info_t *jpeg_stats,
> +                                 stat_info_t *jpeg_alpha_stats);
>  
>  #define RED_RELEASE_BUNCH_SIZE 64
>  
> diff --git a/server/dcc.c b/server/dcc.c
> index ca6f5b5..218baad 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -784,133 +784,6 @@ glz:
>      return TRUE;
>  }
>  
> -static int image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest,
> -                                        SpiceBitmap *src,
> compress_send_data_t* o_comp_data,
> -                                        stat_info_t *jpeg_stats, // FIXME put
> all stats in a structure
> -                                        stat_info_t *jpeg_alpha_stats)
> -{
> -    JpegData *jpeg_data = &enc->jpeg_data;
> -    LzData *lz_data = &enc->lz_data;
> -    JpegEncoderContext *jpeg = enc->jpeg;
> -    LzContext *lz = enc->lz;
> -    volatile JpegEncoderImageType jpeg_in_type;
> -    int jpeg_size = 0;
> -    volatile int has_alpha = FALSE;
> -    int alpha_lz_size = 0;
> -    int comp_head_filled;
> -    int comp_head_left;
> -    int stride;
> -    uint8_t *lz_out_start_byte;
> -    stat_start_time_t start_time;
> -    stat_start_time_init(&start_time, jpeg_alpha_stats);
> -
> -#ifdef COMPRESS_DEBUG
> -    spice_info("JPEG compress");
> -#endif
> -
> -    switch (src->format) {
> -    case SPICE_BITMAP_FMT_16BIT:
> -        jpeg_in_type = JPEG_IMAGE_TYPE_RGB16;
> -        break;
> -    case SPICE_BITMAP_FMT_24BIT:
> -        jpeg_in_type = JPEG_IMAGE_TYPE_BGR24;
> -        break;
> -    case SPICE_BITMAP_FMT_32BIT:
> -        jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
> -        break;
> -    case SPICE_BITMAP_FMT_RGBA:
> -        jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
> -        has_alpha = TRUE;
> -        break;
> -    default:
> -        return FALSE;
> -    }
> -
> -    encoder_data_init(&jpeg_data->data);
> -
> -    if (setjmp(jpeg_data->data.jmp_env)) {
> -        encoder_data_reset(&jpeg_data->data);
> -        return FALSE;
> -    }
> -
> -    if (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE) {
> -        spice_chunks_linearize(src->data);
> -    }
> -
> -    jpeg_data->data.u.lines_data.chunks = src->data;
> -    jpeg_data->data.u.lines_data.stride = src->stride;
> -    if ((src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
> -        jpeg_data->data.u.lines_data.next = 0;
> -        jpeg_data->data.u.lines_data.reverse = 0;
> -        stride = src->stride;
> -    } else {
> -        jpeg_data->data.u.lines_data.next = src->data->num_chunks - 1;
> -        jpeg_data->data.u.lines_data.reverse = 1;
> -        stride = -src->stride;
> -    }
> -    jpeg_size = jpeg_encode(jpeg, enc->jpeg_quality, jpeg_in_type,
> -                            src->x, src->y, NULL,
> -                            0, stride, jpeg_data->data.bufs_head->buf.bytes,
> -                            sizeof(jpeg_data->data.bufs_head->buf));
> -
> -    // the compressed buffer is bigger than the original data
> -    if (jpeg_size > (src->y * src->stride)) {
> -        longjmp(jpeg_data->data.jmp_env, 1);
> -    }
> -
> -    if (!has_alpha) {
> -        dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG;
> -        dest->u.jpeg.data_size = jpeg_size;
> -
> -        o_comp_data->comp_buf = jpeg_data->data.bufs_head;
> -        o_comp_data->comp_buf_size = jpeg_size;
> -        o_comp_data->is_lossy = TRUE;
> -
> -        stat_compress_add(jpeg_stats, start_time, src->stride * src->y,
> -                          o_comp_data->comp_buf_size);
> -        return TRUE;
> -    }
> -
> -    lz_data->data.bufs_head = jpeg_data->data.bufs_tail;
> -    lz_data->data.bufs_tail = lz_data->data.bufs_head;
> -
> -    comp_head_filled = jpeg_size % sizeof(lz_data->data.bufs_head->buf);
> -    comp_head_left = sizeof(lz_data->data.bufs_head->buf) - comp_head_filled;
> -    lz_out_start_byte = lz_data->data.bufs_head->buf.bytes +
> comp_head_filled;
> -
> -    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;
> -
> -    alpha_lz_size = lz_encode(lz, LZ_IMAGE_TYPE_XXXA, src->x, src->y,
> -                               !!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
> -                               NULL, 0, src->stride,
> -                               lz_out_start_byte,
> -                               comp_head_left);
> -
> -    // the compressed buffer is bigger than the original data
> -    if ((jpeg_size + alpha_lz_size) > (src->y * src->stride)) {
> -        longjmp(jpeg_data->data.jmp_env, 1);
> -    }
> -
> -    dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG_ALPHA;
> -    dest->u.jpeg_alpha.flags = 0;
> -    if (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN) {
> -        dest->u.jpeg_alpha.flags |= SPICE_JPEG_ALPHA_FLAGS_TOP_DOWN;
> -    }
> -
> -    dest->u.jpeg_alpha.jpeg_size = jpeg_size;
> -    dest->u.jpeg_alpha.data_size = jpeg_size + alpha_lz_size;
> -
> -    o_comp_data->comp_buf = jpeg_data->data.bufs_head;
> -    o_comp_data->comp_buf_size = jpeg_size + alpha_lz_size;
> -    o_comp_data->is_lossy = TRUE;
> -    stat_compress_add(jpeg_alpha_stats, start_time, src->stride * src->y,
> -                      o_comp_data->comp_buf_size);
> -    return TRUE;
> -}
> -
>  #ifdef USE_LZ4
>  static int dcc_compress_image_lz4(DisplayChannelClient *dcc, SpiceImage
> *dest,
>                                    SpiceBitmap *src, compress_send_data_t*
> o_comp_data)


More information about the Spice-devel mailing list