From a8ba80d56c2e3ddb5e27a8e7777b9ece0c642d06 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Wed, 10 Jul 2024 12:55:59 +0200 Subject: [PATCH] fix: Set minFPS to 20 to allow maximum resolution photo (#3063) --- .../mrousavy/camera/core/CameraConfiguration.kt | 10 ++++++++++ .../camera/core/CameraSession+Configuration.kt | 14 ++------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package/android/src/main/java/com/mrousavy/camera/core/CameraConfiguration.kt b/package/android/src/main/java/com/mrousavy/camera/core/CameraConfiguration.kt index 975f3feb2f..cd68c4a795 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/CameraConfiguration.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/CameraConfiguration.kt @@ -1,5 +1,6 @@ package com.mrousavy.camera.core +import android.util.Range import androidx.camera.core.Preview.SurfaceProvider import com.mrousavy.camera.core.types.CameraDeviceFormat import com.mrousavy.camera.core.types.CodeType @@ -8,6 +9,7 @@ import com.mrousavy.camera.core.types.PixelFormat import com.mrousavy.camera.core.types.QualityBalance import com.mrousavy.camera.core.types.Torch import com.mrousavy.camera.core.types.VideoStabilizationMode +import kotlin.math.min data class CameraConfiguration( // Input @@ -51,6 +53,14 @@ data class CameraConfiguration( data class Audio(val nothing: Unit) data class Preview(val surfaceProvider: SurfaceProvider) + val targetFpsRange: Range? + get() { + // due to a bug (or feature?) in CameraX, photo resolution will suffer if min FPS is higher than 20. + val maxFps = fps ?: return null + val minFps = min(20, maxFps) + return Range(minFps, maxFps) + } + val targetPreviewAspectRatio: Float? get() { val format = format ?: return null diff --git a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession+Configuration.kt b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession+Configuration.kt index 965db1cc8b..c0944a1073 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession+Configuration.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession+Configuration.kt @@ -2,7 +2,6 @@ package com.mrousavy.camera.core import android.annotation.SuppressLint import android.util.Log -import android.util.Range import androidx.annotation.OptIn import androidx.camera.core.CameraSelector import androidx.camera.core.CameraState @@ -25,16 +24,7 @@ import com.mrousavy.camera.core.types.Torch import com.mrousavy.camera.core.types.VideoStabilizationMode import kotlin.math.roundToInt -internal fun getTargetFpsRange(configuration: CameraConfiguration): Range? { - val fps = configuration.fps ?: return null - return if (configuration.enableLowLightBoost) { - Range(fps / 2, fps) - } else { - Range(fps, fps) - } -} - -internal fun assertFormatRequirement( +private fun assertFormatRequirement( propName: String, format: CameraDeviceFormat?, throwIfNotMet: CameraError, @@ -55,7 +45,7 @@ internal fun assertFormatRequirement( @Suppress("LiftReturnOrAssignment") internal fun CameraSession.configureOutputs(configuration: CameraConfiguration) { Log.i(CameraSession.TAG, "Creating new Outputs for Camera #${configuration.cameraId}...") - val fpsRange = getTargetFpsRange(configuration) + val fpsRange = configuration.targetFpsRange val format = configuration.format Log.i(CameraSession.TAG, "Using FPS Range: $fpsRange")