diff options
author | Sebastiano Barezzi <seba@sebaubuntu.dev> | 2023-02-09 12:50:46 +0100 |
---|---|---|
committer | LuK1337 <priv.luk@gmail.com> | 2023-02-15 12:36:05 +0100 |
commit | dd63b4a02005df353884eff6ac2ac8fc87e60889 (patch) | |
tree | 271536958b981478778181f58b00eb5534021ba7 | |
parent | 006c733c086dec759248871abc0582232c833ac3 (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
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> |