What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for...

264
#WWDC17 © 2017 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. Erik Turnquist, CoreMedia Engineer Brad Ford, Camera Software Working with HEIF and HEVC Session 511 Media

Transcript of What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for...

Page 1: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

#WWDC17

© 2017 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

Erik Turnquist, CoreMedia Engineer Brad Ford, Camera Software

•Working with HEIF and HEVC • Session 511

Media

Page 2: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

What is HEVC?

Page 3: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why?

Page 4: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)
Page 5: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Better compression than H.264

Up to 40%

Page 6: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Better compression

Up to 2x

Page 7: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Today

Page 8: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Access •Playback •Capture •Export

Page 9: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Access •Playback •Capture •Export

Page 10: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC Assets From Photos

PhotoKit will deliver HEVC assets for playback

// PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil) { (playerItem, dictionary) in // use AVPlayerItem}

manager.requestLivePhoto(for: asset, targetSize: size, contentMode: .default, options: nil) { (livePhoto, dictionary) in // use PHLivePhoto}

Page 11: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC Assets From Photos

PhotoKit will deliver HEVC assets

// PHImageManagermanager.requestExportSession(forVideo: asset, options: nil, exportPreset: preset) { (session, dictionary) in // use AVAssetExportSession}manager.requestAVAsset(forVideo: asset, options: nil) { (asset, audioMix, dictionary) in // use AVAsset}

Page 12: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC Assets From Photos

Access HEVC movie file data

// PHAssetResourceManager resourceManager.requestData(for: assetResource, options: nil, dataReceivedHandler: { (data) in // use Data}, { (error) in // handle Error})

Page 13: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Access •Playback •Capture •Export

Page 14: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Supported in modern media frameworks

Streaming, play-while-download, and local files are supported

MPEG-4, QuickTime file format container support

No API opt-in required

Native Playback Support

Page 15: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Decode

macOS

iOS

Page 16: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC Decode Support Minimum configurations

iOS macOS

8-bit Hardware Decode

A9 chip

6th Generation Intel Core processor

10-bit Hardware Decode 7th Generation Intel Core processor

8-bit Software Decode

All iOS Devices All Macs

10-bit Software Decode

Page 17: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let player = AVPlayer(url: URL(fileURLWithPath: "MyAwesomeMovie.mov"))player.play()

Page 18: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Useful for non-realtime operations

Can be limited by hardware support

Decode Capability

assetTrack.isDecodable

Page 19: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Not all content can be played back in realtime

Differing capabilities on device

Playback Capability

assetTrack.isPlayable

Page 20: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Longest battery life

Best decode performance

Hardware Decode Availability

let hardwareDecodeSupported = VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC)

Page 21: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Which Codec For Playback?

H.264 HEVC

Most Compatible

Smaller file size

Page 22: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Access •Playback •Capture •Export

Page 23: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capture HEVC movies with AVFoundation

MPEG-4, QuickTime file format container support

Capture

Page 24: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC Capture Support Minimum configurations

iOS

8-Bit Hardware Encode A10 Fusion chip

Page 25: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing Movies with HEVC

Page 26: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing Movies with HEVC

AVCaptureSession

Page 27: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing Movies with HEVC

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

Page 28: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing Movies with HEVC

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCaptureMovieFileOutput

Page 29: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

AVCaptureConnection

Capturing Movies with HEVC

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCaptureMovieFileOutput

Page 30: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

AVCaptureConnection

Capturing Movies with HEVC

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCaptureMovieFileOutput

Page 31: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let session = AVCaptureSession() session.sessionPreset = .hd4K3840x2160

let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: nil, position: .back) let input = try! AVCaptureDeviceInput(device: camera!) session.addInput(input) let movieFileOutput = AVCaptureMovieFileOutput() session.addOutput(movieFileOutput) session.startRunning() movieFileOutput.startRecording(to: url, recordingDelegate: self)

Page 32: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let session = AVCaptureSession() session.sessionPreset = .hd4K3840x2160

let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: nil, position: .back) let input = try! AVCaptureDeviceInput(device: camera!) session.addInput(input) let movieFileOutput = AVCaptureMovieFileOutput() session.addOutput(movieFileOutput) session.startRunning() movieFileOutput.startRecording(to: url, recordingDelegate: self)

Page 33: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let session = AVCaptureSession() session.sessionPreset = .hd4K3840x2160

let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: nil, position: .back) let input = try! AVCaptureDeviceInput(device: camera!) session.addInput(input) let movieFileOutput = AVCaptureMovieFileOutput() session.addOutput(movieFileOutput) session.startRunning() movieFileOutput.startRecording(to: url, recordingDelegate: self)

Page 34: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let session = AVCaptureSession() session.sessionPreset = .hd4K3840x2160

let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: nil, position: .back) let input = try! AVCaptureDeviceInput(device: camera!) session.addInput(input) let movieFileOutput = AVCaptureMovieFileOutput() session.addOutput(movieFileOutput) session.startRunning() movieFileOutput.startRecording(to: url, recordingDelegate: self)

Page 35: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let session = AVCaptureSession() session.sessionPreset = .hd4K3840x2160

let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: nil, position: .back) let input = try! AVCaptureDeviceInput(device: camera!) session.addInput(input) let movieFileOutput = AVCaptureMovieFileOutput() session.addOutput(movieFileOutput) session.startRunning() movieFileOutput.startRecording(to: url, recordingDelegate: self)

Page 36: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let connection = movieFileOutput.connection(with: .video)if movieFileOutput.availableVideoCodecTypes.contains(.hevc) { outputSetings = [AVVideoCodecKey: AVVideoCodecType.hevc]} else { outputSetings = [AVVideoCodecKey: AVVideoCodecType.h264]} movieFileOutput.setOutputSettings(outputSetings, for: connection!)

