From 9144ae00636348c4c504095203e92ea4b660ccb4 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Wed, 7 Sep 2011 11:35:04 +0000 Subject: [PATCH] Internalise the libjpeg stuff into the JpegCompressor class as the libjpeg headers are a bit conflict prone. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4669 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- common/rfb/JpegCompressor.cxx | 112 +++++++++++++++++++++------------- common/rfb/JpegCompressor.h | 29 +++------ 2 files changed, 77 insertions(+), 64 deletions(-) diff --git a/common/rfb/JpegCompressor.cxx b/common/rfb/JpegCompressor.cxx index 0ed5cb59..f4b6ed1c 100644 --- a/common/rfb/JpegCompressor.cxx +++ b/common/rfb/JpegCompressor.cxx @@ -23,12 +23,24 @@ #include #include +#include +extern "C" { +#include +} +#include + using namespace rfb; // // Error manager implmentation for the JPEG library // +struct JPEG_ERROR_MGR { + struct jpeg_error_mgr pub; + jmp_buf jmpBuffer; + char lastError[JMSG_LENGTH_MAX]; +}; + static void JpegErrorExit(j_common_ptr cinfo) { @@ -50,6 +62,11 @@ JpegOutputMessage(j_common_ptr cinfo) // Destination manager implementation for the JPEG library. // +struct JPEG_DEST_MGR { + struct jpeg_destination_mgr pub; + JpegCompressor *instance; +}; + static void JpegInitDestination(j_compress_ptr cinfo) { @@ -86,33 +103,42 @@ JpegTermDestination(j_compress_ptr cinfo) JpegCompressor::JpegCompressor(int bufferLen) : MemOutStream(bufferLen) { - cinfo.err = jpeg_std_error(&err.pub); - snprintf(err.lastError, JMSG_LENGTH_MAX, "No error"); - err.pub.error_exit = JpegErrorExit; - err.pub.output_message = JpegOutputMessage; + cinfo = new jpeg_compress_struct; - if(setjmp(err.jmpBuffer)) { + err = new struct JPEG_ERROR_MGR; + cinfo->err = jpeg_std_error(&err->pub); + snprintf(err->lastError, JMSG_LENGTH_MAX, "No error"); + err->pub.error_exit = JpegErrorExit; + err->pub.output_message = JpegOutputMessage; + + if(setjmp(err->jmpBuffer)) { // this will execute if libjpeg has an error - throw rdr::Exception(err.lastError); + throw rdr::Exception(err->lastError); } - jpeg_create_compress(&cinfo); + jpeg_create_compress(cinfo); - dest.pub.init_destination = JpegInitDestination; - dest.pub.empty_output_buffer = JpegEmptyOutputBuffer; - dest.pub.term_destination = JpegTermDestination; - dest.instance = this; - cinfo.dest = (struct jpeg_destination_mgr *)&dest; + dest = new struct JPEG_DEST_MGR; + dest->pub.init_destination = JpegInitDestination; + dest->pub.empty_output_buffer = JpegEmptyOutputBuffer; + dest->pub.term_destination = JpegTermDestination; + dest->instance = this; + cinfo->dest = (struct jpeg_destination_mgr *)dest; } JpegCompressor::~JpegCompressor(void) { - if(setjmp(err.jmpBuffer)) { + if(setjmp(err->jmpBuffer)) { // this will execute if libjpeg has an error return; } - jpeg_destroy_compress(&cinfo); + jpeg_destroy_compress(cinfo); + + delete err; + delete dest; + + delete cinfo; } void JpegCompressor::compress(rdr::U8 *buf, int pitch, const Rect& r, @@ -125,17 +151,17 @@ void JpegCompressor::compress(rdr::U8 *buf, int pitch, const Rect& r, bool srcBufIsTemp = false; JSAMPROW *rowPointer = NULL; - if(setjmp(err.jmpBuffer)) { + if(setjmp(err->jmpBuffer)) { // this will execute if libjpeg has an error - jpeg_abort_compress(&cinfo); + jpeg_abort_compress(cinfo); if (srcBufIsTemp && srcBuf) delete[] srcBuf; if (rowPointer) delete[] rowPointer; - throw rdr::Exception(err.lastError); + throw rdr::Exception(err->lastError); } - cinfo.image_width = w; - cinfo.image_height = h; - cinfo.in_color_space = JCS_RGB; + cinfo->image_width = w; + cinfo->image_height = h; + cinfo->in_color_space = JCS_RGB; pixelsize = 3; #ifdef JCS_EXTENSIONS @@ -154,15 +180,15 @@ void JpegCompressor::compress(rdr::U8 *buf, int pitch, const Rect& r, } if(redShift == 0 && greenShift == 8 && blueShift == 16) - cinfo.in_color_space = JCS_EXT_RGBX; + cinfo->in_color_space = JCS_EXT_RGBX; if(redShift == 16 && greenShift == 8 && blueShift == 0) - cinfo.in_color_space = JCS_EXT_BGRX; + cinfo->in_color_space = JCS_EXT_BGRX; if(redShift == 24 && greenShift == 16 && blueShift == 8) - cinfo.in_color_space = JCS_EXT_XBGR; + cinfo->in_color_space = JCS_EXT_XBGR; if(redShift == 8 && greenShift == 16 && blueShift == 24) - cinfo.in_color_space = JCS_EXT_XRGB; + cinfo->in_color_space = JCS_EXT_XRGB; - if (cinfo.in_color_space != JCS_RGB) { + if (cinfo->in_color_space != JCS_RGB) { srcBuf = (rdr::U8 *)buf; pixelsize = 4; } @@ -171,46 +197,46 @@ void JpegCompressor::compress(rdr::U8 *buf, int pitch, const Rect& r, if (pitch == 0) pitch = w * pf.bpp / 8; - if (cinfo.in_color_space == JCS_RGB) { + if (cinfo->in_color_space == JCS_RGB) { srcBuf = new rdr::U8[w * h * pixelsize]; srcBufIsTemp = true; pf.rgbFromBuffer(srcBuf, (const rdr::U8 *)buf, w, pitch, h); pitch = w * pixelsize; } - cinfo.input_components = pixelsize; + cinfo->input_components = pixelsize; - jpeg_set_defaults(&cinfo); - jpeg_set_quality(&cinfo, quality, TRUE); - if(quality >= 96) cinfo.dct_method = JDCT_ISLOW; - else cinfo.dct_method = JDCT_FASTEST; + jpeg_set_defaults(cinfo); + jpeg_set_quality(cinfo, quality, TRUE); + if(quality >= 96) cinfo->dct_method = JDCT_ISLOW; + else cinfo->dct_method = JDCT_FASTEST; switch (subsamp) { case SUBSAMP_420: - cinfo.comp_info[0].h_samp_factor = 2; - cinfo.comp_info[0].v_samp_factor = 2; + cinfo->comp_info[0].h_samp_factor = 2; + cinfo->comp_info[0].v_samp_factor = 2; break; case SUBSAMP_422: - cinfo.comp_info[0].h_samp_factor = 2; - cinfo.comp_info[0].v_samp_factor = 1; + cinfo->comp_info[0].h_samp_factor = 2; + cinfo->comp_info[0].v_samp_factor = 1; break; case SUBSAMP_GRAY: - jpeg_set_colorspace(&cinfo, JCS_GRAYSCALE); + jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); default: - cinfo.comp_info[0].h_samp_factor = 1; - cinfo.comp_info[0].v_samp_factor = 1; + cinfo->comp_info[0].h_samp_factor = 1; + cinfo->comp_info[0].v_samp_factor = 1; } rowPointer = new JSAMPROW[h]; for (int dy = 0; dy < h; dy++) rowPointer[dy] = (JSAMPROW)(&srcBuf[dy * pitch]); - jpeg_start_compress(&cinfo, TRUE); - while (cinfo.next_scanline < cinfo.image_height) - jpeg_write_scanlines(&cinfo, &rowPointer[cinfo.next_scanline], - cinfo.image_height - cinfo.next_scanline); + jpeg_start_compress(cinfo, TRUE); + while (cinfo->next_scanline < cinfo->image_height) + jpeg_write_scanlines(cinfo, &rowPointer[cinfo->next_scanline], + cinfo->image_height - cinfo->next_scanline); - jpeg_finish_compress(&cinfo); + jpeg_finish_compress(cinfo); if (srcBufIsTemp) delete[] srcBuf; delete[] rowPointer; diff --git a/common/rfb/JpegCompressor.h b/common/rfb/JpegCompressor.h index 668c9a00..798572e0 100644 --- a/common/rfb/JpegCompressor.h +++ b/common/rfb/JpegCompressor.h @@ -29,26 +29,12 @@ #include #include -#include -extern "C" { -#include -} -#include +struct jpeg_compress_struct; -namespace rfb { - - typedef struct { - struct jpeg_error_mgr pub; - jmp_buf jmpBuffer; - char lastError[JMSG_LENGTH_MAX]; - } JPEG_ERROR_MGR; - - class JpegCompressor; +struct JPEG_ERROR_MGR; +struct JPEG_DEST_MGR; - typedef struct { - struct jpeg_destination_mgr pub; - JpegCompressor *instance; - } JPEG_DEST_MGR; +namespace rfb { enum JPEG_SUBSAMP { SUBSAMP_UNDEFINED = -1, @@ -78,9 +64,10 @@ namespace rfb { private: - struct jpeg_compress_struct cinfo; - JPEG_ERROR_MGR err; - JPEG_DEST_MGR dest; + struct jpeg_compress_struct *cinfo; + + struct JPEG_ERROR_MGR *err; + struct JPEG_DEST_MGR *dest; }; -- 2.39.5