aboutsummaryrefslogtreecommitdiffstats
path: root/common/rfb/JpegEncoder.cxx
diff options
context:
space:
mode:
authorConstantin Kaplinsky <const@tightvnc.com>2007-10-17 17:40:23 +0000
committerConstantin Kaplinsky <const@tightvnc.com>2007-10-17 17:40:23 +0000
commit651606d27852f0158da7243f5db94ebbd3c6b813 (patch)
treeecb57c595d8e3beac123c8ff8ece0b5164919549 /common/rfb/JpegEncoder.cxx
parentc257370bef6c70176eef01e47edc3e59080fcef4 (diff)
downloadtigervnc-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.cxx33
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;
}