You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.9 KiB
90 lines
2.9 KiB
//
|
|
// SCManagedCaptureDeviceLockOnRecordExposureHandler.m
|
|
// Snapchat
|
|
//
|
|
// Created by Derek Peirce on 3/24/17.
|
|
// Copyright © 2017 Snapchat, Inc. All rights reserved.
|
|
//
|
|
|
|
#import "SCManagedCaptureDeviceLockOnRecordExposureHandler.h"
|
|
|
|
#import "AVCaptureDevice+ConfigurationLock.h"
|
|
#import "SCExposureState.h"
|
|
#import "SCManagedCaptureDeviceExposureHandler.h"
|
|
|
|
#import <SCFoundation/SCTrace.h>
|
|
|
|
@import AVFoundation;
|
|
|
|
@implementation SCManagedCaptureDeviceLockOnRecordExposureHandler {
|
|
CGPoint _exposurePointOfInterest;
|
|
AVCaptureDevice *_device;
|
|
// allows the exposure to change when the user taps to refocus
|
|
BOOL _allowTap;
|
|
SCExposureState *_exposureState;
|
|
}
|
|
|
|
- (instancetype)initWithDevice:(AVCaptureDevice *)device
|
|
pointOfInterest:(CGPoint)pointOfInterest
|
|
allowTap:(BOOL)allowTap
|
|
{
|
|
if (self = [super init]) {
|
|
_device = device;
|
|
_exposurePointOfInterest = pointOfInterest;
|
|
_allowTap = allowTap;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (CGPoint)getExposurePointOfInterest
|
|
{
|
|
return _exposurePointOfInterest;
|
|
}
|
|
|
|
- (void)setExposurePointOfInterest:(CGPoint)pointOfInterest fromUser:(BOOL)fromUser
|
|
{
|
|
SCTraceStart();
|
|
BOOL locked = _device.exposureMode == AVCaptureExposureModeLocked ||
|
|
_device.exposureMode == AVCaptureExposureModeCustom ||
|
|
_device.exposureMode == AVCaptureExposureModeAutoExpose;
|
|
if (!locked || (fromUser && _allowTap)) {
|
|
AVCaptureExposureMode exposureMode =
|
|
(locked ? AVCaptureExposureModeAutoExpose : AVCaptureExposureModeContinuousAutoExposure);
|
|
if ([_device isExposureModeSupported:exposureMode] && [_device isExposurePointOfInterestSupported]) {
|
|
[_device runTask:@"set exposure point"
|
|
withLockedConfiguration:^() {
|
|
// Set exposure point before changing focus mode
|
|
// Be noticed that order does matter
|
|
_device.exposurePointOfInterest = pointOfInterest;
|
|
_device.exposureMode = exposureMode;
|
|
}];
|
|
}
|
|
_exposurePointOfInterest = pointOfInterest;
|
|
}
|
|
}
|
|
|
|
- (void)setStableExposure:(BOOL)stableExposure
|
|
{
|
|
AVCaptureExposureMode exposureMode =
|
|
stableExposure ? AVCaptureExposureModeLocked : AVCaptureExposureModeContinuousAutoExposure;
|
|
if ([_device isExposureModeSupported:exposureMode]) {
|
|
[_device runTask:@"set stable exposure"
|
|
withLockedConfiguration:^() {
|
|
_device.exposureMode = exposureMode;
|
|
}];
|
|
}
|
|
}
|
|
|
|
- (void)setVisible:(BOOL)visible
|
|
{
|
|
if (visible) {
|
|
if (_device.exposureMode == AVCaptureExposureModeLocked ||
|
|
_device.exposureMode == AVCaptureExposureModeCustom) {
|
|
[_exposureState applyISOAndExposureDurationToDevice:_device];
|
|
}
|
|
} else {
|
|
_exposureState = [[SCExposureState alloc] initWithDevice:_device];
|
|
}
|
|
}
|
|
|
|
@end
|