Page 37: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let connection = movieFileOutput.connection(with: .video)if movieFileOutput.availableVideoCodecTypes.contains(.hevc) { outputSetings = [AVVideoCodecKey: AVVideoCodecType.hevc]} else { outputSetings = [AVVideoCodecKey: AVVideoCodecType.h264]} movieFileOutput.setOutputSettings(outputSetings, for: connection!)

Page 38: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let connection = movieFileOutput.connection(with: .video)if movieFileOutput.availableVideoCodecTypes.contains(.hevc) { outputSetings = [AVVideoCodecKey: AVVideoCodecType.hevc]} else { outputSetings = [AVVideoCodecKey: AVVideoCodecType.h264]} movieFileOutput.setOutputSettings(outputSetings, for: connection!)

Page 39: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing Live Photo Movies with HEVC

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCapturePhotoOutput

Page 40: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing Live Photo Movies with HEVC

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCapturePhotoOutput

Page 41: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Live Photo Enhancements

Video stabilization

Music playback

30 FPS

Page 42: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let photoSettings = AVCapturePhotoSettings()photoSettings.livePhotoMovieFileURL = URL(fileURLWithPath: myFilePath)if photoOutput.availableLivePhotoVideoCodecTypes.contains(.hevc) { photoSettings.livePhotoVideoCodecType = .hevc}photoOutput.capturePhoto(with: photoSettings, delegate: self)

Page 43: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let photoSettings = AVCapturePhotoSettings()photoSettings.livePhotoMovieFileURL = URL(fileURLWithPath: myFilePath)if photoOutput.availableLivePhotoVideoCodecTypes.contains(.hevc) { photoSettings.livePhotoVideoCodecType = .hevc}photoOutput.capturePhoto(with: photoSettings, delegate: self)

Page 44: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let photoSettings = AVCapturePhotoSettings()photoSettings.livePhotoMovieFileURL = URL(fileURLWithPath: myFilePath)if photoOutput.availableLivePhotoVideoCodecTypes.contains(.hevc) { photoSettings.livePhotoVideoCodecType = .hevc}photoOutput.capturePhoto(with: photoSettings, delegate: self)

Page 45: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

sbufsbufsbuf AVAssetWriter

Capturing HEVC Movies with AVAssetWriter

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCaptureVideoDataOutput

Page 46: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

sbufsbufsbuf AVAssetWriter

Capturing HEVC Movies with AVAssetWriter

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCaptureVideoDataOutput

Page 47: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing HEVC Movies with AVAssetWriter

Configure AVAssetWriterInput with output settings

Video data output can recommend settings

// iOS 7vdo.recommendedVideoSettingsForAssetWriter(writingTo: .mov) // iOS 11vdo.recommendedVideoSettings(forVideoCodecType: .hevc, assetWriterOutputFileType: .mov)

Page 48: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Capturing HEVC Movies with AVAssetWriter

Configure AVAssetWriterInput with output settings

Video data output can recommend settings

// iOS 7vdo.recommendedVideoSettingsForAssetWriter(writingTo: .mov) // iOS 11vdo.recommendedVideoSettings(forVideoCodecType: .hevc, assetWriterOutputFileType: .mov)

Page 49: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Access •Playback •Capture •Export

Page 50: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Transcode to HEVC with AVFoundation and VideoToolbox

MPEG-4, QuickTime file format container support

API opt-in required

Export

Page 51: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Encode

macOS

iOS

Page 52: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC Encode Support Minimum configurations

iOS macOS

8-bit Hardware Encode A10 Fusion chip 6th Generation Intel Core processor

10-bit Software Encode All Macs

Page 53: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Transcode with AVAssetExportSession

Page 54: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Transcode with AVAssetExportSession

AVAssetExportSession

Page 55: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

No change in behavior for existing presets

Convert from H.264 to HEVC with new presets

Produce smaller AVAssets with same quality

Export Session

AVAssetExportPresetHEVC1920x1080 AVAssetExportPresetHEVC3840x2160 AVAssetExportPresetHEVCHighestQuality

Page 56: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compression with AVAssetWriter

Page 57: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compression with AVAssetWriter

AVAssetWritersbufsbufsbuf

Page 58: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Specify HEVC with output settings for AVAssetWriterInput

Asset Writer

AVOutputSettingsPreset.hevc1920x1080 AVOutputSettingsPreset.hevc3840x2160

Convenient output settings with AVOutputSettingsAssistant

settings = [AVVideoCodecKey: AVVideoCodecType.hevc]

Page 59: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let error = VTCopySupportedPropertyDictionaryForEncoder( 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification, &encoderID, &properties)

if error == kVTCouldNotFindVideoEncoderErr { // no HEVC encoder }

Valid Output Settings

Query encoder for supported properties in output settings

Encoder ID is a unique identifier for an encoder

Properties and encoder ID can be used in output settings

Page 60: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

let error = VTCopySupportedPropertyDictionaryForEncoder( 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification, &encoderID, &properties)

if error == kVTCouldNotFindVideoEncoderErr { // no HEVC encoder }

Valid Output Settings

Query encoder for supported properties in output settings

Encoder ID is a unique identifier for an encoder

Properties and encoder ID can be used in output settings

Page 61: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compress Samples with VTCompressionSession

Page 62: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compress Samples with VTCompressionSession

VTCompressionSession

sbufsbufsbuf

sbufsbufhvc1

Page 63: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Create session with HEVC encoder

Compression Session

let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_H264, encoderSpecification, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session); if error == kVTCouldNotFindVideoEncoderErr { // no H.264 encoder}

Page 64: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compression Session

let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session); if error == kVTCouldNotFindVideoEncoderErr { // no HEVC encoder}

Create session with HEVC encoder

Page 65: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Use hardware when available on macOS

let encoderSpecification: [CFString: Any] = [ kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder: true] let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification as CFDictionary, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session)

// Using hardware, or software

Page 66: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Use hardware when available on macOS

let encoderSpecification: [CFString: Any] = [ kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder: true] let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification as CFDictionary, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session)

