# HG changeset patch # User riono210 # Date 1557048775 -32400 # Node ID 4be31e10712142d58b2e1c92302bfeab875e866e # Parent 9292035b8d936b33711dc75d942bbe944cfc82df fix bloking diff -r 9292035b8d93 -r 4be31e107121 src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java --- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java Sun May 05 15:56:33 2019 +0900 +++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java Sun May 05 18:32:55 2019 +0900 @@ -77,6 +77,9 @@ * @throws UnsupportedEncodingException */ + public TileLoop(int offset) { + prevoffset = prevLineOffset = prevC1Offset = offset; + } private void zrleeBlocking(TreeRFBProto rfb, ByteBuffer header, FramebufferUpdateRectangle rect) { // dump32(inputs); @@ -101,7 +104,6 @@ c1.putInt(0); // should be data length width = 0; rectPos = 4; - prevoffset = prevLineOffset = prevC1Offset = 0; } int spanGap = 128; @@ -132,6 +134,7 @@ if (c1rect.x+c1rect.width < rect.x+rect.width) { if (c1.remaining() > spanGap ) { deflater.deflate(c1, Deflater.NO_FLUSH); + if (!deflater.needsInput()) flushRectangle(rect); return; } } else { @@ -150,8 +153,12 @@ prevLineOffset = offset; prevC1Offset = c1.position(); deflater.deflate(c1, Deflater.SYNC_FLUSH); - } else + if (!deflater.needsInput()) flushRectangle(rect); + } else { deflater.deflate(c1, Deflater.NO_FLUSH); + if (!deflater.needsInput()) flushRectangle(rect); + } + return; } else { // phase2 // rewind to the last line finish phase 1 int savew = width; @@ -231,13 +238,25 @@ byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType()); decode1(renderer, null, rect, bytes, zippedLength, null); } - + + + public void multicastDecode(Reader reader, Renderer renderer, + FramebufferUpdateRectangle rect, TreeRFBProto rfb) throws TransportException { + ByteBuffer header = ByteBuffer.allocate(16); + reader.read(header.array()); + int zippedLength = (int) reader.readUInt32(); + if (0 == zippedLength) return; + int length = rect.width * rect.height * renderer.getBytesPerPixel(); + byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType()); + decode1(renderer, header, rect, bytes, zippedLength, rfb); + } + public void decode1(Renderer renderer, ByteBuffer header, FramebufferUpdateRectangle rect, byte[] bytes, int zippedLength, TreeRFBProto rfbProto) throws TransportException { int offset = zippedLength; int maxX = rect.x + rect.width; int maxY = rect.y + rect.height; - TileLoop tileloop = new TileLoop(); + TileLoop tileloop = new TileLoop(zippedLength); //System.out.println("decode1: "+rect); if (null == palette) { palette = new int [128]; diff -r 9292035b8d93 -r 4be31e107121 src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java --- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java Sun May 05 15:56:33 2019 +0900 +++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java Sun May 05 18:32:55 2019 +0900 @@ -3,6 +3,7 @@ import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; +import com.glavsoft.rfb.protocol.NullRenderer; import jp.ac.u_ryukyu.treevnc.TreeRFBProto; import com.glavsoft.drawing.Renderer; @@ -34,8 +35,12 @@ // ReadSendData convert ZRLE to ZRLEE // unzipped data in the bytes byte[] bytes = new byte[rect.width * rect.height * renderer.getBytesPerPixel()]; - ByteBuffer header = rfb.readSendData(dataLen, reader, bytes, rect); - decoder.decode1(renderer, header, rect, bytes, 0, rfb); + if (rfb.multicastBlocking) { + decoder.multicastDecode(reader, renderer, rect, rfb); + } else { + ByteBuffer header = rfb.readSendData(dataLen, reader, bytes, rect); + decoder.decode1(renderer, header, rect, bytes, 0, rfb); + } return; } else { // no reencoding is required @@ -51,8 +56,14 @@ return; } } - byte[] bytes = new byte[dataLen]; - rfb.readSendData(dataLen, reader, bytes, rect); + if (rfb.multicastBlocking) { + // do something + ZRLEDecoder decoder = new ZRLEDecoder(); + decoder.multicastDecode(reader, renderer, rect, rfb); + } else { + byte[] bytes = new byte[dataLen]; + rfb.readSendData(dataLen, reader, bytes, rect); + } } private int getZrleLength(FramebufferUpdateRectangle rect, Reader reader) diff -r 9292035b8d93 -r 4be31e107121 src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java Sun May 05 15:56:33 2019 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java Sun May 05 18:32:55 2019 +0900 @@ -19,6 +19,7 @@ import java.net.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.Collection; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedList; @@ -655,7 +656,6 @@ if (encoding == EncodingType.ZRLE.getId() || encoding == EncodingType.ZLIB.getId()) { - if (multicastBlocking) return header; // recompress into ZREE // uncompressed result is remain in bytes ByteBuffer len = multicastqueue.allocate(4);