Try to select HDR profile
This commit is contained in:
parent
e1b04088c6
commit
4d77bc3ea9
@ -116,6 +116,7 @@ class CameraSession(private val context: Context,
|
|||||||
preview,
|
preview,
|
||||||
photo,
|
photo,
|
||||||
video,
|
video,
|
||||||
|
hdr == true,
|
||||||
this)
|
this)
|
||||||
if (this.cameraId == cameraId && this.outputs == outputs && isActive == isRunning) {
|
if (this.cameraId == cameraId && this.outputs == outputs && isActive == isRunning) {
|
||||||
Log.i(TAG, "Nothing changed in configuration, canceling..")
|
Log.i(TAG, "Nothing changed in configuration, canceling..")
|
||||||
@ -137,6 +138,18 @@ class CameraSession(private val context: Context,
|
|||||||
this.videoStabilizationMode = videoStabilizationMode
|
this.videoStabilizationMode = videoStabilizationMode
|
||||||
this.hdr = hdr
|
this.hdr = hdr
|
||||||
this.lowLightBoost = lowLightBoost
|
this.lowLightBoost = lowLightBoost
|
||||||
|
|
||||||
|
val currentOutputs = outputs
|
||||||
|
if (currentOutputs != null && currentOutputs.enableHdr != hdr) {
|
||||||
|
// Update existing HDR for Outputs
|
||||||
|
this.outputs = CameraOutputs(currentOutputs.cameraId,
|
||||||
|
cameraManager,
|
||||||
|
currentOutputs.preview,
|
||||||
|
currentOutputs.photo,
|
||||||
|
currentOutputs.video,
|
||||||
|
hdr,
|
||||||
|
this)
|
||||||
|
}
|
||||||
launch {
|
launch {
|
||||||
startRunning()
|
startRunning()
|
||||||
}
|
}
|
||||||
|
@ -75,6 +75,14 @@ suspend fun CameraDevice.createCaptureSession(cameraManager: CameraManager,
|
|||||||
outputs.videoOutput?.let { output ->
|
outputs.videoOutput?.let { output ->
|
||||||
outputConfigurations.add(output.toOutputConfiguration(characteristics))
|
outputConfigurations.add(output.toOutputConfiguration(characteristics))
|
||||||
}
|
}
|
||||||
|
if (outputs.enableHdr == true && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
val supportedProfiles = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES)
|
||||||
|
val hdrProfile = supportedProfiles?.bestProfile
|
||||||
|
if (hdrProfile != null) {
|
||||||
|
Log.i(TAG, "Camera $id: Using HDR Profile $hdrProfile...")
|
||||||
|
outputConfigurations.forEach { it.dynamicRangeProfile = hdrProfile }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
// API >=28
|
// API >=28
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.mrousavy.camera.extensions
|
||||||
|
|
||||||
|
import android.hardware.camera2.params.DynamicRangeProfiles
|
||||||
|
import android.os.Build
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
|
||||||
|
private fun Set<Long>.firstMatch(filter: Set<Long>): Long? {
|
||||||
|
filter.forEach { f ->
|
||||||
|
if (this.contains(f)) {
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
|
private val bestProfiles = setOf(
|
||||||
|
DynamicRangeProfiles.HDR10_PLUS,
|
||||||
|
DynamicRangeProfiles.HDR10,
|
||||||
|
DynamicRangeProfiles.HLG10
|
||||||
|
)
|
||||||
|
|
||||||
|
val DynamicRangeProfiles.bestProfile: Long?
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
|
get() {
|
||||||
|
return supportedProfiles.firstMatch(bestProfiles)
|
||||||
|
}
|
@ -21,6 +21,7 @@ class CameraOutputs(val cameraId: String,
|
|||||||
val preview: PreviewOutput? = null,
|
val preview: PreviewOutput? = null,
|
||||||
val photo: PhotoOutput? = null,
|
val photo: PhotoOutput? = null,
|
||||||
val video: VideoOutput? = null,
|
val video: VideoOutput? = null,
|
||||||
|
val enableHdr: Boolean? = false,
|
||||||
val callback: Callback): Closeable {
|
val callback: Callback): Closeable {
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "CameraOutputs"
|
private const val TAG = "CameraOutputs"
|
||||||
@ -34,8 +35,7 @@ class CameraOutputs(val cameraId: String,
|
|||||||
data class VideoOutput(val targetSize: Size? = null,
|
data class VideoOutput(val targetSize: Size? = null,
|
||||||
val enableRecording: Boolean = false,
|
val enableRecording: Boolean = false,
|
||||||
val enableFrameProcessor: Boolean? = false,
|
val enableFrameProcessor: Boolean? = false,
|
||||||
val format: Int = ImageFormat.PRIVATE,
|
val format: Int = ImageFormat.PRIVATE)
|
||||||
val hdrProfile: Long? = null /* DynamicRangeProfiles */)
|
|
||||||
|
|
||||||
interface Callback {
|
interface Callback {
|
||||||
fun onPhotoCaptured(image: Image)
|
fun onPhotoCaptured(image: Image)
|
||||||
@ -61,12 +61,13 @@ class CameraOutputs(val cameraId: String,
|
|||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (other !is CameraOutputs) return false
|
if (other !is CameraOutputs) return false
|
||||||
return this.cameraId == other.cameraId
|
return this.cameraId == other.cameraId
|
||||||
&& (this.preview == null) == (other.preview == null)
|
&& this.preview?.surface == other.preview?.surface
|
||||||
&& this.photo?.targetSize == other.photo?.targetSize
|
&& this.photo?.targetSize == other.photo?.targetSize
|
||||||
&& this.photo?.format == other.photo?.format
|
&& this.photo?.format == other.photo?.format
|
||||||
&& this.video?.enableRecording == other.video?.enableRecording
|
&& this.video?.enableRecording == other.video?.enableRecording
|
||||||
&& this.video?.targetSize == other.video?.targetSize
|
&& this.video?.targetSize == other.video?.targetSize
|
||||||
&& this.video?.format == other.video?.format
|
&& this.video?.format == other.video?.format
|
||||||
|
&& this.enableHdr == other.enableHdr
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
@ -132,7 +133,7 @@ class CameraOutputs(val cameraId: String,
|
|||||||
}
|
}
|
||||||
}, CameraQueues.videoQueue.handler)
|
}, CameraQueues.videoQueue.handler)
|
||||||
|
|
||||||
Log.i(TAG, "Adding ${size.width}x${size.height} video output. (Format: ${video.format} | HDR: ${video.hdrProfile})")
|
Log.i(TAG, "Adding ${size.width}x${size.height} video output. (Format: ${video.format})")
|
||||||
videoOutput = ImageReaderOutput(imageReader, SurfaceOutput.OutputType.VIDEO)
|
videoOutput = ImageReaderOutput(imageReader, SurfaceOutput.OutputType.VIDEO)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user