// Using hardware, or software

Page 67: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Use hardware when available on macOS

let encoderSpecification: [CFString: Any] = [ kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder: true] let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification as CFDictionary, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session)

// Using hardware, or software

Page 68: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Realtime encode, fail if no hardware exists on macOS

let encoderSpecification: [CFString: Any] = [ kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder: true] let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification as CFDictionary, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session)

if error == kVTCouldNotFindVideoEncoderErr { // no hardware HEVC encoder}

Page 69: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Realtime encode, fail if no hardware exists on macOS

let encoderSpecification: [CFString: Any] = [ kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder: true] let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification as CFDictionary, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session)

if error == kVTCouldNotFindVideoEncoderErr { // no hardware HEVC encoder}

Page 70: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Realtime encode, fail if no hardware exists on macOS

let encoderSpecification: [CFString: Any] = [ kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder: true] let error = VTCompressionSessionCreate( kCFAllocatorDefault, 3840, 2160, kCMVideoCodecType_HEVC, encoderSpecification as CFDictionary, nil, nil, nil, nil, // using VTCompressionSessionEncodeFrameWithOutputHandler &session)

if error == kVTCouldNotFindVideoEncoderErr { // no hardware HEVC encoder}

Page 71: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Bit Depth

Page 72: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Bit depth8-bit* 10-bit

*effect amplified for illustration

Page 73: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Set profile via kVTCompressionPropertyKey_ProfileLevel

HEVC 10-bit Encode Settings

// Check VTSessionCopySupportedPropertyDictionary() for support kVTProfileLevel_HEVC_Main10_AutoLevel

CoreVideo pixel buffer format

kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange // 10-bit 4:2:0

Page 74: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Set profile via kVTCompressionPropertyKey_ProfileLevel

HEVC 10-bit Encode Settings

// Check VTSessionCopySupportedPropertyDictionary() for support kVTProfileLevel_HEVC_Main10_AutoLevel

CoreVideo pixel buffer format

kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange // 10-bit 4:2:0

Page 75: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Hierarchical Frame Encoding

Page 76: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Video Encoding 101

Page 77: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Video Encoding 101

I Frame

Page 78: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Video Encoding 101

I Frame P Frame

Page 79: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Video Encoding 101

I Frame P Frame

B Frame

Page 80: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Video Encoding 101

I Frame P Frame

B Frame

Can drop a frame when another doesn’t depend on it

Page 81: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Video Encoding 101

I Frame P Frame

B Frame

Can drop a frame when another doesn’t depend on it

Page 82: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Video Encoding 101

I Frame P Frame

B Frame

Can drop a frame when another doesn’t depend on it

Page 83: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compatible High Frame Rate Content

Non-droppable

Droppable

Page 84: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compatible High Frame Rate Content

Non-droppable

Droppable

240 fps

Page 85: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compatible High Frame Rate Content

Non-droppable

Droppable

240 fps

Page 86: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compatible High Frame Rate Content

Non-droppable

Droppable

120 fps

Page 87: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compatible High Frame Rate Content

Non-droppable

Droppable

60 fps

Page 88: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Compatible High Frame Rate Content

Non-droppable

Droppable

30 fps

Page 89: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Temporal Levels

Level 0

Level 1

Level 2

Level 3

Page 90: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Temporal Levels

Level 0

240 fps

Level 1

Level 2

Level 3

Page 91: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Temporal Levels

Level 0

240 fps

Level 1

Level 2

Level 3

Page 92: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Temporal Levels

Level 0

120 fps

Level 1

Level 2

Level 3

Page 93: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Temporal Levels

Level 0

60 fps

Level 1

Level 2

Level 3

Page 94: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Temporal Levels

Level 0

30 fps

Level 1

Level 2

Level 3

Page 95: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC Hierarchical Encoding

Improved temporal scalability

Improved motion compensation

File annotations (MPEG-4 Part 15 - 8.4)

54

Page 96: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Create compatible high frame rate content

Set base layer and capture frame rate

HEVC Hierarchical Encoding

// Check VTSessionCopySupportedPropertyDictionary() for support kVTCompressionPropertyKey_BaseLayerFrameRate // temporal level 0 frame rate kVTCompressionPropertyKey_ExpectedFrameRate // frame rate of content

Base layer must be decoded

Decode or drop other levels

Page 97: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Brad Ford, Camera Software

•HEIF — it’s what’s for dinner

Page 98: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•What is HEIF? •Low-level HEIF file access •High-level HEIF file access •Capturing HEIF files

Page 99: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•What is HEIF? •Low-level HEIF file access •High-level HEIF file access •Capturing HEIF files

Page 100: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•What is HEIF? •Low-level HEIF file access •High-level HEIF file access •Capturing HEIF files

Page 101: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•What is HEIF? •Low-level HEIF file access •High-level HEIF file access •Capturing HEIF files

Page 102: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•What is HEIF? •Low-level HEIF file access •High-level HEIF file access •Capturing HEIF files

Page 103: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

What is HEIF?HEIF

Page 104: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF

Page 105: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

ighfficiency

mageile

(Format)

HEIF

Page 106: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF Pronunciation

Hife 23%

Heef 46%

Heff 14%

Eff 9%

Хейф 7%

Page 107: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF Pronunciation

Hife 23%

Heef 46%

Heff 14%

Eff 9%

Хейф 7%

Hafe 1%

Page 108: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

2x

Page 109: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

2x

Page 110: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

2xSMALLER

Page 111: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 112: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 113: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 114: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 115: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 116: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 117: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 118: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 119: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 120: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

EXIF

Page 121: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Why HEIF?

Page 122: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)
Page 123: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Demo •Extreme zooming with HEIF

Page 124: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Payload Extension UTI

HEVC Image .HEIC "public.heic"

H.264 Image .AVCI “public.avci"

Anything Else .HEIF "public.heif"

What the .HEIC?

Page 125: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Payload Extension UTI

HEVC Image .HEIC "public.heic"

H.264 Image .AVCI “public.avci"

Anything Else .HEIF "public.heif"

What the .HEIC?

Page 126: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Payload Extension UTI

HEVC Image .HEIC "public.heic"

H.264 Image .AVCI “public.avci"

Anything Else .HEIF "public.heif"

What the .HEIC?

Page 127: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Payload Extension UTI

HEVC Image .HEIC "public.heic"

H.264 Image .AVCI “public.avci"

Anything Else .HEIF "public.heif"

What the .HEIC?

Page 128: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Supported HEIF Flavors (Writing)

Payload Extension UTI

HEVC Image .HEIC "public.heic"

Page 129: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Low-Level Access to HEIF

Page 130: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

CoreGraphics

CoreImage

UIKit

ImageIO

Page 131: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

CoreGraphics

CoreImage

UIKit

CGImageSource

ImageIO

Page 132: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

CoreGraphics

CoreImage

UIKit

CGImageSource CGImageDestination

ImageIO

Page 133: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a jpeg image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.jpg")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 134: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a jpeg image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.jpg")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 135: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a jpeg image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.jpg")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 136: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a jpeg image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.jpg")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 137: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a jpeg image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.jpg")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 138: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a jpeg image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.jpg")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 139: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a heic image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.heic")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 140: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a heic image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.heic")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String:Any]

