Add an example app for iOS native API.

Demonstrates how to use the iOS native API to wrap components into
C++ classes.

This CL also introduces a native API wrapper for the capturer.

The C++ code is forked from the corresponding CL for Android at
https://webrtc-review.googlesource.com/c/src/+/60540

Bug: webrtc:8832
Change-Id: I12d9f30e701c0222628e329218f6d5bfca26e6e0
Reviewed-on: https://webrtc-review.googlesource.com/61422
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22484}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 1ef7de2..e052edf 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -296,13 +296,29 @@
       }
     }
 
+    rtc_static_library("videocapturebase_objc") {
+      visibility = [ "*" ]
+      sources = [
+        "objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m",
+        "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
+      ]
+      libs = [ "AVFoundation.framework" ]
+
+      configs += [ "..:common_objc" ]
+
+      public_configs = [ ":common_config_objc" ]
+
+      deps = [
+        ":common_objc",
+        ":videoframebuffer_objc",
+      ]
+    }
+
     rtc_static_library("videocapture_objc") {
       visibility = [ "*" ]
       sources = [
         "objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m",
-        "objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m",
         "objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
       ]
       if (is_ios) {
         sources += [
@@ -325,6 +341,7 @@
       deps = [
         ":common_objc",
         ":video_objc",
+        ":videocapturebase_objc",
         ":videoframebuffer_objc",
       ]
     }
@@ -922,6 +939,8 @@
     rtc_static_library("native_api") {
       visibility = [ "*" ]
       sources = [
+        "objc/Framework/Native/api/video_capturer.h",
+        "objc/Framework/Native/api/video_capturer.mm",
         "objc/Framework/Native/api/video_decoder_factory.h",
         "objc/Framework/Native/api/video_decoder_factory.mm",
         "objc/Framework/Native/api/video_encoder_factory.h",
@@ -946,9 +965,11 @@
 
       deps = [
         ":native_video",
+        ":videocapturebase_objc",
         ":videocodec_objc",
         ":videoframebuffer_objc",
         ":videorenderer_objc",
+        "../api:libjingle_peerconnection_api",
         "../api:video_frame_api",
         "../api/video_codecs:video_codecs_api",
         "../common_video",
@@ -984,6 +1005,7 @@
 
       deps = [
         ":common_objc",
+        ":videocapturebase_objc",
         ":videocodec_objc",
         ":videoframebuffer_objc",
         ":videorenderer_objc",
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m b/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
index 3f82cb7..527bc8a 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
@@ -46,6 +46,10 @@
 @synthesize frameQueue = _frameQueue;
 @synthesize captureSession = _captureSession;
 
+- (instancetype)init {
+  return [self initWithDelegate:nil captureSession:[[AVCaptureSession alloc] init]];
+}
+
 - (instancetype)initWithDelegate:(__weak id<RTCVideoCapturerDelegate>)delegate {
   return [self initWithDelegate:delegate captureSession:[[AVCaptureSession alloc] init]];
 }
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m
index 9d4d99d..3639fa7 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m
@@ -15,7 +15,6 @@
 @synthesize delegate = _delegate;
 
 - (instancetype)initWithDelegate:(id<RTCVideoCapturerDelegate>)delegate {
-  NSAssert(delegate != nil, @"delegate cannot be nil");
   if (self = [super init]) {
     _delegate = delegate;
   }
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCapturer.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoCapturer.h
index 3addec8..f0a2eaa 100644
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCapturer.h
+++ b/sdk/objc/Framework/Headers/WebRTC/RTCVideoCapturer.h
@@ -22,7 +22,7 @@
 RTC_EXPORT
 @interface RTCVideoCapturer : NSObject
 
-@property(nonatomic, readonly, weak) id<RTCVideoCapturerDelegate> delegate;
+@property(nonatomic, weak) id<RTCVideoCapturerDelegate> delegate;
 
 - (instancetype)initWithDelegate:(id<RTCVideoCapturerDelegate>)delegate;
 
diff --git a/sdk/objc/Framework/Native/api/video_capturer.h b/sdk/objc/Framework/Native/api/video_capturer.h
new file mode 100644
index 0000000..f601f18
--- /dev/null
+++ b/sdk/objc/Framework/Native/api/video_capturer.h
@@ -0,0 +1,28 @@
+/*
+ *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef SDK_OBJC_FRAMEWORK_NATIVE_API_VIDEO_CAPTURER_H_
+#define SDK_OBJC_FRAMEWORK_NATIVE_API_VIDEO_CAPTURER_H_
+
+#import "WebRTC/RTCVideoCapturer.h"
+
+#include "api/mediastreaminterface.h"
+#include "rtc_base/scoped_ref_ptr.h"
+
+namespace webrtc {
+
+rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> ObjCToNativeVideoCapturer(
+    RTCVideoCapturer* objc_video_capturer,
+    rtc::Thread* signaling_thread,
+    rtc::Thread* worker_thread);
+
+}  // namespace webrtc
+
+#endif  // SDK_OBJC_FRAMEWORK_NATIVE_API_VIDEO_CAPTURER_H_
diff --git a/sdk/objc/Framework/Native/api/video_capturer.mm b/sdk/objc/Framework/Native/api/video_capturer.mm
new file mode 100644
index 0000000..2d67f2d
--- /dev/null
+++ b/sdk/objc/Framework/Native/api/video_capturer.mm
@@ -0,0 +1,35 @@
+/*
+ *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "sdk/objc/Framework/Native/api/video_capturer.h"
+
+#include "api/videosourceproxy.h"
+#include "rtc_base/ptr_util.h"
+#include "sdk/objc/Framework/Native/src/objc_video_track_source.h"
+
+namespace webrtc {
+
+rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> ObjCToNativeVideoCapturer(
+    RTCVideoCapturer *objc_video_capturer,
+    rtc::Thread *signaling_thread,
+    rtc::Thread *worker_thread) {
+  RTCObjCVideoSourceAdapter *adapter = [[RTCObjCVideoSourceAdapter alloc] init];
+  rtc::scoped_refptr<webrtc::ObjCVideoTrackSource> objc_video_track_source(
+      new rtc::RefCountedObject<webrtc::ObjCVideoTrackSource>(adapter));
+  rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> video_source =
+      webrtc::VideoTrackSourceProxy::Create(
+          signaling_thread, worker_thread, objc_video_track_source);
+
+  objc_video_capturer.delegate = adapter;
+
+  return video_source;
+}
+
+}  // namespace webrtc
diff --git a/sdk/objc/Framework/Native/src/objc_video_track_source.h b/sdk/objc/Framework/Native/src/objc_video_track_source.h
index 8b0daeb..1062e96 100644
--- a/sdk/objc/Framework/Native/src/objc_video_track_source.h
+++ b/sdk/objc/Framework/Native/src/objc_video_track_source.h
@@ -11,17 +11,23 @@
 #ifndef SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJCVIDEOTRACKSOURCE_H_
 #define SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJCVIDEOTRACKSOURCE_H_
 
+#import "WebRTC/RTCVideoCapturer.h"
+
 #include "WebRTC/RTCMacros.h"
 #include "media/base/adaptedvideotracksource.h"
 #include "rtc_base/timestampaligner.h"
 
 RTC_FWD_DECL_OBJC_CLASS(RTCVideoFrame);
 
+@interface RTCObjCVideoSourceAdapter : NSObject<RTCVideoCapturerDelegate>
+@end
+
 namespace webrtc {
 
 class ObjCVideoTrackSource : public rtc::AdaptedVideoTrackSource {
  public:
   ObjCVideoTrackSource();
+  explicit ObjCVideoTrackSource(RTCObjCVideoSourceAdapter* adapter);
 
   // This class can not be used for implementing screen casting. Hopefully, this
   // function will be removed before we add that to iOS/Mac.
@@ -36,13 +42,16 @@
 
   bool remote() const override { return false; }
 
-  // Called by RTCVideoSource.
   void OnCapturedFrame(RTCVideoFrame* frame);
+
+  // Called by RTCVideoSource.
   void OnOutputFormatRequest(int width, int height, int fps);
 
  private:
   rtc::VideoBroadcaster broadcaster_;
   rtc::TimestampAligner timestamp_aligner_;
+
+  RTCObjCVideoSourceAdapter* adapter_;
 };
 
 }  // namespace webrtc
diff --git a/sdk/objc/Framework/Native/src/objc_video_track_source.mm b/sdk/objc/Framework/Native/src/objc_video_track_source.mm
index 72ed1bb..d3942df 100644
--- a/sdk/objc/Framework/Native/src/objc_video_track_source.mm
+++ b/sdk/objc/Framework/Native/src/objc_video_track_source.mm
@@ -16,10 +16,28 @@
 #include "api/video/i420_buffer.h"
 #include "sdk/objc/Framework/Native/src/objc_frame_buffer.h"
 
+@interface RTCObjCVideoSourceAdapter ()
+@property(nonatomic) webrtc::ObjCVideoTrackSource *objCVideoTrackSource;
+@end
+
+@implementation RTCObjCVideoSourceAdapter
+
+@synthesize objCVideoTrackSource = _objCVideoTrackSource;
+
+- (void)capturer:(RTCVideoCapturer *)capturer didCaptureVideoFrame:(RTCVideoFrame *)frame {
+  _objCVideoTrackSource->OnCapturedFrame(frame);
+}
+
+@end
+
 namespace webrtc {
 
 ObjCVideoTrackSource::ObjCVideoTrackSource() {}
 
+ObjCVideoTrackSource::ObjCVideoTrackSource(RTCObjCVideoSourceAdapter *adapter) : adapter_(adapter) {
+  adapter_.objCVideoTrackSource = this;
+}
+
 void ObjCVideoTrackSource::OnOutputFormatRequest(int width, int height, int fps) {
   cricket::VideoFormat format(width, height, cricket::VideoFormat::FpsToInterval(fps), 0);
   video_adapter()->OnOutputFormatRequest(format);