// // 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": availablePixelFormats.contains(kCVPixelFormatType_420YpCbCr10BiPlanarFullRange), "supportsPhotoHDR": false, "minFps": minFrameRate, "maxFps": maxFrameRate, "pixelFormats": pixelFormats.map(\.unionValue), "supportsDepthCapture": !supportedDepthDataFormats.isEmpty, ] } }