let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)

Page 141: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Read a heic image from file

let inputURL = URL(fileURLWithPath: "/tmp/image.heic")

let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

let image = CGImageSourceCreateImageAtIndex(source, 0, nil)

let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]

let thumb = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)

Page 142: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Tiling Support in CGImageSource

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

"{TIFF}" = { DateTime = "2017:04:01 22:50:24"; Make = Apple; Model = "iPhone 7 Plus"; Orientation = 1; ResolutionUnit = 2; Software = "11.0"; TileLength = 512; TileWidth = 512; XResolution = 72; YResolution = 72; };

Page 143: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Tiling Support in CGImageSource

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

"{TIFF}" = { DateTime = "2017:04:01 22:50:24"; Make = Apple; Model = "iPhone 7 Plus"; Orientation = 1; ResolutionUnit = 2; Software = "11.0"; TileLength = 512; TileWidth = 512; XResolution = 72; YResolution = 72; };

Page 144: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Tiling Support in CGImageSource

let imageProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any]

"{TIFF}" = { DateTime = "2017:04:01 22:50:24"; Make = Apple; Model = "iPhone 7 Plus"; Orientation = 1; ResolutionUnit = 2; Software = "11.0"; TileLength = 512; TileWidth = 512; XResolution = 72; YResolution = 72; };

Page 145: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Tiling Support in CGImage

let subImage = bigImage.cropping(to: rect)

Page 146: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Tiling Support in CGImage

let subImage = bigImage.cropping(to: rect)

Page 147: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a JPEG file

let url = URL(fileURLWithPath: "/tmp/output.jpg")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.jpg as CFString, 1, nil)

