summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastiano Barezzi <seba@sebaubuntu.dev>2023-02-09 12:50:46 +0100
committerLuK1337 <priv.luk@gmail.com>2023-02-15 12:36:05 +0100
commitdd63b4a02005df353884eff6ac2ac8fc87e60889 (patch)
tree271536958b981478778181f58b00eb5534021ba7
parent006c733c086dec759248871abc0582232c833ac3 (diff)
Aperture: Remove OIS handling
* AOSP documentation states the following regarding CONTROL_VIDEO_STABILIZATION_MODE: "If a camera device supports both this mode and OIS (android.lens.opticalStabilizationMode), turning both modes on may produce undesirable interaction, so it is recommended not to enable both at the same time." * Google enables both EIS and OIS anyway in their camera app, like many other OEMs * To overcome this, let the camera HAL handle OIS and keep only the EIS switch (also automatically use CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION when available) * While at it enable video stabilization by default Change-Id: I5e76a279e0bcf642a088d432a4698a315d1de1ab
-rw-r--r--app/src/main/java/org/lineageos/aperture/CameraActivity.kt19
-rw-r--r--app/src/main/java/org/lineageos/aperture/CaptureRequestOptionsBuilderExt.kt23
-rw-r--r--app/src/main/java/org/lineageos/aperture/SettingsActivity.kt60
-rw-r--r--app/src/main/java/org/lineageos/aperture/SharedPreferencesExt.kt30
-rw-r--r--app/src/main/java/org/lineageos/aperture/utils/Camera.kt16
-rw-r--r--app/src/main/java/org/lineageos/aperture/utils/StabilizationMode.kt26
-rw-r--r--app/src/main/java/org/lineageos/aperture/utils/VideoStabilizationMode.kt20
-rw-r--r--app/src/main/res/values/strings.xml10
-rw-r--r--app/src/main/res/xml/root_preferences.xml25
9 files changed, 48 insertions, 181 deletions
diff --git a/app/src/main/java/org/lineageos/aperture/CameraActivity.kt b/app/src/main/java/org/lineageos/aperture/CameraActivity.kt
index b8eab99..0a9b7a3 100644
--- a/app/src/main/java/org/lineageos/aperture/CameraActivity.kt
+++ b/app/src/main/java/org/lineageos/aperture/CameraActivity.kt
@@ -97,10 +97,10 @@ import org.lineageos.aperture.utils.MediaType
import org.lineageos.aperture.utils.PermissionsUtils
import org.lineageos.aperture.utils.Rotation
import org.lineageos.aperture.utils.ShortcutsUtils
-import org.lineageos.aperture.utils.StabilizationMode
import org.lineageos.aperture.utils.StorageUtils
import org.lineageos.aperture.utils.TimeUtils
import org.lineageos.aperture.utils.TimerMode
+import org.lineageos.aperture.utils.VideoStabilizationMode
import java.io.FileNotFoundException
import java.util.concurrent.ExecutorService
import kotlin.math.abs
@@ -1099,15 +1099,14 @@ open class CameraActivity : AppCompatActivity() {
null
}
)
- setStabilizationMode(
- (StabilizationMode::getClosestMode)(
- when (cameraMode) {
- CameraMode.PHOTO -> sharedPreferences.imageStabilizationMode
- CameraMode.VIDEO -> sharedPreferences.videoStabilizationMode
- CameraMode.QR -> StabilizationMode.OFF
- },
- camera, cameraMode
- )
+ setVideoStabilizationMode(
+ if (cameraMode == CameraMode.VIDEO &&
+ sharedPreferences.videoStabilization
+ ) {
+ VideoStabilizationMode.getMode(camera)
+ } else {
+ VideoStabilizationMode.OFF
+ }
)
}
.build()
diff --git a/app/src/main/java/org/lineageos/aperture/CaptureRequestOptionsBuilderExt.kt b/app/src/main/java/org/lineageos/aperture/CaptureRequestOptionsBuilderExt.kt
index 68faad5..ae2a568 100644
--- a/app/src/main/java/org/lineageos/aperture/CaptureRequestOptionsBuilderExt.kt
+++ b/app/src/main/java/org/lineageos/aperture/CaptureRequestOptionsBuilderExt.kt
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: 2022 The LineageOS Project
+ * SPDX-FileCopyrightText: 2022-2023 The LineageOS Project
* SPDX-License-Identifier: Apache-2.0
*/
@@ -10,7 +10,7 @@ import android.hardware.camera2.CaptureRequest
import android.os.Build
import androidx.camera.camera2.interop.CaptureRequestOptions
import org.lineageos.aperture.utils.Framerate
-import org.lineageos.aperture.utils.StabilizationMode
+import org.lineageos.aperture.utils.VideoStabilizationMode
@androidx.camera.camera2.interop.ExperimentalCamera2Interop
fun CaptureRequestOptions.Builder.setFramerate(framerate: Framerate?) {
@@ -24,27 +24,18 @@ fun CaptureRequestOptions.Builder.setFramerate(framerate: Framerate?) {
}
@androidx.camera.camera2.interop.ExperimentalCamera2Interop
-fun CaptureRequestOptions.Builder.setStabilizationMode(stabilizationMode: StabilizationMode) {
+fun CaptureRequestOptions.Builder.setVideoStabilizationMode(videoStabilizationMode: VideoStabilizationMode) {
setCaptureRequestOption(
CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
- when (stabilizationMode) {
- StabilizationMode.DIGITAL -> CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON
- StabilizationMode.HYBRID ->
+ when (videoStabilizationMode) {
+ VideoStabilizationMode.OFF -> CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_OFF
+ VideoStabilizationMode.ON -> CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON
+ VideoStabilizationMode.ON_PREVIEW ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION
} else {
CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON
}
- else -> CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_OFF
- }
- )
-
- setCaptureRequestOption(
- CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE,
- if (stabilizationMode == StabilizationMode.OPTICAL) {
- CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON
- } else {
- CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_OFF
}
)
}
diff --git a/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt b/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt
index 4631947..2ccdae8 100644
--- a/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt
+++ b/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: 2022 The LineageOS Project
+ * SPDX-FileCopyrightText: 2022-2023 The LineageOS Project
* SPDX-License-Identifier: Apache-2.0
*/
@@ -57,15 +57,6 @@ class SettingsActivity : AppCompatActivity() {
class SettingsFragment : PreferenceFragmentCompat() {
private val saveLocation by lazy { findPreference<SwitchPreference>("save_location") }
private val shutterSound by lazy { findPreference<SwitchPreference>("shutter_sound") }
- private val videoStabilization by lazy {
- findPreference<SwitchPreference>("video_stabilization")!!
- }
- private val videoStabilizationPreview by lazy {
- findPreference<SwitchPreference>("video_stabilization_preview")!!
- }
- private val videoStabilizationOis by lazy {
- findPreference<SwitchPreference>("video_stabilization_ois")!!
- }
private val permissionsUtils by lazy { PermissionsUtils(requireContext()) }
@@ -80,42 +71,6 @@ class SettingsActivity : AppCompatActivity() {
}
}
- private val videoStabilizationPreferenceChangeListener =
- Preference.OnPreferenceChangeListener { preference, newValue ->
- val videoStabilizationEnabled =
- if (preference == videoStabilization) {
- newValue as Boolean
- } else {
- videoStabilization.isChecked
- }
- val videoStabilizationPreviewEnabled =
- if (preference == videoStabilizationPreview) {
- newValue as Boolean
- } else {
- videoStabilizationPreview.isChecked
- }
- val videoStabilizationOisEnabled =
- if (preference == videoStabilizationOis) {
- newValue as Boolean
- } else {
- videoStabilizationOis.isChecked
- }
-
- val videoStabilizationPreviewCanBeEnabled =
- videoStabilizationEnabled && !videoStabilizationOisEnabled
- videoStabilizationPreview.isChecked =
- videoStabilizationPreview.isChecked && videoStabilizationPreviewCanBeEnabled
- videoStabilizationPreview.isEnabled = videoStabilizationPreviewCanBeEnabled
-
- val videoStabilizationOisCanBeEnabled =
- videoStabilizationEnabled && !videoStabilizationPreviewEnabled
- videoStabilizationOis.isChecked =
- videoStabilizationOis.isChecked && videoStabilizationOisCanBeEnabled
- videoStabilizationOis.isEnabled = videoStabilizationOisCanBeEnabled
-
- true
- }
-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -138,19 +93,6 @@ class SettingsActivity : AppCompatActivity() {
}
}
shutterSound?.isVisible = !CameraSoundsUtils.mustPlaySounds
-
- // Video stabilization
- videoStabilization.onPreferenceChangeListener =
- videoStabilizationPreferenceChangeListener
- videoStabilizationPreview.onPreferenceChangeListener =
- videoStabilizationPreferenceChangeListener
- videoStabilizationOis.onPreferenceChangeListener =
- videoStabilizationPreferenceChangeListener
-
- videoStabilizationPreview.isEnabled =
- videoStabilization.isChecked && !videoStabilizationOis.isChecked
- videoStabilizationOis.isEnabled =
- videoStabilization.isChecked && !videoStabilizationPreview.isChecked
}
}
}
diff --git a/app/src/main/java/org/lineageos/aperture/SharedPreferencesExt.kt b/app/src/main/java/org/lineageos/aperture/SharedPreferencesExt.kt
index accf276..37d2515 100644
--- a/app/src/main/java/org/lineageos/aperture/SharedPreferencesExt.kt
+++ b/app/src/main/java/org/lineageos/aperture/SharedPreferencesExt.kt
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: 2022 The LineageOS Project
+ * SPDX-FileCopyrightText: 2022-2023 The LineageOS Project
* SPDX-License-Identifier: Apache-2.0
*/
@@ -17,7 +17,6 @@ import org.lineageos.aperture.utils.CameraMode
import org.lineageos.aperture.utils.FlashMode
import org.lineageos.aperture.utils.Framerate
import org.lineageos.aperture.utils.GridMode
-import org.lineageos.aperture.utils.StabilizationMode
import org.lineageos.aperture.utils.TimerMode
// Helpers
@@ -328,29 +327,8 @@ internal var SharedPreferences.lastSavedUri: Uri?
putString(LAST_SAVED_URI_KEY, value.toString())
}
-// Image stabilization
-private const val IMAGE_STABILIZATION_KEY = "image_stabilization"
-internal val SharedPreferences.imageStabilizationMode: StabilizationMode
- get() = if (getBoolean(IMAGE_STABILIZATION_KEY, false)) {
- StabilizationMode.OPTICAL
- } else {
- StabilizationMode.OFF
- }
-
// Video stabilization
private const val VIDEO_STABILIZATION_KEY = "video_stabilization"
-private const val VIDEO_STABILIZATION_OIS_KEY = "video_stabilization_ois"
-private const val VIDEO_STABILIZATION_PREVIEW_KEY = "video_stabilization_preview"
-internal val SharedPreferences.videoStabilizationMode: StabilizationMode
- get() {
- val videoStabilization = getBoolean(VIDEO_STABILIZATION_KEY, false)
- val videoStabilizationOis = getBoolean(VIDEO_STABILIZATION_OIS_KEY, false)
- val videoStabilizationPreview = getBoolean(VIDEO_STABILIZATION_PREVIEW_KEY, false)
-
- return when {
- !videoStabilization -> StabilizationMode.OFF
- videoStabilizationPreview -> StabilizationMode.HYBRID
- videoStabilizationOis -> StabilizationMode.OPTICAL
- else -> StabilizationMode.DIGITAL
- }
- }
+private const val VIDEO_STABILIZATION_DEFAULT = true
+internal val SharedPreferences.videoStabilization: Boolean
+ get() = getBoolean(VIDEO_STABILIZATION_KEY, VIDEO_STABILIZATION_DEFAULT)
diff --git a/app/src/main/java/org/lineageos/aperture/utils/Camera.kt b/app/src/main/java/org/lineageos/aperture/utils/Camera.kt
index cf53b65..6b6af99 100644
--- a/app/src/main/java/org/lineageos/aperture/utils/Camera.kt
+++ b/app/src/main/java/org/lineageos/aperture/utils/Camera.kt
@@ -91,20 +91,17 @@ class Camera(cameraInfo: CameraInfo, cameraManager: CameraManager) {
val supportedExtensionModes = cameraManager.extensionsManager.getSupportedModes(cameraSelector)
- val supportedStabilizationModes = mutableListOf(StabilizationMode.OFF).apply {
+ val supportedVideoStabilizationModes = mutableListOf(VideoStabilizationMode.OFF).apply {
val availableVideoStabilizationModes = camera2CameraInfo.getCameraCharacteristic(
CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES
) ?: IntArray(0)
- val availableOpticalStabilization = camera2CameraInfo.getCameraCharacteristic(
- CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION
- ) ?: IntArray(0)
if (
availableVideoStabilizationModes.contains(
CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON
)
) {
- add(StabilizationMode.DIGITAL)
+ add(VideoStabilizationMode.ON)
}
if (
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
@@ -112,14 +109,7 @@ class Camera(cameraInfo: CameraInfo, cameraManager: CameraManager) {
CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION
)
) {
- add(StabilizationMode.HYBRID)
- }
- if (
- availableOpticalStabilization.contains(
- CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON
- )
- ) {
- add(StabilizationMode.OPTICAL)
+ add(VideoStabilizationMode.ON_PREVIEW)
}
}.toList()
diff --git a/app/src/main/java/org/lineageos/aperture/utils/StabilizationMode.kt b/app/src/main/java/org/lineageos/aperture/utils/StabilizationMode.kt
deleted file mode 100644
index 955af5b..0000000
--- a/app/src/main/java/org/lineageos/aperture/utils/StabilizationMode.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2022 The LineageOS Project
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package org.lineageos.aperture.utils
-
-enum class StabilizationMode {
- OFF,
- DIGITAL,
- OPTICAL,
- HYBRID;
-
- /**
- * Get the closest stabilization to the requested one.
- */
- fun getClosestMode(camera: Camera, cameraMode: CameraMode): StabilizationMode {
- return when {
- camera.supportedStabilizationModes.contains(this) -> this
- this == HYBRID && camera.supportedStabilizationModes.contains(DIGITAL) -> DIGITAL
- this == OPTICAL && cameraMode == CameraMode.VIDEO &&
- camera.supportedStabilizationModes.contains(DIGITAL) -> DIGITAL
- else -> OFF
- }
- }
-}
diff --git a/app/src/main/java/org/lineageos/aperture/utils/VideoStabilizationMode.kt b/app/src/main/java/org/lineageos/aperture/utils/VideoStabilizationMode.kt
new file mode 100644
index 0000000..eb495c3
--- /dev/null
+++ b/app/src/main/java/org/lineageos/aperture/utils/VideoStabilizationMode.kt
@@ -0,0 +1,20 @@
+/*
+ * SPDX-FileCopyrightText: 2023 The LineageOS Project
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package org.lineageos.aperture.utils
+
+enum class VideoStabilizationMode {
+ OFF,
+ ON,
+ ON_PREVIEW;
+
+ companion object {
+ fun getMode(camera: Camera) = when {
+ camera.supportedVideoStabilizationModes.contains(ON_PREVIEW) -> ON_PREVIEW
+ camera.supportedVideoStabilizationModes.contains(ON) -> ON
+ else -> OFF
+ }
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c8a75ed..52a2197 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -99,16 +99,10 @@
<string name="photo_capture_mode_maximize_quality">Maximize quality</string>
<string name="photo_capture_mode_minimize_latency">Minimize latency</string>
<string name="photo_capture_mode_zsl">Zero shutter lag (experimental)</string>
- <string name="image_stabilization_title">Enable image stabilization when available</string>
- <string name="image_stabilization_summary">If the hardware supports it, enable optical image stabilization</string>
<!-- Video Preferences -->
- <string name="video_stabilization_title">Enable video stabilization when available</string>
- <string name="video_stabilization_summary">When available, enable electronic image stabilization (EIS)</string>
- <string name="video_stabilization_ois_title">Use OIS instead of EIS when available</string>
- <string name="video_stabilization_ois_summary">If the hardware supports it, use optical image stabilization (OIS) instead of electronic image stabilization (EIS)</string>
- <string name="video_stabilization_preview_title">Enable stabilization on preview when available</string>
- <string name="video_stabilization_preview_summary">If available, apply image stabilization also to the preview and, if the hardware supports it, automatically enable optical image stabilization (OIS) together with electronic image stabilization (EIS) if the device deems that appropriate. Only some devices launched with Android 13 or newer supports this mode</string>
+ <string name="video_stabilization_title">Enable video stabilization</string>
+ <string name="video_stabilization_summary">When available, enable video stabilization to reduce camera vibrations during recording</string>
<!-- Shortcuts -->
<string name="shortcut_selfie">Take a selfie</string>
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index 96eb553..8edce91 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- SPDX-FileCopyrightText: 2022 The LineageOS Project
+ SPDX-FileCopyrightText: 2022-2023 The LineageOS Project
SPDX-License-Identifier: Apache-2.0
-->
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
@@ -52,13 +52,6 @@
app:title="@string/photo_capture_mode_title"
app:useSimpleSummaryProvider="true" />
- <SwitchPreference
- app:defaultValue="false"
- app:iconSpaceReserved="false"
- app:key="image_stabilization"
- app:summary="@string/image_stabilization_summary"
- app:title="@string/image_stabilization_title" />
-
</PreferenceCategory>
<PreferenceCategory
@@ -66,26 +59,12 @@
app:title="@string/video_header">
<SwitchPreference
- app:defaultValue="false"
+ app:defaultValue="true"
app:iconSpaceReserved="false"
app:key="video_stabilization"
app:summary="@string/video_stabilization_summary"
app:title="@string/video_stabilization_title" />
- <SwitchPreference
- app:defaultValue="false"
- app:iconSpaceReserved="false"
- app:key="video_stabilization_ois"
- app:summary="@string/video_stabilization_ois_summary"
- app:title="@string/video_stabilization_ois_title" />
-
- <SwitchPreference
- app:defaultValue="false"
- app:iconSpaceReserved="false"
- app:key="video_stabilization_preview"
- app:summary="@string/video_stabilization_preview_summary"
- app:title="@string/video_stabilization_preview_title" />
-
</PreferenceCategory>
</PreferenceScreen>