Reject empty codec probe runs and preserve decoder cleanup
This commit is contained in:
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)
|
||||
|
||||
+5
-4
@@ -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() }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user