2023-10-13 10:33:20 -06:00
|
|
|
//
|
|
|
|
// 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) {
|
|
|
|
// Set orientation for each connection
|
|
|
|
connections.forEach { connection in
|
2023-10-18 10:25:30 -06:00
|
|
|
#if swift(>=5.9)
|
|
|
|
if #available(iOS 17.0, *) {
|
|
|
|
// Camera Sensors are always in landscape rotation (90deg).
|
|
|
|
// We are setting the target rotation here, so we need to rotate by landscape once.
|
|
|
|
let cameraOrientation = orientation.rotateBy(orientation: .landscapeLeft)
|
|
|
|
let degrees = cameraOrientation.toDegrees()
|
2023-10-14 05:17:14 -06:00
|
|
|
|
2023-11-15 09:00:41 -07:00
|
|
|
// TODO: Don't rotate the video output because it adds overhead. Instead just use EXIF flags for the .mp4 file if recording.
|
|
|
|
// Does that work when we flip the camera?
|
2023-10-18 10:25:30 -06:00
|
|
|
if connection.isVideoRotationAngleSupported(degrees) {
|
|
|
|
connection.videoRotationAngle = degrees
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if connection.isVideoOrientationSupported {
|
|
|
|
connection.videoOrientation = orientation.toAVCaptureVideoOrientation()
|
|
|
|
}
|
2023-10-14 05:17:14 -06:00
|
|
|
}
|
2023-10-18 10:25:30 -06:00
|
|
|
#else
|
2023-10-14 05:17:14 -06:00
|
|
|
if connection.isVideoOrientationSupported {
|
|
|
|
connection.videoOrientation = orientation.toAVCaptureVideoOrientation()
|
|
|
|
}
|
2023-10-18 10:25:30 -06:00
|
|
|
#endif
|
2023-10-13 10:33:20 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|