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)
}