mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 14:45:21 +00:00
Various fixes
This commit is contained in:
@@ -866,7 +866,10 @@ public final class MediaEditor {
|
|||||||
time = .zero
|
time = .zero
|
||||||
}
|
}
|
||||||
let videoStart = self.values.videoTrimRange?.lowerBound ?? 0.0
|
let videoStart = self.values.videoTrimRange?.lowerBound ?? 0.0
|
||||||
let audioStart = self.values.audioTrackTrimRange?.lowerBound ?? 0.0
|
var audioStart = self.values.audioTrackTrimRange?.lowerBound ?? 0.0
|
||||||
|
if let offset = self.values.audioTrackOffset, offset < 0.0 {
|
||||||
|
audioStart -= offset
|
||||||
|
}
|
||||||
if audioStart - videoStart > 0.0 {
|
if audioStart - videoStart > 0.0 {
|
||||||
let delay = audioStart - time.seconds
|
let delay = audioStart - time.seconds
|
||||||
if delay > 0 {
|
if delay > 0 {
|
||||||
@@ -1121,21 +1124,7 @@ public final class MediaEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if apply {
|
if apply {
|
||||||
let offset = offset ?? 0.0
|
|
||||||
let lowerBound = self.values.audioTrackTrimRange?.lowerBound ?? 0.0
|
|
||||||
|
|
||||||
let audioTime: CMTime
|
|
||||||
if self.sourceIsVideo {
|
|
||||||
let time = self.player?.currentTime() ?? .zero
|
|
||||||
audioTime = self.audioTime(for: time)
|
|
||||||
} else {
|
|
||||||
audioTime = CMTime(seconds: offset + lowerBound, preferredTimescale: CMTimeScale(1000))
|
|
||||||
}
|
|
||||||
self.updateAudioPlaybackRange()
|
self.updateAudioPlaybackRange()
|
||||||
self.audioPlayer?.seek(to: audioTime, toleranceBefore: .zero, toleranceAfter: .zero)
|
|
||||||
if !self.sourceIsVideo {
|
|
||||||
self.audioPlayer?.play()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1351,15 +1351,21 @@ final class MediaEditorScreenComponent: Component {
|
|||||||
audioOffsetUpdated: { [weak mediaEditor] offset, done in
|
audioOffsetUpdated: { [weak mediaEditor] offset, done in
|
||||||
if let mediaEditor {
|
if let mediaEditor {
|
||||||
mediaEditor.setAudioTrackOffset(offset, apply: done)
|
mediaEditor.setAudioTrackOffset(offset, apply: done)
|
||||||
if done {
|
if isAudioOnly {
|
||||||
if !isAudioOnly {
|
let offset = (mediaEditor.values.audioTrackOffset ?? 0.0)
|
||||||
mediaEditor.play()
|
let start = (mediaEditor.values.audioTrackTrimRange?.lowerBound ?? 0.0)
|
||||||
|
if done {
|
||||||
|
mediaEditor.seek(offset + start, andPlay: true)
|
||||||
|
} else {
|
||||||
|
mediaEditor.seek(offset + start, andPlay: false)
|
||||||
|
mediaEditor.stop()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if isAudioOnly {
|
if done {
|
||||||
mediaEditor.seek(offset + (mediaEditor.values.audioTrackTrimRange?.lowerBound ?? 0.0), andPlay: false)
|
mediaEditor.play()
|
||||||
|
} else {
|
||||||
|
mediaEditor.stop()
|
||||||
}
|
}
|
||||||
mediaEditor.stop()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -191,6 +191,12 @@ final class VideoScrubberComponent: Component {
|
|||||||
|
|
||||||
override init(frame: CGRect) {
|
override init(frame: CGRect) {
|
||||||
self.audioScrollView = UIScrollView()
|
self.audioScrollView = UIScrollView()
|
||||||
|
if #available(iOSApplicationExtension 11.0, iOS 11.0, *) {
|
||||||
|
self.audioScrollView.contentInsetAdjustmentBehavior = .never
|
||||||
|
}
|
||||||
|
if #available(iOS 13.0, *) {
|
||||||
|
self.audioScrollView.automaticallyAdjustsScrollIndicatorInsets = false
|
||||||
|
}
|
||||||
self.audioScrollView.bounces = false
|
self.audioScrollView.bounces = false
|
||||||
self.audioScrollView.decelerationRate = .fast
|
self.audioScrollView.decelerationRate = .fast
|
||||||
self.audioScrollView.clipsToBounds = false
|
self.audioScrollView.clipsToBounds = false
|
||||||
@@ -553,7 +559,9 @@ final class VideoScrubberComponent: Component {
|
|||||||
}
|
}
|
||||||
if trimDuration > 0.0 {
|
if trimDuration > 0.0 {
|
||||||
let audioFraction = audioData.duration / trimDuration
|
let audioFraction = audioData.duration / trimDuration
|
||||||
audioTotalWidth = ceil(totalWidth * audioFraction)
|
if audioFraction < 1.0 - .ulpOfOne || audioFraction > 1.0 + .ulpOfOne {
|
||||||
|
audioTotalWidth = ceil(totalWidth * audioFraction)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.isAudioSelected = false
|
self.isAudioSelected = false
|
||||||
@@ -600,6 +608,9 @@ final class VideoScrubberComponent: Component {
|
|||||||
let contentSize = CGSize(width: audioTotalWidth, height: audioScrubberHeight)
|
let contentSize = CGSize(width: audioTotalWidth, height: audioScrubberHeight)
|
||||||
self.ignoreScrollUpdates = true
|
self.ignoreScrollUpdates = true
|
||||||
if self.audioScrollView.contentSize != contentSize {
|
if self.audioScrollView.contentSize != contentSize {
|
||||||
|
if !component.audioOnly {
|
||||||
|
self.audioScrollView.contentInset = UIEdgeInsets(top: 0.0, left: scrubberSize.width, bottom: 0.0, right: scrubberSize.width)
|
||||||
|
}
|
||||||
self.audioScrollView.contentSize = contentSize
|
self.audioScrollView.contentSize = contentSize
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -789,10 +800,24 @@ final class VideoScrubberComponent: Component {
|
|||||||
endPosition = end
|
endPosition = end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var trimViewOffset: CGFloat = 0.0
|
||||||
|
var trimViewVisualInsets: UIEdgeInsets = .zero
|
||||||
|
if self.isAudioSelected {
|
||||||
|
if self.audioScrollView.contentOffset.x < 0.0 {
|
||||||
|
trimViewOffset = -self.audioScrollView.contentOffset.x
|
||||||
|
trimViewVisualInsets.right = trimViewOffset
|
||||||
|
} else if self.audioScrollView.contentOffset.x > self.audioScrollView.contentSize.width - self.audioScrollView.frame.width {
|
||||||
|
let delta = self.audioScrollView.contentOffset.x - (self.audioScrollView.contentSize.width - self.audioScrollView.frame.width)
|
||||||
|
trimViewOffset = -delta
|
||||||
|
trimViewVisualInsets.left = delta
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.trimView.isHollow = self.isAudioSelected || component.audioOnly
|
self.trimView.isHollow = self.isAudioSelected || component.audioOnly
|
||||||
let (leftHandleFrame, rightHandleFrame) = self.trimView.update(
|
let (leftHandleFrame, rightHandleFrame) = self.trimView.update(
|
||||||
totalWidth: totalWidth,
|
totalWidth: totalWidth,
|
||||||
|
visualInsets: trimViewVisualInsets,
|
||||||
scrubberSize: scrubberSize,
|
scrubberSize: scrubberSize,
|
||||||
duration: trimDuration,
|
duration: trimDuration,
|
||||||
startPosition: startPosition,
|
startPosition: startPosition,
|
||||||
@@ -805,6 +830,7 @@ final class VideoScrubberComponent: Component {
|
|||||||
|
|
||||||
let (ghostLeftHandleFrame, ghostRightHandleFrame) = self.ghostTrimView.update(
|
let (ghostLeftHandleFrame, ghostRightHandleFrame) = self.ghostTrimView.update(
|
||||||
totalWidth: totalWidth,
|
totalWidth: totalWidth,
|
||||||
|
visualInsets: .zero,
|
||||||
scrubberSize: CGSize(width: scrubberSize.width, height: collapsedScrubberHeight),
|
scrubberSize: CGSize(width: scrubberSize.width, height: collapsedScrubberHeight),
|
||||||
duration: component.duration,
|
duration: component.duration,
|
||||||
startPosition: component.startPosition,
|
startPosition: component.startPosition,
|
||||||
@@ -852,7 +878,8 @@ final class VideoScrubberComponent: Component {
|
|||||||
self.updateCursorPosition()
|
self.updateCursorPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
videoTransition.setFrame(view: self.trimView, frame: bounds.offsetBy(dx: 0.0, dy: self.isAudioSelected ? 0.0 : originY))
|
let trimViewFrame = CGRect(origin: CGPoint(x: trimViewOffset, y: self.isAudioSelected ? 0.0 : originY), size: bounds.size)
|
||||||
|
videoTransition.setFrame(view: self.trimView, frame: trimViewFrame)
|
||||||
|
|
||||||
videoTransition.setFrame(view: self.ghostTrimView, frame: bounds.offsetBy(dx: 0.0, dy: originY))
|
videoTransition.setFrame(view: self.ghostTrimView, frame: bounds.offsetBy(dx: 0.0, dy: originY))
|
||||||
videoTransition.setAlpha(view: self.ghostTrimView, alpha: self.isAudioSelected ? 0.75 : 0.0)
|
videoTransition.setAlpha(view: self.ghostTrimView, alpha: self.isAudioSelected ? 0.75 : 0.0)
|
||||||
@@ -1124,6 +1151,7 @@ private class TrimView: UIView {
|
|||||||
|
|
||||||
func update(
|
func update(
|
||||||
totalWidth: CGFloat,
|
totalWidth: CGFloat,
|
||||||
|
visualInsets: UIEdgeInsets,
|
||||||
scrubberSize: CGSize,
|
scrubberSize: CGSize,
|
||||||
duration: Double,
|
duration: Double,
|
||||||
startPosition: Double,
|
startPosition: Double,
|
||||||
@@ -1144,13 +1172,15 @@ private class TrimView: UIView {
|
|||||||
let leftHandlePositionFraction = duration > 0.0 ? startPosition / duration : 0.0
|
let leftHandlePositionFraction = duration > 0.0 ? startPosition / duration : 0.0
|
||||||
let leftHandlePosition = floorToScreenPixels(handleWidth / 2.0 + totalWidth * leftHandlePositionFraction)
|
let leftHandlePosition = floorToScreenPixels(handleWidth / 2.0 + totalWidth * leftHandlePositionFraction)
|
||||||
|
|
||||||
let leftHandleFrame = CGRect(origin: CGPoint(x: leftHandlePosition - handleWidth / 2.0, y: 0.0), size: CGSize(width: handleWidth, height: scrubberSize.height))
|
var leftHandleFrame = CGRect(origin: CGPoint(x: leftHandlePosition - handleWidth / 2.0, y: 0.0), size: CGSize(width: handleWidth, height: scrubberSize.height))
|
||||||
|
leftHandleFrame.origin.x = max(leftHandleFrame.origin.x, visualInsets.left)
|
||||||
transition.setFrame(view: self.leftHandleView, frame: leftHandleFrame)
|
transition.setFrame(view: self.leftHandleView, frame: leftHandleFrame)
|
||||||
|
|
||||||
let rightHandlePositionFraction = duration > 0.0 ? endPosition / duration : 1.0
|
let rightHandlePositionFraction = duration > 0.0 ? endPosition / duration : 1.0
|
||||||
let rightHandlePosition = floorToScreenPixels(handleWidth / 2.0 + totalWidth * rightHandlePositionFraction)
|
let rightHandlePosition = floorToScreenPixels(handleWidth / 2.0 + totalWidth * rightHandlePositionFraction)
|
||||||
|
|
||||||
let rightHandleFrame = CGRect(origin: CGPoint(x: max(leftHandleFrame.maxX, rightHandlePosition - handleWidth / 2.0), y: 0.0), size: CGSize(width: handleWidth, height: scrubberSize.height))
|
var rightHandleFrame = CGRect(origin: CGPoint(x: max(leftHandleFrame.maxX, rightHandlePosition - handleWidth / 2.0), y: 0.0), size: CGSize(width: handleWidth, height: scrubberSize.height))
|
||||||
|
rightHandleFrame.origin.x = min(rightHandleFrame.origin.x, totalWidth - visualInsets.right)
|
||||||
transition.setFrame(view: self.rightHandleView, frame: rightHandleFrame)
|
transition.setFrame(view: self.rightHandleView, frame: rightHandleFrame)
|
||||||
|
|
||||||
let capsuleSize = CGSize(width: 2.0, height: 11.0)
|
let capsuleSize = CGSize(width: 2.0, height: 11.0)
|
||||||
|
|||||||
@@ -31,7 +31,18 @@ public func makeTelegramAccountAuxiliaryMethods(uploadInBackground: ((Postbox, M
|
|||||||
return fetchVideoLibraryMediaResource(postbox: postbox, resource: resource, alwaysUseModernPipeline: useModernPipeline)
|
return fetchVideoLibraryMediaResource(postbox: postbox, resource: resource, alwaysUseModernPipeline: useModernPipeline)
|
||||||
}
|
}
|
||||||
} else if let resource = resource as? LocalFileVideoMediaResource {
|
} else if let resource = resource as? LocalFileVideoMediaResource {
|
||||||
return fetchLocalFileVideoMediaResource(postbox: postbox, resource: resource)
|
return postbox.transaction { transaction -> Bool in
|
||||||
|
var useModernPipeline = true
|
||||||
|
let appConfig = currentAppConfiguration(transaction: transaction)
|
||||||
|
if let data = appConfig.data, let _ = data["ios_killswitch_disable_modern_video_pipeline"] {
|
||||||
|
useModernPipeline = false
|
||||||
|
}
|
||||||
|
return useModernPipeline
|
||||||
|
}
|
||||||
|
|> castError(MediaResourceDataFetchError.self)
|
||||||
|
|> mapToSignal { useModernPipeline -> Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> in
|
||||||
|
fetchLocalFileVideoMediaResource(postbox: postbox, resource: resource, alwaysUseModernPipeline: useModernPipeline)
|
||||||
|
}
|
||||||
} else if let resource = resource as? LocalFileGifMediaResource {
|
} else if let resource = resource as? LocalFileGifMediaResource {
|
||||||
return fetchLocalFileGifMediaResource(resource: resource)
|
return fetchLocalFileGifMediaResource(resource: resource)
|
||||||
} else if let photoLibraryResource = resource as? PhotoLibraryMediaResource {
|
} else if let photoLibraryResource = resource as? PhotoLibraryMediaResource {
|
||||||
|
|||||||
Reference in New Issue
Block a user