Move update header out of encoders
parent
8b2c81c3dd
commit
65c0e91c37
|
@ -22,7 +22,6 @@
|
||||||
|
|
||||||
struct vec;
|
struct vec;
|
||||||
|
|
||||||
int encode_rect_count(struct vec* dst, uint32_t count);
|
|
||||||
int encode_rect_head(struct vec* dst, enum rfb_encodings encoding,
|
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 x, uint32_t y, uint32_t width, uint32_t height);
|
||||||
uint32_t calc_bytes_per_cpixel(const struct rfb_pixel_format* fmt);
|
uint32_t calc_bytes_per_cpixel(const struct rfb_pixel_format* fmt);
|
||||||
|
|
|
@ -45,6 +45,8 @@ struct encoder {
|
||||||
uint16_t x_pos;
|
uint16_t x_pos;
|
||||||
uint16_t y_pos;
|
uint16_t y_pos;
|
||||||
|
|
||||||
|
int n_rects;
|
||||||
|
|
||||||
void (*on_done)(struct encoder*, struct rcbuf* result);
|
void (*on_done)(struct encoder*, struct rcbuf* result);
|
||||||
void* userdata;
|
void* userdata;
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,16 +20,6 @@
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
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,
|
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 x, uint32_t y, uint32_t width, uint32_t height)
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,6 +93,8 @@ static int raw_encode_frame(struct raw_encoder* self, struct vec* dst,
|
||||||
{
|
{
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
|
self->encoder.n_rects = 0;
|
||||||
|
|
||||||
int n_rects = 0;
|
int n_rects = 0;
|
||||||
struct pixman_box16* box = pixman_region_rectangles(region, &n_rects);
|
struct pixman_box16* box = pixman_region_rectangles(region, &n_rects);
|
||||||
if (n_rects > UINT16_MAX) {
|
if (n_rects > UINT16_MAX) {
|
||||||
|
@ -108,10 +110,6 @@ static int raw_encode_frame(struct raw_encoder* self, struct vec* dst,
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
rc = encode_rect_count(dst, n_rects);
|
|
||||||
if (rc < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
for (int i = 0; i < n_rects; ++i) {
|
for (int i = 0; i < n_rects; ++i) {
|
||||||
int x = box[i].x1;
|
int x = box[i].x1;
|
||||||
int y = box[i].y1;
|
int y = box[i].y1;
|
||||||
|
@ -124,6 +122,7 @@ static int raw_encode_frame(struct raw_encoder* self, struct vec* dst,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->encoder.n_rects = n_rects;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
src/server.c
12
src/server.c
|
@ -28,6 +28,7 @@
|
||||||
#include "usdt.h"
|
#include "usdt.h"
|
||||||
#include "encoder.h"
|
#include "encoder.h"
|
||||||
#include "tight.h"
|
#include "tight.h"
|
||||||
|
#include "enc-util.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -1223,12 +1224,19 @@ static bool client_has_encoding(const struct nvnc_client* client,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void finish_fb_update(struct nvnc_client* client, struct rcbuf* payload)
|
static void finish_fb_update(struct nvnc_client* client, struct rcbuf* payload,
|
||||||
|
int n_rects)
|
||||||
{
|
{
|
||||||
client_ref(client);
|
client_ref(client);
|
||||||
|
|
||||||
if (client->net_stream->state != STREAM_STATE_CLOSED) {
|
if (client->net_stream->state != STREAM_STATE_CLOSED) {
|
||||||
DTRACE_PROBE1(neatvnc, send_fb_start, client);
|
DTRACE_PROBE1(neatvnc, send_fb_start, client);
|
||||||
|
struct rfb_server_fb_update_msg update_msg = {
|
||||||
|
.type = RFB_SERVER_TO_CLIENT_FRAMEBUFFER_UPDATE,
|
||||||
|
.n_rects = htons(n_rects),
|
||||||
|
};
|
||||||
|
stream_write(client->net_stream, &update_msg,
|
||||||
|
sizeof(update_msg), NULL, NULL);
|
||||||
rcbuf_ref(payload);
|
rcbuf_ref(payload);
|
||||||
stream_send(client->net_stream, payload, on_write_frame_done,
|
stream_send(client->net_stream, payload, on_write_frame_done,
|
||||||
client);
|
client);
|
||||||
|
@ -1251,7 +1259,7 @@ static void finish_fb_update(struct nvnc_client* client, struct rcbuf* payload)
|
||||||
static void on_encode_frame_done(struct encoder* encoder, struct rcbuf* result)
|
static void on_encode_frame_done(struct encoder* encoder, struct rcbuf* result)
|
||||||
{
|
{
|
||||||
struct nvnc_client* client = encoder->userdata;
|
struct nvnc_client* client = encoder->userdata;
|
||||||
finish_fb_update(client, result);
|
finish_fb_update(client, result, encoder->n_rects);
|
||||||
client_unref(client);
|
client_unref(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -514,6 +514,8 @@ static void on_tight_finished(void* obj)
|
||||||
struct rcbuf* result = rcbuf_new(self->dst.data, self->dst.len);
|
struct rcbuf* result = rcbuf_new(self->dst.data, self->dst.len);
|
||||||
assert(result);
|
assert(result);
|
||||||
|
|
||||||
|
self->encoder.n_rects = self->n_rects;
|
||||||
|
|
||||||
if (self->encoder.on_done)
|
if (self->encoder.on_done)
|
||||||
self->encoder.on_done(&self->encoder, result);
|
self->encoder.on_done(&self->encoder, result);
|
||||||
|
|
||||||
|
@ -580,6 +582,8 @@ static int tight_encoder_encode(struct encoder* encoder, struct nvnc_fb* fb,
|
||||||
struct tight_encoder* self = tight_encoder(encoder);
|
struct tight_encoder* self = tight_encoder(encoder);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
self->encoder.n_rects = 0;
|
||||||
|
|
||||||
rc = rfb_pixfmt_from_fourcc(&self->sfmt, nvnc_fb_get_fourcc_format(fb));
|
rc = rfb_pixfmt_from_fourcc(&self->sfmt, nvnc_fb_get_fourcc_format(fb));
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
|
|
||||||
|
@ -598,8 +602,6 @@ static int tight_encoder_encode(struct encoder* encoder, struct nvnc_fb* fb,
|
||||||
self->n_rects = tight_apply_damage(self, damage);
|
self->n_rects = tight_apply_damage(self, damage);
|
||||||
assert(self->n_rects > 0);
|
assert(self->n_rects > 0);
|
||||||
|
|
||||||
encode_rect_count(&self->dst, self->n_rects);
|
|
||||||
|
|
||||||
nvnc_fb_ref(self->fb);
|
nvnc_fb_ref(self->fb);
|
||||||
|
|
||||||
if (tight_schedule_encoding_jobs(self) < 0) {
|
if (tight_schedule_encoding_jobs(self) < 0) {
|
||||||
|
|
|
@ -299,6 +299,8 @@ static int zrle_encode_frame(struct zrle_encoder* self, z_stream* zs,
|
||||||
{
|
{
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
|
self->encoder.n_rects = 0;
|
||||||
|
|
||||||
int n_rects = 0;
|
int n_rects = 0;
|
||||||
struct pixman_box16* box = pixman_region_rectangles(region, &n_rects);
|
struct pixman_box16* box = pixman_region_rectangles(region, &n_rects);
|
||||||
if (n_rects > UINT16_MAX) {
|
if (n_rects > UINT16_MAX) {
|
||||||
|
@ -310,10 +312,6 @@ static int zrle_encode_frame(struct zrle_encoder* self, z_stream* zs,
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
rc = encode_rect_count(dst, n_rects);
|
|
||||||
if (rc < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
for (int i = 0; i < n_rects; ++i) {
|
for (int i = 0; i < n_rects; ++i) {
|
||||||
int x = box[i].x1;
|
int x = box[i].x1;
|
||||||
int y = box[i].y1;
|
int y = box[i].y1;
|
||||||
|
@ -326,6 +324,7 @@ static int zrle_encode_frame(struct zrle_encoder* self, z_stream* zs,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->encoder.n_rects = n_rects;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue