Swiftgram/submodules/Camera/Sources/CameraPreviewNode.swift
2022-01-22 20:54:32 +03:00

70 lines
2.0 KiB
Swift

import Foundation
import AsyncDisplayKit
import Display
import AVFoundation
import SwiftSignalKit
private final class CameraPreviewNodeLayerNullAction: NSObject, CAAction {
@objc func run(forKey event: String, object anObject: Any, arguments dict: [AnyHashable : Any]?) {
}
}
private final class CameraPreviewNodeLayer: AVSampleBufferDisplayLayer {
override func action(forKey event: String) -> CAAction? {
return CameraPreviewNodeLayerNullAction()
}
}
public final class CameraPreviewNode: ASDisplayNode {
private var displayLayer: AVSampleBufferDisplayLayer
private let fadeNode: ASDisplayNode
private var fadedIn = false
public override init() {
self.displayLayer = AVSampleBufferDisplayLayer()
self.displayLayer.videoGravity = .resizeAspectFill
self.fadeNode = ASDisplayNode()
self.fadeNode.backgroundColor = .black
self.fadeNode.isUserInteractionEnabled = false
super.init()
self.clipsToBounds = true
self.layer.addSublayer(self.displayLayer)
self.addSubnode(self.fadeNode)
}
func prepare() {
DispatchQueue.main.async {
self.displayLayer.flushAndRemoveImage()
}
}
func enqueue(_ sampleBuffer: CMSampleBuffer) {
self.displayLayer.enqueue(sampleBuffer)
if !self.fadedIn {
self.fadedIn = true
Queue.mainQueue().after(0.2) {
self.fadeNode.alpha = 0.0
self.fadeNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3)
}
}
}
override public func layout() {
super.layout()
var transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2.0)
transform = transform.scaledBy(x: 1.0, y: 1.0)
self.displayLayer.setAffineTransform(transform)
self.displayLayer.frame = self.bounds
self.fadeNode.frame = self.bounds
}
}