|
|
|
|
@ -155,6 +155,8 @@ class CallVideoEngine(private val context: Context, private val id: Long) {
|
|
|
|
|
val desired = CallVideoFormat(++generation, wanted.width, wanted.height, rotation = rotation, codec = wanted.codec) |
|
|
|
|
val previous = encoder; val previousFormat = format; val previousSettings = active |
|
|
|
|
val previousName = previous?.name; val previousRate = previous?.bitrate |
|
|
|
|
val range = mutable.value.range |
|
|
|
|
val initialRate = (previousRate ?: 1_000_000).coerceIn(range.minimum * 1000, range.maximum * 1000) |
|
|
|
|
previous?.close(); encoder = null |
|
|
|
|
for (codec in if (wanted.codec == 0) listOf(2, 1) else listOf(wanted.codec)) { |
|
|
|
|
if (codec in excluded) continue |
|
|
|
|
@ -162,7 +164,7 @@ class CallVideoEngine(private val context: Context, private val id: Long) {
|
|
|
|
|
val selected = CallVideoNative.choose(caps, peer, desired.copy(codec = codec).array()) ?: continue |
|
|
|
|
var candidate: CallVideoCodec? = null |
|
|
|
|
try { |
|
|
|
|
candidate = CallVideoCodec(CallVideoFormat.from(selected), 1_000_000, implementation.name) |
|
|
|
|
candidate = CallVideoCodec(CallVideoFormat.from(selected), initialRate, implementation.name) |
|
|
|
|
candidate.prepare() |
|
|
|
|
val next = candidate.format |
|
|
|
|
check(CallVideoNative.supported(caps, peer, next.array())) { "Actual encoder format exceeds peer capabilities: $next" } |
|
|
|
|
@ -178,7 +180,8 @@ class CallVideoEngine(private val context: Context, private val id: Long) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (previousFormat != null && previousFormat.codec !in excluded && previousSettings != null && previousName != null && previousRate != null) { |
|
|
|
|
encoder = CallVideoCodec(previousFormat, previousRate, previousName).also { it.prepare(); check(it.format == previousFormat) } |
|
|
|
|
encoder = CallVideoCodec(previousFormat, previousRate, previousName) |
|
|
|
|
encoder!!.prepare(); check(encoder!!.format == previousFormat) |
|
|
|
|
wanted = previousSettings; needKey = true |
|
|
|
|
mutable.value = mutable.value.copy(settings = wanted) |
|
|
|
|
report("Selected mode unavailable; previous video restored") |
|
|
|
|
|