diff options
| author | 2025-02-22 10:29:15 -0500 | |
|---|---|---|
| committer | 2025-02-22 10:29:15 -0500 | |
| commit | 000ce1f671d1f05b76202fd128e272e4ac9da683 (patch) | |
| tree | 315812307bd8c5b7ab0efedfd29a43e52c270989 /src | |
| parent | c7f00bb4a70e94a5b0ded8255e34e094e884f7a0 (diff) | |
| download | camu-000ce1f671d1f05b76202fd128e272e4ac9da683.tar.gz camu-000ce1f671d1f05b76202fd128e272e4ac9da683.tar.bz2 camu-000ce1f671d1f05b76202fd128e272e4ac9da683.zip | |
Support new stl_global_init()
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src')
| -rw-r--r-- | src/codec/ffmpeg/decoder.c | 10 | ||||
| -rw-r--r-- | src/fruits/cmv/cmv.c | 114 | ||||
| -rw-r--r-- | src/liana/list.c | 2 | ||||
| -rw-r--r-- | src/liana/list.h | 4 | ||||
| -rw-r--r-- | src/libsink/sink.c | 8 | ||||
| -rw-r--r-- | src/render/queue_libplacebo.c | 19 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 1 | ||||
| -rw-r--r-- | src/screen/screen.c | 19 |
8 files changed, 99 insertions, 78 deletions
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 |