From 25a533e22bf4643de7b78961a08213336ec99e2a Mon Sep 17 00:00:00 2001 From: Andri Yngvason Date: Sat, 26 Sep 2020 16:10:25 +0000 Subject: [PATCH] Add common utilities for encoders --- include/enc-util.h | 28 +++++++++++++++++++++++++ meson.build | 1 + src/enc-util.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 include/enc-util.h create mode 100644 src/enc-util.c diff --git a/include/enc-util.h b/include/enc-util.h new file mode 100644 index 0000000..5ec7b78 --- /dev/null +++ b/include/enc-util.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2019 - 2020 Andri Yngvason + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#pragma once + +#include "rfb-proto.h" + +#include + +struct vec; + +int encode_rect_count(struct vec* dst, uint32_t count); +int encode_rect_head(struct vec* dst, enum rfb_encodings encoding, + uint32_t x, uint32_t y, uint32_t width, uint32_t height); +uint32_t calc_bytes_per_cpixel(const struct rfb_pixel_format* fmt); diff --git a/meson.build b/meson.build index 851525b..4df7b67 100644 --- a/meson.build +++ b/meson.build @@ -66,6 +66,7 @@ sources = [ 'src/stream.c', 'src/display.c', 'src/tight.c', + 'src/enc-util.c', ] dependencies = [ diff --git a/src/enc-util.c b/src/enc-util.c new file mode 100644 index 0000000..922f00c --- /dev/null +++ b/src/enc-util.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2019 - 2020 Andri Yngvason + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "enc-util.h" +#include "rfb-proto.h" +#include "vec.h" + +#include + +int encode_rect_count(struct vec* dst, uint32_t count) +{ + struct rfb_server_fb_update_msg msg = { + .type = RFB_SERVER_TO_CLIENT_FRAMEBUFFER_UPDATE, + .n_rects = htons(count), + }; + + return vec_append(dst, &msg, sizeof(msg)); +} + +int encode_rect_head(struct vec* dst, enum rfb_encodings encoding, + uint32_t x, uint32_t y, uint32_t width, uint32_t height) +{ + struct rfb_server_fb_rect head = { + .encoding = htonl(encoding), + .x = htons(x), + .y = htons(y), + .width = htons(width), + .height = htons(height), + }; + + return vec_append(dst, &head, sizeof(head)); +} + +uint32_t calc_bytes_per_cpixel(const struct rfb_pixel_format* fmt) +{ + return fmt->bits_per_pixel == 32 ? fmt->depth / 8 + : fmt->bits_per_pixel / 8; +}