Warm Android video codecs in the background and accelerate probe tails

This commit is contained in:
evgeny committed 2026-10-20 01:22:52 +02:00
1 parent e3b74de7ef
commit 91478e2593
2 files changed
+18 -3

No files matched your search

@@ -13,6 +13,7 @@ import com.utun.chat.data.IncomingCallManager
import com.utun.chat.data.TelecomCallManager
import com.utun.chat.data.ChatEventCallback
import com.utun.chat.data.CallController
import com.utun.chat.data.CallVideoCodec
import com.utun.chat.data.AvatarRepository
import com.utun.chat.data.MemberFilesRepository
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -92,8 +93,19 @@ class ChatApplication : Application() {
TelecomCallManager.init()
CallController.init()
com.utun.chat.data.PhoneStateMonitor.init()
// Только тестовые codec кадры: разрешения камеры, Activity, Surface и сеть не нужны.
Thread({
val started = System.nanoTime()
LogManager.addLog("INFO", "call", "video codec background preparation begin; camera and network unused")
try {
val decoders = CallVideoCodec.probeDecoders()
val encoders = CallVideoCodec.probe()
LogManager.addLog("INFO", "call", "video codec background preparation complete " +
"elapsedMs=${(System.nanoTime() - started) / 1_000_000} decodeCodecs=${decoders.size} encodeCodecs=${encoders.size}")
} catch (e: Exception) {
LogManager.addLog("ERROR", "call", "video codec background preparation failed: ${e.message}")
}
}, "call-video-probe").start()
}
companion object {
@@ -392,7 +392,8 @@ internal class CallVideoCodec(requested: CallVideoFormat, bitrate: Int, val name
var sent = 0; var decoded = 0; var pipeline = 0
val info = MediaCodec.BufferInfo(); val started = System.nanoTime(); val deadline = started + 2_000_000_000
while (decoded < packets.size && System.nanoTime() < deadline && keepRunning()) {
if (sent < packets.size && (!paced || System.nanoTime() - started >= sent * 1_000_000_000L / f.fps)) {
// Измеряем pipeline с исходной частотой до первого выхода, затем проверяем весь хвост без пауз.
if (sent < packets.size && (!paced || decoded > 0 || System.nanoTime() - started >= sent * 1_000_000_000L / f.fps)) {
val i = decoder.dequeueInputBuffer(0)
if (i >= 0) {
val p = packets[sent++]; val data = if (p.key) type.unpackKey(p.bytes).second else p.bytes
@@ -410,6 +411,8 @@ internal class CallVideoCodec(requested: CallVideoFormat, bitrate: Int, val name
}
check(keepRunning()) { "Decoder probe cancelled" }
check(decoded == packets.size) { "Decoder did not return all probe frames $decoded/${packets.size}" }
if (paced) LogManager.addLog("DEBUG", "call", "video decoder probe name=$name inputs=$sent outputs=$decoded " +
"pipeline=$pipeline elapsedMs=${(System.nanoTime() - started) / 1_000_000}")
decoder.stop(); return pipeline
} finally { decoder.release() }
}