Verify production HEVC modes and cross-platform reception

This commit is contained in:
evgeny committed 2026-10-19 23:36:58 +02:00
1 parent 08c74894ef
commit 7be4b8884c
3 files changed
+45 -12

No files matched your search

@@ -43,7 +43,8 @@ internal class CallVideoCodec(requested: CallVideoFormat, bitrate: Int, val name
else MediaCodecInfo.CodecProfileLevel.AVCProfileConstrainedBaseline
}
else MediaCodecInfo.CodecProfileLevel.HEVCProfileMain)
setInteger(MediaFormat.KEY_LEVEL, platformLevel(format.codec, format.level, format.profile))
// Запрос Main tier одинаков в probe/live; Qualcomm может выдать High, фактический режим проверяет prepare().
setInteger(MediaFormat.KEY_LEVEL, platformLevel(format.codec, format.level))
setInteger(MediaFormat.KEY_BIT_RATE, bitrate); setInteger(MediaFormat.KEY_FRAME_RATE, format.fps)
setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1)
setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR)
@@ -192,14 +193,11 @@ internal class CallVideoCodec(requested: CallVideoFormat, bitrate: Int, val name
}
companion object {
fun platformLevel(codec: Int, level: Int, profile: Int = 1): Int = if (codec == 1) when (level) {
fun platformLevel(codec: Int, level: Int): Int = if (codec == 1) when (level) {
30 -> MediaCodecInfo.CodecProfileLevel.AVCLevel3
31 -> MediaCodecInfo.CodecProfileLevel.AVCLevel31
40 -> MediaCodecInfo.CodecProfileLevel.AVCLevel4
else -> error("Unsupported AVC level $level")
} else if (profile == 2) {
check(level == 120) { "Unsupported HEVC High tier level $level" }
MediaCodecInfo.CodecProfileLevel.HEVCHighTierLevel4
} else when (level) {
90 -> MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel3
93 -> MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel31
@@ -291,7 +289,7 @@ internal class CallVideoCodec(requested: CallVideoFormat, bitrate: Int, val name
if (caps.videoCapabilities?.areSizeAndRateSupported(size.width, size.height, 30.0) != true) continue
var profiles = 0; var pipeline = 0; var maximumLevel = 0
for (profile in listOf(1, 2)) {
try {
try {
val level = if (type.id == 1) { if (size.width > 1280) 40 else 31 }
else if (size.width > 1280 || profile == 2) 120 else 93
var profilePipeline = 0
@@ -306,9 +304,10 @@ internal class CallVideoCodec(requested: CallVideoFormat, bitrate: Int, val name
}
profiles = profiles or profile; maximumLevel = maxOf(maximumLevel, level)
pipeline = maxOf(pipeline, profilePipeline)
} catch (e: Exception) {
LogManager.addLog("WARN", "call", "video decoder profile probe rejected name=${entry.name} codec=${type.id} profile=$profile size=$size: ${e.message}")
}
} catch (e: Exception) {
LogManager.addLog("WARN", "call", "video decoder profile probe rejected name=${entry.name} " +
"codec=${type.id} profile=$profile size=$size: ${e.message}")
}
}
check(profiles != 0) { "No verified decoder profiles" }
modes += DecoderMode(size, entry.name, profiles, maximumLevel, pipeline)