feat: New Core/ library (#1975)
Moves everything Camera related into `core/` / `Core/` so that it is better encapsulated from React Native.
Benefits:
1. Code is much better organized. Should be easier for collaborators now, and cleaner codebase for me.
2. Locking is fully atomically as you can now only configure the session through a lock/Mutex which is batch-overridable
* On iOS, this makes Camera startup time **MUCH** faster, I measured speedups from **1.5 seconds** to only **240 milliseconds** since we only lock/commit once! 🚀
* On Android, this fixes a few out-of-sync/concurrency issues like "Capture Request contains unconfigured Input/Output Surface!" since it is now a single lock-operation! 💪
3. It is easier to integrate VisionCamera outside of React Native (e.g. Native iOS Apps, NativeScript, Flutter, etc)
With this PR, VisionCamera V3 is up to **7x** faster than V2
This commit is contained in:
@@ -7,34 +7,20 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
extension CameraView {
|
||||
var minAvailableZoom: CGFloat {
|
||||
return videoDeviceInput?.device.minAvailableVideoZoomFactor ?? 1
|
||||
}
|
||||
|
||||
var maxAvailableZoom: CGFloat {
|
||||
return videoDeviceInput?.device.activeFormat.videoMaxZoomFactor ?? 1
|
||||
}
|
||||
|
||||
@objc
|
||||
final func onPinch(_ gesture: UIPinchGestureRecognizer) {
|
||||
guard let device = videoDeviceInput?.device else {
|
||||
return
|
||||
}
|
||||
|
||||
let scale = max(min(gesture.scale * pinchScaleOffset, device.activeFormat.videoMaxZoomFactor), CGFloat(1.0))
|
||||
let scale = max(min(gesture.scale * pinchScaleOffset, cameraSession.maxZoom), CGFloat(1.0))
|
||||
if gesture.state == .ended {
|
||||
pinchScaleOffset = scale
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
try device.lockForConfiguration()
|
||||
device.videoZoomFactor = scale
|
||||
device.unlockForConfiguration()
|
||||
} catch {
|
||||
invokeOnError(.device(.configureError))
|
||||
// Update zoom on Camera
|
||||
cameraSession.configure { configuration in
|
||||
configuration.zoom = scale
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,24 +36,4 @@ extension CameraView {
|
||||
self.pinchGestureRecognizer = nil
|
||||
}
|
||||
}
|
||||
|
||||
@objc
|
||||
final func zoom(factor: CGFloat, animated: Bool) {
|
||||
guard let device = videoDeviceInput?.device else {
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
try device.lockForConfiguration()
|
||||
let clamped = max(min(factor, device.activeFormat.videoMaxZoomFactor), CGFloat(1.0))
|
||||
if animated {
|
||||
device.ramp(toVideoZoomFactor: clamped, withRate: 1)
|
||||
} else {
|
||||
device.videoZoomFactor = clamped
|
||||
}
|
||||
device.unlockForConfiguration()
|
||||
} catch {
|
||||
invokeOnError(.device(.configureError))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user