Skip to content

App Crashes when an HD video is played due to using too much memory #144

@ArbazIrshad

Description

@ArbazIrshad

The Phones memory fills up too quickly and it crashes pretty quickly even on a 3 second video.

import UIKit
import GPUImage

class MainThreadRenderer: ImageConsumer {
    var maximumInputs: UInt = 1
    
    var isProcessing: Bool = false
    
    var sources: SourceContainer = SourceContainer()
    
    private let renderView: RenderView
    private let lock = NSLock()
    
    init(renderView: RenderView) {
        self.renderView = renderView
    }
    
    func newTextureAvailable(_ texture: Texture, fromSourceIndex: UInt) {

                     lock.lock()
        DispatchQueue.main.async { [weak self] in
            print("Processing")
            self?.renderView.newTextureAvailable(texture, fromSourceIndex: fromSourceIndex)

            self?.lock.unlock()
        }
    }
}

class ViewController: UIViewController {



    var renderView: RenderView!
    var mainRenderer: MainThreadRenderer!
    var camera: Camera!


    var movie: MovieInput!
    var hue: HueAdjustment!
    var saturation: SaturationAdjustment!
    var contrast: ContrastAdjustment!
    var contrastSlider: UISlider!
    var lookupFilter: LookupFilter!

    
    override func viewDidLoad() {
        super.viewDidLoad()
        

        guard let bundleURL = Bundle.main.resourceURL else {
            return
        }
        
        let movieURL = URL(string: "test2.MP4", relativeTo: bundleURL)!
        print("MOVIE URL: \(movieURL)")
        do {
            movie = try MovieInput(url: movieURL, playAtActualSpeed: true, loop: true)

            renderView = RenderView(frame: view.bounds)
            view.addSubview(renderView)
            

            
            mainRenderer = MainThreadRenderer(renderView: renderView)

            camera = try Camera(sessionPreset: .vga640x480)

            print("MOVIE READY \(movie != nil)")
//            contrastSlider = createSlider(min: -1, max: 1, value: 0, action: #selector(contrastChanged(_:)))
//            let stack = UIStackView(arrangedSubviews: [
//                    contrastSlider
////                        labeledSlider("Exposure", slider: exposureSlider),
////                        labeledSlider("Contrast", slider: contrastSlider),
////                        labeledSlider("Saturation", slider: saturationSlider),
////                        labeledSlider("Temperature", slider: temperatureSlider),
////                        labeledSlider("Tint", slider: tintSlider)
//            ])
//            stack.axis = .vertical
//            stack.spacing = 12
//            stack.translatesAutoresizingMaskIntoConstraints = false
//            view.addSubview(stack)
//            
//            NSLayoutConstraint.activate([
//                     stack.topAnchor.constraint(equalTo: renderView.bottomAnchor, constant: 16),
//                     stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
//                     stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16)
//                 ])
            
            hue = HueAdjustment()
            saturation = SaturationAdjustment()
            contrast = ContrastAdjustment()
            
            lookupFilter = LookupFilter()
            lookupFilter.lookupImage = PictureInput(imageName: "lookup_old")
            
            

            print("AFTER LOOKUP FILTER")
            movie --> lookupFilter --> hue --> saturation --> contrast --> mainRenderer
            
          
            movie.runBenchmark = false
            
            
            movie.start()

            

            
            
        } catch {
            print("Couldn't process movie with error: \(error)")
        }


    }
    
    
    
    
    
    
    @objc func contrastChanged(_ sender: UISlider) {
//         hue.hue = sender.value
     }
    
    

    
    func changeHue(newValue: Float) {
         guard let hue = hue else { return }
         hue.hue = newValue

    
     }

     func changeSaturation(newValue: Float) {
         guard let saturation = saturation else { return }
         saturation.saturation = newValue
     }

     func changeContrast(newValue: Float) {
         guard let contrast = contrast else { return }
         contrast.contrast = newValue
     }
    

    func createSlider(min: Float, max: Float, value: Float, action: Selector) -> UISlider {
         let slider = UISlider()
         slider.minimumValue = min
         slider.maximumValue = max
         slider.value = value
         slider.addTarget(self, action: action, for: .valueChanged)
         return slider
     }
    
    

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions