summaryrefslogtreecommitdiff
path: root/src/fruits/cmv
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-02-19 13:40:38 -0500
committerAndrew Opalach <andrew@akon.city> 2025-02-19 13:40:38 -0500
commit2bee71a7e032c0972418e324bb1d7e6b02330b18 (patch)
treefa5819e9d9efe75cbc6f50d462dd0eb6bd19b6a2 /src/fruits/cmv
parentb36f022defd8d4ec5a8c29578bb583bea05dfbb6 (diff)
downloadcamu-2bee71a7e032c0972418e324bb1d7e6b02330b18.tar.gz
camu-2bee71a7e032c0972418e324bb1d7e6b02330b18.tar.bz2
camu-2bee71a7e032c0972418e324bb1d7e6b02330b18.zip
Server resource unload, many tweaks and fixes
- Initial liana client preferences. - Hook up libplacebo dx11 backend. - Make usage of FFmpeg hardware decoding api make some sense. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/fruits/cmv')
-rw-r--r--src/fruits/cmv/cmv.c109
1 files changed, 92 insertions, 17 deletions
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index ebc2236..f79ffe2 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -53,6 +53,66 @@ static void sigint_handler(int signum)
goto out; \
} while (0)
+// sink-p12-108.52.160.112-aEN-v-sEN.exe
+static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *prefs)
+{
+ u32 index = al_str_rfind(exe_name, '/');
+ if (index == al_str_npos) {
+ index = al_str_rfind(exe_name, '\\');
+ if (index == al_str_npos) goto def;
+ }
+
+ str sub = al_str_substr(exe_name, index + 1, exe_name->length);
+ if (al_str_cmp(&sub, &al_str_c("sink-"), 0, 5) != 0) {
+ goto def;
+ }
+ sub = al_str_substr(&sub, 5, sub.length);
+
+ // Skip version.
+ index = al_str_find(&sub, '-');
+ if (index == al_str_npos) goto def;
+ sub = al_str_substr(&sub, index + 1, sub.length);
+
+ index = al_str_find(&sub, '-');
+ if (index == al_str_npos) goto def;
+ *addr = al_str_substr(&sub, 0, index);
+
+ for (;;) {
+ sub = al_str_substr(&sub, index + 1, sub.length);
+ index = al_str_find(&sub, '-');
+ if (index == al_str_npos) {
+ index = al_str_find(&sub, '.');
+ if (index == al_str_npos) {
+ index = sub.length;
+ } else {
+ sub.length = index;
+ }
+ }
+
+ str value;
+ al_str_clone(&value, &al_str_substr(&sub, 0, index));
+ al_str_to_lower(&value);
+ if (al_str_at(&value, 0) == 'a') {
+ prefs->enabled_mask |= CAMU_MASK_AUDIO;
+ } else if (al_str_at(&value, 0) == 'v') {
+ prefs->enabled_mask |= CAMU_MASK_VIDEO;
+ } else if (al_str_at(&value, 0) == 's') {
+ prefs->enabled_mask |= CAMU_MASK_SUBTITLE;
+ }
+ al_str_free(&value);
+
+ if (index == sub.length) break;
+ }
+
+ return true;
+def:
+ prefs->enabled_mask = CAMU_MASK_AUDIO | CAMU_MASK_VIDEO | CAMU_MASK_SUBTITLE;
+ prefs->audio_lang = CAMU_LANG_ENGLISH;
+ prefs->subtitle_lang = CAMU_LANG_ENGLISH;
+
+ return false;
+}
+
#ifdef NAUNET_ON_WINDOWS
s32 wmain(s32 argc, wchar_t **argv)
#else
@@ -68,7 +128,7 @@ s32 main(s32 argc, char *argv[])
signal(SIGINT, sigint_handler);
#ifdef CAMU_HAVE_FFMPEG
- camu_ff_set_default_log_callback();
+ camu_ff_common_init();
#endif
str home = al_str_null();
@@ -84,30 +144,49 @@ s32 main(s32 argc, char *argv[])
nn_event_loop_init(&c.loop);
- u8 type;
- str *addr;
#ifndef CAMU_SINK_ONLY
bool local = argc > 1;
- if (local) {
+#endif
+
+ u8 type;
+ str addr;
+
+ str exe_name;
+#ifdef NAUNET_ON_WINDOWS
+ al_wstr_to_str(&al_wstr_cr(argv[0]), &exe_name);
+#else
+ exe_name = al_str_cr(argv[0]);
+#endif
+ if (!parse_exe_name_params(&exe_name, &addr, &c.desktop.sink.prefs)) {
+#ifndef CAMU_SINK_ONLY
+ if (local) {
#ifdef NAUNET_ON_WINDOWS
- type = NNWT_SOCKET_TCP; addr = &CAMU_LOCALHOST;
+ type = NNWT_SOCKET_TCP; addr = CAMU_LOCALHOST;
+#else
+ type = NNWT_SOCKET_UNIX; addr = CMV_UNIX_PATH;
+#endif
+ } else {
+ type = CAMU_TEST_TYPE;
+ addr = CAMU_TEST_ADDR;
+ }
#else
- type = NNWT_SOCKET_UNIX; addr = &CMV_UNIX_PATH;
+ type = NNWT_SOCKET_TCP; addr = CAMU_TEST_ADDR;
#endif
+ } else {
+ type = NNWT_SOCKET_TCP;
+ }
+
+#ifndef CAMU_SINK_ONLY
+ if (local) {
camu_server_init(&c.server, &c.loop);
#ifdef CAMU_DIRECT_MODE
camu_server_bind_direct(&c.server);
#else
- if (!camu_server_listen(&c.server, type, addr, CAMU_PORT)) {
+ if (!camu_server_listen(&c.server, type, &addr, CAMU_PORT)) {
failure();
}
#endif
- } else {
- type = CAMU_TEST_TYPE;
- addr = &CAMU_TEST_ADDR;
}
-#else
- type = NNWT_SOCKET_TCP; addr = &CAMU_TEST_ADDR;
#endif
if (!camu_desktop_init(&c.desktop, "cmv")) failure();
@@ -118,7 +197,7 @@ s32 main(s32 argc, char *argv[])
c.desktop.sink.local_server = &c.server.data.server;
}
#endif
- if (!camu_desktop_connect(&c.desktop, type, &c.loop, addr, CAMU_PORT)) failure();
+ if (!camu_desktop_connect(&c.desktop, type, &c.loop, &addr, CAMU_PORT)) failure();
#ifndef CAMU_SINK_ONLY
if (local) {
@@ -177,10 +256,6 @@ out:
al_str_free(&home);
-#ifdef CAMU_HAVE_FFMPEG
- camu_ff_free_default_log_callback();
-#endif
-
stl_global_close();
nn_common_close();