Skip to content

Commit

Permalink
Enable Preview Stabilization if devices support for JCA
Browse files Browse the repository at this point in the history
  • Loading branch information
kailianc committed Oct 16, 2023
1 parent 489e543 commit 29c9a12
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 10 deletions.
3 changes: 1 addition & 2 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion camera-viewfinder-compose/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ dependencies {
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")

// CameraX
val camerax_version = "1.3.0-SNAPSHOT"
val camerax_version = "1.4.0-SNAPSHOT"
implementation("androidx.camera:camera-core:${camerax_version}")
implementation("androidx.camera:camera-view:${camerax_version}")

Expand Down
2 changes: 1 addition & 1 deletion domain/camera/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ dependencies {
implementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")

// CameraX
val camerax_version = "1.3.0-SNAPSHOT"
val camerax_version = "1.4.0-SNAPSHOT"
implementation("androidx.camera:camera-core:${camerax_version}")
implementation("androidx.camera:camera-camera2:${camerax_version}")
implementation("androidx.camera:camera-lifecycle:${camerax_version}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@ package com.google.jetpackcamera.domain.camera

import android.app.Application
import android.content.ContentValues
import android.hardware.camera2.CameraCharacteristics
import android.provider.MediaStore
import android.util.Log
import android.view.Display
import androidx.annotation.OptIn
import androidx.camera.camera2.interop.Camera2CameraInfo
import androidx.camera.camera2.interop.ExperimentalCamera2Interop
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
import androidx.camera.core.CameraSelector.LensFacing
Expand All @@ -45,13 +49,13 @@ import com.google.jetpackcamera.settings.model.AspectRatio
import com.google.jetpackcamera.settings.model.CameraAppSettings
import com.google.jetpackcamera.settings.model.CaptureMode
import com.google.jetpackcamera.settings.model.FlashModeStatus
import java.util.Date
import javax.inject.Inject
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.coroutineScope
import java.util.Date
import javax.inject.Inject

private const val TAG = "CameraXCameraUseCase"

Expand All @@ -70,14 +74,14 @@ constructor(

// TODO apply flash from settings
private val imageCaptureUseCase = ImageCapture.Builder().build()
private val previewUseCase: Preview = Preview.Builder().build()

private val recorder = Recorder.Builder().setExecutor(
defaultDispatcher.asExecutor()
).build()
private val videoCaptureUseCase = VideoCapture.withOutput(recorder)
private var recording: Recording? = null

private lateinit var previewUseCase: Preview
private lateinit var useCaseGroup: UseCaseGroup

private lateinit var aspectRatio: AspectRatio
Expand All @@ -88,8 +92,9 @@ constructor(
this.aspectRatio = currentCameraSettings.aspectRatio
this.captureMode = currentCameraSettings.captureMode
setFlashMode(currentCameraSettings.flashMode)
updateUseCaseGroup()

cameraProvider = ProcessCameraProvider.getInstance(application).await()
updateUseCaseGroup()

val availableCameraLens =
listOf(
Expand Down Expand Up @@ -197,6 +202,7 @@ constructor(
// flips the camera to the designated lensFacing direction
override suspend fun flipCamera(isFrontFacing: Boolean) {
this.isFrontFacing = isFrontFacing
updateUseCaseGroup()
rebindUseCases()
}

Expand Down Expand Up @@ -252,6 +258,8 @@ constructor(
}

private fun updateUseCaseGroup() {
previewUseCase = createPreviewUseCase()

val useCaseGroupBuilder =
UseCaseGroup.Builder()
.setViewPort(
Expand All @@ -268,6 +276,35 @@ constructor(
useCaseGroup = useCaseGroupBuilder.build()
}

@OptIn(ExperimentalCamera2Interop::class)
private fun createPreviewUseCase() : Preview {
var isPreviewStabilizationSupported = false

// TODO: find a better way to access camera info of front/back camera before binding
// use cases
val availableCameraInfo = cameraProvider.availableCameraInfos
if (availableCameraInfo.isNotEmpty()) {
for (cameraInfo in availableCameraInfo) {
val lensFacing = Camera2CameraInfo.from(cameraInfo).getCameraCharacteristic(
CameraCharacteristics.LENS_FACING)
if ((isFrontFacing && CameraCharacteristics.LENS_FACING_FRONT == lensFacing)
|| (!isFrontFacing && CameraCharacteristics.LENS_FACING_BACK == lensFacing)) {
isPreviewStabilizationSupported =
Preview.getPreviewCapabilities(cameraInfo)
.isStabilizationSupported
}
}
}

val previewUseCaseBuilder = Preview.Builder()
// Enable preview stabilization if device capability supports
if (isPreviewStabilizationSupported) {
Log.d("JCA-CameraX", "PreviewStabilization enabled");
previewUseCaseBuilder.setPreviewStabilizationEnabled(true)
}
return previewUseCaseBuilder.build()
}

// converts LensFacing from datastore to @LensFacing Int value
private fun getLensFacing(isFrontFacing: Boolean): Int = when (isFrontFacing) {
true -> CameraSelector.LENS_FACING_FRONT
Expand All @@ -280,6 +317,7 @@ constructor(
getLensFacing(isFrontFacing)
)
cameraProvider.unbindAll()

cameraProvider.runWith(cameraSelector, useCaseGroup) {
camera = it
awaitCancellation()
Expand Down
2 changes: 1 addition & 1 deletion feature/preview/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.4.1")

// CameraX
val camerax_version = "1.3.0-SNAPSHOT"
val camerax_version = "1.4.0-SNAPSHOT"
implementation("androidx.camera:camera-core:${camerax_version}")
implementation("androidx.camera:camera-view:${camerax_version}")

Expand Down
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven {
setUrl("https://androidx.dev/snapshots/builds/10707469/artifacts/repository")
setUrl("https://androidx.dev/snapshots/builds/10955671/artifacts/repository")
}
google()
mavenCentral()
Expand Down

0 comments on commit 29c9a12

Please sign in to comment.