diff options
author | Constantin Kaplinsky <const@tightvnc.com> | 2007-10-17 17:40:23 +0000 |
---|---|---|
committer | Constantin Kaplinsky <const@tightvnc.com> | 2007-10-17 17:40:23 +0000 |
commit | 651606d27852f0158da7243f5db94ebbd3c6b813 (patch) | |
tree | ecb57c595d8e3beac123c8ff8ece0b5164919549 /common/rfb/JpegEncoder.cxx | |
parent | c257370bef6c70176eef01e47edc3e59080fcef4 (diff) | |
download | tigervnc-651606d27852f0158da7243f5db94ebbd3c6b813.tar.gz tigervnc-651606d27852f0158da7243f5db94ebbd3c6b813.zip |
Using JpegEncoder for video only with proper pixel formats.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2361 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'common/rfb/JpegEncoder.cxx')
-rw-r--r-- | common/rfb/JpegEncoder.cxx | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/common/rfb/JpegEncoder.cxx b/common/rfb/JpegEncoder.cxx index 6903c2cc..054a5ef3 100644 --- a/common/rfb/JpegEncoder.cxx +++ b/common/rfb/JpegEncoder.cxx @@ -18,7 +18,9 @@ #include <rfb/JpegEncoder.h> #include <rdr/OutStream.h> +#include <rdr/Exception.h> #include <rfb/encodings.h> +#include <rfb/ConnParams.h> #include <rfb/LogWriter.h> #ifdef HAVE_DMEDIA @@ -79,16 +81,27 @@ void JpegEncoder::setQualityLevel(int level) jcomp->setQuality(qualityMap[level]); } -bool JpegEncoder::writeRect(PixelBuffer* pb, const Rect& r) +bool JpegEncoder::isPixelFormatSupported(PixelBuffer* pb) const { - int serverBitsPerPixel = pb->getPF().bpp; - int clientBitsPerPixel = writer->bpp(); - - // FIXME: Implement JPEG compression for (serverBitsPerPixel == 16). - // FIXME: Check that all color components are actually 8 bits wide. - if (serverBitsPerPixel != 32 || clientBitsPerPixel < 16) { - // FIXME: Make sure this return value is checked properly. - return false; + const PixelFormat &serverPF = pb->getPF(); + const PixelFormat &clientPF = writer->getConnParams()->pf(); + + // FIXME: Ask encoders if they support given pixel formats. + + if ( serverPF.bpp == 32 && clientPF.bpp >= 16 && + serverPF.depth == 24 && serverPF.redMax == 255 && + serverPF.greenMax == 255 && serverPF.blueMax == 255 ) { + return true; + } + + return false; +} + +void JpegEncoder::writeRect(PixelBuffer* pb, const Rect& r) +{ + if (!isPixelFormatSupported(pb)) { + vlog.error("pixel format unsupported by JPEG encoder"); + throw rdr::Exception("internal error in JpegEncoder"); } writer->startRect(r, encodingTight); @@ -108,7 +121,5 @@ bool JpegEncoder::writeRect(PixelBuffer* pb, const Rect& r) os->writeBytes(jcomp->getDataPtr(), jcomp->getDataLength()); writer->endRect(); - - return true; } |