]> source.dussan.org Git - tigervnc.git/commitdiff
Implemented new "VideoPriority" parameter. It allows to increase the priority of...
authorConstantin Kaplinsky <const@tightvnc.com>
Tue, 25 Dec 2007 17:43:09 +0000 (17:43 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Tue, 25 Dec 2007 17:43:09 +0000 (17:43 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2379 3789f03b-4d11-0410-bbf8-ca57d06f2519

unix/x0vncserver/PollingManager.cxx
unix/x0vncserver/PollingManager.h

index 5cd611bd99e452867cd973dd95733fec40968b5f..bf13cac65d31eccf1a08c5d78ded431570d98ed9 100644 (file)
@@ -39,6 +39,9 @@ const int PollingManager::m_pollingOrder[32] = {
   19,  3, 27, 11, 29, 13,  5, 21
 };
 
+IntParameter PollingManager::m_videoPriority("VideoPriority",
+  "Priority of sending updates for video area (0..8)", 2);
+
 //
 // Constructor.
 //
@@ -51,6 +54,7 @@ PollingManager::PollingManager(Display *dpy, Image *image,
                                int offsetLeft, int offsetTop)
   : m_dpy(dpy), m_server(0), m_image(image),
     m_offsetLeft(offsetLeft), m_offsetTop(offsetTop),
+    m_numVideoPasses(0),
     m_pollingStep(0)
 {
   // Save width and height of the screen (and the image).
@@ -145,6 +149,22 @@ bool PollingManager::pollScreen()
   if (!m_server)
     return false;
 
+  // If video data should have higher priority, and video area was
+  // detected, perform special passes to send video data only. Such
+  // "video passes" will be performed between normal polling passes.
+  // No actual polling is performed in a video pass since we know that
+  // video is changing continuously.
+  if ((int)m_videoPriority > 1 && !m_videoRect.is_empty()) {
+    if (m_numVideoPasses > 0) {
+      m_numVideoPasses--;
+      getScreenRect(m_videoRect);
+      return true;              // we've got changes
+    } else {
+      // Normal pass now, but schedule video passes for next calls.
+      m_numVideoPasses = (int)m_videoPriority - 1;
+    }
+  }
+
   // changeFlags[] array will hold boolean values corresponding to
   // each 32x32 tile. If a value is true, then we've detected a change
   // in that tile. Initially, we fill in the array with zero values.
@@ -164,7 +184,9 @@ bool PollingManager::pollScreen()
   }
 
   // Do the work related to video area detection.
-  bool haveVideoRect = handleVideo(changeFlags);
+  bool haveVideoRect = false;
+  if ((int)m_videoPriority != 0)
+    haveVideoRect = handleVideo(changeFlags);
 
   // Inform the server about the changes.
   // FIXME: It's possible that (nTilesChanged != 0) but changeFlags[]
index 3f77081d3a51397bc943dea9c8f50e6e0a25a3f3..e3a29b0bfa836e2f9019d9396652698915f8692f 100644 (file)
@@ -115,10 +115,13 @@ private:
   char *m_rateMatrix;
   char *m_videoFlags;
   Rect m_videoRect;
+  int m_numVideoPasses;
 
   unsigned int m_pollingStep;
   static const int m_pollingOrder[];
 
+  static IntParameter m_videoPriority;
+
 #ifdef DEBUG
 private: