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:
		
							
								
								
									
										59
									
								
								package/ios/Core/PreviewView.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								package/ios/Core/PreviewView.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| // | ||||
| //  PreviewView.swift | ||||
| //  VisionCamera | ||||
| // | ||||
| //  Created by Marc Rousavy on 30.11.22. | ||||
| //  Copyright © 2022 mrousavy. All rights reserved. | ||||
| // | ||||
|  | ||||
| import AVFoundation | ||||
| import Foundation | ||||
| import UIKit | ||||
|  | ||||
| class PreviewView: UIView { | ||||
|   /** | ||||
|    Convenience wrapper to get layer as its statically known type. | ||||
|    */ | ||||
|   var videoPreviewLayer: AVCaptureVideoPreviewLayer { | ||||
|     // swiftlint:disable force_cast | ||||
|     return layer as! AVCaptureVideoPreviewLayer | ||||
|     // swiftlint:enable force_cast | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    Gets or sets the resize mode of the PreviewView. | ||||
|    */ | ||||
|   var resizeMode: ResizeMode = .cover { | ||||
|     didSet { | ||||
|       switch resizeMode { | ||||
|       case .cover: | ||||
|         videoPreviewLayer.videoGravity = .resizeAspectFill | ||||
|       case .contain: | ||||
|         videoPreviewLayer.videoGravity = .resizeAspect | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   override public class var layerClass: AnyClass { | ||||
|     return AVCaptureVideoPreviewLayer.self | ||||
|   } | ||||
|  | ||||
|   func layerRectConverted(fromMetadataOutputRect rect: CGRect) -> CGRect { | ||||
|     return videoPreviewLayer.layerRectConverted(fromMetadataOutputRect: rect) | ||||
|   } | ||||
|  | ||||
|   func captureDevicePointConverted(fromLayerPoint point: CGPoint) -> CGPoint { | ||||
|     return videoPreviewLayer.captureDevicePointConverted(fromLayerPoint: point) | ||||
|   } | ||||
|  | ||||
|   init(frame: CGRect, session: AVCaptureSession) { | ||||
|     super.init(frame: frame) | ||||
|     videoPreviewLayer.session = session | ||||
|     videoPreviewLayer.videoGravity = .resizeAspectFill | ||||
|   } | ||||
|  | ||||
|   @available(*, unavailable) | ||||
|   required init?(coder _: NSCoder) { | ||||
|     fatalError("init(coder:) is not implemented!") | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user