Last active
October 1, 2019 15:34
-
-
Save owahltinez/a1a0a20fb601485933c6ff8d337875d5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SmartSize(width: Int, height: Int) { | |
var size = Size(width, height) | |
var long = max(size.width, size.height) | |
var short = min(size.width, size.height) | |
override fun toString() = "SmartSize(${long}x${short})" | |
} | |
val SIZE_1080P: SmartSize = SmartSize(1920, 1080) | |
fun getDisplaySmartSize(display: Display): SmartSize { | |
val outPoint = Point() | |
display.getRealSize(outPoint) | |
return SmartSize(outPoint.x, outPoint.y) | |
} | |
fun <T>getPreviewOutputSize( | |
display: Display, | |
characteristics: CameraCharacteristics, | |
targetClass: Class<T>, | |
format: Int? = null | |
): Size { | |
// Find which is smaller: screen or 1080p | |
val screenSize = getDisplaySmartSize(display) | |
val hdScreen = screenSize.long >= SIZE_1080P.long || screenSize.short >= SIZE_1080P.short | |
val maxSize = if (hdScreen) SIZE_1080P else screenSize | |
// If image format is provided, use it to determine supported sizes; else use target class | |
val config = characteristics.get( | |
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!! | |
if (format == null) | |
assert(StreamConfigurationMap.isOutputSupportedFor(targetClass)) | |
else | |
assert(config.isOutputSupportedFor(format)) | |
val allSizes = if (format == null) | |
config.getOutputSizes(targetClass) else config.getOutputSizes(format) | |
// Get available sizes and sort them by area from largest to smallest | |
val validSizes = allSizes | |
.sortedWith(compareBy { it.height * it.width }) | |
.map { SmartSize(it.width, it.height) }.reversed() | |
// Then, get the largest output size that is smaller or equal than our max size | |
return validSizes.first { it.long <= maxSize.long && it.short <= maxSize.short }.size | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment