From 24b58a516e6bacfdf59aac422411c2f1fcf4ffb2 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Wed, 1 Jan 2025 16:04:59 -0500 Subject: Optimizations based on video loop performance - Support nn_packet_stream direct mode - Hook up FFmpeg hardware accelerated decoding - Refactor VCR - Reduce locking when returning packets to a packet pool Signed-off-by: Andrew Opalach --- src/libclient/client.c | 26 ++++++++++++++++++-------- src/libclient/client.h | 4 ++-- 2 files changed, 20 insertions(+), 10 deletions(-) (limited to 'src/libclient') diff --git a/src/libclient/client.c b/src/libclient/client.c index b4e44da..dcceb05 100644 --- a/src/libclient/client.c +++ b/src/libclient/client.c @@ -1,3 +1,5 @@ +#include + #include "client.h" #include "common.h" @@ -22,7 +24,8 @@ static bool results_callback(void *userdata, struct nn_rpc_connection *conn, break; } - nn_packet_free(packet); + nn_packet_stream_return_packet(conn->stream, packet); + return false; } @@ -30,10 +33,11 @@ static struct nn_rpc_command commands[] = { { .op = CAMU_CLIENT_RESULTS, .callback = results_callback, .userdata = NULL } }; -static void idd_callback(void *userdata, struct nn_packet *packet) +static void idd_callback(void *userdata, struct nn_rpc_connection *conn, struct nn_packet *packet) { struct camu_client *client = (struct camu_client *)userdata; client->callback(client->userdata, CAMU_CLIENT_LOGIN, packet); + nn_packet_stream_return_packet(conn->stream, packet); } static void connection_callback(void *userdata, struct nn_rpc_connection *conn) @@ -64,15 +68,21 @@ bool camu_client_login(struct camu_client *client, struct nn_event_loop *loop, commands[i].userdata = client; nn_rpc_add_command(&client->client, &commands[i]); } - if (!nn_rpc_prepare_client(&client->client, type, CAMU_MULTIPLEX_RPC)) { - return false; - } - nn_rpc_connect(&client->client, addr, port); + nn_rpc_prepare_client(&client->client); +#ifdef CAMU_DIRECT_MODE + (void)type; + (void)addr; + (void)port; + struct nn_rpc_connection *conn = client->client.conn; + nn_multiplex_direct_connect(conn->stream, CAMU_MULTIPLEX_RPC); +#else + nn_rpc_connect(&client->client, CAMU_MULTIPLEX_RPC, type, addr, port); +#endif return true; } void camu_client_create_list(struct camu_client *client, str *name, - void (*callback)(void *, struct nn_packet *), void *userdata) + void (*callback)(void *, struct nn_rpc_connection *conn, struct nn_packet *), void *userdata) { struct nn_packet *packet = nn_rpc_get_packet(&client->client, CAMU_SERVER_CLIENT_COMMAND); nn_packet_write_u8(packet, CAMU_CLIENT_CREATE_LIST); @@ -81,7 +91,7 @@ void camu_client_create_list(struct camu_client *client, str *name, } void camu_client_toggle_sink(struct camu_client *client, str *sink, str *list, bool enable, - void (*callback)(void *, struct nn_packet *), void *userdata) + void (*callback)(void *, struct nn_rpc_connection *conn, struct nn_packet *), void *userdata) { struct nn_packet *packet = nn_rpc_get_packet(&client->client, CAMU_SERVER_CLIENT_COMMAND); nn_packet_write_u8(packet, CAMU_CLIENT_TOGGLE_SINK); diff --git a/src/libclient/client.h b/src/libclient/client.h index 63d877d..fee7de1 100644 --- a/src/libclient/client.h +++ b/src/libclient/client.h @@ -21,9 +21,9 @@ bool camu_client_login(struct camu_client *client, struct nn_event_loop *loop, u8 type, str *addr, u16 port, str *username); void camu_client_create_list(struct camu_client *client, str *name, - void (*callback)(void *, struct nn_packet *), void *userdata); + void (*callback)(void *, struct nn_rpc_connection *conn, struct nn_packet *), void *userdata); void camu_client_toggle_sink(struct camu_client *client, str *sink, str *list, bool enable, - void (*callback)(void *, struct nn_packet *), void *userdata); + void (*callback)(void *, struct nn_rpc_connection *conn, struct nn_packet *), void *userdata); void camu_client_create_search(struct camu_client *client, str *module, str *query); void camu_client_get_page(struct camu_client *client, s32 id, u32 num); -- cgit v1.2.3-101-g0448