| 
					
				 | 
			
			
				@@ -53,19 +53,19 @@ import Foundation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import UIKit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import BFUIKit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public var runBenchmark = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public weak var delegate: MovieInputDelegate? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var yuvConversionShader: ShaderProgram? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var asset: AVAsset? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var videoComposition: AVVideoComposition? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var yuvConversionShader: ShaderProgram? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var asset: AVAsset? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var videoComposition: AVVideoComposition? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 使用原始速度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var playAtActualSpeed: Bool = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var playAtActualSpeed: Bool = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Time in the video where it should start. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var requestedStartTime: CMTime? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var requestedStartTime: CMTime? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Last sample time that played. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public private(set) var currentTime: CMTime = .zero 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -74,46 +74,46 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Can be used to check video encoding progress. Not called from main thread. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public var progress: ((Double) -> Void)? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var audioSettings: [String: Any]? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var audioSettings: [String: Any]? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var movieFramebuffer: Framebuffer? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var movieFramebuffer: Framebuffer? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public var framebufferUserInfo: [AnyHashable: Any]? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Atomic var assetReader: AVAssetReader? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var moveSticker: PQEditVisionTrackMaterialsModel? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var moveSticker: PQEditVisionTrackMaterialsModel? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var videoSize: CGSize = .zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var videoSize: CGSize = .zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 最后一帧图像数据 CMSampleBuffer 不会 deep copy 所以使用一个CVImageBuffer变量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var lastImageBuffer: CVImageBuffer? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var lastImageBuffer: CVImageBuffer? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Atomic var currentRenderImageBuffer: CVPixelBuffer? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var currentRenderImageBufferTimeStamp: CMTime = .zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var currentRenderSampleBuffer: CMSampleBuffer? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var currentRenderImageBufferTimeStamp: CMTime = .zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var currentRenderSampleBuffer: CMSampleBuffer? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 旋转角度值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var mImageOrientation: ImageOrientation = .portrait 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var mImageOrientation: ImageOrientation = .portrait 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var inputSize: GLSize = GLSize(width: 0, height: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var inputSize: GLSize = GLSize(width: 0, height: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var timebaseInfo = mach_timebase_info_data_t() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var timebaseInfo = mach_timebase_info_data_t() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var currentThread: Thread? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var currentThread: Thread? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /// Use serial queue to ensure that the picture is smooth 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //    var seekQueue: DispatchQueue! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 原视频素材的 FPS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var stickerFPS: Float = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var stickerFPS: Float = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 开始时间,创建 filter 显示的时候有 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var startTimeStamp: CMTime? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var startTimeStamp: CMTime? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 最后一次显示帧时间戳 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var targetTimeStamp: CMTime = .zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var targetTimeStamp: CMTime = .zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 当前帧 id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var framebufferIndex:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var framebufferIndex:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var imageVertexBuffer: GLuint = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public var imageVertexBuffer: GLuint = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     deinit { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         FilterLog(1, message: "movie filter release") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -189,7 +189,7 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //        let currTime = CMTimeGetSeconds(CMTime(value: framebuffer.timingStyle.timestamp!.value, timescale: framebuffer.timingStyle.timestamp!.timescale)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    open override func renderFrame() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public override func renderFrame() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let inputFramebuffer: Framebuffer = inputFramebuffers[0]! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         inputSize = inputFramebuffer.sizeForTargetOrientation(.portrait) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -242,7 +242,7 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 原视频角度类型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func moveAssetRotation() -> NXGPUImageRotationMode { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func moveAssetRotation() -> NXGPUImageRotationMode { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let Angle: Int = PQPHAssetVideoParaseUtil.videoRotationAngle(assert: asset!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //        FilterLog(2, message: "原视频素材Angle is \(Angle)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // see https://my.oschina.net/NycoWang/blog/904105 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -283,7 +283,7 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // MARK: Internal processing functions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func createReader() -> AVAssetReader? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func createReader() -> AVAssetReader? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         do { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let outputSettings: [String: AnyObject] = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 [kCVPixelBufferPixelFormatTypeKey as String: NSNumber(value: Int32(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange))] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -316,7 +316,7 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    open func startReading() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func startReading() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         FilterLog(2, message: "开始初始化") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         mach_timebase_info(&timebaseInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -343,14 +343,14 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 设置解码开始时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func resetRangeTime(startTime: CMTime = .zero) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func resetRangeTime(startTime: CMTime = .zero) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         FilterLog(2, message: "\(String(describing: moveSticker?.locationPath)) 取帧的时间 \(CMTimeGetSeconds(requestedStartTime ?? .zero))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         requestedStartTime = startTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         startReading() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 取出第一帧数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func readNextVideoFrame(showTimeStamp: CMTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func readNextVideoFrame(showTimeStamp: CMTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // XXXX 有时渲染视频取出来的画面时为黑屏,再渲染一次,数据是没有问题已经保存到沙盒进行验证,这个不是最好的方案! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if lastImageBuffer != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             renderPixelBuffler(movieFrame: lastImageBuffer!, withSampleTime: currentTime) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -450,7 +450,7 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /// - Parameters: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ///   - movieFrame:帧数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ///   - withSampleTime: 渲染时间戳,不是帧的 PTS 是渲染的时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func renderPixelBuffler(movieFrame: CVPixelBuffer, withSampleTime: CMTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func renderPixelBuffler(movieFrame: CVPixelBuffer, withSampleTime: CMTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // NV12 会返回 2,Y分量和UV 分量, 如果buffer 是BGRA 则返回0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         FilterLog(2, message: "CVPixelBufferGetPlaneCount is \(CVPixelBufferGetPlaneCount(movieFrame))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -570,7 +570,7 @@ open class PQMovieFilter: PQBaseFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         secondChrominanceFramebuffer?.unlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func nanosToAbs(_ nanos: UInt64) -> UInt64 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func nanosToAbs(_ nanos: UInt64) -> UInt64 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return nanos * UInt64(timebaseInfo.denom) / UInt64(timebaseInfo.numer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -590,7 +590,7 @@ extension UIImage { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //        self.init(cgImage: cgImage) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func saveImage(currentImage: UIImage, persent: CGFloat, imageName: String) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   public func saveImage(currentImage: UIImage, persent: CGFloat, imageName: String) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if let imageData = currentImage.jpegData(compressionQuality: persent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let fullPath = NSHomeDirectory().appending("/Documents/").appending(imageName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |