From e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 23 Jun 2025 17:49:11 -0400 Subject: Improve FFmpeg hwaccel fallback, VR emulation - Optimize sink seeking with single video frame. - Small cleanups. Signed-off-by: Andrew Opalach --- src/libsink/desktop.c | 3 ++- src/libsink/sink.c | 27 +++++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) (limited to 'src/libsink') diff --git a/src/libsink/desktop.c b/src/libsink/desktop.c index a2d02c9..6ef0562 100644 --- a/src/libsink/desktop.c +++ b/src/libsink/desktop.c @@ -239,7 +239,7 @@ bool camu_desktop_connect(struct camu_desktop *c, str *name, struct nn_event_loo bool camu_desktop_tick(struct camu_desktop *c) { bool force; - if (!c->should_quit && camu_screen_tick(&c->scr, &force)) { + if (camu_screen_tick(&c->scr, &force) && !c->should_quit) { c->renderer->render(c->renderer, &c->scr, force); } return !c->should_quit; @@ -260,6 +260,7 @@ void camu_desktop_stop(struct camu_desktop *c) void camu_desktop_free(struct camu_desktop *c) { camu_sink_free(&c->sink); + al_str_free(&c->sink.default_list); camu_mixer_close(&c->mixer); c->renderer->free(&c->renderer); camu_screen_close(&c->scr); diff --git a/src/libsink/sink.c b/src/libsink/sink.c index 94ee3c6..6565cf5 100644 --- a/src/libsink/sink.c +++ b/src/libsink/sink.c @@ -60,13 +60,15 @@ enum { #define ENTRY_MAX_AGE 4 // printf format for entries. -#if defined AL_WE_64BIT -#define ENTRY_FMT "#%u(0x%llx)" -#elif defined AL_WE_32BIT -#define ENTRY_FMT "#%u(0x%lx)" -#endif +#ifdef AL_DEBUG +#define ENTRY_FMT "#%u(%p)" #define ENTRY_ARG(entry) \ ((entry) && (entry) != (struct camu_sink_entry *)0xb00b) ? (entry)->id : 0, (entry) ? (entry) : 0x0 +#else +#define ENTRY_FMT "#%u" +#define ENTRY_ARG(entry) \ + ((entry) && (entry) != (struct camu_sink_entry *)0xb00b) ? (entry)->id : 0 +#endif #define AUDIO_STATE(entry) ((entry)->audio.state) #define VIDEO_STATE(entry) ((entry)->video.state) @@ -85,6 +87,7 @@ enum { #define AUDIO_ENDED_OR_EMPTY(entry) ((entry)->audio.state == BUFFER_ENDED || BUFFER_EMPTY(&(entry)->audio)) #define VIDEO_ENDED_OR_EMPTY(entry) ((entry)->video.state == BUFFER_ENDED || BUFFER_EMPTY(&(entry)->video)) +#define VIDEO_STREAM(entry) (entry)->video.buf.stream #define VIDEO_IS_SINGLE_FRAME(entry) (entry)->video.buf.single_frame #if defined CAMU_SCREEN_THREADED && defined CAMU_MIXER_THREADED @@ -1079,11 +1082,15 @@ static void client_callback(void *userdata, u8 op, struct camu_codec_stream *str // Remove again for another add in BUFFER_BUFFERED. remove_entry_audio_buffer(entry); } - // Slight optimization. A duplicate frame will still be sent but discarded in the video buffer. bool skip_video = rec->reconnect && VIDEO_IS_SINGLE_FRAME(entry); - if (!skip_video && !VIDEO_ENDED_OR_EMPTY(entry)) { - remove_entry_video_buffer(entry); - remove_entry_video_buffer(entry); + if (!VIDEO_ENDED_OR_EMPTY(entry)) { // Single frames will never be ENDED. + if (!skip_video) { + remove_entry_video_buffer(entry); + remove_entry_video_buffer(entry); + } else { + // We are keeping the frame, so don't request a duplicate. + entry->client.mask &= ~(1 << VIDEO_STREAM(entry)->index); + } } // Resolve any queued REMOVE_BUFFER requests before blocking. // If MIXER_THREADED_START_STOP is not set, REMOVE_BUFFER happens from the sink's @@ -1238,7 +1245,7 @@ static void client_callback(void *userdata, u8 op, struct camu_codec_stream *str lia_client_free(&entry->client); camu_audio_buffer_free(&entry->audio.buf); camu_video_buffer_free(&entry->video.buf); - log_debug("Entry ("ENTRY_FMT") closed by %s.", ENTRY_ARG(entry), removed ? "force" : "cleanup"); + log_info("Entry ("ENTRY_FMT") closed by %s.", ENTRY_ARG(entry), removed ? "force" : "cleanup"); al_free(entry); break; -- cgit v1.2.3-101-g0448