Swiftgram/TelegramUI/SampleBufferPool.swift
2017-04-18 19:53:47 +03:00

51 lines
1.3 KiB
Swift

import Foundation
import UIKit
import AVFoundation
import SwiftSignalKit
private final class SampleBufferLayerImpl: AVSampleBufferDisplayLayer {
override func action(forKey event: String) -> CAAction? {
return NSNull()
}
}
final class SampleBufferLayer {
let layer: AVSampleBufferDisplayLayer
private let enqueue: (AVSampleBufferDisplayLayer) -> Void
fileprivate init(layer: AVSampleBufferDisplayLayer, enqueue: @escaping (AVSampleBufferDisplayLayer) -> Void) {
self.layer = layer
self.enqueue = enqueue
}
deinit {
self.enqueue(self.layer)
}
}
private let pool = Atomic<[AVSampleBufferDisplayLayer]>(value: [])
func takeSampleBufferLayer() -> SampleBufferLayer {
var layer: AVSampleBufferDisplayLayer?
let _ = pool.modify { list in
var list = list
if !list.isEmpty {
layer = list.removeLast()
}
return list
}
if layer == nil {
layer = SampleBufferLayerImpl()
}
return SampleBufferLayer(layer: layer!, enqueue: { layer in
Queue.concurrentDefaultQueue().async {
layer.flushAndRemoveImage()
let _ = pool.modify { list in
var list = list
list.append(layer)
return list
}
}
})
}