else { fatalError("unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 148: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a JPEG file

let url = URL(fileURLWithPath: "/tmp/output.jpg")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.jpg as CFString, 1, nil)

else { fatalError("unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 149: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a JPEG file

let url = URL(fileURLWithPath: "/tmp/output.jpg")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.jpg as CFString, 1, nil)

else { fatalError("unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 150: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a JPEG file

let url = URL(fileURLWithPath: "/tmp/output.jpg")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.jpg as CFString, 1, nil)

else { fatalError("unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 151: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a HEIC file

let url = URL(fileURLWithPath: "/tmp/output.heic")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.heic as CFString, 1, nil)

else { fatalError("unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 152: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a HEIF file

let url = URL(fileURLWithPath: "/tmp/output.heic")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.heic as CFString, 1, nil)

else { throw WriteError.error(message: "unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 153: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a HEIF file

let url = URL(fileURLWithPath: "/tmp/output.heic")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.heic as CFString, 1, nil)

else { fatalError("unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 154: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Writing a CGImage to a HEIF file

let url = URL(fileURLWithPath: "/tmp/output.heic")guard let destination = CGImageDestinationCreateWithURL(url as CFURL, AVFileType.heic as CFString, 1, nil)

else { fatalError("unable to create CGImageDestination")} CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)

Page 155: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

ImageIO Depth Support

HEIC • Auxiliary image (monochrome HEVC) with XMP metadata

JPEG • MPO image (jpeg encoded) with XMP metadata

Image Editing with Depth WWDC 2017

NEW

Page 156: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•High-Level Access to HEIF

Page 157: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Brad Ford

•Compression Poetry

Page 158: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)
Page 159: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

JPEG is yay big but HEIF is brief

Page 160: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Brad Ford

•Compression Haiku

Page 161: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)
Page 162: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC has

Page 163: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC hastwice as many syllables

Page 164: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC hastwice as many syllablesas JPEG — progress.

Page 165: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Photos

CoreGraphics

CoreImage

UIKit

AVFoundation

CoreMedia

HEIF and PhotoKit

PhotosUI

PhotoKit

Page 166: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF and PhotoKit

Applying adjustments • Photos • Videos • Live Photos

Common workflows • Display • Backup • Share

Page 167: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Apply Adjustments

PHPhotoLibrary performChanges:

Page 168: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Apply Adjustments

PHPhotoLibrary performChanges:

PHAsset

Page 169: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Apply Adjustments

PHContentEditingInput

PHPhotoLibrary performChanges:

PHAsset

Page 170: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Apply Adjustments

PHContentEditingOutput

PHContentEditingInput

PHPhotoLibrary performChanges:

PHAsset

Page 171: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Apply Adjustments

PHContentEditingOutput

PHContentEditingInput

renderedContentURL

PHPhotoLibrary performChanges:

PHAsset

Page 172: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Apply Adjustments

PHContentEditingOutput

PHContentEditingInput

renderedContentURL

PHPhotoLibrary performChanges:

PHAsset

Page 173: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Applying Adjustments

PHContentEditingOutput • Image rendered as JPEG • Image Exif orientation of 1 (no rotation)

Page 174: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing a HEIF photo -- save as JPEG

func applyPhotoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completion: () -> ()) {

guard let inputImage = CIImage(contentsOf: input.fullSizeImageURL!) else { fatalError("can't load input image") } let outputImage = inputImage .applyingOrientation(input.fullSizeImageOrientation) .applyingFilter(filterName, withInputParameters: nil)

// Write the edited image as a JPEG. do { try self.ciContext.writeJPEGRepresentation(of: outputImage, to: output.renderedContentURL, colorSpace: inputImage.colorSpace!, options: [:]) } catch let error { fatalError("can't apply filter to image: \(error)") } completion() }

Page 175: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing a HEIF photo -- save as JPEG

func applyPhotoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completion: () -> ()) {

guard let inputImage = CIImage(contentsOf: input.fullSizeImageURL!) else { fatalError("can't load input image") } let outputImage = inputImage .applyingOrientation(input.fullSizeImageOrientation) .applyingFilter(filterName, withInputParameters: nil)

// Write the edited image as a JPEG. do { try self.ciContext.writeJPEGRepresentation(of: outputImage, to: output.renderedContentURL, colorSpace: inputImage.colorSpace!, options: [:]) } catch let error { fatalError("can't apply filter to image: \(error)") } completion() }

Page 176: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing a HEIF photo -- save as JPEG

func applyPhotoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completion: () -> ()) {

guard let inputImage = CIImage(contentsOf: input.fullSizeImageURL!) else { fatalError("can't load input image") } let outputImage = inputImage .applyingOrientation(input.fullSizeImageOrientation) .applyingFilter(filterName, withInputParameters: nil)

// Write the edited image as a JPEG. do { try self.ciContext.writeJPEGRepresentation(of: outputImage, to: output.renderedContentURL, colorSpace: inputImage.colorSpace!, options: [:]) } catch let error { fatalError("can't apply filter to image: \(error)") } completion() }

Page 177: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing a HEIF photo -- save as JPEG

func applyPhotoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completion: () -> ()) {

guard let inputImage = CIImage(contentsOf: input.fullSizeImageURL!) else { fatalError("can't load input image") } let outputImage = inputImage .applyingOrientation(input.fullSizeImageOrientation) .applyingFilter(filterName, withInputParameters: nil)

// Write the edited image as a JPEG. do { try self.ciContext.writeJPEGRepresentation(of: outputImage, to: output.renderedContentURL, colorSpace: inputImage.colorSpace!, options: [:]) } catch let error { fatalError("can't apply filter to image: \(error)") } completion() }

Page 178: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Applying Adjustments

PHContentEditingOutput • Video rendered as H.264

Page 179: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing an HEVC video -- save as H.264

func applyVideoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completionHandler: @escaping () -> ()) {

guard let avAsset = input.audiovisualAsset else { fatalError("can't get AV asset") } let composition = AVVideoComposition(asset: avAsset, applyingCIFiltersWithHandler: { request in let img = request.sourceImage.applyingFilter(filterName, withInputParameters: nil) request.finish(with: img, context: nil) }) // Export the video composition to the output URL. guard let export = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetHighestQuality) else { fatalError("can't set up AV export session") } export.outputFileType = AVFileType.mov export.outputURL = output.renderedContentURL export.videoComposition = composition export.exportAsynchronously(completionHandler: completionHandler) }

Page 180: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing an HEVC video -- save as H.264

func applyVideoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completionHandler: @escaping () -> ()) {

guard let avAsset = input.audiovisualAsset else { fatalError("can't get AV asset") } let composition = AVVideoComposition(asset: avAsset, applyingCIFiltersWithHandler: { request in let img = request.sourceImage.applyingFilter(filterName, withInputParameters: nil) request.finish(with: img, context: nil) }) // Export the video composition to the output URL. guard let export = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetHighestQuality) else { fatalError("can't set up AV export session") } export.outputFileType = AVFileType.mov export.outputURL = output.renderedContentURL export.videoComposition = composition export.exportAsynchronously(completionHandler: completionHandler) }

Page 181: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing an HEVC video -- save as H.264

func applyVideoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completionHandler: @escaping () -> ()) {

guard let avAsset = input.audiovisualAsset else { fatalError("can't get AV asset") } let composition = AVVideoComposition(asset: avAsset, applyingCIFiltersWithHandler: { request in let img = request.sourceImage.applyingFilter(filterName, withInputParameters: nil) request.finish(with: img, context: nil) }) // Export the video composition to the output URL. guard let export = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetHighestQuality) else { fatalError("can't set up AV export session") } export.outputFileType = AVFileType.mov export.outputURL = output.renderedContentURL export.videoComposition = composition export.exportAsynchronously(completionHandler: completionHandler) }

Page 182: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing an HEVC video -- save as H.264

func applyVideoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completionHandler: @escaping () -> ()) {

guard let avAsset = input.audiovisualAsset else { fatalError("can't get AV asset") } let composition = AVVideoComposition(asset: avAsset, applyingCIFiltersWithHandler: { request in let img = request.sourceImage.applyingFilter(filterName, withInputParameters: nil) request.finish(with: img, context: nil) }) // Export the video composition to the output URL. guard let export = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetHighestQuality) else { fatalError("can't set up AV export session") } export.outputFileType = AVFileType.mov export.outputURL = output.renderedContentURL export.videoComposition = composition export.exportAsynchronously(completionHandler: completionHandler) }

Page 183: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Applying Adjustments

PHLivePhotoEditingContext • Uses CIImage frames, automatically converted

Page 184: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing a HEIF/HEVC live photo -- format handled automatically

func applyLivePhotoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completion: @escaping () -> ()) { guard let livePhotoContext = PHLivePhotoEditingContext(livePhotoEditingInput: input) else { fatalError("can't get live photo") } livePhotoContext.frameProcessor = { frame, _ in return frame.image.applyingFilter(filterName, withInputParameters: nil) } livePhotoContext.saveLivePhoto(to: output) { success, error in if success { completion() } else { print("can't output live photo") } } }

Page 185: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

// Editing a HEIF/HEVC live photo -- format handled automatically

func applyLivePhotoFilter(_ filterName: String, input: PHContentEditingInput, output: PHContentEditingOutput, completion: @escaping () -> ()) { guard let livePhotoContext = PHLivePhotoEditingContext(livePhotoEditingInput: input) else { fatalError("can't get live photo") } livePhotoContext.frameProcessor = { frame, _ in return frame.image.applyingFilter(filterName, withInputParameters: nil) } livePhotoContext.saveLivePhoto(to: output) { success, error in if success { completion() } else { print("can't output live photo") } } }

Page 186: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Common PhotoKit Workflows

Display • PHImageManager for UIImage, AVPlayerItem, or PHLivePhoto • No code changes needed

Page 187: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Backup • PHAssetResourceManager provides resources in native format

Common PhotoKit Workflows

Page 188: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Sharing

Common PhotoKit Workflows

Compatibility Features

Page 189: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Leaving the Garden

// for images, check the UTI and convert if needed: PHImageManager.default().requestImageData(for: asset, options: options, resultHandler: { imageData, dataUTI, orientation, info in guard let dataUTI = dataUTI else { return } if !UTTypeConformsTo(dataUTI as CFString, kUTTypeJPEG { // convert the data to a JPEG representation... } // for videos use export preset to specify the format PHImageManager.default().requestExportSession(forVideo: asset, options: options, exportPreset: AVAssetExportPresetHighestQuality, resultHandler: { exportSession, info in

Page 190: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Leaving the Garden

// for images, check the UTI and convert if needed: PHImageManager.default().requestImageData(for: asset, options: options, resultHandler: { imageData, dataUTI, orientation, info in guard let dataUTI = dataUTI else { return } if !UTTypeConformsTo(dataUTI as CFString, kUTTypeJPEG { // convert the data to a JPEG representation... } // for videos use export preset to specify the format PHImageManager.default().requestExportSession(forVideo: asset, options: options, exportPreset: AVAssetExportPresetHighestQuality, resultHandler: { exportSession, info in

Page 191: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

•Capturing HEIF

Page 192: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Brad Ford

•Compression Haiku Two

Page 193: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

111

Page 194: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF, a container,

111

Page 195: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF, a container,compresses four times better

111

Page 196: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF, a container,compresses four times betterthan HEVC

111

Page 197: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCapturePhotoOutput

Page 198: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCapturePhotoOutput

Page 199: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCapturePhotoOutput

Page 200: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

AVCaptureDeviceInput

AVCaptureDevice

AVCaptureSession

AVCapturePhotoOutput

Page 201: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEIF Capture Support

iPhone 7 Plus

iPhone 7

10.5-inch iPad Pro

12.9-inch iPad Pro

NEW

NEW

Page 202: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

AVCapturePhotoOutput Usage

Page 203: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

capturePhoto(with: delegate:)

flashMode = .auto, preview = 1440x1440

AVCapturePhotoCaptureDelegate

Time

AVCapturePhotoOutput Usage

Page 204: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

willBeginCaptureFor

AVCaptureResolvedPhotoSettings flashEnabled = true, preview = 1440x1080

Time

AVCapturePhotoCaptureDelegate

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 205: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

AVCapturePhotoCaptureDelegate

will

Begi

nCap

ture

For

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 206: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

AVCapturePhotoCaptureDelegate

will

Begi

nCap

ture

For willCapturePhotoFor

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 207: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

AVCapturePhotoCaptureDelegate

will

Begi

nCap

ture

For

will

Capt

ureP

hoto

For

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 208: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

didCapturePhotoFor

AVCapturePhotoCaptureDelegate

will

Begi

nCap

ture

For

will

Capt

ureP

hoto

For

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 209: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

will

Begi

nCap

ture

For

Time

will

Capt

ureP

hoto

For

didC

aptu

rePh

otoF

or

AVCapturePhotoCaptureDelegate

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 210: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

will

Begi

nCap

ture

For

Time

will

Capt

ureP

hoto

For

didC

aptu

rePh

otoF

or

didFinishProcessingPhoto

AVCapturePhotoCaptureDelegate

flashMode = .auto, preview = 1440x1440

CMSampleBuffer

CMSampleBuffer

AVCapturePhotoOutput Usage

Page 211: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

didF

inis

hPro

cess

ingP

hoto

will

Begi

nCap

ture

For

will

Capt

ureP

hoto

For

didC

aptu

rePh

otoF

or

AVCapturePhotoCaptureDelegate

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 212: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

didF

inis

hPro

cess

ingP

hoto

didFinishCaptureFor

will

Begi

nCap

ture

For

will

Capt

ureP

hoto

For

didC

aptu

rePh

otoF

or

AVCapturePhotoCaptureDelegate

flashMode = .auto, preview = 1440x1440

AVCapturePhotoOutput Usage

Page 213: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Time

AVCapturePhotoOutput Usage

Page 214: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Timewi

llBe

ginC

aptu

reFo

r

will

Capt

ureP

hoto

For

didC

aptu

rePh

otoF

or

didF

inis

hPro

cess

ingP

hoto

didF

inis

hCap

ture

For

AVCapturePhotoCaptureDelegate

AVCapturePhotoSettings

AVCapturePhotoOutput Usage

Page 215: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Timewi

llBe

ginC

aptu

reFo

r

will

Capt

ureP

hoto

For

didC

aptu

rePh

otoF

or

didF

inis

hPro

cess

ingP

hoto

didF

inis

hCap

ture

For

AVCapturePhotoCaptureDelegate

didF

inis

hRaw

Capt

ureF

or

AVCapturePhotoSettings

AVCapturePhotoOutput Usage

Page 216: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Timewi

llBe

ginC

aptu

reFo

r

will

Capt

ureP

hoto

For

didC

aptu

rePh

otoF

or

didF

inis

hPro

cess

ingP

hoto

didF

inis

hCap

ture

For

AVCapturePhotoCaptureDelegate

didF

inis

hPro

cess

ingL

iveP

hoto

Movi

e

didF

inis

hRaw

Capt

ureF

or

AVCapturePhotoSettings

AVCapturePhotoOutput Usage

Page 217: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

CMSampleBuffer

CMSampleBuffer vs. HEIF

Page 218: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

CMSampleBuffer

CMSampleBuffer vs. HEIF

Sample buffer contains media data

Page 219: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

CMSampleBuffer

CMSampleBuffer vs. HEIF

Sample buffer contains media data

HEIF contains a file structure

Page 220: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

CMSampleBuffer

CMSampleBuffer vs. HEIF

Sample buffer contains media data

HEIF contains a file structure

HEVC video is not the same as HEIF HEVC

Page 221: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)
Page 222: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)
Page 223: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

NEW

AVCapturePhoto

Page 224: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

NEW

Faster CMSampleBuffer replacement

AVCapturePhoto

Page 225: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

NEW

Faster CMSampleBuffer replacement

100% immutable

AVCapturePhoto

Page 226: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

NEW

Faster CMSampleBuffer replacement

100% immutable

Backed by containerized dataAVCapturePhoto

Page 227: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject {

open var timestamp: CMTime { get } open var isRawPhoto: Bool { get } open var pixelBuffer: CVPixelBuffer? { get }

open var previewPixelBuffer: CVPixelBuffer? { get } open var embeddedThumbnailPhotoFormat: [String : Any]? { get }

open var metadata: [String : Any] { get } open var depthData: AVDepthData? { get }

}

NEW

Page 228: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject {

open var timestamp: CMTime { get } open var isRawPhoto: Bool { get } open var pixelBuffer: CVPixelBuffer? { get }

open var previewPixelBuffer: CVPixelBuffer? { get } open var embeddedThumbnailPhotoFormat: [String : Any]? { get }

open var metadata: [String : Any] { get } open var depthData: AVDepthData? { get }

}

NEW

Page 229: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject {

open var timestamp: CMTime { get } open var isRawPhoto: Bool { get } open var pixelBuffer: CVPixelBuffer? { get }

open var previewPixelBuffer: CVPixelBuffer? { get } open var embeddedThumbnailPhotoFormat: [String : Any]? { get }

open var metadata: [String : Any] { get } open var depthData: AVDepthData? { get }

}

NEW

Page 230: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject {

open var timestamp: CMTime { get } open var isRawPhoto: Bool { get } open var pixelBuffer: CVPixelBuffer? { get }

open var previewPixelBuffer: CVPixelBuffer? { get } open var embeddedThumbnailPhotoFormat: [String : Any]? { get }

open var metadata: [String : Any] { get } open var depthData: AVDepthData? { get }

}

NEW

Page 231: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject { open var resolvedSettings: AVCaptureResolvedPhotoSettings { get } open var photoCount: Int { get }

open var bracketSettings: AVCaptureBracketedStillImageSettings? { get } open var sequenceCount: Int { get } open var lensStabilizationStatus: AVCaptureDevice.LensStabilizationStatus { get }

}

NEW

Page 232: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject { open var resolvedSettings: AVCaptureResolvedPhotoSettings { get } open var photoCount: Int { get }

open var bracketSettings: AVCaptureBracketedStillImageSettings? { get } open var sequenceCount: Int { get } open var lensStabilizationStatus: AVCaptureDevice.LensStabilizationStatus { get }

}

NEW

Page 233: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject { open var resolvedSettings: AVCaptureResolvedPhotoSettings { get } open var photoCount: Int { get }

open var bracketSettings: AVCaptureBracketedStillImageSettings? { get } open var sequenceCount: Int { get } open var lensStabilizationStatus: AVCaptureDevice.LensStabilizationStatus { get }

}

NEW

Page 234: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject {

open func fileDataRepresentation() -> Data?

open func cgImageRepresentation() -> Unmanaged<CGImage>? open func previewCGImageRepresentation() -> Unmanaged<CGImage>?

}

NEW

Page 235: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject {

open func fileDataRepresentation() -> Data?

open func cgImageRepresentation() -> Unmanaged<CGImage>? open func previewCGImageRepresentation() -> Unmanaged<CGImage>?

}

NEW

Page 236: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

open class AVCapturePhoto : NSObject {

open func fileDataRepresentation() -> Data?

open func cgImageRepresentation() -> Unmanaged<CGImage>? open func previewCGImageRepresentation() -> Unmanaged<CGImage>?

}

NEW

Page 237: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?)

Page 238: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?)

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingRawPhoto rawSampleBuffer: CMSampleBuffer?, previewPhoto: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?)

Page 239: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

iOS 10 AVCapturePhotoOutput Supported Formats

Image Format

Compressed Formats jpeg

Uncompressed Formats

420f/420v

BGRA

RAW Formats grb4/rgg4/bgg4/gbr4

Page 240: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

iOS 11 AVCapturePhotoOutput Supported Formats

Image Format File Container Format

Compressed Formats

hvc1 HEIC

jpeg JFIF

Uncompressed Formats

420f/420vTIFF

BGRA

RAW Formats grb4/rgg4/bgg4/gbr4 DNG

Page 241: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

iOS 11 AVCapturePhotoOutput Supported Formats

Image Format File Container Format

Compressed Formats

hvc1 HEIC

jpeg JFIF

Uncompressed Formats

420f/420vTIFF

BGRA

RAW Formats grb4/rgg4/bgg4/gbr4 DNG

Page 242: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Old Way

AVCapturePhotoOutput

Full Size JPEG CMSampleBuffer

Preview 420f CMSampleBuffer

Page 243: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Exif manipulation

Old Way

AVCapturePhotoOutput

Full Size JPEG CMSampleBuffer

Preview 420f CMSampleBuffer

Page 244: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Exif manipulation

JPEGDataPhotoRepresentation(for:, preview:)

Old Way

AVCapturePhotoOutput

