From a4419b4c89cb6bfc5c04c489cd152a928eef42cb Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 20 Oct 2026 21:40:20 +0200 Subject: [PATCH] Validate Android surface timestamps in stream diagnostics --- .../com/utun/chat/data/StreamPlayerEngine.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) 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 78a1347d..08ce0ccb 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 @@ -144,12 +144,23 @@ class StreamPlayerEngine(private val group: Long, private val source: Long, priv var firstRendered = true val codecRevision = frame.revision try { - attempt.setOnFrameRenderedListener({ _, pts, renderedNs -> + attempt.setOnFrameRenderedListener({ codec, pts, renderedNs -> if (firstRendered) { firstRendered = false + val callbackUs = System.nanoTime() / 1000 + val renderedUs = renderedNs / 1000 + val renderClockValid = renderedUs in requestedAtUs..callbackUs + if (!renderClockValid) LogManager.addLog("WARN", "stream", + "viewer surface timestamp outside request interval id=$id PTS=$pts renderedNs=$renderedNs " + + "requestedUs=$requestedAtUs callbackUs=$callbackUs; using callback time") LogManager.addLog("INFO", "stream", "android first surface frame id=$id revision=$codecRevision " + - "PTS=$pts elapsedUs=${renderedNs / 1000 - requestedAtUs} " + - "callbackDelayUs=${System.nanoTime() / 1000 - renderedNs / 1000}") + "stage=surface_callback PTS=$pts elapsedUs=${callbackUs - requestedAtUs} " + + "renderElapsedUs=${if (renderClockValid) renderedUs - requestedAtUs else -1} " + + "callbackDelayUs=${if (renderClockValid) callbackUs - renderedUs else -1}") + try { codec.setOnFrameRenderedListener(null, null) } + catch (e: Exception) { + LogManager.addLog("WARN", "stream", "viewer surface diagnostics detach id=$id: ${e.message}") + } } }, main) } catch (e: Exception) {