diff --git a/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoProbe.kt b/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoProbe.kt index dd44c8cd..18565051 100644 --- a/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoProbe.kt +++ b/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoProbe.kt @@ -7,7 +7,10 @@ import android.media.ImageReader import android.media.ImageWriter import android.os.Bundle -/** Явный запуск через adb am instrument вне живого звонка; без camera capture и сетевой передачи. */ +/** Явная instrumentation-проба вне живого звонка; без camera capture и сетевой передачи. + * codec=0/1/2 фильтрует encode/rotation проверки, rotations=1 проверяет YUV-углы всех режимов. + * remote=call-video-*.idr декодирует один KEY из filesDir. Без remote/rotations проверяются bitrate и KEY VGA-режимов. + * Результат finish=0 только после успешных проверок и cleanup; аппаратный запуск выполняется вручную. */ class CallVideoProbe : Instrumentation() { private var remote: String? = null private var selectedCodec = 0 @@ -60,6 +63,7 @@ class CallVideoProbe : Instrumentation() { finish(0, Bundle().apply { putString("rotations", "All YUV corners, PTS and four rotations verified; codecs=${codecs.keys}") }) return } + var exercised = 0 for ((codec, entry) in codecs) { if (selectedCodec != 0 && selectedCodec != codec) continue val mode = entry.modes.firstOrNull { it.size.width == 640 && it.size.height == 480 } ?: continue @@ -74,7 +78,9 @@ class CallVideoProbe : Instrumentation() { } java.io.File(targetContext.filesDir, "call-video-local-codec$codec.idr").writeBytes(checkNotNull(key)) } + exercised++ } + check(exercised > 0) { "No VGA encoder modes exercised for codec=$selectedCodec" } finish(0, Bundle().apply { putString("codecs", codecs.toString()); putString("decoders", decoders.toString()) }) } catch (e: Exception) { android.util.Log.e("CallVideoProbe", "probe failed", e) diff --git a/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoRotationProbe.kt b/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoRotationProbe.kt index 1c347413..300337f3 100644 --- a/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoRotationProbe.kt +++ b/tools/chatgui-android/app/src/debug/java/com/utun/chat/data/CallVideoRotationProbe.kt @@ -11,7 +11,9 @@ import android.util.Log import android.util.Size import kotlin.math.abs -/** Проверяет настоящие YUV входы, bitstream и декодированные углы; камера/звонок не нужны. */ +/** Ручная часть CallVideoProbe: каждый выбранный codec/mode проверяет 12 кадров и четыре поворота. + * Два encoder запуска покрывают 0/180 и 90/270°; decoder сверяет PTS, crop и YUV-углы с допуском 12. + * Ошибка передаётся instrumentation; исходный YUV и codecs закрываются при любом результате. */ internal object CallVideoRotationProbe { private val corners = arrayOf(intArrayOf(0, 1, 2, 3), intArrayOf(2, 0, 3, 1), intArrayOf(3, 2, 1, 0), intArrayOf(1, 3, 0, 2)) private val colors = arrayOf(intArrayOf(32, 80, 144, 208), intArrayOf(80, 100, 120, 140), intArrayOf(160, 180, 200, 220)) @@ -80,7 +82,7 @@ internal object CallVideoRotationProbe { private fun decode(format: CallVideoFormat, packets: List, name: String, quarter: Int) { val codec = MediaCodec.createByCodecName(name) - try { + VideoCodecResources(codec, name).use { val type = StreamVideoCodec.fromId(format.codec) val config = type.unpackKey(packets.first().bytes).first val media = CallVideoCodec.decoderFormat(format, codec, config).apply { @@ -126,7 +128,6 @@ internal object CallVideoRotationProbe { } } check(decoded == packets.size) { "Incomplete rotated decoder output $decoded/${packets.size}" } - codec.stop() - } finally { codec.release() } + } } }