Reland "Add completion callbacks to RTCCameraVideoCapturer start/stop operations"

This is a reland of e23a9e8f418ad758bc1be5b53184b69ad1dab1c2
Original change's description:
> Add completion callbacks to RTCCameraVideoCapturer start/stop operations
> 
> Bug: webrtc:8696
> Change-Id: I327ce11632fd0c71e28411d260094e87ede6b6b6
> Reviewed-on: https://webrtc-review.googlesource.com/37021
> Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
> Reviewed-by: Anders Carlsson <andersc@webrtc.org>
> Commit-Queue: Anders Carlsson <andersc@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#21546}

Bug: webrtc:8696
Change-Id: I48b4d140d870c9924ef0d76f4d282ff13951e083
Reviewed-on: https://webrtc-review.googlesource.com/38800
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21592}
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m b/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
index 7ee319f..89060ef 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
@@ -116,6 +116,17 @@
 - (void)startCaptureWithDevice:(AVCaptureDevice *)device
                         format:(AVCaptureDeviceFormat *)format
                            fps:(NSInteger)fps {
+  [self startCaptureWithDevice:device format:format fps:fps completionHandler:nil];
+}
+
+- (void)stopCapture {
+  [self stopCaptureWithCompletionHandler:nil];
+}
+
+- (void)startCaptureWithDevice:(AVCaptureDevice *)device
+                        format:(AVCaptureDeviceFormat *)format
+                           fps:(NSInteger)fps
+             completionHandler:(nullable void (^)(NSError *))completionHandler {
   _willBeRunning = YES;
   [RTCDispatcher
       dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
@@ -132,6 +143,9 @@
                       if (![_currentDevice lockForConfiguration:&error]) {
                         RTCLogError(
                             @"Failed to lock device %@. Error: %@", _currentDevice, error.userInfo);
+                        if (completionHandler) {
+                          completionHandler(error);
+                        }
                         return;
                       }
                       [self reconfigureCaptureSessionInput];
@@ -141,10 +155,13 @@
                       [_captureSession startRunning];
                       [_currentDevice unlockForConfiguration];
                       _isRunning = YES;
+                      if (completionHandler) {
+                        completionHandler(nil);
+                      }
                     }];
 }
 
-- (void)stopCapture {
+- (void)stopCaptureWithCompletionHandler:(nullable void (^)())completionHandler {
   _willBeRunning = NO;
   [RTCDispatcher
       dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
@@ -160,6 +177,9 @@
                       [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
 #endif
                       _isRunning = NO;
+                      if (completionHandler) {
+                        completionHandler();
+                      }
                     }];
 }
 
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h b/sdk/objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h
index 8f0f377..31b405c 100644
--- a/sdk/objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h
+++ b/sdk/objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h
@@ -32,12 +32,20 @@
 // Returns the most efficient supported output pixel format for this capturer.
 - (FourCharCode)preferredOutputPixelFormat;
 
-// Starts and stops the capture session asynchronously.
+// Starts the capture session asynchronously and notifies callback on completion.
 // The device will capture video in the format given in the `format` parameter. If the pixel format
 // in `format` is supported by the WebRTC pipeline, the same pixel format will be used for the
 // output. Otherwise, the format returned by `preferredOutputPixelFormat` will be used.
 - (void)startCaptureWithDevice:(AVCaptureDevice *)device
                         format:(AVCaptureDeviceFormat *)format
+                           fps:(NSInteger)fps
+             completionHandler:(nullable void (^)(NSError *))completionHandler;
+// Stops the capture session asynchronously and notifies callback on completion.
+- (void)stopCaptureWithCompletionHandler:(nullable void (^)())completionHandler;
+
+// Starts the capture session asynchronously.
+- (void)startCaptureWithDevice:(AVCaptureDevice *)device
+                        format:(AVCaptureDeviceFormat *)format
                            fps:(NSInteger)fps;
 // Stops the capture session asynchronously.
 - (void)stopCapture;