Swiftgram/submodules/TelegramUI/Sources/TimeBasedVideoPreload.swift
Peter Iakovlev e9a4a9347a Revert "Rename directories [skip ci]"
This reverts commit 789438a27450dcbdee6065ebf096198ed3b90fec
2020-03-01 10:06:51 +00:00

42 lines
1.7 KiB
Swift

import Foundation
import UIKit
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import FFMpegBinding
import UniversalMediaPlayer
func preloadVideoResource(postbox: Postbox, resourceReference: MediaResourceReference, duration: Double) -> Signal<Never, NoError> {
return Signal { subscriber in
let queue = Queue()
let disposable = MetaDisposable()
queue.async {
let maximumFetchSize = 2 * 1024 * 1024 + 128 * 1024
//let maximumFetchSize = 128
let sourceImpl = FFMpegMediaFrameSource(queue: queue, postbox: postbox, resourceReference: resourceReference, tempFilePath: nil, streamable: true, video: true, preferSoftwareDecoding: false, fetchAutomatically: true, maximumFetchSize: maximumFetchSize)
let source = QueueLocalObject(queue: queue, generate: {
return sourceImpl
})
let signal = sourceImpl.seek(timestamp: 0.0)
|> deliverOn(queue)
|> mapToSignal { result -> Signal<Never, MediaFrameSourceSeekError> in
let result = result.syncWith({ $0 })
if let videoBuffer = result?.buffers.videoBuffer, let impl = source.syncWith({ $0 }) {
return impl.ensureHasFrames(until: min(duration, videoBuffer.duration.seconds))
|> ignoreValues
|> castError(MediaFrameSourceSeekError.self)
} else {
return .complete()
}
}
disposable.set(signal.start(error: { _ in
subscriber.putCompletion()
}, completed: {
subscriber.putCompletion()
}))
}
return disposable
}
}