Fix blurred first play

This commit is contained in:
Ali 2023-06-20 10:48:02 +03:00
parent 47bbfba78d
commit dbb6fe27b8
3 changed files with 38 additions and 19 deletions

View File

@ -477,7 +477,11 @@ private func chatMessageVideoDatas(postbox: Postbox, userLocation: MediaResource
let fetchedDisposable = fetchedMediaResource(mediaBox: postbox.mediaBox, userLocation: userLocation, userContentType: MediaResourceUserContentType(file: fileReference.media), reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() let fetchedDisposable = fetchedMediaResource(mediaBox: postbox.mediaBox, userLocation: userLocation, userContentType: MediaResourceUserContentType(file: fileReference.media), reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start()
let thumbnailDisposable = postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: synchronousLoad).start(next: { next in let thumbnailDisposable = postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: synchronousLoad).start(next: { next in
let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])
subscriber.putNext(data ?? decodedThumbnailData) if let data {
subscriber.putNext(data)
} else {
subscriber.putNext(decodedThumbnailData)
}
}, error: subscriber.putError, completed: subscriber.putCompletion) }, error: subscriber.putError, completed: subscriber.putCompletion)
return ActionDisposable { return ActionDisposable {

View File

@ -164,9 +164,13 @@ final class StoryItemContentComponent: Component {
loopVideo: true, loopVideo: true,
enableSound: true, enableSound: true,
beginWithAmbientSound: environment.sharedState.useAmbientMode, beginWithAmbientSound: environment.sharedState.useAmbientMode,
useLargeThumbnail: true,
autoFetchFullSizeThumbnail: true,
tempFilePath: nil, tempFilePath: nil,
captureProtected: false, captureProtected: false,
storeAfterDownload: nil hintDimensions: file.dimensions?.cgSize,
storeAfterDownload: nil,
displayImage: false
), ),
priority: .gallery priority: .gallery
) )

View File

