cf4882b152
* feat: Add support for LiDAR, TrueDepth, External (USB) and Continuity Camera Devices (iOS 17) * Rename `devices` -> `physicalDevices` * fix: Comment out iOS 17 cameras for now * fix: Move `supportsDepthCapture` to `format` * fix: Fall back to `wide-angle-camera` for any unknown types * Update CameraPage.tsx * `descriptor` -> `physicalDeviceDescriptor` * Update CameraDevice.ts * Format * feat: Expose `userPreferredCameraDevice` Uses the new iOS 17 API where the user can prefer a default device, otherwise fall back to the first device of the available ones * fix: Expose as property * Add TODO comments * fix: Format code * fix: Compile below Swift 5.9
62 lines
2.0 KiB
Swift
62 lines
2.0 KiB
Swift
//
|
|
// AVCaptureDevice.Format+toDictionary.swift
|
|
// mrousavy
|
|
//
|
|
// Created by Marc Rousavy on 15.01.21.
|
|
// Copyright © 2021 mrousavy. All rights reserved.
|
|
//
|
|
|
|
import AVFoundation
|
|
|
|
private func getAllVideoStabilizationModes() -> [AVCaptureVideoStabilizationMode] {
|
|
var modes: [AVCaptureVideoStabilizationMode] = [.auto, .cinematic, .off, .standard]
|
|
if #available(iOS 13, *) {
|
|
modes.append(.cinematicExtended)
|
|
}
|
|
return modes
|
|
}
|
|
|
|
extension AVCaptureDevice.Format {
|
|
var videoStabilizationModes: [AVCaptureVideoStabilizationMode] {
|
|
return getAllVideoStabilizationModes().filter { self.isVideoStabilizationModeSupported($0) }
|
|
}
|
|
|
|
var minFrameRate: Float64 {
|
|
let maxRange = videoSupportedFrameRateRanges.max { l, r in
|
|
return l.maxFrameRate < r.maxFrameRate
|
|
}
|
|
return maxRange?.maxFrameRate ?? 0
|
|
}
|
|
|
|
var maxFrameRate: Float64 {
|
|
let maxRange = videoSupportedFrameRateRanges.max { l, r in
|
|
return l.maxFrameRate < r.maxFrameRate
|
|
}
|
|
return maxRange?.maxFrameRate ?? 0
|
|
}
|
|
|
|
func toDictionary() -> [String: Any] {
|
|
let availablePixelFormats = AVCaptureVideoDataOutput().availableVideoPixelFormatTypes
|
|
let pixelFormats = availablePixelFormats.map { format in PixelFormat(mediaSubType: format) }
|
|
|
|
return [
|
|
"videoStabilizationModes": videoStabilizationModes.map(\.descriptor),
|
|
"autoFocusSystem": autoFocusSystem.descriptor,
|
|
"photoHeight": highResolutionStillImageDimensions.height,
|
|
"photoWidth": highResolutionStillImageDimensions.width,
|
|
"videoHeight": videoDimensions.height,
|
|
"videoWidth": videoDimensions.width,
|
|
"maxISO": maxISO,
|
|
"minISO": minISO,
|
|
"fieldOfView": videoFieldOfView,
|
|
"maxZoom": videoMaxZoomFactor,
|
|
"supportsVideoHDR": isVideoHDRSupported,
|
|
"supportsPhotoHDR": false,
|
|
"minFps": minFrameRate,
|
|
"maxFps": maxFrameRate,
|
|
"pixelFormats": pixelFormats.map(\.unionValue),
|
|
"supportsDepthCapture": !supportedDepthDataFormats.isEmpty,
|
|
]
|
|
}
|
|
}
|