| 
					
				 | 
			
			
				@@ -27,25 +27,8 @@ public enum PQGPUImagePlayerViewStatus: Int { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case unknow = -1000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public func willDisplayFramebuffer(renderView _: RenderView, framebuffer _: Framebuffer) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public func didDisplayFramebuffer(renderView _: RenderView, framebuffer: Framebuffer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        if(renderView.bounds.size.width = framebuffer.size.width && renderView.bounds.size.height = framebuffer.size.height){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if GLint(mCanverSize.width) == framebuffer.size.width, GLint(mCanverSize.height) == framebuffer.size.height { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        DispatchQueue.main.async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            renderView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public func shouldDisplayNextFramebufferAfterMainThreadLoop() -> Bool { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class PQGPUImagePlayerView: UIView { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public private(set) var playbackTime: TimeInterval = 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         willSet { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             playbackTimeChangeClosure?(newValue) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -143,15 +126,22 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public var mPlayeTimeRange: CMTimeRange? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public  var mStickers: [PQEditVisionTrackMaterialsModel]? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // 最后一次显示的sticker 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public  var lastshowSticker: PQEditVisionTrackMaterialsModel? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var mStickers: [PQEditVisionTrackMaterialsModel]? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        didSet { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            configCache() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 是否显示时间条 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public  var showProgressLab: Bool = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public   var cacheFilters: [PQBaseFilter] = Array() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var showProgressLab: Bool = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 缓存创建filter 防止 seek 100ms 慢 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Atomic var cacheFilters: Array<PQBaseFilter> = Array() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 缓存个数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var cacheFiltersMaxCount: Int = 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// Use serial queue to ensure that the picture is smooth 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var createFiltersQueue: DispatchQueue! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //是否显示高斯 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public  var showGaussianBlur:Bool = false 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -159,7 +149,7 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 渲染区view 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private lazy var renderView: RenderView = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let view = RenderView() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        view.backgroundColor = PQBFConfig.shared.styleBackGroundColor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        view.backgroundColor = UIColor.black 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         view.frame = self.bounds 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         view.delegate = self 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let tap = UITapGestureRecognizer(target: self, action: #selector(RenderViewOnclick)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -170,7 +160,7 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 暂停播放view 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     lazy var playView: UIImageView = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let view = UIImageView(frame: CGRect(x: (self.frame.size.width - 52) / 2, y: (self.frame.size.height - 52) / 2, width: 52, height: 52)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        view.image = UIImage().BF_Image(named: "gpuplayBtn") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        view.image =  UIImage().BF_Image(named: "gpuplayBtn") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         view.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return view 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -217,15 +207,24 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         addSubview(renderView) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         addSubview(playView) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         addSubview(progressLab) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        backgroundColor = PQBFConfig.shared.styleBackGroundColor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        backgroundColor = UIColor.black 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         playerEmptyView = UIImageView(frame: bounds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        playerEmptyView.backgroundColor = PQBFConfig.shared.styleBackGroundColor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        playerEmptyView.image = UIImage().BF_Image(named: "playEmpty") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        playerEmptyView.backgroundColor = .black 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        playerEmptyView.image =  UIImage().BF_Image(named: "playEmpty") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         playerEmptyView.contentMode = .center 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         addSubview(playerEmptyView) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         addSubview(tipLab) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if #available(iOS 10.0, *) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            createFiltersQueue = DispatchQueue(label: "PQ.moveFiler.seeking111", qos: .default, attributes: .initiallyInactive, autoreleaseFrequency: .never, target: nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            createFiltersQueue = DispatchQueue(label: "PQ.moveFiler.seeking111", qos: .userInteractive, attributes: [], autoreleaseFrequency: .inherit, target: nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if #available(iOS 10.0, *) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            createFiltersQueue.activate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     func showBorderLayer() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -382,7 +381,10 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         movie.progress = { [weak self, movie] currTime, duration, prgressValue in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             guard let strongSelf = self else { return } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self?.findShowStikcer(currTime: movie.currentTime.seconds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FilterLog(message: " movie.currentTime.seconds 进度\(movie.currentTime.seconds)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            self?.createFiltersQueue.async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self?.changeFilter(currTime: movie.currentTime.seconds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self?.progress?(currTime, duration, prgressValue) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -402,6 +404,8 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         movie.completion = { [weak self] in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             guard let strongSelf = self else { return } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //缓存已经用完,重新初始化缓存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            strongSelf.configCache() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             DispatchQueue.main.async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 strongSelf.status = .stop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 strongSelf.finishedClosure?() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -414,71 +418,152 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         applyFilters() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    func findShowStikcer(currTime: Float64) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if mStickers?.count ?? 0 == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            BFLog(message: "mStickers data is error") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var currentSticker: PQEditVisionTrackMaterialsModel? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var currentIdenx: Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (index, sticker) in mStickers!.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if sticker.timelineIn <= currTime, sticker.timelineOut >= currTime { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                currentSticker = sticker 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                currentIdenx = index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 初始化缓存,默认选创建 cacheFiltersMaxCount 个缓存 filterrs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    func configCache() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cacheFilters.removeAll() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BFLog(message: "视频 filter 总数:\(mStickers?.count ?? 0)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if mStickers?.count ?? 0 > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (index , sticker) in mStickers!.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                print( "mStickers timelinein:\(sticker.timelineIn) timelineout: \(sticker.timelineOut) index : \(index)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 创建不同的filter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if currentSticker == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            BFLog(message: "sticker data is error") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if movie != nil && currentSticker != lastshowSticker { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            BFLog(message: "sticker timelineIn is: \(currentSticker!.timelineIn) timelineOut \(currentSticker!.timelineOut)    in is :\(currentSticker!.model_in) in out is :\(currentSticker!.out)  sticker location::: \(String(describing: currentSticker?.locationPath))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (index, currentSticker) in mStickers!.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               //到达最大缓存数退出 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if index == cacheFiltersMaxCount { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var showFitler: PQBaseFilter? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if currentSticker.type == StickerType.VIDEO.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    showFitler = PQMovieFilter(movieSticker: currentSticker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var showFitler: PQBaseFilter? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if currentSticker!.type == StickerType.VIDEO.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                showFitler = PQMovieFilter(movieSticker: currentSticker!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else if currentSticker.type == StickerType.IMAGE.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    showFitler = PQImageFilter(sticker: currentSticker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if showFitler != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    cacheFilters.append(showFitler!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else if currentSticker!.type == StickerType.IMAGE.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                showFitler = PQImageFilter(sticker: currentSticker!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            movie!.removeAllTargets() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            let currentTarget: ImageSource = movie! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (index, filter) in cacheFilters.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FilterLog(message: " 初始化 config create currentSticker timelinein \(String(describing: filter.stickerInfo?.timelineIn)) timelineout \(String(describing: filter.stickerInfo?.timelineOut))  in :\(String(describing: filter.stickerInfo?.model_in)) out \(String(describing: filter.stickerInfo?.out))  index\(index)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        movie?.removeAllTargets() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let showFilter: PQBaseFilter = cacheFilters.first! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        movie?.addTarget(showFilter, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        showFilter.addTarget(renderView, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //创建下一个filter 数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    func createNextFilter() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BFLog(message: "加入前 当前的缓存个数为: \(cacheFilters.count)  maxCount \(cacheFiltersMaxCount) 最后一个显示时间 \(String(describing: cacheFilters.last?.stickerInfo?.timelineIn))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if cacheFilters.count <=  cacheFiltersMaxCount { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              let showIndex = mStickers?.firstIndex(where: { (sticker) -> Bool in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                (cacheFilters.last?.stickerInfo == sticker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                FilterLog(message: "当前显示的showIndex: \(String(describing: showIndex))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if ((showIndex ?? 0) + 1) < (mStickers?.count ?? 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  let currentSticker = mStickers?[(showIndex ?? 0) + 1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  if currentSticker != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      var showFitler: PQBaseFilter? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      if currentSticker!.type == StickerType.VIDEO.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          showFitler = PQMovieFilter(movieSticker: currentSticker!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      } else if currentSticker!.type == StickerType.IMAGE.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          showFitler = PQImageFilter(sticker: currentSticker!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      if showFitler != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          cacheFilters.append(showFitler!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    FilterLog(message: "缓存数据加入不成功!!!!!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               if(currentSticker?.type == StickerType.IMAGE.rawValue && showGaussianBlur){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   //高斯层 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   let json = currentSticker?.toJSONString(prettyPrint: false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   if json == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                       BFLog(message: "数据转换有问题 跳转") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                       return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   let blurStickerModel: PQEditVisionTrackMaterialsModel? = Mapper<PQEditVisionTrackMaterialsModel>().map(JSONString: json!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   blurStickerModel?.canvasFillType = stickerContentMode.aspectFillStr.rawValue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   let showGaussianFitler:PQBaseFilter = PQImageFilter(sticker: blurStickerModel!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   let iosb:GaussianBlur = GaussianBlur.init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   iosb.blurRadiusInPixels = 20 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   showGaussianFitler.addTarget(iosb) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   currentTarget.addTarget(showGaussianFitler, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   iosb.addTarget(showFitler!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FilterLog(message: "加入后 当前的缓存个数为: \(cacheFilters.count)  maxCount \(cacheFiltersMaxCount) 最后一个显示时间 \(String(describing: cacheFilters.last?.stickerInfo?.timelineIn))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   showFitler?.addTarget(renderView, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   currentTarget.addTarget(showFitler!, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   showFitler?.addTarget(renderView, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// 按时间从缓存中取出要显示的filter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// - Parameter currTime: 当前播放时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    func changeFilter(currTime: Float64) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //1,删除已经显示过的 filter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.cacheFilters.removeAll(where: {(filter) -> Bool in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (currTime > (filter.stickerInfo?.timelineOut ?? 0.0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (index,bsFilter )in cacheFilters.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print( "111111缓存操作   没要查找到要查找的显示是为:\(currTime) 缓存数据timeline in :\(bsFilter.stickerInfo?.timelineIn ?? 0.0)) timelineOut:\(bsFilter.stickerInfo?.timelineOut ?? 0.0) 缓存数 \(cacheFilters.count) index: \(index)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 2,找出一个要显示的 fitler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let showIndex = cacheFilters.firstIndex(where: { (filter) -> Bool in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (currTime >= (filter.stickerInfo?.timelineIn ?? 0.0) && currTime <= (filter.stickerInfo?.timelineOut ?? 0.0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(showIndex == nil){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (index,bsFilter )in cacheFilters.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                print( "22222缓存操作   没要查找到要查找的显示是为:\(currTime) 缓存数据timeline in :\(bsFilter.stickerInfo?.timelineIn ?? 0.0)) timelineOut:\(bsFilter.stickerInfo?.timelineOut ?? 0.0) 缓存数 \(cacheFilters.count) index: \(index)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let showFilter: PQBaseFilter = cacheFilters[showIndex ?? 0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print("缓存操作   查找到命中的显示是为:\(currTime) 缓存数据timeline in :\(showFilter.stickerInfo?.timelineIn ?? 0.0)) timelineOut:\(showFilter.stickerInfo?.out ?? 0.0) 缓存数 \(cacheFilters.count) index: \(String(describing: showIndex))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(!(showFilter.isShow)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FilterLog(message: "showIndex当前时间为  \(currTime) showIndex is \(String(describing: showIndex)) 显示 filter timein is: \(String(describing: showFilter.stickerInfo?.timelineIn)) timeout is: \(String(describing: showFilter.stickerInfo?.timelineOut))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            showFilter.isShow = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            movie!.removeAllTargets() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(showFilter.stickerInfo?.type == StickerType.IMAGE.rawValue && showGaussianBlur){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //高斯层 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let json = showFilter.stickerInfo?.toJSONString(prettyPrint: false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if json == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    BFLog(message: "数据转换有问题 跳转") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let blurStickerModel: PQEditVisionTrackMaterialsModel? = Mapper<PQEditVisionTrackMaterialsModel>().map(JSONString: json!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                blurStickerModel?.canvasFillType = stickerContentMode.aspectFillStr.rawValue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let showGaussianFitler:PQBaseFilter = PQImageFilter(sticker: blurStickerModel!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let iosb:GaussianBlur = GaussianBlur.init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                iosb.blurRadiusInPixels = 20 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                showGaussianFitler.addTarget(iosb) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                movie?.addTarget(showGaussianFitler, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                iosb.addTarget(showFilter) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                showFilter.addTarget(renderView, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                movie?.addTarget(showFilter, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                showFilter.addTarget(renderView, atTargetIndex: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self.createNextFilter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            lastshowSticker = currentSticker 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -609,9 +694,23 @@ public extension PQGPUImagePlayerView { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         filters = newFilters 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//    // 重置所有 filer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//    func appendStickers(stickers: [PQEditVisionTrackMaterialsModel]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        mStickers = stickers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// MARK: - RenderViewDelegate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+extension PQGPUImagePlayerView: RenderViewDelegate{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func willDisplayFramebuffer(renderView _: RenderView, framebuffer _: Framebuffer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FilterLog(message: "willDisplayFramebuffer") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func didDisplayFramebuffer(renderView _: RenderView, framebuffer: Framebuffer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FilterLog(message: "didDisplayFramebuffer") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public func shouldDisplayNextFramebufferAfterMainThreadLoop() -> Bool { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FilterLog(message: "didDisplayFramebuffer") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |