{ "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json", "schemaVersion": 1, "id": "wwdc2026-305", "event": "wwdc2026", "eventName": "WWDC26", "year": 2026, "eventContentId": 305, "title": "Enhance RAW image processing with Core Image", "description": "Harness the power of version 9 of the Core Image RAW processing APIs to dramatically improve image quality in your apps, with improved sharpness and more defined color, while using the Apple Neural Engine for optimal performance. Take advantage of the CIRAWFilter API to let your users edit RAW photos by changing exposure, noise reduction, sharpness, contrast and more. And explore new CIImageProcessor APIs that optimize performance by giving you precise control over tile sizing and buffer management.", "url": "https://developer.apple.com/videos/play/wwdc2026/305", "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/305", "type": "Video", "publishedAt": "2026-06-08T14:00:00-07:00", "platforms": [ "iOS", "iPadOS", "macOS", "visionOS" ], "keywords": [], "topics": [ "Photos & Camera" ], "primaryTopic": "Photos & Camera", "duration": 988, "hasTranscript": true, "transcriptWordCount": 2051, "availableLanguages": [ "eng", "fra", "jpn", "kor", "por", "spa", "zho" ], "media": { "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/cmaf.m3u8", "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/cmaf-download.m3u8", "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/downloads/wwdc2026-305_sd.mp4", "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/downloads/wwdc2026-305_hd.mp4", "duration": 988 }, "codeSnippets": [ { "title": "Contact for exports", "language": "swift", "startTimeSeconds": 668, "code": "let exportCtx = CIContext(options : [\n .cacheIntermediate : false,\n .memoryLimit : 512 ])" }, { "title": "CIImageProcessor with explicit output tile sizes", "language": "swift", "startTimeSeconds": 743, "code": "import CoreImage\n\nclass MyProcessor: CIImageProcessorKernel {\n override class func roi(forInput input: Int32,\n arguments: [String : Any]?,\n outputRect: CGRect) -> CGRect { return outputRect }\n\n override class func process(with inputs: [CIImageProcessorInput]?,\n arguments: [String : Any]?,\n output: CIImageProcessorOutput) throws {\n guard let input = inputs?.first,\n let iBuffer = input.pixelBuffer,\n let oBuffer = output.pixelBuffer else { return }\n\n let iRegion = input.region\n let oRegion = output.region // controlled by Core Image\n\n // MyCopyBuffer(iBuffer,iRegion, oBuffer,oRegion)\n }\n}\n\nlet extent = inImg.extent\nlet tileSize = 512.0 // whatever tile size you want\nvar tiles: [CIVector] = []\nfor y in stride(from: extent.minY, to: extent.maxY, by: tileSize) {\n for x in stride(from: extent.minX, to: extent.maxX, by: tileSize) {\n let tile = CGRect(x: x, y: y,\n width: min(tileSize, extent.maxX - x),\n height: min(tileSize, extent.maxY - y))\n tiles.append(CIVector(cgRect: tile))\n }\n}\n\nlet result = try MyProcessor.apply(withTiledExtent: tiles, inputs: [inImg], arguments: [:])" }, { "title": "CIImageProcessor using temporary PixelBuffer", "language": "swift", "startTimeSeconds": 864, "code": "import CoreImage\n\nclass MyProcessor: CIImageProcessorKernel {\n override class func process(with inputs: [CIImageProcessorInput]?,\n arguments: [String: Any]?,\n output: CIImageProcessorOutput) throws {\n guard let input = inputs?.first,\n let srcPixelBuffer = input.pixelBuffer,\n let dstPixelBuffer = output.pixelBuffer else { return }\n\n // Get a scratch buffer from Core Image's cache\n guard let scratch = output.temporaryPixelBuffer(identifier : \"myScratch\",\n format: kCVPixelFormatType_64RGBAHalf,\n width: Int(output.region.width),\n height: Int(output.region.height),\n pixelBufferAttributes: nil) else { return }\n\n // Step 1: copy input CVPixelBuffer → scratch\n // Step 2: process pixels in scratch\n // Step 3: copy scratch → output CVPixelBuffer\n }\n}" } ], "resources": [ { "title": "Extended Virtual Addressing Entitlement", "url": "https://developer.apple.com/documentation/BundleResources/Entitlements/com.apple.developer.kernel.extended-virtual-addressing", "type": "documentation", "description": "A Boolean value that indicates whether the app may access an extended address space.", "sosumiURL": "https://sosumi.ai/documentation/BundleResources/Entitlements/com.apple.developer.kernel.extended-virtual-addressing", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/BundleResources/Entitlements/com.apple.developer.kernel.extended-virtual-addressing.json" } ], "path": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/", "files": { "metadata": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/metadata.json", "readme": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/README.md", "transcript": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/transcript.md", "transcriptJSON": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/transcript.json" } }