Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Memory Consumption Too Much #349

Open
mobileexpert1 opened this issue Feb 8, 2023 · 1 comment
Open

Memory Consumption Too Much #349

mobileexpert1 opened this issue Feb 8, 2023 · 1 comment

Comments

@mobileexpert1
Copy link

Hello,
I am facing too much memory consumption issue on "MTIBlendFilter" and "MTIHexagonalBokehBlurFilter" while applying both on a video and not getting filtered applied video data on "MTIHexagonalBokehBlurFilter" but it showing output image as we wants but not working on video. Kindly check why i am facing such kinds of issues.

"MTIHexagonalBokehBlurFilter" Code

let inputDepthMask: MTIImage = MTIImage(contentsOf: Bundle.main.url(forResource: "radial", withExtension: "png")!, isOpaque: true)!
let bokeh = MTIHexagonalBokehBlurFilter()
bokeh.inputImage = FilterImage.shared.orignalImage
bokeh.inputMask = MTIMask(content: inputDepthMask, component: .red, mode: .oneMinusMaskValue)
bokeh.brightness = 0.5
bokeh.radius = 20.0
let outPutImg = bokeh.outputImage!
FilterImage.shared.filterdImage = outPutImg
return outPutImg
}

    #####   "MTIBlendFilter" Code
    
        //MARK: -- Overlay Image Filter
func makeOverlayFilterImage() -> MTIImage?{
    var currentImage:MTIImage?
    guard let bledMode = FilterImage.shared.blendMode else {return nil}
    let blendFilter = MTIBlendFilter(blendMode: bledMode)
    blendFilter.intensity = ((overlayIntensity ?? 50)/100) //Compositions.sliderValue / 100
    blendFilter.inputBackgroundImage = self.orignalImage
    if let filterdImage{
        currentImage = filterdImage
    }
    else{
        currentImage = orignalImage
    }
    guard let inputImage = currentImage else {return nil }
    blendFilter.inputImage =  self.blendOverImage        
    guard let outPutImage = FilterGraph.makeImage(builder: { output in
        inputImage => blendFilter.inputPorts.inputBackgroundImage
        blendFilter => output
    }) else {return nil }
    self.filterdImage = outPutImage        
        return outPutImage        
     }
Composition Method Calling for video
     if let asset = videoAsset{
        playerItem = AVPlayerItem(asset: asset)
        DispatchQueue.main.async {
            MyPlayer.share.playVideoWithAsset(self.playerItem)
        }
        if let comp = Compositions.DemoFilter(asset: asset, render: renderContext){
            self.VideoCompositon = comp
            self.playerItem?.videoComposition = comp.makeAVVideoComposition()
        }
    }
Composition Method
    static func DemoFilter(asset :AVAsset,render:MTIContext) -> MTIVideoComposition?{ //    --- MPSDefinitionFilter
    FilterImage.shared.isApplyFilter = true
    FilterImage.shared.filterdImage = nil
    let blendFilter = MTIBlendFilter(blendMode: .overlay)
    let lookup = MTIColorLookupFilter()
    _ = MTIHexagonalBokehBlurFilter()
    _ = MTIHexagonalBokehBlurFilter()
    _ = MTISaturationFilter()
    
    let composition = MTIVideoComposition(asset: asset, context: render, queue: DispatchQueue.main, filter: { request in
        guard let sourceImage = request.anySourceImage else {
            return MTIImage.transparent
        }
        FilterImage.shared.orignalImage = sourceImage
       if let uiImg = GlobalStruct.ColorLookUp {
         let MtImg = DemoImages.convertUiToMti(image: uiImg)
            lookup.inputColorLookupTable = MtImg
       }
        else{
           lookup.inputColorLookupTable = MTIImage.transparent//MTIImage(image: UI_Images.Transparent!)
            }
        
        if let uiImg = GlobalStruct.overlayImage {
            let MtImg = DemoImages.convertUiToMti(image: uiImg)
            blendFilter.inputImage = MtImg
        }
        else{
            blendFilter.inputImage = MTIImage.transparent
        }
        
                let newImg = FilterGraph.makeImage(builder: { output in
                    sourceImage => lookup.inputPorts.inputImage
                    if let img = lookup.outputImage{
                        img => blendFilter.inputPorts.inputBackgroundImage
                    }else{
                        sourceImage => blendFilter.inputPorts.inputBackgroundImage
                    }
                    
                    blendFilter => output
                    //AnyIOPort(sequence: []) => output
                })!
        return newImg //sourceImage
    })
        
    return composition
}

}

@YuAo
Copy link
Member

YuAo commented Feb 21, 2023

Can you try again with the latest version? Also, you should move the filter configuration out of the filter block.

For example:

       if let uiImg = GlobalStruct.ColorLookUp {
         let MtImg = DemoImages.convertUiToMti(image: uiImg)
            lookup.inputColorLookupTable = MtImg
       }

This creates a new MTIImage for every video frame. It's better to create once and reuse that MTIImage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants