summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-01-01 16:04:59 -0500
committerAndrew Opalach <andrew@akon.city> 2025-01-01 16:13:22 -0500
commit24b58a516e6bacfdf59aac422411c2f1fcf4ffb2 (patch)
tree834284316a98f829362619eb2174022687df85ea /src/server
parent20003fd25404ee5fc4cd068fbc4fae1ad6f6ae99 (diff)
downloadcamu-24b58a516e6bacfdf59aac422411c2f1fcf4ffb2.tar.gz
camu-24b58a516e6bacfdf59aac422411c2f1fcf4ffb2.tar.bz2
camu-24b58a516e6bacfdf59aac422411c2f1fcf4ffb2.zip
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 <andrew@akon.city>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/common.h2
-rw-r--r--src/server/server.c41
-rw-r--r--src/server/server.h5
3 files changed, 32 insertions, 16 deletions
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);