Video Stickers Fixes

This commit is contained in:
Ilya Laktyushin 2022-01-28 15:19:21 +03:00
parent 363d4d7f3a
commit 6ebb6d5269
2 changed files with 22 additions and 3 deletions

View File

@ -33,6 +33,7 @@ swift_library(
"//submodules/MediaResources:MediaResources", "//submodules/MediaResources:MediaResources",
"//submodules/MediaPlayer:UniversalMediaPlayer", "//submodules/MediaPlayer:UniversalMediaPlayer",
"//submodules/ManagedFile:ManagedFile", "//submodules/ManagedFile:ManagedFile",
"//submodules/TelegramCore:TelegramCore",
], ],
visibility = [ visibility = [
"//visibility:public", "//visibility:public",

View File

@ -6,6 +6,7 @@ import UniversalMediaPlayer
import CoreMedia import CoreMedia
import ManagedFile import ManagedFile
import Accelerate import Accelerate
import TelegramCore
private let sharedStoreQueue = Queue.concurrentDefaultQueue() private let sharedStoreQueue = Queue.concurrentDefaultQueue()
@ -29,6 +30,9 @@ private final class VideoStickerFrameSourceCache {
public private(set) var frameCount: Int32 = 0 public private(set) var frameCount: Int32 = 0
private var isStoringFrames = Set<Int>() private var isStoringFrames = Set<Int>()
var storedFrames: Int {
return self.isStoringFrames.count
}
private var scratchBuffer: Data private var scratchBuffer: Data
private var decodeBuffer: Data private var decodeBuffer: Data
@ -114,6 +118,7 @@ private final class VideoStickerFrameSourceCache {
if self.file.read(&frameCount, 4) != 4 { if self.file.read(&frameCount, 4) != 4 {
return false return false
} }
if frameCount < 0 { if frameCount < 0 {
return false return false
} }
@ -325,9 +330,22 @@ final class VideoStickerDirectFrameSource: AnimatedStickerFrameSource {
} else if let source = self.source { } else if let source = self.source {
let frameAndLoop = source.readFrame(maxPts: nil) let frameAndLoop = source.readFrame(maxPts: nil)
if frameAndLoop.0 == nil { if frameAndLoop.0 == nil {
if frameAndLoop.3 && self.frameCount == 0 { if frameAndLoop.3 {
self.frameCount = frameIndex if self.frameCount == 0 {
self.cache?.storeFrameRateAndCount(frameRate: self.frameRate, frameCount: self.frameCount) if let cache = self.cache {
if cache.storedFrames == frameIndex {
self.frameCount = frameIndex
cache.storeFrameRateAndCount(frameRate: self.frameRate, frameCount: self.frameCount)
} else {
Logger.shared.log("VideoSticker", "Missed a frame? \(frameIndex) \(cache.storedFrames)")
}
} else {
self.frameCount = frameIndex
}
}
self.currentFrame = 0
} else {
Logger.shared.log("VideoSticker", "Skipped a frame?")
} }
return nil return nil
} }