summaryrefslogtreecommitdiff
path: root/src/libsink
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-06-23 17:49:11 -0400
committerAndrew Opalach <andrew@akon.city> 2025-06-23 17:49:11 -0400
commite0fcbf0910b52a6e66eb733a2850ec58a53cf0e3 (patch)
treea24ff2b9313263666d121536064e01436b480571 /src/libsink
parente9475ce94ba69bd437d8cf0cf3f78062be928568 (diff)
downloadcamu-e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3.tar.gz
camu-e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3.tar.bz2
camu-e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3.zip
Improve FFmpeg hwaccel fallback, VR emulation
- Optimize sink seeking with single video frame. - Small cleanups. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/libsink')
-rw-r--r--src/libsink/desktop.c3
-rw-r--r--src/libsink/sink.c27
2 files changed, 19 insertions, 11 deletions
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;