summaryrefslogtreecommitdiffstats
path: root/server/mjpeg_encoder.c
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2012-04-01 08:32:14 +0300
committerYonit Halperin <yhalperi@redhat.com>2012-05-03 13:07:01 +0300
commit318dce4abbdaf48817a48a3c6d5972e4223dff06 (patch)
tree9583f961c52b098faa697f3d3a4a7e4986500f15 /server/mjpeg_encoder.c
parent0f1fb0ecc2a2f5a3086b7697e26228c16b97693e (diff)
downloadspice-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.c15
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);