zrle: Use vec for tile buffer
parent
9787cf5772
commit
09d64dfbe6
15
inc/vec.h
15
inc/vec.h
|
@ -1,6 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
struct vec {
|
struct vec {
|
||||||
void* data;
|
void* data;
|
||||||
|
@ -24,6 +26,19 @@ int vec_assign(struct vec* vec, const void* data, size_t size);
|
||||||
int vec_append(struct vec* vec, const void* data, size_t size);
|
int vec_append(struct vec* vec, const void* data, size_t size);
|
||||||
void* vec_append_zero(struct vec* vec, size_t size);
|
void* vec_append_zero(struct vec* vec, size_t size);
|
||||||
|
|
||||||
|
static inline void vec_fast_append_8(struct vec* vec, uint8_t value)
|
||||||
|
{
|
||||||
|
assert(vec->len < vec->cap);
|
||||||
|
((uint8_t*)vec->data)[vec->len++] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void vec_fast_append_32(struct vec* vec, uint32_t value)
|
||||||
|
{
|
||||||
|
assert(vec->len + sizeof(value) <= vec->cap);
|
||||||
|
assert(vec->len % sizeof(value) == 0);
|
||||||
|
((uint32_t*)vec->data)[vec->len] = value;
|
||||||
|
vec->len += sizeof(value);
|
||||||
|
}
|
||||||
|
|
||||||
#define vec_for(elem, vec) \
|
#define vec_for(elem, vec) \
|
||||||
for (elem = (vec)->data; \
|
for (elem = (vec)->data; \
|
||||||
|
|
23
src/zrle.c
23
src/zrle.c
|
@ -145,19 +145,23 @@ void pixel32_to_cpixel(uint8_t *restrict dst,
|
||||||
#undef CONVERT_PIXELS
|
#undef CONVERT_PIXELS
|
||||||
}
|
}
|
||||||
|
|
||||||
void zrle_encode_tile(uint8_t *dst, const struct rfb_pixel_format *dst_fmt,
|
void zrle_encode_tile(struct vec *dst, const struct rfb_pixel_format *dst_fmt,
|
||||||
const uint32_t *src,
|
const uint32_t *src,
|
||||||
const struct rfb_pixel_format *src_fmt,
|
const struct rfb_pixel_format *src_fmt,
|
||||||
int stride, int width, int height)
|
int stride, int width, int height)
|
||||||
{
|
{
|
||||||
int bytes_per_cpixel = dst_fmt->depth / 8;
|
int bytes_per_cpixel = dst_fmt->depth / 8;
|
||||||
|
|
||||||
dst[0] = 0; /* Sub-encoding is raw pixel data */
|
vec_clear(dst);
|
||||||
|
|
||||||
|
vec_fast_append_8(dst, 0);
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y)
|
for (int y = 0; y < height; ++y)
|
||||||
pixel32_to_cpixel(dst + 1 + width * y * bytes_per_cpixel,
|
pixel32_to_cpixel(((uint8_t*)dst->data) + 1 + width * y * bytes_per_cpixel,
|
||||||
dst_fmt, src + stride * y,
|
dst_fmt, src + stride * y,
|
||||||
src_fmt, bytes_per_cpixel, width);
|
src_fmt, bytes_per_cpixel, width);
|
||||||
|
|
||||||
|
dst->len += bytes_per_cpixel * width * height;
|
||||||
}
|
}
|
||||||
|
|
||||||
int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt,
|
int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt,
|
||||||
|
@ -171,10 +175,9 @@ int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt,
|
||||||
z_stream zs = { 0 };
|
z_stream zs = { 0 };
|
||||||
|
|
||||||
struct vec out;
|
struct vec out;
|
||||||
uint8_t *in;
|
struct vec in;
|
||||||
|
|
||||||
in = malloc(chunk_size);
|
if (vec_init(&in, 1 + bytes_per_cpixel * 64 * 64) < 0)
|
||||||
if (!in)
|
|
||||||
goto failure;
|
goto failure;
|
||||||
|
|
||||||
if (vec_init(&out, bytes_per_cpixel * width * height * 2) < 0)
|
if (vec_init(&out, bytes_per_cpixel * width * height * 2) < 0)
|
||||||
|
@ -199,12 +202,12 @@ int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt,
|
||||||
printf("Encoding tile @ %dx%d. width: %d, height: %d\n", tile_x,
|
printf("Encoding tile @ %dx%d. width: %d, height: %d\n", tile_x,
|
||||||
tile_y, tile_width, tile_height);
|
tile_y, tile_width, tile_height);
|
||||||
|
|
||||||
zrle_encode_tile(in, dst_fmt,
|
zrle_encode_tile(&in, dst_fmt,
|
||||||
((uint32_t*)src) + tile_x + tile_y * width,
|
((uint32_t*)src) + tile_x + tile_y * width,
|
||||||
src_fmt, stride, tile_width, tile_height);
|
src_fmt, stride, tile_width, tile_height);
|
||||||
|
|
||||||
zs.next_in = in;
|
zs.next_in = in.data;
|
||||||
zs.avail_in = 1 + tile_width * tile_height * bytes_per_cpixel;
|
zs.avail_in = in.len;
|
||||||
|
|
||||||
int flush = (i == n_tiles - 1) ? Z_FINISH : Z_NO_FLUSH;
|
int flush = (i == n_tiles - 1) ? Z_FINISH : Z_NO_FLUSH;
|
||||||
|
|
||||||
|
@ -239,7 +242,7 @@ int zrle_encode_box(uv_stream_t *stream, const struct rfb_pixel_format *dst_fmt,
|
||||||
r = vnc__write(stream, out.data, out.len - 4, NULL);
|
r = vnc__write(stream, out.data, out.len - 4, NULL);
|
||||||
failure:
|
failure:
|
||||||
// vec_destroy(&out);
|
// vec_destroy(&out);
|
||||||
free(in);
|
vec_destroy(&in);
|
||||||
return r;
|
return r;
|
||||||
#undef CHUNK
|
#undef CHUNK
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue