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
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  AVCaptureOutput+mirror.swift
 | 
						|
//  mrousavy
 | 
						|
//
 | 
						|
//  Created by Marc Rousavy on 18.01.21.
 | 
						|
//  Copyright © 2021 mrousavy. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
import AVFoundation
 | 
						|
 | 
						|
extension AVCaptureOutput {
 | 
						|
  /**
 | 
						|
   Mirrors the video output if possible.
 | 
						|
   */
 | 
						|
  func mirror() {
 | 
						|
    connections.forEach { connection in
 | 
						|
      if connection.isVideoMirroringSupported {
 | 
						|
        connection.automaticallyAdjustsVideoMirroring = false
 | 
						|
        connection.isVideoMirrored = true
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   Sets the target orientation of the video output.
 | 
						|
   This does not always physically rotate image buffers.
 | 
						|
 | 
						|
   - For Preview, an orientation hint is used to rotate the layer/view itself.
 | 
						|
   - For Photos, an EXIF tag is used.
 | 
						|
   - For Videos, the buffers are physically rotated if available, since we use an AVCaptureVideoDataOutput instead of an AVCaptureMovieFileOutput.
 | 
						|
   */
 | 
						|
  func setOrientation(_ orientation: Orientation) {
 | 
						|
    // Camera Sensors are always in 90deg rotation.
 | 
						|
    // We are setting the target rotation here, so we need to rotate by 90deg once.
 | 
						|
    let cameraOrientation = orientation.rotateRight()
 | 
						|
 | 
						|
    // Set orientation for each connection
 | 
						|
    connections.forEach { connection in
 | 
						|
      // TODO: Use this once Xcode 15 is rolled out
 | 
						|
      // if #available(iOS 17.0, *) {
 | 
						|
      //   let degrees = cameraOrientation.toDegrees()
 | 
						|
      //   if connection.isVideoRotationAngleSupported(degrees) {
 | 
						|
      //     connection.videoRotationAngle = degrees
 | 
						|
      //   }
 | 
						|
      // } else {
 | 
						|
      if connection.isVideoOrientationSupported {
 | 
						|
        connection.videoOrientation = cameraOrientation.toAVCaptureVideoOrientation()
 | 
						|
      }
 | 
						|
      // }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |