]> source.dussan.org Git - tigervnc.git/commitdiff
Decode rectangles in order if needed
authorPierre Ossman <ossman@cendio.se>
Thu, 12 Nov 2015 12:18:22 +0000 (13:18 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 27 Nov 2015 10:10:15 +0000 (11:10 +0100)
Some encodings must be handled in the order they are received.
Make sure we respect this in the decode manager.

common/rfb/DecodeManager.cxx
common/rfb/Decoder.h
common/rfb/TightDecoder.cxx
common/rfb/ZRLEDecoder.cxx

index ddebf0a3796fc9be0b2ed9ecad372227cf3c7a1a..3c1ddb412c58dfbe11c127ff98544bc1b70b5164 100644 (file)
@@ -251,18 +251,27 @@ DecodeManager::QueueEntry* DecodeManager::DecodeThread::findEntry()
        ++iter) {
     DecodeManager::QueueEntry* entry;
 
+    std::list<DecodeManager::QueueEntry*>::iterator iter2;
+
     entry = *iter;
 
     // Another thread working on this?
     if (entry->active)
       goto next;
 
+    // If this is an ordered decoder then make sure this is the first
+    // rectangle in the queue for that decoder
+    if (entry->decoder->flags & DecoderOrdered) {
+      for (iter2 = manager->workQueue.begin(); iter2 != iter; ++iter2) {
+        if (entry->encoding == (*iter2)->encoding)
+          goto next;
+      }
+    }
+
     // Check overlap with earlier rectangles
     if (!lockedRegion.intersect(entry->affectedRegion).is_empty())
       goto next;
 
-    // FIXME: check dependencies between rects
-
     return entry;
 
 next:
index f631a5512130bd6e2ce9b61ed8088a561779c576..9a03eb3889d31fc2801d8bd6e542ecf024f8f9df 100644 (file)
@@ -33,6 +33,8 @@ namespace rfb {
   enum DecoderFlags {
     // A constant for decoders that don't need anything special
     DecoderPlain = 0,
+    // All rects for this decoder must be handled in order
+    DecoderOrdered = 1 << 0,
   };
 
   class Decoder {
index 24236dba11f384d5316b467077e75478b5be01d4..ec329e40a2712df41f2dd8b1c8306d852e5b8c20 100644 (file)
@@ -46,7 +46,7 @@ static const int TIGHT_MIN_TO_COMPRESS = 12;
 #include <rfb/tightDecode.h>
 #undef BPP
 
-TightDecoder::TightDecoder() : Decoder(DecoderPlain)
+TightDecoder::TightDecoder() : Decoder(DecoderOrdered)
 {
 }
 
index c9245c06a7a0261e8c145349821aea9c811e8c99..c13f28613cd765f0e1c77d68a7aa6a87d297d67b 100644 (file)
@@ -62,7 +62,7 @@ static inline rdr::U32 readOpaque24B(rdr::InStream* is)
 #undef CPIXEL
 #undef BPP
 
-ZRLEDecoder::ZRLEDecoder() : Decoder(DecoderPlain)
+ZRLEDecoder::ZRLEDecoder() : Decoder(DecoderOrdered)
 {
 }