| Index: webrtc/api/objc/avfoundationvideocapturer.mm | 
| diff --git a/webrtc/api/objc/avfoundationvideocapturer.mm b/webrtc/api/objc/avfoundationvideocapturer.mm | 
| index a3f0f44160b2e5c885da1bf6d66a2b9eb142b3d5..c466512bd0ed4976e9927a8eb1d6b54990607624 100644 | 
| --- a/webrtc/api/objc/avfoundationvideocapturer.mm | 
| +++ b/webrtc/api/objc/avfoundationvideocapturer.mm | 
| @@ -17,6 +17,7 @@ | 
| #import <UIKit/UIKit.h> | 
|  | 
| #import "webrtc/base/objc/RTCDispatcher.h" | 
| +#import "webrtc/base/objc/RTCLogging.h" | 
|  | 
| // TODO(tkchin): support other formats. | 
| static NSString* const kDefaultPreset = AVCaptureSessionPreset640x480; | 
| @@ -35,6 +36,7 @@ static cricket::VideoFormat const kDefaultFormat = | 
|  | 
| @property(nonatomic, readonly) AVCaptureSession *captureSession; | 
| @property(nonatomic, readonly) BOOL isRunning; | 
| +@property(nonatomic, readonly) BOOL canUseBackCamera; | 
| @property(nonatomic, assign) BOOL useBackCamera;  // Defaults to NO. | 
|  | 
| // We keep a pointer back to AVFoundationVideoCapturer to make callbacks on it | 
| @@ -88,10 +90,19 @@ static cricket::VideoFormat const kDefaultFormat = | 
| _capturer = nullptr; | 
| } | 
|  | 
| +- (BOOL)canUseBackCamera { | 
| +  return _backDeviceInput != nil; | 
| +} | 
| + | 
| - (void)setUseBackCamera:(BOOL)useBackCamera { | 
| if (_useBackCamera == useBackCamera) { | 
| return; | 
| } | 
| +  if (!self.canUseBackCamera) { | 
| +    RTCLog(@"No rear-facing camera exists or it cannot be used;" | 
| +           "not switching."); | 
| +    return; | 
| +  } | 
| _useBackCamera = useBackCamera; | 
| [self updateSessionInput]; | 
| } | 
| @@ -186,10 +197,15 @@ static cricket::VideoFormat const kDefaultFormat = | 
| frontCaptureDevice = captureDevice; | 
| } | 
| } | 
| -  if (!frontCaptureDevice || !backCaptureDevice) { | 
| -    NSLog(@"Failed to get capture devices."); | 
| +  if (!frontCaptureDevice) { | 
| +    RTCLog(@"Failed to get front capture device."); | 
| return NO; | 
| } | 
| +  if (!backCaptureDevice) { | 
| +    RTCLog(@"Failed to get back capture device"); | 
| +    // Don't return NO here because devices exist (16GB 5th generation iPod | 
| +    // Touch) that don't have a rear-facing camera. | 
| +  } | 
|  | 
| // Set up the session inputs. | 
| NSError *error = nil; | 
| @@ -201,18 +217,21 @@ static cricket::VideoFormat const kDefaultFormat = | 
| error.localizedDescription); | 
| return NO; | 
| } | 
| -  _backDeviceInput = | 
| -      [AVCaptureDeviceInput deviceInputWithDevice:backCaptureDevice | 
| -                                            error:&error]; | 
| -  if (!_backDeviceInput) { | 
| -    NSLog(@"Failed to get capture device input: %@", | 
| -          error.localizedDescription); | 
| -    return NO; | 
| +  if (backCaptureDevice) { | 
| +    error = nil; | 
| +    _backDeviceInput = | 
| +        [AVCaptureDeviceInput deviceInputWithDevice:backCaptureDevice | 
| +                                              error:&error]; | 
| +    if (error) { | 
| +      RTCLog(@"Failed to get capture device input: %@", | 
| +            error.localizedDescription); | 
| +      _backDeviceInput = nil; | 
| +    } | 
| } | 
|  | 
| // Add the inputs. | 
| if (![_captureSession canAddInput:_frontDeviceInput] || | 
| -      ![_captureSession canAddInput:_backDeviceInput]) { | 
| +      (_backDeviceInput && ![_captureSession canAddInput:_backDeviceInput])) { | 
| NSLog(@"Session does not support capture inputs."); | 
| return NO; | 
| } | 
| @@ -336,6 +355,10 @@ AVCaptureSession* AVFoundationVideoCapturer::GetCaptureSession() { | 
| return _capturer.captureSession; | 
| } | 
|  | 
| +bool AVFoundationVideoCapturer::CanUseBackCamera() const { | 
| +  return _capturer.canUseBackCamera; | 
| +} | 
| + | 
| void AVFoundationVideoCapturer::SetUseBackCamera(bool useBackCamera) { | 
| _capturer.useBackCamera = useBackCamera; | 
| } | 
|  |