From 32e648ea9e6d22c10b0f4bcb1fb9526487078ddf Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 21 Oct 2026 00:15:34 +0200 Subject: [PATCH] Release audio holds at video EOF and stop Android batches promptly --- .../app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt | 2 ++ tools/chatgui/src/streamplayer_window.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt index 27bbd487..a4db9b1f 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt @@ -274,6 +274,7 @@ class StreamPlayerEngine(private val group: Long, private val source: Long, priv val deviceLead = playback?.leadUs ?: 0 var consumed = 0 for (work in 0 until 32) { + if (!running) break video.step(position, System.nanoTime() / 1000) needsAudio = !audioInputEnded && (playback?.needsInput ?: true) val audioAhead = if (!audioInputEnded && (!audioEnabled || needsAudio) && records.audios == 0) deviceLead + 80000 else -1L @@ -340,6 +341,7 @@ class StreamPlayerEngine(private val group: Long, private val source: Long, priv else -> error("Unknown media event=$kind") } } + if (!running) break if (!ended && (!opened || waitingKey) && System.nanoTime() > deadline) error("Viewer open timeout") if (!playbackStarted && video.firstOutputPts != null) playbackStarted = true if (playbackStarted && playback != null && ready >= 0) { diff --git a/tools/chatgui/src/streamplayer_window.cpp b/tools/chatgui/src/streamplayer_window.cpp index e1e9d558..e87cd799 100644 --- a/tools/chatgui/src/streamplayer_window.cpp +++ b/tools/chatgui/src/streamplayer_window.cpp @@ -316,7 +316,7 @@ void StreamPlayerWindow::decode() { work.codec += codecUs; work.codecMax = std::max(work.codecMax, codecUs); if (result == AVERROR(EAGAIN)) return; if (result == AVERROR_EOF) { - std::lock_guard guard(p.lock); p.videoEnded = true; + std::lock_guard guard(p.lock); p.videoEnded = true; p.holdAudio = false; DEBUG_INFO(DEBUG_CATEGORY_VIDEO, "desktop decoder drained id=%llu decoded=%llu", (unsigned long long)p.id, (unsigned long long)decoded); return; }