summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meson.build2
-rw-r--r--src/codec/ffmpeg/decoder.c10
-rw-r--r--src/fruits/cmv/cmv.c114
-rw-r--r--src/liana/list.c2
-rw-r--r--src/liana/list.h4
-rw-r--r--src/libsink/sink.c8
-rw-r--r--src/render/queue_libplacebo.c19
-rw-r--r--src/render/renderer_libplacebo.c1
-rw-r--r--src/screen/screen.c19
-rw-r--r--subprojects/packagefiles/ffmpeg/meson.build2
-rw-r--r--subprojects/stela.wrap2
11 files changed, 103 insertions, 80 deletions
diff --git a/meson.build b/meson.build
index ee77926..e27d8b2 100644
--- a/meson.build
+++ b/meson.build
@@ -27,6 +27,8 @@ if not no_video
stela_opts += get_option('sink-use-vulkan') ? 'window=glfw' : 'window=wayland'
elif is_android
stela_opts += 'window=glfm'
+ elif is_windows
+ stela_opts += 'window=win32'
else
stela_opts += 'window=glfw'
endif
diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c
index affe9fa..47b5b01 100644
--- a/src/codec/ffmpeg/decoder.c
+++ b/src/codec/ffmpeg/decoder.c
@@ -141,7 +141,6 @@ static bool get_hwdevice_config(struct camu_ff_decoder *av, const AVCodec *codec
static bool collect_supported_hwaccels(struct camu_ff_decoder *av)
{
- al_array_init(av->supported_hw_codecs);
const AVCodec *codec;
void *iter = NULL;
while ((codec = av_codec_iterate(&iter))) {
@@ -151,7 +150,6 @@ static bool collect_supported_hwaccels(struct camu_ff_decoder *av)
}
}
- al_array_init(av->supported_hw_devices);
enum AVHWDeviceType hw_device_type = AV_HWDEVICE_TYPE_NONE;
while ((hw_device_type = av_hwdevice_iterate_types(hw_device_type)) != AV_HWDEVICE_TYPE_NONE) {
al_array_push(av->supported_hw_devices, hw_device_type);
@@ -166,6 +164,10 @@ static bool collect_supported_hwaccels(struct camu_ff_decoder *av)
static void close_internal(struct camu_ff_decoder *av)
{
if (av->codec_context) avcodec_free_context(&av->codec_context);
+#ifdef CAMU_FF_DECODER_HWACCEL
+ al_array_free(av->supported_hw_codecs);
+ al_array_free(av->supported_hw_devices);
+#endif
}
static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
@@ -174,6 +176,10 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
struct camu_ff_decoder *av = (struct camu_ff_decoder *)dec;
av->codec_context = NULL;
+#ifdef CAMU_FF_DECODER_HWACCEL
+ al_array_init(av->supported_hw_codecs);
+ al_array_init(av->supported_hw_devices);
+#endif
AVCodecParameters *codecpar = stream->av.stream->codecpar;
const AVCodec *codec = avcodec_find_decoder(codecpar->codec_id);
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index f79ffe2..f9c3b82 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -41,18 +41,6 @@ static nn_thread_result NNWT_THREADCALL event_loop_thread(void *userdata)
return 0;
}
-static struct cmv c = { 0 };
-
-static void sigint_handler(int signum)
-{
- (void)signum;
- c.desktop.should_quit = 1;
-}
-
-#define failure() do { \
- 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)
{
@@ -113,20 +101,10 @@ def:
return false;
}
-#ifdef NAUNET_ON_WINDOWS
-s32 wmain(s32 argc, wchar_t **argv)
-#else
-s32 main(s32 argc, char *argv[])
-#endif
-{
- if (!nn_common_init() || !stl_global_init(false)) {
- return EXIT_FAILURE;
- }
-
- s32 ret = EXIT_FAILURE;
-
- signal(SIGINT, sigint_handler);
+static struct cmv c = { 0 };
+s32 window_system_main(s32 argc, str *argv)
+{
#ifdef CAMU_HAVE_FFMPEG
camu_ff_common_init();
#endif
@@ -150,14 +128,7 @@ s32 main(s32 argc, char *argv[])
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)) {
+ if (!parse_exe_name_params(&argv[0], &addr, &c.desktop.sink.prefs)) {
#ifndef CAMU_SINK_ONLY
if (local) {
#ifdef NAUNET_ON_WINDOWS
@@ -183,13 +154,15 @@ s32 main(s32 argc, char *argv[])
camu_server_bind_direct(&c.server);
#else
if (!camu_server_listen(&c.server, type, &addr, CAMU_PORT)) {
- failure();
+ return EXIT_FAILURE;
}
#endif
}
#endif
- if (!camu_desktop_init(&c.desktop, "cmv")) failure();
+ if (!camu_desktop_init(&c.desktop, "cmv")) {
+ return EXIT_FAILURE;
+ }
#ifndef CAMU_SINK_ONLY
if (local) {
c.desktop.exit_callback = exit_callback;
@@ -197,38 +170,31 @@ 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)) {
+ return EXIT_FAILURE;
+ }
#ifndef CAMU_SINK_ONLY
if (local) {
for (s32 i = 1; i < argc; i++) {
-#ifdef NAUNET_ON_WINDOWS
- str arg;
- if (!al_wstr_to_str(&al_wstr_cr(argv[i]), &arg)) {
- al_log_error("cmv", "Failed to parse argument #%i.", i);
- continue;
- }
-#else
- str arg = al_str_cr(argv[i]);
-#endif
struct nn_packet *packet = nn_packet_create();
#ifdef CAMU_HAVE_PORTAL
- if (al_str_at(&arg, 0) == ';' || camu_is_url(&arg, 0)) {
+ if (al_str_at(&argv[i], 0) == ';' || camu_is_url(&argv[i], 0)) {
nn_packet_write_u8(packet, CAMU_RESOURCE_SIMPLE_SEARCH);
#elif defined NAUNET_HAS_CURL
- if (camu_is_url(&arg, 0)) {
+ if (camu_is_url(&argv[i], 0)) {
nn_packet_write_u8(packet, CAMU_RESOURCE_HTTP);
#else
if (0) {
#endif
#if CACHE_HAVE_CDIO
- } else if (al_str_cmp(&arg, &al_str_c("cdda://"), 0, 7) == 0) {
+ } else if (al_str_cmp(&argv[i], &al_str_c("cdda://"), 0, 7) == 0) {
nn_packet_write_u8(packet, CAMU_RESOURCE_CDIO);
#endif
} else {
nn_packet_write_u8(packet, CAMU_RESOURCE_FILE);
}
- nn_packet_write_str(packet, &arg);
+ nn_packet_write_str(packet, &argv[i]);
camu_server_local_add(&c.server, packet);
nn_packet_free(packet);
}
@@ -244,19 +210,61 @@ s32 main(s32 argc, char *argv[])
while (camu_desktop_tick(&c.desktop)) {}
camu_desktop_stop(&c.desktop);
+
nn_thread_join(&thread0);
+
camu_desktop_free(&c.desktop);
#ifndef CAMU_SINK_ONLY
camu_server_free(&c.server);
#endif
-
- ret = EXIT_SUCCESS;
-out:
nn_event_loop_destroy(&c.loop);
-
al_str_free(&home);
+ return EXIT_SUCCESS;
+}
+
+static void sigint_handler(int signum)
+{
+ (void)signum;
+ c.desktop.should_quit = 1;
+}
+
+#ifdef NAUNET_ON_WINDOWS
+s32 wmain(s32 argc, wchar_t **wargv)
+#else
+s32 main(s32 argc, char *cargv[])
+#endif
+{
+ if (!nn_common_init()) {
+ return EXIT_FAILURE;
+ }
+
+ signal(SIGINT, sigint_handler);
+
+ array(str) args;
+ al_array_init(args);
+ for (s32 i = 0; i < argc; i++) {
+ str arg;
+#ifdef NAUNET_ON_WINDOWS
+ if (!al_wstr_to_str(&al_wstr_cr(wargv[i]), &arg)) {
+ al_log_error("cmv", "Failed to parse argument #%i.", i);
+ continue;
+ }
+#else
+ al_str_from(&arg, cargv[i]);
+#endif
+ al_array_push(args, arg);
+ }
+
+ s32 ret = stl_global_init((s32)args.count, args.data, window_system_main, false);
stl_global_close();
+
+ str *arg;
+ al_array_foreach_ptr(args, i, arg) {
+ al_str_free(arg);
+ }
+ al_array_free(args);
+
nn_common_close();
return ret;
diff --git a/src/liana/list.c b/src/liana/list.c
index ca8aaa5..cccca8e 100644
--- a/src/liana/list.c
+++ b/src/liana/list.c
@@ -634,7 +634,7 @@ static bool handle_shuffle(struct lia_list *list)
exchange a[i] and a[j]
*/
// Changed size - 2 to size - 1 to support 2 entry lists.
- // I assume this alters the algorithm, not sure how badly.
+ // I assume that alters the algorithm, not sure how badly.
for (u32 i = 0; i < size - 1; i++) {
u32 j = i + (al_rand() % (size - i));
SWAP(al_array_at(list->entries, i), al_array_at(list->entries, j));
diff --git a/src/liana/list.h b/src/liana/list.h
index 4b1ae02..86064af 100644
--- a/src/liana/list.h
+++ b/src/liana/list.h
@@ -7,8 +7,8 @@
#define LIANA_SEQUENCE_ANY -1
#define LIANA_TIMESTAMP_INVALID ((u64)-1)
-#define LIANA_BASE_DELAY 750000Lu // 750ms
-#define LIANA_BASE_PING 150000Lu // 150ms
+#define LIANA_BASE_DELAY 450000Lu // 450ms
+#define LIANA_BASE_PING 125000Lu // 125ms
#define LIANA_PAUSE_DELAY LIANA_BASE_PING
#define LIANA_DELAY_IGNORE 0Lu
diff --git a/src/libsink/sink.c b/src/libsink/sink.c
index 4aa1d51..62bb941 100644
--- a/src/libsink/sink.c
+++ b/src/libsink/sink.c
@@ -568,12 +568,12 @@ static void maybe_cleanup_old_entries(struct camu_sink *sink)
// We check size <= MAX_AGE in the loops because sink->lru is
// not indicative of the amount of entries we have loaded.
- // The most obvious reason for that is that it's incremented for
- // buffer and queue operations.
+ // The most obvious reason being it's incremented when moving
+ // back and forth between two entries. As well as for buffer and
+ // queue operations.
struct camu_sink_entry *entry;
- // Handle sink->lru wrapping. This has to happen in a step
- // before the no wrapping case.
+ // Handle sink->lru wrapping. This must happen in a step before the no wrapping case.
al_array_foreach_rev(sink->entries, i, entry) {
// 0 65532 65533 65534 65535
// 0 1 65533 65534 65535
diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c
index b6a7477..d078cbc 100644
--- a/src/render/queue_libplacebo.c
+++ b/src/render/queue_libplacebo.c
@@ -215,26 +215,27 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
));
}
- if (!ok) {
+ if (!ok && frame->hw_frames_ctx) {
if (!lq->copy_frame_fallback) {
al_log_warn("frame_queue_libplacebo", "Falling back to software copy.");
lq->copy_frame_fallback = true;
lq->swframe = av_frame_alloc();
+ enum AVPixelFormat *fmts;
+ av_hwframe_transfer_get_formats(frame->hw_frames_ctx, AV_HWFRAME_TRANSFER_DIRECTION_FROM, &fmts, 0);
+ lq->swframe->format = fmts[0];
+ av_free(fmts);
}
ok = av_hwframe_transfer_data(lq->swframe, frame, 0) == 0;
if (ok) {
av_frame_copy_props(lq->swframe, frame);
+ ok = pl_map_avframe_ex(gpu, out_frame, pl_avframe_params(
+ .frame = lq->swframe,
+ .tex = tex
+ ));
+ av_frame_unref(lq->swframe);
}
}
- if (lq->copy_frame_fallback) {
- ok = pl_map_avframe_ex(gpu, out_frame, pl_avframe_params(
- .frame = lq->swframe,
- .tex = tex
- ));
- av_frame_unref(lq->swframe);
- }
-
((struct pl_source_frame *)src)->frame_data = NULL;
if (ok && lq->have_subtitles) {
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 0dcff45..8ff718e 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -233,6 +233,7 @@ static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *r
lq->params.interpolation_threshold = 0.01f;
lq->params.radius = pl_frame_mix_radius(&lr->params);
lq->params.timeout = 0uL; // vsync
+ lq->copy_frame_fallback = false;
lq->ass = lr->ass;
return queue;
}
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 77fbd8d..eb68278 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -29,15 +29,14 @@ static void should_close_callback(void *userdata)
scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, NULL);
}
-static void resize_callback(void *userdata, u32 width, u32 height)
+static void do_resize(struct camu_screen *scr, u32 width, u32 height)
{
- struct camu_screen *scr = (struct camu_screen *)userdata;
if (scr->renderer) {
scr->renderer->resize(scr->renderer, &width, &height);
}
al_assert(width > 0 && height > 0);
- scr->width = (u32)width;
- scr->height = (u32)height;
+ scr->width = width;
+ scr->height = height;
struct camu_screen_video *video;
al_array_foreach_ptr(scr->videos, i, video) {
camu_view_calculate(&video->view, scr->width, scr->height);
@@ -46,6 +45,12 @@ static void resize_callback(void *userdata, u32 width, u32 height)
al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
}
+static void resize_callback(void *userdata, u32 width, u32 height)
+{
+ struct camu_screen *scr = (struct camu_screen *)userdata;
+ do_resize(scr, width, height);
+}
+
static void refresh_callback(void *userdata)
{
struct camu_screen *scr = (struct camu_screen *)userdata;
@@ -136,8 +141,10 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
return false;
}
-#ifdef STELA_WINDOW_WAYLAND
+#if defined STELA_WINDOW_WAYLAND
#define SCROLL_MULTIPLIER 160.0
+#elif defined STELA_WINDOW_WIN32
+#define SCROLL_MULTIPLIER 1200.0
#else
#define SCROLL_MULTIPLIER 20.0
#endif
@@ -176,7 +183,6 @@ static bool key_callback(void *userdata, u8 state, u8 button)
scr->flags |= CAMU_SCREEN_MOD_CONTROL;
break;
case 0x10: // q
- case 0x18: // q (spice?)
scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, NULL);
break;
case 0x31: // n
@@ -192,7 +198,6 @@ static bool key_callback(void *userdata, u8 state, u8 button)
scr->callback(scr->userdata, CAMU_SCREEN_PREVIOUS, NULL);
break;
case 0x39: // spacebar
- case 0x41: // spacebar (spice?)
scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL);
break;
case 0x1f: // s
diff --git a/subprojects/packagefiles/ffmpeg/meson.build b/subprojects/packagefiles/ffmpeg/meson.build
index 05940c4..04533f8 100644
--- a/subprojects/packagefiles/ffmpeg/meson.build
+++ b/subprojects/packagefiles/ffmpeg/meson.build
@@ -73,9 +73,9 @@ if get_option('sink-use-vulkan')
hwaccels += 'h264_vulkan,hevc_vulkan,av1_vulkan'
elif is_windows
extra_options += ['--enable-d3d11va']
- #extra_options += ['--enable-d3d11va', '--enable-dxva2']
hwaccels += 'h264_d3d11va,hevc_d3d11va,av1_d3d11va,vp9_d3d11va'
hwaccels += ',h264_d3d11va2,hevc_d3d11va2,av1_d3d11va2,vp9_d3d11va2'
+ #extra_options += ['--enable-dxva2']
#hwaccels += ',h264_dxva2,hevc_dxva2,av1_dxva2,vp9_dxva2'
elif is_android
extra_options += ['--enable-jni', '--enable-mediacodec']
diff --git a/subprojects/stela.wrap b/subprojects/stela.wrap
index faac747..b164d5f 100644
--- a/subprojects/stela.wrap
+++ b/subprojects/stela.wrap
@@ -1,4 +1,4 @@
[wrap-git]
url = https://git.akon.city/stela
-revision = c0cd683e98f357d4b81cfd44444dbc909dcb2386
+revision = 1993433dc36dfae6a6c4b32f613e64ba213fdc23
depth = 1