Document camera preset restoration, orientation and manual bitrate bounds

This commit is contained in:
evgeny committed 2026-10-29 13:34:24 +01:00
1 parent 97f1eaa048
commit 8e4d28c1fc
3 files changed
+16 -5

No files matched your search

@@ -1,6 +1,8 @@
package com.utun.chat.data
/** Независимый выбор фото: пустая камера означает обычную заднюю, нулевые размеры — максимальное разрешение. */
/** Независимый выбор фото: camera ищется по ID, затем MAIN/первая; width/height=0 выбирают максимальную площадь.
* Размеры заданы парой 0/0 либо 1..16384, JPEG quality — один из QUALITIES.
* resolve* возвращают null для пустого списка, неподдержанный размер заменяется максимальным. */
data class PhotoCaptureSettings(val camera: String = "", val width: Int = 0, val height: Int = 0, val jpegQuality: Int = 85,
val orientation: StreamOrientation = StreamOrientation.AUTO) {
init {
@@ -17,7 +19,9 @@ data class PhotoCaptureSettings(val camera: String = "", val width: Int = 0, val
companion object { val QUALITIES = listOf(50, 75, 85, 95, 100) }
}
/** Выбор записи видео хранится отдельно от фото, звонков и трансляций; height — метка 480p/720p/1080p. */
/** Отдельный preset записи: camera по ID, затем SELFIE/первая; height — метка 480p/720p/1080p.
* codec=1 AVC/2 HEVC, bitrate в бит/с из BITRATES; неверные значения отвергает конструктор.
* Пустой список камер даёт null; разрешения/capabilities проверяет владелец CameraX. */
data class VideoCaptureSettings(val camera: String = "", val height: Int = 720, val codec: Int = 1, val bitrate: Int = 2_000_000,
val orientation: StreamOrientation = StreamOrientation.AUTO) {
init { require(height in HEIGHTS); require(codec in 1..2); require(bitrate in BITRATES) }
@@ -1,6 +1,8 @@
package com.utun.chat.data
/** AUTO следует датчику положения, остальные углы задаются вручную относительно обычного положения устройства. */
/** AUTO следует датчику, остальные углы задаются относительно обычного положения устройства.
* deviceDegrees/sensor — четверти оборота 0/90/180/270; targetDegrees даёт ориентацию Surface,
* sensorRotation добавляет положение сенсора и направление front. На wire AUTO=-1 не передаётся. */
enum class StreamOrientation(val degrees: Int) {
// -1 хранится только в настройках; в видео передаётся вычисленный угол 0/90/180/270.
AUTO(-1), UPRIGHT(0), RIGHT(90), UPSIDE_DOWN(180), LEFT(270);
@@ -14,7 +16,9 @@ enum class StreamOrientation(val degrees: Int) {
}
}
/** Режим камеры и ориентация подтверждаются и восстанавливаются одним значением. */
/** Подтверждаемый режим камеры/ориентации: videoBitrate=null использует автоматически рассчитанный mode.bitrate.
* Битрейт в бит/с проверяется по аппаратному диапазону; withMode сохраняет ориентацию и ограничивает
* ручной выбор новым manualBitrateRange (до 12 Мбит/с), либо снимает ручной выбор при пустом диапазоне. */
data class StreamCaptureConfig(val mode: StreamCaptureMode, val orientation: StreamOrientation = StreamOrientation.AUTO,
val videoBitrate: Int? = null) {
val bitrate get() = videoBitrate ?: mode.bitrate
@@ -1,6 +1,9 @@
package com.utun.chat.data
/** Последний выбор пользователя; возможности encoder заново берём у устройства. */
/** Сохранённый выбор без аппаратных capabilities; resolve сопоставляет его с новым списком камер/modes.
* Камера по ID, затем MAIN/первая; codec сохраняется, если доступен; размер/FPS — точный либо меньшая FPS.
* Дальнейший fallback выбирает StreamCameraModes, неверная orientation становится AUTO, bitrate ограничивается.
* Пустой набор камеры/modes возвращает null с WARN; фактическое восстановление логируется, audio хранится отдельно. */
data class StreamCaptureSettings(val camera: String = "", val width: Int = 1280, val height: Int = 720, val fps: Int = 30,
val codec: Int = StreamVideoCodec.H264.id, val rotation: Int = StreamOrientation.AUTO.degrees,
val bitrate: Int? = null, val audio: Boolean = true) {