Load frames for video preview from network

This commit is contained in:
Peter
2019-07-16 20:28:29 +01:00
parent 10b5ea4cb4
commit 0bf61a2794
34 changed files with 115 additions and 89 deletions

View File

@@ -12,6 +12,9 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa
let readCount = min(resourceSize - context.readingOffset, Int(bufferSize))
let requestRange: Range<Int> = context.readingOffset ..< (context.readingOffset + readCount)
context.currentNumberOfReads += 1
context.currentReadBytes += readCount
let semaphore = DispatchSemaphore(value: 0)
data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .partial)
let requiredDataIsNotLocallyAvailable = context.requiredDataIsNotLocallyAvailable
@@ -29,10 +32,15 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa
semaphore.signal()
}
})
var fetchDisposable: Disposable?
if context.videoStream != nil {
fetchDisposable = fetchedMediaResource(mediaBox: context.mediaBox, reference: context.fileReference.resourceReference(context.fileReference.media.resource), ranges: [(requestRange, .elevated)]).start()
}
semaphore.wait()
disposable.dispose()
cancelDisposable.dispose()
fetchDisposable?.dispose()
if let fetchedData = fetchedData {
fetchedData.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> Void in
@@ -91,6 +99,8 @@ private final class UniversalSoftwareVideoSourceImpl {
fileprivate var cancelRead: Signal<Bool, NoError>
fileprivate var requiredDataIsNotLocallyAvailable: (() -> Void)?
fileprivate var currentNumberOfReads: Int = 0
fileprivate var currentReadBytes: Int = 0
init?(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise<UniversalSoftwareVideoSourceState>, cancelInitialization: Signal<Bool, NoError>) {
guard let size = fileReference.media.size else {
@@ -229,10 +239,13 @@ private final class UniversalSoftwareVideoSourceImpl {
func readImage() -> (UIImage?, CGFloat, CGFloat, Bool) {
if let videoStream = self.videoStream {
for _ in 0 ..< 10 {
self.currentNumberOfReads = 0
self.currentReadBytes = 0
for i in 0 ..< 10 {
let (decodableFrame, loop) = self.readDecodableFrame()
if let decodableFrame = decodableFrame {
if let renderedFrame = videoStream.decoder.render(frame: decodableFrame) {
print("Frame rendered in \(self.currentNumberOfReads) reads, \(self.currentReadBytes) bytes, total frames read: \(i + 1)")
return (renderedFrame, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), loop)
}
}