From e2946853043966104c0ee890434ab898c0374f25 Mon Sep 17 00:00:00 2001 From: Andri Yngvason Date: Tue, 27 Aug 2019 18:17:33 +0000 Subject: [PATCH] ZRLE sort of works now --- server.c | 8 +++++++- zrle.c | 22 ++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/server.c b/server.c index b260f6b..239a668 100644 --- a/server.c +++ b/server.c @@ -450,8 +450,14 @@ static int on_client_set_encodings(struct vnc_client *client) return sizeof(*msg) + 4 * n_encodings; } +static int is_done= 0; + static int on_client_fb_update_request(struct vnc_client *client) { + + if (is_done) + return 0; + is_done = 1; struct rfb_client_fb_update_req_msg *msg = (struct rfb_client_fb_update_req_msg*)(client->msg_buffer + client->buffer_index); @@ -688,7 +694,7 @@ int main(int argc, char *argv[]) struct vnc_server server = { 0 }; server.fb = &fb; - server.display.pixfmt = DRM_FORMAT_RGBX8888; + server.display.pixfmt = DRM_FORMAT_XRGB8888; server.display.width = fb.width; server.display.height = fb.height; server.display.name = argv[1]; diff --git a/zrle.c b/zrle.c index 0e8e3e1..6f678df 100644 --- a/zrle.c +++ b/zrle.c @@ -155,7 +155,7 @@ void zrle_encode_tile(uint8_t *dst, const struct rfb_pixel_format *dst_fmt, dst[0] = 0; /* Sub-encoding is raw pixel data */ for (int y = 0; y < height; ++y) - pixel32_to_cpixel(dst + 1 + width * y, + pixel32_to_cpixel(dst + 1 + width * y * bytes_per_cpixel, dst_fmt, src + stride * y, src_fmt, bytes_per_cpixel, width); } @@ -177,7 +177,7 @@ int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt, if (!in) goto failure; - if (vec_init(&out, bytes_per_cpixel * width * height / 2) < 0) + if (vec_init(&out, bytes_per_cpixel * width * height * 2) < 0) goto failure; r = deflateInit(&zs, Z_DEFAULT_COMPRESSION); @@ -204,24 +204,24 @@ int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt, src_fmt, stride, tile_width, tile_height); zs.next_in = in; - zs.avail_in = tile_width * tile_height * 4; + zs.avail_in = 1 + tile_width * tile_height * bytes_per_cpixel; int flush = (i == n_tiles - 1) ? Z_FINISH : Z_NO_FLUSH; do { - zs.next_out = ((Bytef*)out.data) + out.len; - + /* r = vec_reserve(&out, out.len + chunk_size); if (r < 0) goto failure; +*/ + zs.next_out = ((Bytef*)out.data) + out.len; zs.avail_out = out.cap - out.len; zr = deflate(&zs, flush); assert(zr != Z_STREAM_ERROR); - int have = out.cap - out.len - zs.avail_out; - out.len += have; + out.len = out.cap - zs.avail_out; } while (zs.avail_out == 0); assert(zs.avail_in == 0); @@ -232,11 +232,13 @@ int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt, deflateEnd(&zs); uint32_t *out_size = out.data; - *out_size = htonl(out.len); + *out_size = htonl(out.len - 8); - r = vnc__write(stream, out.data, out.len, NULL); + printf("Sending %lu bytes\n", out.len - 4); + + r = vnc__write(stream, out.data, out.len - 4, NULL); failure: - vec_destroy(&out); +// vec_destroy(&out); free(in); return r; #undef CHUNK