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/server/common.h | 2 ++ src/server/server.c | 41 +++++++++++++++++++++++++++-------------- src/server/server.h | 5 +++-- 3 files changed, 32 insertions(+), 16 deletions(-) (limited to 'src/server') diff --git a/src/server/common.h b/src/server/common.h index b4c6344..9948c02 100644 --- a/src/server/common.h +++ b/src/server/common.h @@ -6,6 +6,8 @@ #define CAMU_MULTIPLEX_RPC 0x53 #define CAMU_MULTIPLEX_LIANA 0x85 +//#define CAMU_DIRECT_MODE + enum { CAMU_NODE = 0, CAMU_CLIENT, diff --git a/src/server/server.c b/src/server/server.c index 8373296..c2b30a0 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -117,7 +117,8 @@ static bool identify_callback(void *userdata, struct nn_rpc_connection *conn, } } - nn_packet_free(packet); + nn_packet_stream_return_packet(conn->stream, packet); + return true; } @@ -336,7 +337,8 @@ static bool client_command_callback(void *userdata, struct nn_rpc_connection *co } out: - nn_packet_free(packet); + nn_packet_stream_return_packet(conn->stream, packet); + return true; } @@ -562,7 +564,8 @@ static bool list_action_callback(void *userdata, struct nn_rpc_connection *conn, } out: - nn_packet_free(packet); + nn_packet_stream_return_packet(conn->stream, packet); + return false; } @@ -634,23 +637,23 @@ static void connection_closed_callback(void *userdata, struct nn_rpc_connection } } -static bool multiplex_callback(void *userdata, u8 id, struct nn_socket *sock) +static bool multiplex_callback(void *userdata, u8 id, struct nn_packet_stream *stream) { struct camu_server *server = (struct camu_server *)userdata; switch (id) { case CAMU_MULTIPLEX_RPC: - nn_rpc_add_socket(&server->server, sock); - return true; + nn_rpc_add_stream(&server->server, stream); + break; case CAMU_MULTIPLEX_LIANA: - lia_server_add_socket(&server->data.server, sock); - return true; - default: + lia_server_add_stream(&server->data.server, stream); break; + default: + return false; } - return false; + return true; } -bool camu_server_init(struct camu_server *server, u8 type, struct nn_event_loop *loop) +void camu_server_init(struct camu_server *server, struct nn_event_loop *loop) { server->loop = loop; server->addr = al_str_zero(); @@ -678,24 +681,34 @@ bool camu_server_init(struct camu_server *server, u8 type, struct nn_event_loop camu_post_cache_init(&server->cache); camu_portal_init(&server->bridge, &server->cache, server->loop, server); #endif - - return nn_multiplex_socket_init(&server->multi, type, multiplex_callback, server); } -bool camu_server_listen(struct camu_server *server, str *addr, u16 port) +bool camu_server_listen(struct camu_server *server, u8 type, str *addr, u16 port) { + if (!nn_multiplex_socket_init(&server->multi, type, multiplex_callback, server)) { + return false; + } al_str_clone(&server->addr, addr); if (server->multi.sock.type == NNWT_SOCKET_TCP) addr = NULL; // any return nn_multiplex_socket_listen(&server->multi, server->loop, addr, port); } +void camu_server_bind_direct(struct camu_server *server) +{ + nn_multiplex_direct_init(multiplex_callback, server); +} + void camu_server_close(struct camu_server *server) { #ifdef CAMU_HAVE_PORTAL camu_portal_close(&server->bridge); #endif lia_server_close(&server->data.server); +#ifdef CAMU_DIRECT_MODE + nn_multiplex_direct_close(); +#else nn_multiplex_socket_close(&server->multi); +#endif } void camu_server_free(struct camu_server *server) diff --git a/src/server/server.h b/src/server/server.h index ab96e80..1b250dc 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -49,8 +49,9 @@ struct camu_server { void *userdata; }; -bool camu_server_init(struct camu_server *server, u8 type, struct nn_event_loop *loop); -bool camu_server_listen(struct camu_server *server, str *addr, u16 port); +void camu_server_init(struct camu_server *server, struct nn_event_loop *loop); +bool camu_server_listen(struct camu_server *server, u8 type, str *addr, u16 port); +void camu_server_bind_direct(struct camu_server *server); void camu_server_close(struct camu_server *server); void camu_server_free(struct camu_server *server); -- cgit v1.2.3-101-g0448