#ifndef __JPEGCOMPRESSOR_H__ #define __JPEGCOMPRESSOR_H__ #include #include extern "C" { #include } #include #include namespace rfb { // // An abstract interface for performing JPEG compression. // class JpegCompressor { public: virtual ~JpegCompressor() {} // Set JPEG quality level (0..100) virtual void setQuality(int level) = 0; // Actually compress an image. virtual void compress(const rdr::U32 *buf, const PixelFormat *fmt, int w, int h, int stride) = 0; // Access results of the compression. virtual size_t getDataLength() = 0; virtual const char *getDataPtr() = 0; }; // // A C++ class for performing JPEG compression via the // Independent JPEG Group's software (free JPEG library). // class StandardJpegCompressor : public JpegCompressor { public: StandardJpegCompressor(); virtual ~StandardJpegCompressor(); // Set JPEG quality level (0..100) virtual void setQuality(int level); // Actually compress the image. virtual void compress(const rdr::U32 *buf, const PixelFormat *fmt, int w, int h, int stride); // Access results of the compression. virtual size_t getDataLength() { return m_cdata_ready; } virtual const char *getDataPtr() { return (const char *)m_cdata; } public: // Our implementation of JPEG destination manager. These three // functions should never be called directly. They are made public // because they should be accessible from C-compatible functions // called by the JPEG library. void initDestination(); bool emptyOutputBuffer(); void termDestination(); protected: static const int ALLOC_CHUNK_SIZE; static const int DEFAULT_QUALITY; struct jpeg_compress_struct m_cinfo; struct jpeg_error_mgr m_jerr; unsigned char *m_cdata; size_t m_cdata_allocated; size_t m_cdata_ready; }; } #endif // __JPEGCOMPRESSOR_H__