fix: Improve performance of zoom, fps, hdr and format selection

This commit is contained in:
Marc Rousavy 2023-08-23 15:50:34 +02:00
parent efe6556fc2
commit 4b009a0053

View File

@ -139,6 +139,7 @@ class CameraSession(private val context: Context,
this.hdr = hdr
this.lowLightBoost = lowLightBoost
var needsReconfiguration = false
val currentOutputs = outputs
if (currentOutputs != null && currentOutputs.enableHdr != hdr) {
// Update existing HDR for Outputs
@ -149,9 +150,11 @@ class CameraSession(private val context: Context,
currentOutputs.video,
hdr,
this)
needsReconfiguration = true
}
launch {
startRunning()
if (needsReconfiguration) startRunning()
else updateRepeatingRequest()
}
}
@ -274,7 +277,7 @@ class CameraSession(private val context: Context,
suspend fun setTorchMode(enableTorch: Boolean) {
if (this.enableTorch != enableTorch) {
this.enableTorch = enableTorch
startRunning()
updateRepeatingRequest()
}
}
@ -282,7 +285,7 @@ class CameraSession(private val context: Context,
if (this.zoom != zoom) {
this.zoom = zoom
launch {
startRunning()
updateRepeatingRequest()
}
}
}
@ -354,6 +357,8 @@ class CameraSession(private val context: Context,
// Cache session in memory
captureSession = session
lastOutputsHashCode = outputs.hashCode()
// New session initialized
onInitialized()
return session
}
@ -429,12 +434,7 @@ class CameraSession(private val context: Context,
try {
mutex.withLock {
val fps = fps
val videoStabilizationMode = videoStabilizationMode
val lowLightBoost = lowLightBoost
val hdr = hdr
val outputs = outputs
if (outputs == null || outputs.size == 0) {
Log.i(TAG, "CameraSession doesn't have any Outputs, canceling..")
destroy()
@ -452,25 +452,42 @@ class CameraSession(private val context: Context,
isRunning = false
}
// 4. Create repeating request (configures FPS, HDR, etc.)
val repeatingRequest = getPreviewCaptureRequest(session, outputs, fps, videoStabilizationMode, lowLightBoost, hdr)
// 5. Start repeating request
session.setRepeatingRequest(repeatingRequest, null, null)
Log.i(TAG, "Camera Session started!")
Log.i(TAG, "Camera Session initialized! Starting repeating request..")
isRunning = true
this.captureSession = session
this.outputs = outputs
this.cameraDevice = camera
onInitialized()
}
updateRepeatingRequest()
} catch (e: IllegalStateException) {
Log.e(TAG, "Failed to start Camera Session, this session is already closed.", e)
}
}
private suspend fun updateRepeatingRequest() {
mutex.withLock {
val session = captureSession
if (session == null) {
// Not yet ready. Start session first, then it will update repeating request.
startRunning()
return
}
val fps = fps
val videoStabilizationMode = videoStabilizationMode
val lowLightBoost = lowLightBoost
val hdr = hdr
val outputs = outputs
if (outputs == null || outputs.size == 0) {
Log.i(TAG, "CameraSession doesn't have any Outputs, canceling..")
return
}
val repeatingRequest = getPreviewCaptureRequest(session, outputs, fps, videoStabilizationMode, lowLightBoost, hdr)
session.setRepeatingRequest(repeatingRequest, null, null)
}
}
private suspend fun stopRunning() {
Log.i(TAG, "Stopping Camera Session...")
try {