From 846e17728f2ed2af3672987ef61853f0bc96c224 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 28 Oct 2024 13:08:13 -0400 Subject: Refactor video buffer and scaler, better A/V sync Signed-off-by: Andrew Opalach --- src/libsink/sink.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/libsink') diff --git a/src/libsink/sink.c b/src/libsink/sink.c index ff9f4f2..da8f47f 100644 --- a/src/libsink/sink.c +++ b/src/libsink/sink.c @@ -472,13 +472,20 @@ static void evaluate_latency(struct camu_sink *sink, struct camu_sink_entry *ent #ifndef CAMU_SINK_NO_VIDEO // Entry has both audio and video configured. if (!BUFFER_EMPTY(&entry->audio) && !BUFFER_EMPTY(&entry->video)) { - camu_video_buffer_set_latency(&entry->video.buf, -camu_mixer_get_latency(sink->audio.mixer)); + f64 audio = camu_mixer_get_latency(sink->audio.mixer); + s32 frames = audio / entry->video.buf.avg_frame_duration; + frames -= sink->video.renderer->get_latency(sink->video.renderer); + camu_video_buffer_set_latency(&entry->video.buf, -frames); } #endif #else // To sync clients with differing audio latencies our only option is to factor the mixer - // latency into the audio buffer. - camu_audio_buffer_set_latency(&entry->audio.buf, camu_mixer_get_latency(sink->audio.mixer)); + // latency directly into the audio buffer. + f64 audio = camu_mixer_get_latency(sink->audio.mixer); + s32 frames = audio / entry->video.buf.avg_frame_duration; + frames += sink->video.renderer->get_latency(sink->video.renderer); + camu_video_buffer_set_latency(&entry->video.buf, frames); + camu_audio_buffer_set_latency(&entry->audio.buf, audio); #endif } @@ -823,6 +830,8 @@ static bool set_command_callback(void *userdata, struct aki_rpc_connection *conn entry->ended = ended; + if (entry == sink->current) goto out; + if (op == LIANA_SINK_BUFFER) { goto out; } else if (op == LIANA_SINK_BUFFER_AND_QUEUE) { -- cgit v1.2.3-101-g0448