summaryrefslogtreecommitdiffstats
path: root/server/mjpeg_encoder.c
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2011-06-27 18:38:51 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2011-07-22 16:53:56 +0200
commitad55230a2d970edb859d646f10c0f6baf18aa41c (patch)
tree267c0e5dbf5ce9caac3d2ddecc9c9a26da824216 /server/mjpeg_encoder.c
parentb0cd4f4883b86327bb86fce5422ab2474128aac6 (diff)
downloadspice-ad55230a2d970edb859d646f10c0f6baf18aa41c.tar.gz
spice-ad55230a2d970edb859d646f10c0f6baf18aa41c.tar.xz
spice-ad55230a2d970edb859d646f10c0f6baf18aa41c.zip
mjpeg_encoder: use libjpeg-turbo extra colorspaces
When libjpeg-turbo is available, we can use the BGR and BGRX colorspaces that it provides to avoid extra conversions of the data we want to compress to mjpeg
Diffstat (limited to 'server/mjpeg_encoder.c')
-rw-r--r--server/mjpeg_encoder.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/server/mjpeg_encoder.c b/server/mjpeg_encoder.c
index bfe8ca74..d3ddf3f6 100644
--- a/server/mjpeg_encoder.c
+++ b/server/mjpeg_encoder.c
@@ -86,7 +86,7 @@ uint8_t mjpeg_encoder_get_bytes_per_pixel(MJpegEncoder *encoder)
return encoder->bytes_per_pixel;
}
-
+#ifndef JCS_EXTENSIONS
/* Pixel conversion routines */
static void pixel_rgb24bpp_to_24(uint8_t *src, uint8_t *dest)
{
@@ -103,6 +103,7 @@ static void pixel_rgb32bpp_to_24(uint8_t *src, uint8_t *dest)
*dest++ = (pixel >> 8) & 0xff;
*dest++ = (pixel >> 0) & 0xff;
}
+#endif
static void pixel_rgb16bpp_to_24(uint8_t *src, uint8_t *dest)
{
@@ -222,10 +223,17 @@ jpeg_mem_dest (j_compress_ptr cinfo,
int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
uint8_t **dest, size_t *dest_len)
{
+ encoder->cinfo.in_color_space = JCS_RGB;
+ encoder->cinfo.input_components = 3;
switch (format) {
case SPICE_BITMAP_FMT_32BIT:
encoder->bytes_per_pixel = 4;
+#ifdef JCS_EXTENSIONS
+ encoder->cinfo.in_color_space = JCS_EXT_BGRX;
+ encoder->cinfo.input_components = 4;
+#else
encoder->pixel_converter = pixel_rgb32bpp_to_24;
+#endif
break;
case SPICE_BITMAP_FMT_16BIT:
encoder->bytes_per_pixel = 2;
@@ -233,7 +241,11 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
break;
case SPICE_BITMAP_FMT_24BIT:
encoder->bytes_per_pixel = 3;
+#ifdef JCS_EXTENSIONS
+ encoder->cinfo.in_color_space = JCS_EXT_BGR;
+#else
encoder->pixel_converter = pixel_rgb24bpp_to_24;
+#endif
break;
default:
red_printf_some(1000, "unsupported format %d", format);
@@ -244,9 +256,6 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
encoder->cinfo.image_width = encoder->width;
encoder->cinfo.image_height = encoder->height;
- encoder->cinfo.input_components = 3;
- encoder->cinfo.in_color_space = JCS_RGB;
-
jpeg_set_defaults(&encoder->cinfo);
encoder->cinfo.dct_method = JDCT_IFAST;
jpeg_set_quality(&encoder->cinfo, encoder->quality, TRUE);
@@ -269,8 +278,10 @@ int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
row += 3;
src_pixels += encoder->bytes_per_pixel;
}
+ scanlines_written = jpeg_write_scanlines(&encoder->cinfo, &encoder->row, 1);
+ } else {
+ scanlines_written = jpeg_write_scanlines(&encoder->cinfo, &src_pixels, 1);
}
- scanlines_written = jpeg_write_scanlines(&encoder->cinfo, &encoder->row, 1);
if (scanlines_written == 0) { /* Not enough space */
jpeg_abort_compress(&encoder->cinfo);
return 0;