Reject empty codec probe runs and preserve decoder cleanup

This commit is contained in:
evgeny committed 2026-10-29 13:34:25 +01:00
1 parent 9383a68f17
commit 6f5850b9ca
2 files changed
+12 -5

No files matched your search

@@ -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)
@@ -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<CallVideoCodec.Packet>, 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() }
}
}
}