Full Size JPEG CMSampleBuffer

Preview 420f CMSampleBuffer

Page 245: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Exif manipulation

JPEGDataPhotoRepresentation(for:, preview:)

Old Way

AVCapturePhotoOutput

Full Size JPEG CMSampleBuffer

Preview 420f CMSampleBuffer

Page 246: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

New Way

Page 247: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

New Way

AVCapturePhotoSettings

.format = [AVVideoCodecType: .hevc]

.metadata = [...]

.previewPhotoFormat = [1440x1440]

.embeddedThumbnailPhotoFormat = [320x320]

Page 248: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

New WayAVCapturePhotoOutput

AVCapturePhotoSettings

.format = [AVVideoCodecType: .hevc]

.metadata = [...]

.previewPhotoFormat = [1440x1440]

.embeddedThumbnailPhotoFormat = [320x320]

Page 249: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

New WayAVCapturePhotoOutput

AVCapturePhoto (HEIC containerized)

AVCapturePhotoSettings

.format = [AVVideoCodecType: .hevc]

.metadata = [...]

.previewPhotoFormat = [1440x1440]

.embeddedThumbnailPhotoFormat = [320x320]

Page 250: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

photo.fileDataRepresentation()

New WayAVCapturePhotoOutput

AVCapturePhoto (HEIC containerized)

