diff options
author | Yonit Halperin <yhalperi@redhat.com> | 2012-04-01 08:32:14 +0300 |
---|---|---|
committer | Yonit Halperin <yhalperi@redhat.com> | 2012-05-03 13:07:01 +0300 |
commit | 318dce4abbdaf48817a48a3c6d5972e4223dff06 (patch) | |
tree | 9583f961c52b098faa697f3d3a4a7e4986500f15 /server/mjpeg_encoder.c | |
parent | 0f1fb0ecc2a2f5a3086b7697e26228c16b97693e (diff) | |
download | spice-318dce4abbdaf48817a48a3c6d5972e4223dff06.tar.gz spice-318dce4abbdaf48817a48a3c6d5972e4223dff06.tar.xz spice-318dce4abbdaf48817a48a3c6d5972e4223dff06.zip |
server/red_worker.c/video: add support for frames of different sizes
rhbz #813826
When playing a youtube video on Windows guest, the driver sometimes(**) sends
images which contain the video frames, but also other parts of the
screen (e.g., the youtube process bar). In order to prevent glitches, we send these
images as part of the stream, using SPICE_MSG_DISPLAY_STREAM_DATA_SIZED.
(**) It happens regularly with the you tube html5 player. With flash,
it occurs when moving the cursor in the player area.
Diffstat (limited to 'server/mjpeg_encoder.c')
-rw-r--r-- | server/mjpeg_encoder.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/server/mjpeg_encoder.c b/server/mjpeg_encoder.c index 4692315c..9c3d0796 100644 --- a/server/mjpeg_encoder.c +++ b/server/mjpeg_encoder.c @@ -25,8 +25,6 @@ #include <jpeglib.h> struct MJpegEncoder { - int width; - int height; uint8_t *row; int first_frame; int quality; @@ -38,15 +36,13 @@ struct MJpegEncoder { void (*pixel_converter)(uint8_t *src, uint8_t *dest); }; -MJpegEncoder *mjpeg_encoder_new(int width, int height) +MJpegEncoder *mjpeg_encoder_new(void) { MJpegEncoder *enc; enc = spice_new0(MJpegEncoder, 1); enc->first_frame = TRUE; - enc->width = width; - enc->height = height; enc->quality = 70; enc->cinfo.err = jpeg_std_error(&enc->jerr); jpeg_create_compress(&enc->cinfo); @@ -200,6 +196,7 @@ spice_jpeg_mem_dest(j_compress_ptr cinfo, /* end of code from libjpeg */ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format, + int width, int height, uint8_t **dest, size_t *dest_len) { encoder->cinfo.in_color_space = JCS_RGB; @@ -233,9 +230,9 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format, } if ((encoder->pixel_converter != NULL) && (encoder->row == NULL)) { - unsigned int stride = encoder->width * 3; + unsigned int stride = width * 3; /* check for integer overflow */ - if (stride < encoder->width) { + if (stride < width) { return FALSE; } encoder->row = spice_malloc(stride); @@ -243,8 +240,8 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format, spice_jpeg_mem_dest(&encoder->cinfo, dest, dest_len); - encoder->cinfo.image_width = encoder->width; - encoder->cinfo.image_height = encoder->height; + encoder->cinfo.image_width = width; + encoder->cinfo.image_height = height; jpeg_set_defaults(&encoder->cinfo); encoder->cinfo.dct_method = JDCT_IFAST; jpeg_set_quality(&encoder->cinfo, encoder->quality, TRUE); |