Add modifier to do y-inversion during encoding

tight-png
Andri Yngvason 2019-09-08 15:09:35 +00:00
parent 2e359e734d
commit 73987c2f17
6 changed files with 34 additions and 18 deletions

View File

@ -48,7 +48,7 @@ int run_benchmark(const char *image)
{
int rc = -1;
struct nvnc_fb fb;
struct nvnc_fb fb = { 0 };
rc = read_png_file(&fb, image);
if (rc < 0)
return -1;
@ -83,8 +83,7 @@ int run_benchmark(const char *image)
free(dummy);
start_time = gettime_us(CLOCK_PROCESS_CPUTIME_ID);
rc = zrle_encode_frame(&zs, &frame, &pixfmt, fb.addr, &pixfmt,
fb.width, fb.height, &region);
rc = zrle_encode_frame(&zs, &frame, &pixfmt, &fb, &pixfmt, &region);
end_time = gettime_us(CLOCK_PROCESS_CPUTIME_ID);
printf("Encoding %s took %"PRIu64" micro seconds\n", image,

View File

@ -50,12 +50,14 @@ int main(int argc, char *argv[])
return 1;
}
struct nvnc_fb fb;
struct nvnc_fb fb = { 0 };
if (read_png_file(&fb, file) < 0) {
printf("Failed to read png file\n");
return 1;
}
fb.nvnc_modifier = NVNC_MOD_Y_INVERT;
struct nvnc *server = nvnc_open("127.0.0.1", 5900);
nvnc_set_dimensions(server, fb.width, fb.height, fb.fourcc_format);

View File

@ -31,6 +31,10 @@ enum nvnc_button_mask {
NVNC_SCROLL_DOWN = 1 << 4,
};
enum nvnc_modifier {
NVNC_MOD_Y_INVERT = 1 << 0,
};
struct nvnc_fb {
void *addr;
uint32_t size;
@ -38,6 +42,8 @@ struct nvnc_fb {
uint16_t height;
uint32_t fourcc_format;
uint64_t fourcc_modifier;
enum nvnc_modifier nvnc_modifier;
uint32_t reserved[4];
};
typedef void (*nvnc_key_fn)(struct nvnc_client*, uint32_t keysym, bool is_pressed);

View File

@ -21,6 +21,7 @@
#include "miniz.h"
struct nvnc_fb;
struct rfb_pixel_format;
struct pixman_region16;
struct vec;
@ -34,7 +35,6 @@ void pixel32_to_cpixel(uint8_t *restrict dst,
int zrle_encode_frame(z_stream *zs,
struct vec *dst,
const struct rfb_pixel_format *dst_fmt,
const uint8_t *src,
const struct nvnc_fb *src,
const struct rfb_pixel_format *src_fmt,
int width, int height,
struct pixman_region16 *region);

View File

@ -810,8 +810,7 @@ int nvnc_update_fb(struct nvnc *self, const struct nvnc_fb *fb,
goto failure;
zrle_encode_frame(&client->z_stream, &frame, &client->pixfmt,
fb->addr, &server_fmt, fb->width, fb->height,
&region);
fb, &server_fmt, cregion);
pixman_region_clear(cregion);

View File

@ -19,6 +19,7 @@
#include "vec.h"
#include "zrle.h"
#include "miniz.h"
#include "neatvnc.h"
#include <stdint.h>
#include <unistd.h>
@ -260,10 +261,15 @@ void zrle_encode_packed_tile(struct vec *dst,
}
void zrle_copy_tile(uint32_t *dst, const uint32_t *src, int stride,
int width, int height)
int width, int height, enum nvnc_modifier mod)
{
for (int y = 0; y < height; ++y)
for (int y = 0; y < height; ++y) {
if (!(mod & NVNC_MOD_Y_INVERT))
memcpy(dst + y * width, src + y * stride, width * 4);
else
memcpy(dst + (height - y - 1) * width, src + y * stride,
width * 4);
}
}
void zrle_encode_tile(struct vec *dst, const struct rfb_pixel_format *dst_fmt,
@ -324,7 +330,8 @@ int zrle_deflate(struct vec* dst, const struct vec* src, z_stream* zs,
}
int zrle_encode_box(struct vec* out, const struct rfb_pixel_format *dst_fmt,
const uint8_t *src, const struct rfb_pixel_format *src_fmt,
const struct nvnc_fb *fb,
const struct rfb_pixel_format *src_fmt,
int x, int y, int stride, int width, int height,
z_stream* zs)
{
@ -362,12 +369,16 @@ int zrle_encode_box(struct vec* out, const struct rfb_pixel_format *dst_fmt,
int tile_x = (i % UDIV_UP(width, 64)) * 64;
int tile_y = (i / UDIV_UP(width, 64)) * 64;
if (fb->nvnc_modifier & NVNC_MOD_Y_INVERT)
tile_y = (UDIV_UP(height, 64) - tile_y / 64 - 1) * 64;
int tile_width = width - tile_x >= 64 ? 64 : width - tile_x;
int tile_height = height - tile_y >= 64 ? 64 : height - tile_y;
zrle_copy_tile(tile,
((uint32_t*)src) + x + tile_x + (y + tile_y) * stride,
stride, tile_width, tile_height);
((uint32_t*)fb->addr) + x + tile_x + (y + tile_y) * stride,
stride, tile_width, tile_height,
fb->nvnc_modifier);
zrle_encode_tile(&in, dst_fmt, tile, src_fmt,
tile_width * tile_height);
@ -390,9 +401,8 @@ failure:
int zrle_encode_frame(z_stream *zs,
struct vec* dst,
const struct rfb_pixel_format *dst_fmt,
const uint8_t *src,
const struct nvnc_fb *src,
const struct rfb_pixel_format *src_fmt,
int width, int height,
struct pixman_region16 *region)
{
int rc = -1;
@ -420,7 +430,7 @@ int zrle_encode_frame(z_stream *zs,
int box_height = box[i].y2 - y;
rc = zrle_encode_box(dst, dst_fmt, src, src_fmt, x, y,
width, box_width, box_height, zs);
src->width, box_width, box_height, zs);
if (rc < 0)
return -1;
}