AVCapturePhotoSettings

.format = [AVVideoCodecType: .hevc]

.metadata = [...]

.previewPhotoFormat = [1440x1440]

.embeddedThumbnailPhotoFormat = [320x320]

Page 251: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

photo.fileDataRepresentation()

New WayAVCapturePhotoOutput

AVCapturePhoto (HEIC containerized)

AVCapturePhotoSettings

.format = [AVVideoCodecType: .hevc]

.metadata = [...]

.previewPhotoFormat = [1440x1440]

.embeddedThumbnailPhotoFormat = [320x320]

Page 252: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Photos During Video Capture

HEVC/H.264 hardware resource contention • Video is prioritized • Photos are larger

Consider using JPEG for photos

Page 253: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

HEVC and HEIF Bursts

HEVC encode takes longer than JPEG

Recommendation for burst captures is to use JPEG

Page 254: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Brad Ford

•A Compression Essay on WWDC

Page 255: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)
Page 256: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

World Wide Developer Conference

Page 257: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

World Wide Developer ConferenceWWDC

Page 258: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

World Wide Developer ConferenceWWDCDub-Dub

Page 259: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

World Wide Developer ConferenceWWDCDub-DubWuh-Duck

Page 260: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Summary

HEVC movies are up to 40% smaller than H.264

HEVC playback is supported everywhere on iOS 11 and macOS High Sierra

Opt in to create HEVC content using capture and export APIs

HEIC files are twice as small as JPEGs

HEIF decode is supported everywhere on iOS 11 and macOS High Sierra

Capture HEIC files using the new AVCapturePhoto interface

Page 261: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

More Informationhttps://developer.apple.com/wwdc17/511

Page 262: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Related Sessions

High Efficiency Image File Format WWDC 2017 Video

Introducing HEIF and HEVC WWDC 2017

Depth and Capture WWDC 2017

Image Editing with Depth WWDC 2017

Page 263: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)

Labs

HEIF and HEVC Lab Technology Lab F Fri 12:00PM-2:00PM

Photos Depth & Capture Lab Technology Lab F Fri 2:00PM-4:00PM

Page 264: What is HEVC? - Apple Developer · HEVC Assets From Photos PhotoKit will deliver HEVC assets for playback // PHImageManager manager.requestPlayerItem(forVideo: asset, options: nil)