| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 using namespace webrtc::videocapturemodule; | 26 using namespace webrtc::videocapturemodule; |
| 27 | 27 |
| 28 @interface RTCVideoCaptureIosObjC (hidden) | 28 @interface RTCVideoCaptureIosObjC (hidden) |
| 29 - (int)changeCaptureInputWithName:(NSString*)captureDeviceName; | 29 - (int)changeCaptureInputWithName:(NSString*)captureDeviceName; |
| 30 @end | 30 @end |
| 31 | 31 |
| 32 @implementation RTCVideoCaptureIosObjC { | 32 @implementation RTCVideoCaptureIosObjC { |
| 33 webrtc::videocapturemodule::VideoCaptureIos* _owner; | 33 webrtc::videocapturemodule::VideoCaptureIos* _owner; |
| 34 webrtc::VideoCaptureCapability _capability; | 34 webrtc::VideoCaptureCapability _capability; |
| 35 AVCaptureSession* _captureSession; | 35 AVCaptureSession* _captureSession; |
| 36 int _captureId; | |
| 37 BOOL _orientationHasChanged; | 36 BOOL _orientationHasChanged; |
| 38 AVCaptureConnection* _connection; | 37 AVCaptureConnection* _connection; |
| 39 BOOL _captureChanging; // Guarded by _captureChangingCondition. | 38 BOOL _captureChanging; // Guarded by _captureChangingCondition. |
| 40 NSCondition* _captureChangingCondition; | 39 NSCondition* _captureChangingCondition; |
| 41 } | 40 } |
| 42 | 41 |
| 43 @synthesize frameRotation = _framRotation; | 42 @synthesize frameRotation = _framRotation; |
| 44 | 43 |
| 45 - (id)initWithOwner:(VideoCaptureIos*)owner captureId:(int)captureId { | 44 - (id)initWithOwner:(VideoCaptureIos*)owner { |
| 46 if (self == [super init]) { | 45 if (self == [super init]) { |
| 47 _owner = owner; | 46 _owner = owner; |
| 48 _captureId = captureId; | |
| 49 _captureSession = [[AVCaptureSession alloc] init]; | 47 _captureSession = [[AVCaptureSession alloc] init]; |
| 50 #if defined(WEBRTC_IOS) | 48 #if defined(WEBRTC_IOS) |
| 51 _captureSession.usesApplicationAudioSession = NO; | 49 _captureSession.usesApplicationAudioSession = NO; |
| 52 #endif | 50 #endif |
| 53 _captureChanging = NO; | 51 _captureChanging = NO; |
| 54 _captureChangingCondition = [[NSCondition alloc] init]; | 52 _captureChangingCondition = [[NSCondition alloc] init]; |
| 55 | 53 |
| 56 if (!_captureSession || !_captureChangingCondition) { | 54 if (!_captureSession || !_captureChangingCondition) { |
| 57 return nil; | 55 return nil; |
| 58 } | 56 } |
| 59 | 57 |
| 60 // create and configure a new output (using callbacks) | 58 // create and configure a new output (using callbacks) |
| 61 AVCaptureVideoDataOutput* captureOutput = | 59 AVCaptureVideoDataOutput* captureOutput = |
| 62 [[AVCaptureVideoDataOutput alloc] init]; | 60 [[AVCaptureVideoDataOutput alloc] init]; |
| 63 NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; | 61 NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; |
| 64 | 62 |
| 65 NSNumber* val = [NSNumber | 63 NSNumber* val = [NSNumber |
| 66 numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange]; | 64 numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange]; |
| 67 NSDictionary* videoSettings = | 65 NSDictionary* videoSettings = |
| 68 [NSDictionary dictionaryWithObject:val forKey:key]; | 66 [NSDictionary dictionaryWithObject:val forKey:key]; |
| 69 captureOutput.videoSettings = videoSettings; | 67 captureOutput.videoSettings = videoSettings; |
| 70 | 68 |
| 71 // add new output | 69 // add new output |
| 72 if ([_captureSession canAddOutput:captureOutput]) { | 70 if ([_captureSession canAddOutput:captureOutput]) { |
| 73 [_captureSession addOutput:captureOutput]; | 71 [_captureSession addOutput:captureOutput]; |
| 74 } else { | 72 } else { |
| 75 WEBRTC_TRACE(kTraceError, kTraceVideoCapture, _captureId, | 73 WEBRTC_TRACE(kTraceError, kTraceVideoCapture, 0, |
| 76 "%s:%s:%d Could not add output to AVCaptureSession ", | 74 "%s:%s:%d Could not add output to AVCaptureSession ", |
| 77 __FILE__, __FUNCTION__, __LINE__); | 75 __FILE__, __FUNCTION__, __LINE__); |
| 78 } | 76 } |
| 79 | 77 |
| 80 #ifdef WEBRTC_IOS | 78 #ifdef WEBRTC_IOS |
| 81 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; | 79 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; |
| 82 | 80 |
| 83 NSNotificationCenter* notify = [NSNotificationCenter defaultCenter]; | 81 NSNotificationCenter* notify = [NSNotificationCenter defaultCenter]; |
| 84 [notify addObserver:self | 82 [notify addObserver:self |
| 85 selector:@selector(onVideoError:) | 83 selector:@selector(onVideoError:) |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 _connection.videoOrientation = AVCaptureVideoOrientationPortrait; | 236 _connection.videoOrientation = AVCaptureVideoOrientationPortrait; |
| 239 } | 237 } |
| 240 break; | 238 break; |
| 241 } | 239 } |
| 242 #endif | 240 #endif |
| 243 } | 241 } |
| 244 | 242 |
| 245 - (void)onVideoError:(NSNotification*)notification { | 243 - (void)onVideoError:(NSNotification*)notification { |
| 246 NSLog(@"onVideoError: %@", notification); | 244 NSLog(@"onVideoError: %@", notification); |
| 247 // TODO(sjlee): make the specific error handling with this notification. | 245 // TODO(sjlee): make the specific error handling with this notification. |
| 248 WEBRTC_TRACE(kTraceError, kTraceVideoCapture, _captureId, | 246 WEBRTC_TRACE(kTraceError, kTraceVideoCapture, 0, |
| 249 "%s:%s:%d [AVCaptureSession startRunning] error.", __FILE__, | 247 "%s:%s:%d [AVCaptureSession startRunning] error.", __FILE__, |
| 250 __FUNCTION__, __LINE__); | 248 __FUNCTION__, __LINE__); |
| 251 } | 249 } |
| 252 | 250 |
| 253 - (BOOL)stopCapture { | 251 - (BOOL)stopCapture { |
| 254 #ifdef WEBRTC_IOS | 252 #ifdef WEBRTC_IOS |
| 255 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; | 253 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; |
| 256 #endif | 254 #endif |
| 257 _orientationHasChanged = NO; | 255 _orientationHasChanged = NO; |
| 258 [self waitForCaptureChangeToFinish]; | 256 [self waitForCaptureChangeToFinish]; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 | 300 |
| 303 // now create capture session input out of AVCaptureDevice | 301 // now create capture session input out of AVCaptureDevice |
| 304 NSError* deviceError = nil; | 302 NSError* deviceError = nil; |
| 305 AVCaptureDeviceInput* newCaptureInput = | 303 AVCaptureDeviceInput* newCaptureInput = |
| 306 [AVCaptureDeviceInput deviceInputWithDevice:captureDevice | 304 [AVCaptureDeviceInput deviceInputWithDevice:captureDevice |
| 307 error:&deviceError]; | 305 error:&deviceError]; |
| 308 | 306 |
| 309 if (!newCaptureInput) { | 307 if (!newCaptureInput) { |
| 310 const char* errorMessage = [[deviceError localizedDescription] UTF8String]; | 308 const char* errorMessage = [[deviceError localizedDescription] UTF8String]; |
| 311 | 309 |
| 312 WEBRTC_TRACE(kTraceError, kTraceVideoCapture, _captureId, | 310 WEBRTC_TRACE(kTraceError, kTraceVideoCapture, 0, |
| 313 "%s:%s:%d deviceInputWithDevice error:%s", __FILE__, | 311 "%s:%s:%d deviceInputWithDevice error:%s", __FILE__, |
| 314 __FUNCTION__, __LINE__, errorMessage); | 312 __FUNCTION__, __LINE__, errorMessage); |
| 315 | 313 |
| 316 return NO; | 314 return NO; |
| 317 } | 315 } |
| 318 | 316 |
| 319 // try to add our new capture device to the capture session | 317 // try to add our new capture device to the capture session |
| 320 [_captureSession beginConfiguration]; | 318 [_captureSession beginConfiguration]; |
| 321 | 319 |
| 322 BOOL addedCaptureInput = NO; | 320 BOOL addedCaptureInput = NO; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 } | 374 } |
| 377 | 375 |
| 378 - (void)waitForCaptureChangeToFinish { | 376 - (void)waitForCaptureChangeToFinish { |
| 379 [_captureChangingCondition lock]; | 377 [_captureChangingCondition lock]; |
| 380 while (_captureChanging) { | 378 while (_captureChanging) { |
| 381 [_captureChangingCondition wait]; | 379 [_captureChangingCondition wait]; |
| 382 } | 380 } |
| 383 [_captureChangingCondition unlock]; | 381 [_captureChangingCondition unlock]; |
| 384 } | 382 } |
| 385 @end | 383 @end |
| OLD | NEW |