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.
225 lines
11 KiB
225 lines
11 KiB
//
|
|
// SCManagedCapturer.h
|
|
// Snapchat
|
|
//
|
|
// Created by Liu Liu on 4/20/15.
|
|
// Copyright (c) 2015 Liu Liu. All rights reserved.
|
|
//
|
|
|
|
#import "SCCaptureCommon.h"
|
|
#import "SCSnapCreationTriggers.h"
|
|
|
|
#import <SCAudio/SCAudioConfiguration.h>
|
|
|
|
#import <AVFoundation/AVFoundation.h>
|
|
#import <Foundation/Foundation.h>
|
|
|
|
#define SCCapturerContext [NSString sc_stringWithFormat:@"%s/%d", __FUNCTION__, __LINE__]
|
|
|
|
@class SCBlackCameraDetector;
|
|
@protocol SCManagedCapturerListener
|
|
, SCManagedCapturerLensAPI, SCDeviceMotionProvider, SCFileInputDecider, SCManagedCapturerARImageCaptureProvider,
|
|
SCManagedCapturerGLViewManagerAPI, SCManagedCapturerLensAPIProvider, SCManagedCapturerLSAComponentTrackerAPI,
|
|
SCManagedCapturePreviewLayerControllerDelegate;
|
|
|
|
@protocol SCCapturer <NSObject>
|
|
|
|
@property (nonatomic, readonly) SCBlackCameraDetector *blackCameraDetector;
|
|
|
|
/**
|
|
* Returns id<SCLensProcessingCore> for the current capturer.
|
|
*/
|
|
- (id<SCManagedCapturerLensAPI>)lensProcessingCore;
|
|
|
|
- (CMTime)firstWrittenAudioBufferDelay;
|
|
- (BOOL)audioQueueStarted;
|
|
- (BOOL)isLensApplied;
|
|
- (BOOL)isVideoMirrored;
|
|
|
|
- (SCVideoCaptureSessionInfo)activeSession;
|
|
|
|
#pragma mark - Outside resources
|
|
|
|
- (void)setBlackCameraDetector:(SCBlackCameraDetector *)blackCameraDetector
|
|
deviceMotionProvider:(id<SCDeviceMotionProvider>)deviceMotionProvider
|
|
fileInputDecider:(id<SCFileInputDecider>)fileInputDecider
|
|
arImageCaptureProvider:(id<SCManagedCapturerARImageCaptureProvider>)arImageCaptureProvider
|
|
glviewManager:(id<SCManagedCapturerGLViewManagerAPI>)glViewManager
|
|
lensAPIProvider:(id<SCManagedCapturerLensAPIProvider>)lensAPIProvider
|
|
lsaComponentTracker:(id<SCManagedCapturerLSAComponentTrackerAPI>)lsaComponentTracker
|
|
managedCapturerPreviewLayerControllerDelegate:
|
|
(id<SCManagedCapturePreviewLayerControllerDelegate>)previewLayerControllerDelegate;
|
|
|
|
#pragma mark - Setup, Start & Stop
|
|
|
|
// setupWithDevicePositionAsynchronously will be called on the main thread, executed off the main thread, exactly once
|
|
- (void)setupWithDevicePositionAsynchronously:(SCManagedCaptureDevicePosition)devicePosition
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
/**
|
|
* Important: Remember to call stopRunningAsynchronously to stop the capture session. Dismissing the view is not enough
|
|
* @param identifier is for knowing the callsite. Pass in the classname of the callsite is generally suggested.
|
|
* Currently it is used for debugging purposes. In other words the capture session will work without it.
|
|
*/
|
|
- (SCCapturerToken *)startRunningAsynchronouslyWithCompletionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
- (void)stopRunningAsynchronously:(SCCapturerToken *)token
|
|
completionHandler:(sc_managed_capturer_stop_running_completion_handler_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)stopRunningAsynchronously:(SCCapturerToken *)token
|
|
completionHandler:(sc_managed_capturer_stop_running_completion_handler_t)completionHandler
|
|
after:(NSTimeInterval)delay
|
|
context:(NSString *)context;
|
|
|
|
- (void)startStreamingAsynchronouslyWithCompletionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)addSampleBufferDisplayController:(id<SCManagedSampleBufferDisplayController>)sampleBufferDisplayController
|
|
context:(NSString *)context;
|
|
|
|
#pragma mark - Recording / Capture
|
|
|
|
- (void)captureStillImageAsynchronouslyWithAspectRatio:(CGFloat)aspectRatio
|
|
captureSessionID:(NSString *)captureSessionID
|
|
completionHandler:
|
|
(sc_managed_capturer_capture_still_image_completion_handler_t)completionHandler
|
|
context:(NSString *)context;
|
|
/**
|
|
* Unlike captureStillImageAsynchronouslyWithAspectRatio, this captures a single frame from the ongoing video
|
|
* stream. This should be faster but lower quality (and smaller size), and does not play the shutter sound.
|
|
*/
|
|
- (void)captureSingleVideoFrameAsynchronouslyWithCompletionHandler:
|
|
(sc_managed_capturer_capture_video_frame_completion_handler_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)prepareForRecordingAsynchronouslyWithContext:(NSString *)context
|
|
audioConfiguration:(SCAudioConfiguration *)configuration;
|
|
- (void)startRecordingAsynchronouslyWithOutputSettings:(SCManagedVideoCapturerOutputSettings *)outputSettings
|
|
audioConfiguration:(SCAudioConfiguration *)configuration
|
|
maxDuration:(NSTimeInterval)maxDuration
|
|
fileURL:(NSURL *)fileURL
|
|
captureSessionID:(NSString *)captureSessionID
|
|
completionHandler:
|
|
(sc_managed_capturer_start_recording_completion_handler_t)completionHandler
|
|
context:(NSString *)context;
|
|
- (void)stopRecordingAsynchronouslyWithContext:(NSString *)context;
|
|
- (void)cancelRecordingAsynchronouslyWithContext:(NSString *)context;
|
|
|
|
- (void)startScanAsynchronouslyWithScanConfiguration:(SCScanConfiguration *)configuration context:(NSString *)context;
|
|
- (void)stopScanAsynchronouslyWithCompletionHandler:(dispatch_block_t)completionHandler context:(NSString *)context;
|
|
- (void)sampleFrameWithCompletionHandler:(void (^)(UIImage *frame, CMTime presentationTime))completionHandler
|
|
context:(NSString *)context;
|
|
|
|
// AddTimedTask will schedule a task to run, it is thread safe API. Your task will run on main thread, so it is not
|
|
// recommended to add large amount of tasks which all have the same task target time.
|
|
- (void)addTimedTask:(SCTimedTask *)task context:(NSString *)context;
|
|
|
|
// clearTimedTasks will cancel the tasks, it is thread safe API.
|
|
- (void)clearTimedTasksWithContext:(NSString *)context;
|
|
|
|
#pragma mark - Utilities
|
|
|
|
- (void)convertViewCoordinates:(CGPoint)viewCoordinates
|
|
completionHandler:(sc_managed_capturer_convert_view_coordniates_completion_handler_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)detectLensCategoryOnNextFrame:(CGPoint)point
|
|
lenses:(NSArray<SCLens *> *)lenses
|
|
completion:(sc_managed_lenses_processor_category_point_completion_handler_t)completion
|
|
context:(NSString *)context;
|
|
|
|
#pragma mark - Configurations
|
|
|
|
- (void)setDevicePositionAsynchronously:(SCManagedCaptureDevicePosition)devicePosition
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setFlashActive:(BOOL)flashActive
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setLensesActive:(BOOL)lensesActive
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setLensesActive:(BOOL)lensesActive
|
|
filterFactory:(SCLookseryFilterFactory *)filterFactory
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setLensesInTalkActive:(BOOL)lensesActive
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setTorchActiveAsynchronously:(BOOL)torchActive
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setNightModeActiveAsynchronously:(BOOL)active
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)lockZoomWithContext:(NSString *)context;
|
|
|
|
- (void)unlockZoomWithContext:(NSString *)context;
|
|
|
|
- (void)setZoomFactorAsynchronously:(CGFloat)zoomFactor context:(NSString *)context;
|
|
- (void)resetZoomFactorAsynchronously:(CGFloat)zoomFactor
|
|
devicePosition:(SCManagedCaptureDevicePosition)devicePosition
|
|
context:(NSString *)context;
|
|
|
|
- (void)setExposurePointOfInterestAsynchronously:(CGPoint)pointOfInterest
|
|
fromUser:(BOOL)fromUser
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setAutofocusPointOfInterestAsynchronously:(CGPoint)pointOfInterest
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)setPortraitModePointOfInterestAsynchronously:(CGPoint)pointOfInterest
|
|
completionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
- (void)continuousAutofocusAndExposureAsynchronouslyWithCompletionHandler:(dispatch_block_t)completionHandler
|
|
context:(NSString *)context;
|
|
|
|
// I need to call these three methods from SCAppDelegate explicitly so that I get the latest information.
|
|
- (void)applicationDidEnterBackground;
|
|
- (void)applicationWillEnterForeground;
|
|
- (void)applicationDidBecomeActive;
|
|
- (void)applicationWillResignActive;
|
|
- (void)mediaServicesWereReset;
|
|
- (void)mediaServicesWereLost;
|
|
|
|
#pragma mark - Add / Remove Listener
|
|
|
|
- (void)addListener:(id<SCManagedCapturerListener>)listener;
|
|
- (void)removeListener:(id<SCManagedCapturerListener>)listener;
|
|
- (void)addVideoDataSourceListener:(id<SCManagedVideoDataSourceListener>)listener;
|
|
- (void)removeVideoDataSourceListener:(id<SCManagedVideoDataSourceListener>)listener;
|
|
- (void)addDeviceCapacityAnalyzerListener:(id<SCManagedDeviceCapacityAnalyzerListener>)listener;
|
|
- (void)removeDeviceCapacityAnalyzerListener:(id<SCManagedDeviceCapacityAnalyzerListener>)listener;
|
|
|
|
- (NSString *)debugInfo;
|
|
|
|
- (id<SCManagedVideoDataSource>)currentVideoDataSource;
|
|
|
|
- (void)checkRestrictedCamera:(void (^)(BOOL, BOOL, AVAuthorizationStatus))callback;
|
|
|
|
// Need to be visible so that classes like SCCaptureSessionFixer can manage capture session
|
|
- (void)recreateAVCaptureSession;
|
|
|
|
#pragma mark - Snap Creation triggers
|
|
|
|
- (SCSnapCreationTriggers *)snapCreationTriggers;
|
|
|
|
@optional
|
|
|
|
- (BOOL)authorizedForVideoCapture;
|
|
|
|
- (void)preloadVideoCaptureAuthorization;
|
|
|
|
@end
|