Reference count encoders
parent
48b070af5a
commit
baaf84eab9
|
@ -60,6 +60,8 @@ struct encoder_impl {
|
||||||
struct encoder {
|
struct encoder {
|
||||||
struct encoder_impl* impl;
|
struct encoder_impl* impl;
|
||||||
|
|
||||||
|
int ref;
|
||||||
|
|
||||||
uint16_t x_pos;
|
uint16_t x_pos;
|
||||||
uint16_t y_pos;
|
uint16_t y_pos;
|
||||||
|
|
||||||
|
@ -71,7 +73,10 @@ struct encoder {
|
||||||
|
|
||||||
struct encoder* encoder_new(enum rfb_encodings type, uint16_t width,
|
struct encoder* encoder_new(enum rfb_encodings type, uint16_t width,
|
||||||
uint16_t height);
|
uint16_t height);
|
||||||
void encoder_destroy(struct encoder* self);
|
void encoder_ref(struct encoder* self);
|
||||||
|
void encoder_unref(struct encoder* self);
|
||||||
|
|
||||||
|
void encoder_init(struct encoder* self, struct encoder_impl*);
|
||||||
|
|
||||||
enum rfb_encodings encoder_get_type(const struct encoder* self);
|
enum rfb_encodings encoder_get_type(const struct encoder* self);
|
||||||
enum encoder_kind encoder_get_kind(const struct encoder* self);
|
enum encoder_kind encoder_get_kind(const struct encoder* self);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021 Andri Yngvason
|
* Copyright (c) 2021 - 2022 Andri Yngvason
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -49,6 +49,12 @@ struct encoder* encoder_new(enum rfb_encodings type, uint16_t width,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void encoder_init(struct encoder* self, struct encoder_impl* impl)
|
||||||
|
{
|
||||||
|
self->ref = 1;
|
||||||
|
self->impl = impl;
|
||||||
|
}
|
||||||
|
|
||||||
enum rfb_encodings encoder_get_type(const struct encoder* self)
|
enum rfb_encodings encoder_get_type(const struct encoder* self)
|
||||||
{
|
{
|
||||||
if (self->impl == &encoder_impl_raw)
|
if (self->impl == &encoder_impl_raw)
|
||||||
|
@ -77,11 +83,20 @@ enum encoder_kind encoder_get_kind(const struct encoder* self)
|
||||||
return ENCODER_KIND_INVALID;
|
return ENCODER_KIND_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void encoder_destroy(struct encoder* self)
|
void encoder_ref(struct encoder* self)
|
||||||
|
{
|
||||||
|
assert(self->ref > 0);
|
||||||
|
self->ref++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void encoder_unref(struct encoder* self)
|
||||||
{
|
{
|
||||||
if (!self)
|
if (!self)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (--self->ref != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
if (self->impl->destroy)
|
if (self->impl->destroy)
|
||||||
self->impl->destroy(self);
|
self->impl->destroy(self);
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ struct encoder* open_h264_new(void)
|
||||||
if (!self)
|
if (!self)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
self->parent.impl = &encoder_impl_open_h264;
|
encoder_init(&self->parent, &encoder_impl_open_h264);
|
||||||
|
|
||||||
if (open_h264_init_pending(self) < 0) {
|
if (open_h264_init_pending(self) < 0) {
|
||||||
free(self);
|
free(self);
|
||||||
|
|
|
@ -184,7 +184,7 @@ struct encoder* raw_encoder_new(void)
|
||||||
if (!self)
|
if (!self)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
self->encoder.impl = &encoder_impl_raw;
|
encoder_init(&self->encoder, &encoder_impl_raw);
|
||||||
|
|
||||||
pixman_region_init(&self->current_damage);
|
pixman_region_init(&self->current_damage);
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,7 @@ static void client_close(struct nvnc_client* client)
|
||||||
!(client->encoder->impl->flags &
|
!(client->encoder->impl->flags &
|
||||||
ENCODER_IMPL_FLAG_IGNORES_DAMAGE);
|
ENCODER_IMPL_FLAG_IGNORES_DAMAGE);
|
||||||
}
|
}
|
||||||
encoder_destroy(client->encoder);
|
encoder_unref(client->encoder);
|
||||||
pixman_region_fini(&client->damage);
|
pixman_region_fini(&client->damage);
|
||||||
free(client->cut_text.buffer);
|
free(client->cut_text.buffer);
|
||||||
free(client);
|
free(client);
|
||||||
|
@ -661,7 +661,7 @@ static void process_fb_update_requests(struct nvnc_client* client)
|
||||||
!(client->encoder->impl->flags &
|
!(client->encoder->impl->flags &
|
||||||
ENCODER_IMPL_FLAG_IGNORES_DAMAGE);
|
ENCODER_IMPL_FLAG_IGNORES_DAMAGE);
|
||||||
}
|
}
|
||||||
encoder_destroy(client->encoder);
|
encoder_unref(client->encoder);
|
||||||
client->encoder = encoder_new(encoding, width, height);
|
client->encoder = encoder_new(encoding, width, height);
|
||||||
if (!client->encoder) {
|
if (!client->encoder) {
|
||||||
nvnc_log(NVNC_LOG_ERROR, "Failed to allocate new encoder");
|
nvnc_log(NVNC_LOG_ERROR, "Failed to allocate new encoder");
|
||||||
|
|
|
@ -536,7 +536,7 @@ struct encoder* tight_encoder_new(uint16_t width, uint16_t height)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->encoder.impl = &encoder_impl_tight;
|
encoder_init(&self->encoder, &encoder_impl_tight);
|
||||||
|
|
||||||
return (struct encoder*)self;
|
return (struct encoder*)self;
|
||||||
}
|
}
|
||||||
|
|
|
@ -386,7 +386,7 @@ struct encoder* zrle_encoder_new(void)
|
||||||
if (!self)
|
if (!self)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
self->encoder.impl = &encoder_impl_zrle;
|
encoder_init(&self->encoder, &encoder_impl_zrle);
|
||||||
|
|
||||||
int rc = deflateInit2(&self->zs,
|
int rc = deflateInit2(&self->zs,
|
||||||
/* compression level: */ 1,
|
/* compression level: */ 1,
|
||||||
|
|
Loading…
Reference in New Issue