From e9228cb9faed0533dcfb9d0c73751c4f9db27dd2 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 12 Jun 2023 17:56:59 +0400 Subject: [PATCH] Camera and editor improvements --- .../MediaEditor/Sources/MediaEditor.swift | 5 +-- .../Sources/MediaEditorRenderer.swift | 2 +- .../Sources/VideoTextureSource.swift | 32 +++---------------- .../Sources/MediaEditorScreen.swift | 24 +++++++------- 4 files changed, 20 insertions(+), 43 deletions(-) diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift index 2da4d50cd0..f8bfc0c06f 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift @@ -305,7 +305,7 @@ public final class MediaEditor { let playerItem = AVPlayerItem(asset: asset) let player = AVPlayer(playerItem: playerItem) - + player.automaticallyWaitsToMinimizeStalling = false if let transitionImage { let colors = mediaEditorGetGradientColors(from: transitionImage) subscriber.putNext((VideoTextureSource(player: player, renderTarget: renderTarget), nil, player, colors.0, colors.1)) @@ -348,6 +348,7 @@ public final class MediaEditor { if let asset { let playerItem = AVPlayerItem(asset: asset) let player = AVPlayer(playerItem: playerItem) + player.automaticallyWaitsToMinimizeStalling = false subscriber.putNext((VideoTextureSource(player: player, renderTarget: renderTarget), nil, player, colors.0, colors.1)) subscriber.putCompletion() } @@ -422,7 +423,7 @@ public final class MediaEditor { self.player?.play() } }) - self.player?.play() + player.playImmediately(atRate: 1.0) self.volumeFade = self.player?.fadeVolume(from: 0.0, to: 1.0, duration: 0.4) } } diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorRenderer.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorRenderer.swift index dbc34f57d1..75098f129c 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorRenderer.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorRenderer.swift @@ -221,7 +221,7 @@ final class MediaEditorRenderer: TextureConsumer { if let onNextRender = self.onNextRender { self.onNextRender = nil - Queue.mainQueue().after(0.1) { + Queue.mainQueue().after(0.016) { onNextRender() } } diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/VideoTextureSource.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/VideoTextureSource.swift index f87426ee1c..2d74d6ce48 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/VideoTextureSource.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/VideoTextureSource.swift @@ -29,10 +29,7 @@ final class VideoTextureSource: NSObject, TextureSource, AVPlayerItemOutputPullD private weak var player: AVPlayer? private weak var playerItem: AVPlayerItem? private var playerItemOutput: AVPlayerItemVideoOutput? - - private var playerItemStatusObservation: NSKeyValueObservation? - private var playerItemObservation: NSKeyValueObservation? - + private var displayLink: CADisplayLink? private let device: MTLDevice? @@ -57,24 +54,12 @@ final class VideoTextureSource: NSObject, TextureSource, AVPlayerItemOutputPullD super.init() - self.playerItemObservation = player.observe(\.currentItem, options: [.initial, .new], changeHandler: { [weak self] (player, change) in - guard let strongSelf = self else { - return - } - strongSelf.updatePlayerItem(player.currentItem) - }) + self.updatePlayerItem(player.currentItem) } - - deinit { - self.playerItemObservation?.invalidate() - self.playerItemStatusObservation?.invalidate() - } - + func invalidate() { self.playerItemOutput?.setDelegate(nil, queue: nil) self.playerItemOutput = nil - self.playerItemObservation?.invalidate() - self.playerItemStatusObservation?.invalidate() self.displayLink?.invalidate() self.displayLink = nil } @@ -88,18 +73,9 @@ final class VideoTextureSource: NSObject, TextureSource, AVPlayerItemOutputPullD } } self.playerItemOutput = nil - self.playerItemStatusObservation?.invalidate() - self.playerItemStatusObservation = nil self.playerItem = playerItem - self.playerItemStatusObservation = self.playerItem?.observe(\.status, options: [.initial, .new], changeHandler: { [weak self] item, change in - guard let strongSelf = self else { - return - } - if strongSelf.playerItem == item, item.status == .readyToPlay { - strongSelf.handleReadyToPlay() - } - }) + self.handleReadyToPlay() } private func handleReadyToPlay() { diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index 3b1e0b40de..11535b7c4c 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -252,22 +252,22 @@ final class MediaEditorScreenComponent: Component { view.layer.animateScale(from: 0.1, to: 1.0, duration: 0.2) } - var delay: Double = 0.0 - for button in buttons { - if let view = button.view { - view.layer.animatePosition(from: CGPoint(x: 0.0, y: 64.0), to: .zero, duration: 0.3, delay: delay, timingFunction: kCAMediaTimingFunctionSpring, additive: true) - view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, delay: delay) - view.layer.animateScale(from: 0.1, to: 1.0, duration: 0.2, delay: delay) - delay += 0.05 - } - } - if let view = self.doneButton.view { view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) view.layer.animateScale(from: 0.1, to: 1.0, duration: 0.2) } if case .camera = source { + var delay: Double = 0.0 + for button in buttons { + if let view = button.view { + view.layer.animatePosition(from: CGPoint(x: 0.0, y: 64.0), to: .zero, duration: 0.3, delay: delay, timingFunction: kCAMediaTimingFunctionSpring, additive: true) + view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, delay: delay) + view.layer.animateScale(from: 0.1, to: 1.0, duration: 0.2, delay: delay) + delay += 0.05 + } + } + if let view = self.saveButton.view { view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) view.layer.animateScale(from: 0.1, to: 1.0, duration: 0.2) @@ -900,10 +900,10 @@ final class MediaEditorScreenComponent: Component { saveButtonView.layer.shadowOpacity = 0.35 self.addSubview(saveButtonView) } - + let saveButtonAlpha = component.isSavingAvailable ? 1.0 : 0.3 saveButtonView.isUserInteractionEnabled = component.isSavingAvailable - + transition.setPosition(view: saveButtonView, position: saveButtonFrame.center) transition.setBounds(view: saveButtonView, bounds: CGRect(origin: .zero, size: saveButtonFrame.size)) transition.setScale(view: saveButtonView, scale: displayTopButtons ? 1.0 : 0.01)