Attempting to improve performance by changing the initialization process
This commit is contained in:
parent
ac7836b3ca
commit
17789a064b
|
@ -65,6 +65,7 @@
|
|||
if ((self = [super init])) {
|
||||
self.manager = manager;
|
||||
[self.manager initializeCaptureSessionInput:AVMediaTypeVideo];
|
||||
[self.manager startSession];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
@ -93,6 +94,7 @@
|
|||
{
|
||||
[super removeFromSuperview];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
|
||||
[self.manager stopSession];
|
||||
}
|
||||
|
||||
- (void)orientationChanged:(NSNotification *)notification{
|
||||
|
|
|
@ -69,5 +69,7 @@ typedef NS_ENUM(NSInteger, RCTCameraTorchMode) {
|
|||
- (void)capture:(NSDictionary*)options callback:(RCTResponseSenderBlock)callback;
|
||||
- (void)initializeCaptureSessionInput:(NSString*)type;
|
||||
- (void)stopCapture;
|
||||
- (void)startSession;
|
||||
- (void)stopSession;
|
||||
|
||||
@end
|
||||
|
|
|
@ -105,47 +105,6 @@ RCT_EXPORT_VIEW_PROPERTY(torchMode, NSInteger);
|
|||
|
||||
self.sessionQueue = dispatch_queue_create("cameraManagerQueue", DISPATCH_QUEUE_SERIAL);
|
||||
|
||||
dispatch_async(self.sessionQueue, ^{
|
||||
|
||||
|
||||
if (self.presetCamera == AVCaptureDevicePositionUnspecified) {
|
||||
self.presetCamera = AVCaptureDevicePositionBack;
|
||||
}
|
||||
|
||||
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
|
||||
if ([self.session canAddOutput:stillImageOutput])
|
||||
{
|
||||
stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};
|
||||
[self.session addOutput:stillImageOutput];
|
||||
self.stillImageOutput = stillImageOutput;
|
||||
}
|
||||
|
||||
AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
|
||||
if ([self.session canAddOutput:movieFileOutput])
|
||||
{
|
||||
[self.session addOutput:movieFileOutput];
|
||||
self.movieFileOutput = movieFileOutput;
|
||||
}
|
||||
|
||||
AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
|
||||
if ([self.session canAddOutput:metadataOutput]) {
|
||||
[metadataOutput setMetadataObjectsDelegate:self queue:self.sessionQueue];
|
||||
[self.session addOutput:metadataOutput];
|
||||
[metadataOutput setMetadataObjectTypes:metadataOutput.availableMetadataObjectTypes];
|
||||
self.metadataOutput = metadataOutput;
|
||||
}
|
||||
|
||||
__weak RCTCameraManager *weakSelf = self;
|
||||
[self setRuntimeErrorHandlingObserver:[NSNotificationCenter.defaultCenter addObserverForName:AVCaptureSessionRuntimeErrorNotification object:self.session queue:nil usingBlock:^(NSNotification *note) {
|
||||
RCTCameraManager *strongSelf = weakSelf;
|
||||
dispatch_async(strongSelf.sessionQueue, ^{
|
||||
// Manually restarting the session since it must have been stopped due to an error.
|
||||
[strongSelf.session startRunning];
|
||||
});
|
||||
}]];
|
||||
|
||||
[self.session startRunning];
|
||||
});
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
@ -254,6 +213,62 @@ RCT_EXPORT_METHOD(stopCapture) {
|
|||
}
|
||||
}
|
||||
|
||||
- (void)startSession {
|
||||
dispatch_async(self.sessionQueue, ^{
|
||||
if (self.presetCamera == AVCaptureDevicePositionUnspecified) {
|
||||
self.presetCamera = AVCaptureDevicePositionBack;
|
||||
}
|
||||
|
||||
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
|
||||
if ([self.session canAddOutput:stillImageOutput])
|
||||
{
|
||||
stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};
|
||||
[self.session addOutput:stillImageOutput];
|
||||
self.stillImageOutput = stillImageOutput;
|
||||
}
|
||||
|
||||
AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
|
||||
if ([self.session canAddOutput:movieFileOutput])
|
||||
{
|
||||
[self.session addOutput:movieFileOutput];
|
||||
self.movieFileOutput = movieFileOutput;
|
||||
}
|
||||
|
||||
AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
|
||||
if ([self.session canAddOutput:metadataOutput]) {
|
||||
[metadataOutput setMetadataObjectsDelegate:self queue:self.sessionQueue];
|
||||
[self.session addOutput:metadataOutput];
|
||||
[metadataOutput setMetadataObjectTypes:metadataOutput.availableMetadataObjectTypes];
|
||||
self.metadataOutput = metadataOutput;
|
||||
}
|
||||
|
||||
__weak RCTCameraManager *weakSelf = self;
|
||||
[self setRuntimeErrorHandlingObserver:[NSNotificationCenter.defaultCenter addObserverForName:AVCaptureSessionRuntimeErrorNotification object:self.session queue:nil usingBlock:^(NSNotification *note) {
|
||||
RCTCameraManager *strongSelf = weakSelf;
|
||||
dispatch_async(strongSelf.sessionQueue, ^{
|
||||
// Manually restarting the session since it must have been stopped due to an error.
|
||||
[strongSelf.session startRunning];
|
||||
});
|
||||
}]];
|
||||
|
||||
[self.session startRunning];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)stopSession {
|
||||
dispatch_async(self.sessionQueue, ^{
|
||||
[self.previewLayer removeFromSuperlayer];
|
||||
[self.session stopRunning];
|
||||
for(AVCaptureInput *input in self.session.inputs) {
|
||||
[self.session removeInput:input];
|
||||
}
|
||||
|
||||
for(AVCaptureOutput *output in self.session.outputs) {
|
||||
[self.session removeOutput:output];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
- (void)initializeCaptureSessionInput:(NSString *)type {
|
||||
dispatch_async(self.sessionQueue, ^{
|
||||
NSError *error = nil;
|
||||
|
|
Loading…
Reference in New Issue