Create experimental Obj-C++ API.

This can be used to wrap Objective-C components in C++ classes, so users
can use the WebRTC C++ API directly together with the iOS specific
components provided by our SDK.

Bug: webrtc:8832
Change-Id: I6d34f7ec62d51df8d3a5340a2e17d30ae73e13e8
Reviewed-on: https://webrtc-review.googlesource.com/46162
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21850}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index fbc167c..0e26a4a 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -127,8 +127,6 @@
         "objc/Framework/Classes/Video/RTCCVPixelBuffer.mm",
         "objc/Framework/Classes/Video/RTCI420Buffer+Private.h",
         "objc/Framework/Classes/Video/RTCI420Buffer.mm",
-        "objc/Framework/Classes/Video/objc_frame_buffer.h",
-        "objc/Framework/Classes/Video/objc_frame_buffer.mm",
         "objc/Framework/Classes/Video/objcvideotracksource.h",
         "objc/Framework/Classes/Video/objcvideotracksource.mm",
         "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
@@ -136,6 +134,7 @@
 
       deps = [
         ":common_objc",
+        ":native_video",
         "../api:libjingle_peerconnection_api",
         "../api:video_frame_api",
         "../api:video_frame_api_i420",
@@ -195,6 +194,7 @@
 
       deps = [
         ":common_objc",
+        ":native_video",
         ":videotracksource_objc",
         "../api:libjingle_peerconnection_api",
         "../api:optional",
@@ -343,6 +343,8 @@
         ":common_objc",
         ":corevideoframebuffer_objc",
         ":default_codec_factory_objc",
+        ":native_api",
+        ":native_video",
         ":peerconnectionfactory_base_objc",
         ":video_objc",
         ":videotoolbox_objc",
@@ -442,6 +444,8 @@
       }
 
       deps = [
+        ":native_api",
+        ":native_video",
         ":peerconnectionfactory_base_objc",
         "../api:libjingle_peerconnection_api",
         "../api:peerconnection_and_implicit_call_api",
@@ -573,6 +577,8 @@
       deps = [
         ":common_objc",
         ":corevideoframebuffer_objc",
+        ":native_api",
+        ":native_video",
         ":videotracksource_objc",
         "../api:libjingle_peerconnection_api",
         "../api:peerconnection_and_implicit_call_api",
@@ -691,6 +697,7 @@
         defines = [ "GTEST_RELATIVE_PATH" ]
         deps = [
           ":common_objc",
+          ":native_video",
           ":peerconnection_objc",
           ":peerconnectionfactory_objc",
           ":videotoolbox_objc",
@@ -833,6 +840,70 @@
       }
     }
 
+    # The native API is currently experimental and may change without notice.
+    rtc_static_library("native_api") {
+      visibility = [ "*" ]
+      sources = [
+        "objc/Framework/Native/api/video_decoder_factory.h",
+        "objc/Framework/Native/api/video_decoder_factory.mm",
+        "objc/Framework/Native/api/video_encoder_factory.h",
+        "objc/Framework/Native/api/video_encoder_factory.mm",
+        "objc/Framework/Native/api/video_frame_buffer.h",
+        "objc/Framework/Native/api/video_frame_buffer.mm",
+      ]
+
+      configs += [ "..:common_objc" ]
+
+      public_configs = [ ":common_config_objc" ]
+
+      if (!build_with_chromium && is_clang) {
+        # Suppress warnings from the Chromium Clang plugin
+        # (bugs.webrtc.org/163).
+        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
+      }
+
+      deps = [
+        ":native_video",
+        "../api/video_codecs:video_codecs_api",
+        "../common_video",
+        "../rtc_base:rtc_base",
+      ]
+    }
+
+    rtc_static_library("native_video") {
+      sources = [
+        "objc/Framework/Native/src/objc_frame_buffer.h",
+        "objc/Framework/Native/src/objc_frame_buffer.mm",
+        "objc/Framework/Native/src/objc_video_decoder_factory.h",
+        "objc/Framework/Native/src/objc_video_decoder_factory.mm",
+        "objc/Framework/Native/src/objc_video_encoder_factory.h",
+        "objc/Framework/Native/src/objc_video_encoder_factory.mm",
+      ]
+
+      configs += [ "..:common_objc" ]
+
+      public_configs = [ ":common_config_objc" ]
+
+      if (!build_with_chromium && is_clang) {
+        # Suppress warnings from the Chromium Clang plugin
+        # (bugs.webrtc.org/163).
+        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
+      }
+
+      deps = [
+        ":common_objc",
+        "../api:video_frame_api",
+        "../api/video_codecs:video_codecs_api",
+        "../common_video",
+        "../media:rtc_audio_video",
+        "../media:rtc_media_base",
+        "../modules:module_api",
+        "../modules/video_coding:video_codec_interface",
+        "../rtc_base:checks",
+        "../rtc_base:rtc_base",
+      ]
+    }
+
     rtc_static_library("rtc_sdk_objc") {
       complete_static_lib = true
       deps = [
@@ -893,10 +964,6 @@
       sources = [
         "objc/Framework/Classes/VideoToolbox/RTCVideoDecoderH264.mm",
         "objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm",
-        "objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h",
-        "objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm",
-        "objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h",
-        "objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm",
         "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
       ]
 
@@ -904,6 +971,7 @@
 
       deps = [
         ":common_objc",
+        ":native_api",
         ":video_objc",
         ":video_toolbox_cc",
         ":videotracksource_objc",