mirror of
https://github.com/TelegramMessenger/Telegram-iOS.git
synced 2026-07-06 03:33:41 +02:00
Various improvements
This commit is contained in:
parent
a05ef5e022
commit
22945ebb31
22 changed files with 662 additions and 363 deletions
|
|
@ -339,43 +339,34 @@ private final class CameraContext {
|
|||
self.mainDeviceContext?.output.processSampleBuffer = { [weak self] sampleBuffer, pixelBuffer, connection in
|
||||
guard let self, let mainDeviceContext = self.mainDeviceContext else {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
var front = false
|
||||
if #available(iOS 13.0, *) {
|
||||
front = connection.inputPorts.first?.sourceDevicePosition == .front
|
||||
}
|
||||
self.mainVideoOutput?.push(sampleBuffer, mirror: front)
|
||||
|
||||
let timestamp = CACurrentMediaTime()
|
||||
if timestamp > self.lastSnapshotTimestamp + 2.5, !mainDeviceContext.output.isRecording || !self.savedSnapshot {
|
||||
var front = false
|
||||
if #available(iOS 13.0, *) {
|
||||
front = connection.inputPorts.first?.sourceDevicePosition == .front
|
||||
}
|
||||
|
||||
if sampleBuffer.type == kCMMediaType_Video {
|
||||
Queue.mainQueue().async {
|
||||
self.mainVideoOutput?.push(sampleBuffer, mirror: front)
|
||||
}
|
||||
}
|
||||
|
||||
self.savePreviewSnapshot(pixelBuffer: pixelBuffer, front: front)
|
||||
self.lastSnapshotTimestamp = timestamp
|
||||
self.savedSnapshot = true
|
||||
}
|
||||
}
|
||||
self.mainDeviceContext?.output.processAudioBuffer = { [weak self] sampleBuffer in
|
||||
let _ = self
|
||||
}
|
||||
self.additionalDeviceContext?.output.processSampleBuffer = { [weak self] sampleBuffer, pixelBuffer, connection in
|
||||
guard let self, let additionalDeviceContext = self.additionalDeviceContext else {
|
||||
return
|
||||
}
|
||||
|
||||
var front = false
|
||||
if #available(iOS 13.0, *) {
|
||||
front = connection.inputPorts.first?.sourceDevicePosition == .front
|
||||
}
|
||||
self.additionalVideoOutput?.push(sampleBuffer, mirror: front)
|
||||
|
||||
let timestamp = CACurrentMediaTime()
|
||||
if timestamp > self.lastAdditionalSnapshotTimestamp + 2.5, !additionalDeviceContext.output.isRecording || !self.savedAdditionalSnapshot {
|
||||
var front = false
|
||||
if #available(iOS 13.0, *) {
|
||||
front = connection.inputPorts.first?.sourceDevicePosition == .front
|
||||
}
|
||||
|
||||
Queue.mainQueue().async {
|
||||
self.additionalVideoOutput?.push(sampleBuffer, mirror: front)
|
||||
}
|
||||
|
||||
self.savePreviewSnapshot(pixelBuffer: pixelBuffer, front: front)
|
||||
self.lastAdditionalSnapshotTimestamp = timestamp
|
||||
self.savedAdditionalSnapshot = true
|
||||
|
|
@ -402,10 +393,7 @@ private final class CameraContext {
|
|||
if #available(iOS 13.0, *) {
|
||||
front = connection.inputPorts.first?.sourceDevicePosition == .front
|
||||
}
|
||||
|
||||
Queue.mainQueue().async {
|
||||
self.mainVideoOutput?.push(sampleBuffer, mirror: front)
|
||||
}
|
||||
self.mainVideoOutput?.push(sampleBuffer, mirror: front)
|
||||
|
||||
let timestamp = CACurrentMediaTime()
|
||||
if timestamp > self.lastSnapshotTimestamp + 2.5, !mainDeviceContext.output.isRecording || !self.savedSnapshot {
|
||||
|
|
@ -414,10 +402,6 @@ private final class CameraContext {
|
|||
self.savedSnapshot = true
|
||||
}
|
||||
}
|
||||
self.mainDeviceContext?.output.processAudioBuffer = { [weak self] sampleBuffer in
|
||||
let _ = self
|
||||
}
|
||||
|
||||
// if self.initialConfiguration.reportAudioLevel {
|
||||
// self.mainDeviceContext?.output.processAudioBuffer = { [weak self] sampleBuffer in
|
||||
// guard let self else {
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ final class CameraOutput: NSObject {
|
|||
}
|
||||
|
||||
self.videoOutput.alwaysDiscardsLateVideoFrames = false
|
||||
self.videoOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey: use32BGRA ? kCVPixelFormatType_32BGRA : kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] as [String : Any]
|
||||
self.videoOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey: use32BGRA ? kCVPixelFormatType_32BGRA : kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] as [String : Any]
|
||||
}
|
||||
|
||||
deinit {
|
||||
|
|
@ -471,90 +471,91 @@ final class CameraOutput: NSObject {
|
|||
private var videoSwitchSampleTimeOffset: CMTime?
|
||||
|
||||
func processVideoRecording(_ sampleBuffer: CMSampleBuffer, fromAdditionalOutput: Bool) {
|
||||
guard let videoRecorder = self.videoRecorder, videoRecorder.isRecording else {
|
||||
return
|
||||
}
|
||||
guard let formatDescriptor = CMSampleBufferGetFormatDescription(sampleBuffer) else {
|
||||
return
|
||||
}
|
||||
let type = CMFormatDescriptionGetMediaType(formatDescriptor)
|
||||
|
||||
if let videoRecorder = self.videoRecorder, videoRecorder.isRecording {
|
||||
if case .roundVideo = self.currentMode, type == kCMMediaType_Video {
|
||||
let currentTimestamp = CACurrentMediaTime()
|
||||
let duration: Double = 0.2
|
||||
if !self.exclusive {
|
||||
var transitionFactor: CGFloat = 0.0
|
||||
if case .front = self.currentPosition {
|
||||
transitionFactor = 1.0
|
||||
if self.lastSwitchTimestamp > 0.0, currentTimestamp - self.lastSwitchTimestamp < duration {
|
||||
transitionFactor = max(0.0, (currentTimestamp - self.lastSwitchTimestamp) / duration)
|
||||
}
|
||||
} else {
|
||||
transitionFactor = 0.0
|
||||
if self.lastSwitchTimestamp > 0.0, currentTimestamp - self.lastSwitchTimestamp < duration {
|
||||
transitionFactor = 1.0 - max(0.0, (currentTimestamp - self.lastSwitchTimestamp) / duration)
|
||||
}
|
||||
}
|
||||
|
||||
if (transitionFactor == 1.0 && fromAdditionalOutput)
|
||||
|| (transitionFactor == 0.0 && !fromAdditionalOutput)
|
||||
|| (transitionFactor > 0.0 && transitionFactor < 1.0) {
|
||||
if let processedSampleBuffer = self.processRoundVideoSampleBuffer(sampleBuffer, additional: fromAdditionalOutput, transitionFactor: transitionFactor) {
|
||||
let presentationTime = CMSampleBufferGetPresentationTimeStamp(processedSampleBuffer)
|
||||
if let lastSampleTimestamp = self.lastSampleTimestamp, lastSampleTimestamp > presentationTime {
|
||||
|
||||
} else {
|
||||
videoRecorder.appendSampleBuffer(processedSampleBuffer)
|
||||
self.lastSampleTimestamp = presentationTime
|
||||
}
|
||||
}
|
||||
if case .roundVideo = self.currentMode, type == kCMMediaType_Video {
|
||||
let currentTimestamp = CACurrentMediaTime()
|
||||
let duration: Double = 0.2
|
||||
if !self.exclusive {
|
||||
var transitionFactor: CGFloat = 0.0
|
||||
if case .front = self.currentPosition {
|
||||
transitionFactor = 1.0
|
||||
if self.lastSwitchTimestamp > 0.0, currentTimestamp - self.lastSwitchTimestamp < duration {
|
||||
transitionFactor = max(0.0, (currentTimestamp - self.lastSwitchTimestamp) / duration)
|
||||
}
|
||||
} else {
|
||||
var additional = self.currentPosition == .front
|
||||
var transitionFactor = self.currentPosition == .front ? 1.0 : 0.0
|
||||
if self.lastSwitchTimestamp > 0.0 {
|
||||
if self.needsCrossfadeTransition {
|
||||
self.needsCrossfadeTransition = false
|
||||
self.crossfadeTransitionStart = currentTimestamp + 0.03
|
||||
self.needsSwitchSampleOffset = true
|
||||
}
|
||||
if self.crossfadeTransitionStart > 0.0, currentTimestamp - self.crossfadeTransitionStart < duration {
|
||||
if case .front = self.currentPosition {
|
||||
transitionFactor = max(0.0, (currentTimestamp - self.crossfadeTransitionStart) / duration)
|
||||
} else {
|
||||
transitionFactor = 1.0 - max(0.0, (currentTimestamp - self.crossfadeTransitionStart) / duration)
|
||||
}
|
||||
} else if currentTimestamp - self.lastSwitchTimestamp < 0.05 {
|
||||
additional = !additional
|
||||
transitionFactor = 1.0 - transitionFactor
|
||||
self.needsCrossfadeTransition = true
|
||||
}
|
||||
transitionFactor = 0.0
|
||||
if self.lastSwitchTimestamp > 0.0, currentTimestamp - self.lastSwitchTimestamp < duration {
|
||||
transitionFactor = 1.0 - max(0.0, (currentTimestamp - self.lastSwitchTimestamp) / duration)
|
||||
}
|
||||
if let processedSampleBuffer = self.processRoundVideoSampleBuffer(sampleBuffer, additional: additional, transitionFactor: transitionFactor) {
|
||||
videoRecorder.appendSampleBuffer(processedSampleBuffer)
|
||||
} else {
|
||||
videoRecorder.appendSampleBuffer(sampleBuffer)
|
||||
}
|
||||
|
||||
if (transitionFactor == 1.0 && fromAdditionalOutput)
|
||||
|| (transitionFactor == 0.0 && !fromAdditionalOutput)
|
||||
|| (transitionFactor > 0.0 && transitionFactor < 1.0) {
|
||||
if let processedSampleBuffer = self.processRoundVideoSampleBuffer(sampleBuffer, additional: fromAdditionalOutput, transitionFactor: transitionFactor) {
|
||||
let presentationTime = CMSampleBufferGetPresentationTimeStamp(processedSampleBuffer)
|
||||
if let lastSampleTimestamp = self.lastSampleTimestamp, lastSampleTimestamp > presentationTime {
|
||||
|
||||
} else {
|
||||
videoRecorder.appendSampleBuffer(processedSampleBuffer)
|
||||
self.lastSampleTimestamp = presentationTime
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if type == kCMMediaType_Audio {
|
||||
if self.needsSwitchSampleOffset {
|
||||
self.needsSwitchSampleOffset = false
|
||||
|
||||
if let lastAudioSampleTime = self.lastAudioSampleTime {
|
||||
let videoSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
|
||||
let offset = videoSampleTime - lastAudioSampleTime
|
||||
if let current = self.videoSwitchSampleTimeOffset {
|
||||
self.videoSwitchSampleTimeOffset = current + offset
|
||||
} else {
|
||||
self.videoSwitchSampleTimeOffset = offset
|
||||
}
|
||||
self.lastAudioSampleTime = nil
|
||||
}
|
||||
var additional = self.currentPosition == .front
|
||||
var transitionFactor = self.currentPosition == .front ? 1.0 : 0.0
|
||||
if self.lastSwitchTimestamp > 0.0 {
|
||||
if self.needsCrossfadeTransition {
|
||||
self.needsCrossfadeTransition = false
|
||||
self.crossfadeTransitionStart = currentTimestamp + 0.03
|
||||
self.needsSwitchSampleOffset = true
|
||||
}
|
||||
if self.crossfadeTransitionStart > 0.0, currentTimestamp - self.crossfadeTransitionStart < duration {
|
||||
if case .front = self.currentPosition {
|
||||
transitionFactor = max(0.0, (currentTimestamp - self.crossfadeTransitionStart) / duration)
|
||||
} else {
|
||||
transitionFactor = 1.0 - max(0.0, (currentTimestamp - self.crossfadeTransitionStart) / duration)
|
||||
}
|
||||
} else if currentTimestamp - self.lastSwitchTimestamp < 0.05 {
|
||||
additional = !additional
|
||||
transitionFactor = 1.0 - transitionFactor
|
||||
self.needsCrossfadeTransition = true
|
||||
}
|
||||
|
||||
self.lastAudioSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer) + CMSampleBufferGetDuration(sampleBuffer)
|
||||
}
|
||||
videoRecorder.appendSampleBuffer(sampleBuffer)
|
||||
if let processedSampleBuffer = self.processRoundVideoSampleBuffer(sampleBuffer, additional: additional, transitionFactor: transitionFactor) {
|
||||
videoRecorder.appendSampleBuffer(processedSampleBuffer)
|
||||
} else {
|
||||
videoRecorder.appendSampleBuffer(sampleBuffer)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if type == kCMMediaType_Audio {
|
||||
if self.needsSwitchSampleOffset {
|
||||
self.needsSwitchSampleOffset = false
|
||||
|
||||
if let lastAudioSampleTime = self.lastAudioSampleTime {
|
||||
let videoSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
|
||||
let offset = videoSampleTime - lastAudioSampleTime
|
||||
if let current = self.videoSwitchSampleTimeOffset {
|
||||
self.videoSwitchSampleTimeOffset = current + offset
|
||||
} else {
|
||||
self.videoSwitchSampleTimeOffset = offset
|
||||
}
|
||||
self.lastAudioSampleTime = nil
|
||||
}
|
||||
}
|
||||
|
||||
self.lastAudioSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer) + CMSampleBufferGetDuration(sampleBuffer)
|
||||
}
|
||||
videoRecorder.appendSampleBuffer(sampleBuffer)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue