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
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index d6541f9..3929b1f 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -646,8 +646,15 @@
     // complicated as compared to the original VNC4.
     writer()->setupCurrentEncoder();
     int nRects = (ui.copied.numRects() +
-                  (ui.video_area.is_empty() ? 0 : 1) +
                   (drawRenderedCursor ? 1 : 0));
+    if (!ui.video_area.is_empty()) {
+      if (writer()->canUseJpegEncoder(server->getPixelBuffer())) {
+        nRects++;
+      } else {
+        nRects += writer()->getNumRects(ui.video_area);
+      }
+    }
+
     std::vector<Rect> rects;
     std::vector<Rect>::const_iterator i;
     ui.changed.get_rects(&rects);
@@ -657,8 +664,14 @@
     }
     
     writer()->writeFramebufferUpdateStart(nRects);
-    if (!ui.video_area.is_empty())
-      writer()->writeVideoRect(server->getPixelBuffer(), ui.video_area);
+    if (!ui.video_area.is_empty()) {
+      if (writer()->canUseJpegEncoder(server->getPixelBuffer())) {
+        writer()->writeJpegRect(server->getPixelBuffer(), ui.video_area);
+      } else {
+        Rect actual;
+        writer()->writeRect(ui.video_area, &image_getter, &actual);
+      }
+    }
     Region updatedRegion;
     writer()->writeRects(ui, &image_getter, &updatedRegion);
     updates.subtract(updatedRegion);