瀏覽代碼

处理 filter 内存 OO M 要再次确认

jsonwang 3 年之前
父節點
當前提交
fc6845d01c

+ 87 - 73
BFFramework/Classes/PQGPUImage/akfilters/PQImageFilter.swift

@@ -14,47 +14,52 @@ import UIKit
 open class PQImageFilter: PQBaseFilter {
     // 图片纹理
     var imageTexture: GLuint = 0
-
+    var imageVertexBuffer: GLuint = 0
     var mSticker: PQEditVisionTrackMaterialsModel?
     var newImage: UIImage?
     deinit {
         BFLog(1, message: "image filter deinit 析构掉~")
         newImage = nil
-
+        
         if imageTexture != 0 {
             glDeleteTextures(1, &imageTexture)
             imageTexture = 0
         }
+        if(imageVertexBuffer != 0){
+            PQGPUImageTools.deleteVBO(imageVertexBuffer)
+            imageVertexBuffer = 0
+        }
+   
         
     }
-
+    
     init(sticker: PQEditVisionTrackMaterialsModel, isExport: Bool = true, showUISize: CGSize = .zero) {
         super.init(fragmentShader: PassthroughFragmentShader, numberOfInputs: 1)
-
+        
         mSticker = sticker
         stickerInfo = sticker
-
+        
         if mSticker!.locationPath.count == 0 {
             BFLog(2, message: "图片数据为空,创建失败")
             return
         }
-//        print("mSticker path : \(String(describing: mSticker!.locationPath))")
-
+        //        print("mSticker path : \(String(describing: mSticker!.locationPath))")
+        
         newImage = UIImage(contentsOfFile: documensDirectory + sticker.locationPath)
         //try find image file frome in BFFramework bundle
         if(newImage == nil){
             newImage = UIImage.moduleImage(named: sticker.locationPath, moduleName: "BFFramework",isAssets: false)
         }
-
+        
         // 如果是预览时 对原图进行缩放处理
         if !isExport {
             let maxLength = max(showUISize.width, showUISize.height)
             newImage = newImage?.nx_scaleWithMaxLength(maxLength: CGFloat(maxLength * UIScreen.main.scale))
-
+            
             BFLog(message: "newImage is \(newImage?.size.width ?? 0) \(newImage?.size.height ?? 0)")
- 
+            
         }
-
+        
         autoreleasepool {
             if newImage == nil {
                 let filePath = documensDirectory + (mSticker?.locationPath ?? "")
@@ -67,12 +72,12 @@ open class PQImageFilter: PQBaseFilter {
                 } else { BFLog(2, message: "文件不存在") }
             }
         }
-
+        
         if newImage?.cgImage != nil {
             BFLog(message: "提前加载图片。。。。timelineIn : \(String(describing: mSticker?.timelineIn)) timelineOut :\(String(describing: mSticker?.timelineOut)) \(String(describing: mSticker?.locationPath))")
-
-//            imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
-
+            
+            //            imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
+            
         } else { BFLog(2, message: "image filter init error image data is nil!") }
         
         
@@ -81,16 +86,16 @@ open class PQImageFilter: PQBaseFilter {
         if (!__CGSizeEqualToSize(aptImageSize, newImage!.size))
         {
             BFLog(2, message: "原图大小宽度不是16的倍数 \(newImage!.size)")
-            newImage = newImage?.nx_scaleToSize(size: aptImageSize)
+            //            newImage = newImage?.nx_scaleToSize(size: aptImageSize)
             BFLog(2, message: "归16后大小 \(newImage!.size)")
-
+            
         }
-
+        
     }
-
-//    override public func newFramebufferAvailable(_ framebuffer: Framebuffer, fromSourceIndex: UInt) {
-//        super.newFramebufferAvailable(framebuffer, fromSourceIndex: fromSourceIndex)
-//
+    
+    //    override public func newFramebufferAvailable(_ framebuffer: Framebuffer, fromSourceIndex: UInt) {
+    //        super.newFramebufferAvailable(framebuffer, fromSourceIndex: fromSourceIndex)
+    //
     ////        let currTime = CMTimeGetSeconds(CMTime(value: framebuffer.timingStyle.timestamp!.value, timescale: framebuffer.timingStyle.timestamp!.timescale))
     ////
     ////        if mSticker!.timelineIn != 0, currTime >= mSticker!.timelineIn, currTime <= mSticker!.timelineOut, imageTexture == 0 {
@@ -98,78 +103,87 @@ open class PQImageFilter: PQBaseFilter {
     //////                imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
     ////            } else { BFLog(message: "image filter init error image data is nil!") }
     ////        }
-//    }
-
+    //    }
+    
     open override func renderFrame() {
         let inputFramebuffer: Framebuffer = inputFramebuffers[0]!
         let inputSize = inputFramebuffer.sizeForTargetOrientation(.portrait)
-
-//        print("renderFrame timestamp is \(inputFramebuffer.timingStyle)")
-
+        
+        //        print("renderFrame timestamp is \(inputFramebuffer.timingStyle)")
+        
         let currTime = CMTimeGetSeconds(CMTime(value: inputFramebuffer.timingStyle.timestamp!.value, timescale: inputFramebuffer.timingStyle.timestamp!.timescale))
-
+        
         renderFramebuffer = sharedImageProcessingContext.framebufferCache.requestFramebufferWithProperties(orientation: .portrait, size: inputSize, stencil: false)
-
+        
         // 画布
         let textureProperties = InputTextureProperties(textureCoordinates: inputFramebuffer.orientation.rotationNeededForOrientation(.portrait).textureCoordinates(), texture: inputFramebuffer.texture)
-
+        
         renderFramebuffer.activateFramebufferForRendering()
         clearFramebufferWithColor(Color.white)
         renderQuadWithShader(shader, uniformSettings: uniformSettings,
                              vertexBufferObject: sharedImageProcessingContext.standardImageVBO, inputTextures: [textureProperties])
         releaseIncomingFramebuffers()
-
+        
         if newImage == nil {
             BFLog(2, message: "图片数据有错误!!!! 检查数据\(mSticker!.locationPath)")
             return
         }
-
-        BFLog(2, message: " image filter 当前时间: \(currTime) \(newImage!.size)")
-
-        if currTime >= mSticker!.timelineIn && currTime <= mSticker!.timelineOut {
-        BFLog(2, message: " 显示图片当前时间: \(currTime) 开始时间:\(mSticker!.timelineIn) 结束时间:\(mSticker!.timelineOut)  \(String(describing: newImage?.size))")
-        // 取纹理坐标
-        var textureCoordinates = PQGPUImageTools.getTextureCoordinates(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
-
-        BFLog(2, message: "textureCoordinates is \(textureCoordinates) image size :\(newImage!.size ) cannvasSize:\(inputSize)  files path is \(mSticker?.locationPath)")
-
-        // imageTexture 有可能被析构导致黑屏
-        if imageTexture == 0 && newImage?.cgImage != nil {
-            BFLog(2, message: "imageTexture is error !!!!!重新创建")
-            imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
-        }
-
         
-        //如果设置过大小位置,使用设置值,比如水印
-        if(stickerInfo?.materialPosition?.width != 0){
-           textureCoordinates = [
-                0.0, 0.0, // 1 bottom left
-                1.0, 0.0, // 2 bottom right
-                0.0, 1.0, // 3 top left
-                1.0, 1.0, // 4 top right
-            ]
-        }
+        BFLog(2, message: " image filter 当前时间: \(currTime) \(newImage!.size)")
         
-        let texturePropertiesimagetwo = InputTextureProperties(textureCoordinates: textureCoordinates, texture: imageTexture)
-
-        var verticesPoint: [GLfloat] = PQGPUImageTools.getVerticesPoint(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
+        if currTime >= mSticker!.timelineIn && currTime <= mSticker!.timelineOut {
+            BFLog(2, message: " 显示图片当前时间: \(currTime) 开始时间:\(mSticker!.timelineIn) 结束时间:\(mSticker!.timelineOut)  \(String(describing: newImage?.size))")
+            // 取纹理坐标
+            var textureCoordinates = PQGPUImageTools.getTextureCoordinates(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
+            
+            BFLog(2, message: "textureCoordinates is \(textureCoordinates) image size :\(newImage!.size ) cannvasSize:\(inputSize)  files path is \(mSticker?.locationPath)")
+            
+            // imageTexture 有可能被析构导致黑屏
+            if imageTexture == 0 && newImage?.cgImage != nil {
+                BFLog(2, message: "imageTexture is error !!!!!重新创建")
+                imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
+            }
+            
+            
+            //如果设置过大小位置,使用设置值,比如水印
+            if(stickerInfo?.materialPosition?.width != 0){
+                textureCoordinates = [
+                    0.0, 0.0, // 1 bottom left
+                    1.0, 0.0, // 2 bottom right
+                    0.0, 1.0, // 3 top left
+                    1.0, 1.0, // 4 top right
+                ]
+            }
+            
+            let texturePropertiesimagetwo = InputTextureProperties(textureCoordinates: textureCoordinates, texture: imageTexture)
+            
+            var verticesPoint: [GLfloat] = PQGPUImageTools.getVerticesPoint(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
+            
+            //如果设置过大小位置,使用设置值,比如水印
+            if(stickerInfo?.materialPosition?.width != 0){
+                verticesPoint = PQGPUImageTools.computeVertices(viewSize: CGSize.init(width: CGFloat(inputSize.width), height: CGFloat(inputSize.height)), _bounds: CGRect.init(x: stickerInfo?.materialPosition?.x ?? 0, y:  stickerInfo?.materialPosition?.y ?? 0, width: stickerInfo?.materialPosition?.width ?? 0, height: stickerInfo?.materialPosition?.height ?? 0))
+            }
+            
+            // 设置融合模式支持 alpha
+            glEnable(GLenum(GL_DEPTH_TEST))
+            glEnable(GLenum(GL_BLEND))
+            glBlendFunc(GLenum(GL_SRC_ALPHA), GLenum(GL_ONE_MINUS_SRC_ALPHA))
+            
+            imageVertexBuffer = PQGPUImageTools.NXGenerateVBO(for: verticesPoint)
+            
+            renderQuadWithShader(shader,
+                                 uniformSettings: uniformSettings,
+                                 vertexBufferObject: imageVertexBuffer, inputTextures: [texturePropertiesimagetwo])
+            releaseIncomingFramebuffers()
+            
+            if(imageVertexBuffer != 0){
+                PQGPUImageTools.deleteVBO(imageVertexBuffer)
+                imageVertexBuffer = 0
+            }
+            
         
-        //如果设置过大小位置,使用设置值,比如水印
-        if(stickerInfo?.materialPosition?.width != 0){
-            verticesPoint = PQGPUImageTools.computeVertices(viewSize: CGSize.init(width: CGFloat(inputSize.width), height: CGFloat(inputSize.height)), _bounds: CGRect.init(x: stickerInfo?.materialPosition?.x ?? 0, y:  stickerInfo?.materialPosition?.y ?? 0, width: stickerInfo?.materialPosition?.width ?? 0, height: stickerInfo?.materialPosition?.height ?? 0))
         }
         
-        // 设置融合模式支持 alpha
-        glEnable(GLenum(GL_DEPTH_TEST))
-        glEnable(GLenum(GL_BLEND))
-        glBlendFunc(GLenum(GL_SRC_ALPHA), GLenum(GL_ONE_MINUS_SRC_ALPHA))
         
-        renderQuadWithShader(shader,
-                             uniformSettings: uniformSettings,
-                             vertexBufferObject: PQGPUImageTools.NXGenerateVBO(for: verticesPoint),
-                             
-                             inputTextures: [texturePropertiesimagetwo])
-            releaseIncomingFramebuffers()
-        }
     }
 }

+ 3 - 0
BFFramework/Classes/PQGPUImage/akfilters/Tools/PQCompositionExporter.swift

@@ -338,6 +338,9 @@ public class PQCompositionExporter {
         input?.cancel()
         output?.assetWriter.cancelWriting()
         output?.finishRecording()
+        
+        input?.removeAllTargets()
+      
     }
 
     public func handleCaption(for asset: AVAsset) {

+ 1 - 1
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointEditerController.swift

@@ -749,7 +749,7 @@ class PQStuckPointEditerController: PQBaseViewController {
             UIApplication.shared.isIdleTimerDisabled = false
         }
         musicNameLab.stop()
-        playerView.pause()
+        playerView.stop()
 
         musicEditBGView.pausePlayer()
         PQNotification.removeObserver(self)

+ 4 - 6
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointPublicController.swift

@@ -637,9 +637,9 @@ class PQStuckPointPublicController: PQBaseViewController {
             exportSession.cancelExport()
         }
         // 开始导出
-        appendAudio()
+//        appendAudio()
         /// 保存草稿
-        saveDraftbox()
+//        saveDraftbox()
         // 曝光上报:窗口曝光
         PQEventTrackViewModel.baseReportUpload(businessType: .bt_windowView, objectType: .ot_view_publishSyncedUp, pageSource: .sp_stuck_publishSyncedUp, extParams: nil, remindmsg: "卡点视频数据上报-(曝光上报:窗口曝光)")
 
@@ -702,9 +702,7 @@ class PQStuckPointPublicController: PQBaseViewController {
             endMovieExporter.cancel()
         }
  
-        exporter?.input?.removeAllTargets()
-        watermarkMovieExporter?.input?.removeAllTargets()
-        endMovieExporter?.input?.removeAllTargets()
+     
         avPlayer.pause()
         avPlayer.replaceCurrentItem(with: nil)
         // 点击上报:返回按钮
@@ -864,7 +862,7 @@ extension PQStuckPointPublicController {
                 //导出不带水印的正片
                 self?.beginExport(inputAsset: asset)
                 //导出带水印的正片
-                self?.beginExportWatermarkMovie(inputAsset:asset)
+//                self?.beginExportWatermarkMovie(inputAsset:asset)
             }else{
                 cShowHUB(superView: self?.view, msg: "合成失败请重试。")
             }

+ 1 - 0
BFFramework/Classes/Stuckpoint/ViewModel/PQGPUImagePlayerView.swift

@@ -725,6 +725,7 @@ public extension PQGPUImagePlayerView {
         //            return
         //        }
 
+        movie?.removeAllTargets()
         movie?.cancel()
         speaker?.cancel()
         status = .stop