func processImage()

in AmazonChimeSDK/AmazonChimeSDKTests/audiovideo/video/backgroundfilter/BackgroundFilterTest.swift [255:302]


    func processImage(frame: VideoFrame) -> (hash: String, image: UIImage?) {
        guard let pixelBuffer = frame.buffer as? VideoFramePixelBuffer else {
            return ("", nil)
        }
        CVPixelBufferLockBaseAddress(pixelBuffer.pixelBuffer, CVPixelBufferLockFlags.readOnly)
        guard let address = CVPixelBufferGetBaseAddress(pixelBuffer.pixelBuffer) else {
            XCTFail("Failed to retrieve frame buffer address.")
            return ("", nil)
        }
        let contextDataPointer: UnsafeMutablePointer<UInt8> = address.bindMemory(
            to: UInt8.self,
            capacity: frame.width * frame.height * 4)

        let imageCfData = CFDataCreate(nil, contextDataPointer, frame.width * frame.height * 4)
        let cgProvider = CGDataProvider.init(data: imageCfData!)!
        var hashArray = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
        let nsImageData = NSData(data: (cgProvider.data as Data?)!)

        // Attach images for manual testing and debugging purposes.
        // In the test view, right click the test and use "Jump to Report"
        // to see the attached images.
        let ciImage = CIImage(cvImageBuffer: pixelBuffer.pixelBuffer)
        let context = CIContext(options: [.cacheIntermediates: false])
        guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else {
            XCTFail("Error creating CGImage of input frame.")
            return ("", nil)
        }
        let image = UIImage(cgImage: cgImage)
        let attachment = XCTAttachment(image: image)
        attachment.lifetime = .keepAlways
        self.add(attachment)

        CC_SHA256(nsImageData.bytes, UInt32(nsImageData.count), &hashArray)

        let finalData = NSData(bytes: hashArray, length: Int(CC_SHA256_DIGEST_LENGTH))

        var bytes = [UInt8](repeating: 0, count: finalData.length)
        finalData.getBytes(&bytes, length: finalData.length)

        var hexString = ""
        for byte in bytes {
            hexString += String(format: "%02x", UInt8(byte))
        }

        CVPixelBufferUnlockBaseAddress(pixelBuffer.pixelBuffer, CVPixelBufferLockFlags.readOnly)

        return (hexString, image)
    }