fix: (Android) Give real video resolutions, unbind/rebind preview in onHostResume, add missing Android capture errors (#1079)
* Calculate a format's video dimensions based on supported resolutions and photo dimensions * Add Android fallback strategy for recording quality * Ensure that session props are not ignored when app is resumed * Simplify setting Android video dimensions in format * Modify Android imageAnalysisBuilder to use photoSize * Update onHostResume function to reference android preview issue * Add missing Android capture errors
This commit is contained in:
@@ -235,6 +235,8 @@ class CameraView(context: Context, private val frameProcessorThread: ExecutorSer
|
||||
override fun onHostResume() {
|
||||
hostLifecycleState = Lifecycle.State.RESUMED
|
||||
updateLifecycleState()
|
||||
// workaround for https://issuetracker.google.com/issues/147354615, preview must be bound on resume
|
||||
update(propsThatRequireSessionReconfiguration)
|
||||
}
|
||||
override fun onHostPause() {
|
||||
hostLifecycleState = Lifecycle.State.CREATED
|
||||
@@ -410,16 +412,21 @@ class CameraView(context: Context, private val frameProcessorThread: ExecutorSer
|
||||
// User has selected a custom format={}. Use that
|
||||
val format = DeviceFormat(format!!)
|
||||
Log.i(TAG, "Using custom format - photo: ${format.photoSize}, video: ${format.videoSize} @ $fps FPS")
|
||||
previewBuilder.setTargetResolution(format.videoSize)
|
||||
if (video == true) {
|
||||
previewBuilder.setTargetResolution(format.videoSize)
|
||||
} else {
|
||||
previewBuilder.setTargetResolution(format.photoSize)
|
||||
}
|
||||
imageCaptureBuilder.setTargetResolution(format.photoSize)
|
||||
imageAnalysisBuilder.setTargetResolution(format.videoSize)
|
||||
imageAnalysisBuilder.setTargetResolution(format.photoSize)
|
||||
|
||||
// TODO: Ability to select resolution exactly depending on format? Just like on iOS...
|
||||
when (min(format.videoSize.height, format.videoSize.width)) {
|
||||
in 0..480 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.SD))
|
||||
in 480..720 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.HD))
|
||||
in 720..1080 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.FHD))
|
||||
in 1080..2160 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.UHD))
|
||||
in 480..720 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.HD, FallbackStrategy.lowerQualityThan(Quality.HD)))
|
||||
in 720..1080 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.FHD, FallbackStrategy.lowerQualityThan(Quality.FHD)))
|
||||
in 1080..2160 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.UHD, FallbackStrategy.lowerQualityThan(Quality.UHD)))
|
||||
in 2160..4320 -> videoRecorderBuilder.setQualitySelector(QualitySelector.from(Quality.HIGHEST, FallbackStrategy.lowerQualityThan(Quality.HIGHEST)))
|
||||
}
|
||||
|
||||
fps?.let { fps ->
|
||||
|
||||
Reference in New Issue
Block a user