@ -51,8 +51,9 @@ public final class NativeVideoContent: UniversalVideoContent {
let captureProtected: Bool let captureProtected: Bool
let hintDimensions: CGSize? let hintDimensions: CGSize?
let storeAfterDownload: (() -> Void)? let storeAfterDownload: (() -> Void)?
let displayImage: Bool
public init(id: NativeVideoContentId, userLocation: MediaResourceUserLocation, fileReference: FileMediaReference, imageReference: ImageMediaReference? = nil, streamVideo: MediaPlayerStreaming = .none, loopVideo: Bool = false, enableSound: Bool = true, beginWithAmbientSound: Bool = false, baseRate: Double = 1.0, fetchAutomatically: Bool = true, onlyFullSizeThumbnail: Bool = false, useLargeThumbnail: Bool = false, autoFetchFullSizeThumbnail: Bool = false, startTimestamp: Double? = nil, endTimestamp: Double? = nil, continuePlayingWithoutSoundOnLostAudioSession: Bool = false, placeholderColor: UIColor = .white, tempFilePath: String? = nil, isAudioVideoMessage: Bool = false, captureProtected: Bool = false, hintDimensions: CGSize? = nil, storeAfterDownload: (() -> Void)?) { public init(id: NativeVideoContentId, userLocation: MediaResourceUserLocation, fileReference: FileMediaReference, imageReference: ImageMediaReference? = nil, streamVideo: MediaPlayerStreaming = .none, loopVideo: Bool = false, enableSound: Bool = true, beginWithAmbientSound: Bool = false, baseRate: Double = 1.0, fetchAutomatically: Bool = true, onlyFullSizeThumbnail: Bool = false, useLargeThumbnail: Bool = false, autoFetchFullSizeThumbnail: Bool = false, startTimestamp: Double? = nil, endTimestamp: Double? = nil, continuePlayingWithoutSoundOnLostAudioSession: Bool = false, placeholderColor: UIColor = .white, tempFilePath: String? = nil, isAudioVideoMessage: Bool = false, captureProtected: Bool = false, hintDimensions: CGSize? = nil, storeAfterDownload: (() -> Void)?, displayImage: Bool = true) {
self.id = id self.id = id
self.nativeId = id self.nativeId = id
self.userLocation = userLocation self.userLocation = userLocation
@ -90,10 +91,11 @@ public final class NativeVideoContent: UniversalVideoContent {
self.isAudioVideoMessage = isAudioVideoMessage self.isAudioVideoMessage = isAudioVideoMessage
self.hintDimensions = hintDimensions self.hintDimensions = hintDimensions
self.storeAfterDownload = storeAfterDownload self.storeAfterDownload = storeAfterDownload
self.displayImage = displayImage
} }
public func makeContentNode(postbox: Postbox, audioSession: ManagedAudioSession) -> UniversalVideoContentNode & ASDisplayNode { public func makeContentNode(postbox: Postbox, audioSession: ManagedAudioSession) -> UniversalVideoContentNode & ASDisplayNode {
return NativeVideoContentNode(postbox: postbox, audioSessionManager: audioSession, userLocation: self.userLocation, fileReference: self.fileReference, imageReference: self.imageReference, streamVideo: self.streamVideo, loopVideo: self.loopVideo, enableSound: self.enableSound, beginWithAmbientSound: self.beginWithAmbientSound, baseRate: self.baseRate, fetchAutomatically: self.fetchAutomatically, onlyFullSizeThumbnail: self.onlyFullSizeThumbnail, useLargeThumbnail: self.useLargeThumbnail, autoFetchFullSizeThumbnail: self.autoFetchFullSizeThumbnail, startTimestamp: self.startTimestamp, endTimestamp: self.endTimestamp, continuePlayingWithoutSoundOnLostAudioSession: self.continuePlayingWithoutSoundOnLostAudioSession, placeholderColor: self.placeholderColor, tempFilePath: self.tempFilePath, isAudioVideoMessage: self.isAudioVideoMessage, captureProtected: self.captureProtected, hintDimensions: self.hintDimensions, storeAfterDownload: self.storeAfterDownload) return NativeVideoContentNode(postbox: postbox, audioSessionManager: audioSession, userLocation: self.userLocation, fileReference: self.fileReference, imageReference: self.imageReference, streamVideo: self.streamVideo, loopVideo: self.loopVideo, enableSound: self.enableSound, beginWithAmbientSound: self.beginWithAmbientSound, baseRate: self.baseRate, fetchAutomatically: self.fetchAutomatically, onlyFullSizeThumbnail: self.onlyFullSizeThumbnail, useLargeThumbnail: self.useLargeThumbnail, autoFetchFullSizeThumbnail: self.autoFetchFullSizeThumbnail, startTimestamp: self.startTimestamp, endTimestamp: self.endTimestamp, continuePlayingWithoutSoundOnLostAudioSession: self.continuePlayingWithoutSoundOnLostAudioSession, placeholderColor: self.placeholderColor, tempFilePath: self.tempFilePath, isAudioVideoMessage: self.isAudioVideoMessage, captureProtected: self.captureProtected, hintDimensions: self.hintDimensions, storeAfterDownload: self.storeAfterDownload, displayImage: self.displayImage)
} }
public func isEqual(to other: UniversalVideoContent) -> Bool { public func isEqual(to other: UniversalVideoContent) -> Bool {
@ -121,6 +123,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
private let audioSessionManager: ManagedAudioSession private let audioSessionManager: ManagedAudioSession
private let isAudioVideoMessage: Bool private let isAudioVideoMessage: Bool
private let captureProtected: Bool private let captureProtected: Bool
private let displayImage: Bool
private let player: MediaPlayer private let player: MediaPlayer
private var thumbnailPlayer: MediaPlayer? private var thumbnailPlayer: MediaPlayer?
@ -170,7 +173,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
private var shouldPlay: Bool = false private var shouldPlay: Bool = false
init(postbox: Postbox, audioSessionManager: ManagedAudioSession, userLocation: MediaResourceUserLocation, fileReference: FileMediaReference, imageReference: ImageMediaReference?, streamVideo: MediaPlayerStreaming, loopVideo: Bool, enableSound: Bool, beginWithAmbientSound: Bool, baseRate: Double, fetchAutomatically: Bool, onlyFullSizeThumbnail: Bool, useLargeThumbnail: Bool, autoFetchFullSizeThumbnail: Bool, startTimestamp: Double?, endTimestamp: Double?, continuePlayingWithoutSoundOnLostAudioSession: Bool = false, placeholderColor: UIColor, tempFilePath: String?, isAudioVideoMessage: Bool, captureProtected: Bool, hintDimensions: CGSize?, storeAfterDownload: (() -> Void)? = nil) { init(postbox: Postbox, audioSessionManager: ManagedAudioSession, userLocation: MediaResourceUserLocation, fileReference: FileMediaReference, imageReference: ImageMediaReference?, streamVideo: MediaPlayerStreaming, loopVideo: Bool, enableSound: Bool, beginWithAmbientSound: Bool, baseRate: Double, fetchAutomatically: Bool, onlyFullSizeThumbnail: Bool, useLargeThumbnail: Bool, autoFetchFullSizeThumbnail: Bool, startTimestamp: Double?, endTimestamp: Double?, continuePlayingWithoutSoundOnLostAudioSession: Bool = false, placeholderColor: UIColor, tempFilePath: String?, isAudioVideoMessage: Bool, captureProtected: Bool, hintDimensions: CGSize?, storeAfterDownload: (() -> Void)? = nil, displayImage: Bool) {
self.postbox = postbox self.postbox = postbox
self.userLocation = userLocation self.userLocation = userLocation
self.fileReference = fileReference self.fileReference = fileReference
@ -182,6 +185,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
self.audioSessionManager = audioSessionManager self.audioSessionManager = audioSessionManager
self.isAudioVideoMessage = isAudioVideoMessage self.isAudioVideoMessage = isAudioVideoMessage
self.captureProtected = captureProtected self.captureProtected = captureProtected
self.displayImage = displayImage
self.imageNode = TransformImageNode() self.imageNode = TransformImageNode()
@ -216,22 +220,25 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
self?.performActionAtEnd() self?.performActionAtEnd()
} }
self.imageNode.setSignal(internalMediaGridMessageVideo(postbox: postbox, userLocation: userLocation, videoReference: fileReference, imageReference: imageReference, onlyFullSize: onlyFullSizeThumbnail, useLargeThumbnail: useLargeThumbnail, autoFetchFullSizeThumbnail: autoFetchFullSizeThumbnail || fileReference.media.isInstantVideo) |> map { [weak self] getSize, getData in if displayImage {
Queue.mainQueue().async { self.imageNode.setSignal(internalMediaGridMessageVideo(postbox: postbox, userLocation: userLocation, videoReference: fileReference, imageReference: imageReference, onlyFullSize: onlyFullSizeThumbnail, useLargeThumbnail: useLargeThumbnail, autoFetchFullSizeThumbnail: autoFetchFullSizeThumbnail || fileReference.media.isInstantVideo) |> map { [weak self] getSize, getData in
if let strongSelf = self, strongSelf.dimensions == nil { Queue.mainQueue().async {
if let dimensions = getSize() { if let strongSelf = self, strongSelf.dimensions == nil {
strongSelf.dimensions = dimensions if let dimensions = getSize() {
strongSelf.dimensionsPromise.set(dimensions) strongSelf.dimensions = dimensions
if let size = strongSelf.validLayout { strongSelf.dimensionsPromise.set(dimensions)
strongSelf.updateLayout(size: size, transition: .immediate) if let size = strongSelf.validLayout {
strongSelf.updateLayout(size: size, transition: .immediate)
}
} }
} }
} }
} return getData
return getData })
})
self.addSubnode(self.imageNode)
}
self.addSubnode(self.imageNode)
self.addSubnode(self.playerNode) self.addSubnode(self.playerNode)
self._status.set(combineLatest(self.dimensionsPromise.get(), self.player.status) self._status.set(combineLatest(self.dimensionsPromise.get(), self.player.status)
|> map { dimensions, status in |> map { dimensions, status in
@ -261,8 +268,12 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
self._bufferingStatus.set(.single(nil)) self._bufferingStatus.set(.single(nil))
} }
self.imageNode.imageUpdated = { [weak self] _ in if self.displayImage {
self?._ready.set(.single(Void())) self.imageNode.imageUpdated = { [weak self] _ in
self?._ready.set(.single(Void()))
}
} else {
self._ready.set(.single(Void()))
} }
if let startTimestamp = startTimestamp { if let startTimestamp = startTimestamp {