Fix captured photo quality

This commit is contained in:
Ilya Laktyushin
2023-07-21 22:16:43 +02:00
parent c9c694d585
commit d3ee489694
4 changed files with 27 additions and 9 deletions

View File

@@ -69,6 +69,7 @@ final class CameraDevice {
var maxHeight: Int32 = 0
var hasSecondaryZoomLevels = false
var candidates: [AVCaptureDevice.Format] = []
var photoCandidates: [AVCaptureDevice.Format] = []
outer: for format in device.formats {
if format.mediaType != .video || format.value(forKey: "isPhotoFormat") as? Bool == true {
continue
@@ -94,8 +95,14 @@ final class CameraDevice {
if #available(iOS 16.0, *), !format.secondaryNativeResolutionZoomFactors.isEmpty {
hasSecondaryZoomLevels = true
candidates.append(format)
if format.isHighPhotoQualitySupported {
photoCandidates.append(format)
}
} else if !hasSecondaryZoomLevels {
candidates.append(format)
if #available(iOS 15.0, *), format.isHighPhotoQualitySupported {
photoCandidates.append(format)
}
}
}
}
@@ -103,14 +110,24 @@ final class CameraDevice {
if !candidates.isEmpty {
var bestFormat: AVCaptureDevice.Format?
outer: for format in candidates {
photoOuter: for format in photoCandidates {
for range in format.videoSupportedFrameRateRanges {
if range.maxFrameRate > maxFramerate {
continue outer
continue photoOuter
}
bestFormat = format
}
}
if bestFormat == nil {
outer: for format in candidates {
for range in format.videoSupportedFrameRateRanges {
if range.maxFrameRate > maxFramerate {
continue outer
}
bestFormat = format
}
}
}
if bestFormat == nil {
bestFormat = candidates.last
}