From 8e4d28c1fc1394125700940fb7f78bb4d185b72b Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 00:47:07 +0100 Subject: [PATCH] Document camera preset restoration, orientation and manual bitrate bounds --- .../main/java/com/utun/chat/data/CameraCaptureSettings.kt | 8 ++++++-- .../main/java/com/utun/chat/data/StreamCaptureConfig.kt | 8 ++++++-- .../main/java/com/utun/chat/data/StreamCaptureSettings.kt | 5 ++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CameraCaptureSettings.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CameraCaptureSettings.kt index 47984db8..770a1447 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CameraCaptureSettings.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CameraCaptureSettings.kt @@ -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) } diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureConfig.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureConfig.kt index 3089dff0..402d5a1d 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureConfig.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureConfig.kt @@ -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 diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureSettings.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureSettings.kt index f8281216..11501871 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureSettings.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamCaptureSettings.kt @@ -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) {