Broadcast extension for AppRTCMobile on iOS

This provides an environment for testing out using WebRTC from an iOS
extension. It implements a ReplayKit broadcast extension for live
streaming games and screensharing.

The extension is only supported on iOS 11+ and is guarded by a build
flag.

Bug: webrtc:9335
Change-Id: Id218d6c73ef7599f5953c5a1e0e62e5d0dc4f10b
Reviewed-on: https://webrtc-review.googlesource.com/80000
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Patrik Höglund <phoglund@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23504}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 3d9e4ee..35124db 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -48,6 +48,12 @@
     ]
   }
 
+  config("used_from_extension") {
+    if (is_ios && rtc_apprtcmobile_broadcast_extension) {
+      cflags = [ "-fapplication-extension" ]
+    }
+  }
+
   rtc_static_library("common_objc") {
     sources = [
       "objc/Framework/Classes/Common/NSString+StdString.h",
@@ -71,7 +77,10 @@
       "../rtc_base:checks",
       "../rtc_base:rtc_base",
     ]
-    configs += [ "..:common_objc" ]
+    configs += [
+      "..:common_objc",
+      ":used_from_extension",
+    ]
 
     public_configs = [ ":common_config_objc" ]
 
@@ -176,7 +185,10 @@
           "objc/Framework/Headers/WebRTC/RTCAudioSession.h",
           "objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h",
         ]
-        configs += [ "..:common_objc" ]
+        configs += [
+          "..:common_objc",
+          ":used_from_extension",
+        ]
 
         public_configs = [ ":common_config_objc" ]
 
@@ -218,7 +230,10 @@
         "//third_party/libyuv",
       ]
 
-      configs += [ "..:common_objc" ]
+      configs += [
+        "..:common_objc",
+        ":used_from_extension",
+      ]
       if (!build_with_chromium && is_clang) {
         # Suppress warnings from the Chromium Clang plugin
         # (bugs.webrtc.org/163).
@@ -244,7 +259,10 @@
         "//rtc_base:rtc_base_approved",
         "//third_party/libyuv",
       ]
-      configs += [ "..:common_objc" ]
+      configs += [
+        "..:common_objc",
+        ":used_from_extension",
+      ]
     }
 
     rtc_static_library("video_objc") {
@@ -294,7 +312,10 @@
         "../rtc_base:rtc_base",
       ]
 
-      configs += [ "..:common_objc" ]
+      configs += [
+        "..:common_objc",
+        ":used_from_extension",
+      ]
       if (!build_with_chromium && is_clang) {
         # Suppress warnings from the Chromium Clang plugin
         # (bugs.webrtc.org/163).
@@ -629,7 +650,10 @@
         "objc/Framework/Headers/WebRTC/RTCMediaSource.h",
       ]
 
-      configs += [ "..:common_objc" ]
+      configs += [
+        "..:common_objc",
+        ":used_from_extension",
+      ]
       public_configs = [ ":common_config_objc" ]
 
       deps = [
@@ -734,7 +758,10 @@
         "objc/Framework/Headers/WebRTC/RTCVideoTrack.h",
       ]
 
-      configs += [ "..:common_objc" ]
+      configs += [
+        "..:common_objc",
+        ":used_from_extension",
+      ]
       public_configs = [ ":common_config_objc" ]
 
       if (!build_with_chromium && is_clang) {
@@ -1056,7 +1083,10 @@
           "GLKit.framework",
         ]
 
-        configs += [ "..:common_objc" ]
+        configs += [
+          "..:common_objc",
+          ":used_from_extension",
+        ]
 
         public_configs = [ ":common_config_objc" ]
 
@@ -1218,7 +1248,14 @@
         "objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm",
       ]
 
-      configs += [ "..:common_objc" ]
+      configs += [
+        "..:common_objc",
+        ":used_from_extension",
+      ]
+
+      if (is_ios && rtc_apprtcmobile_broadcast_extension) {
+        defines = [ "RTC_APPRTCMOBILE_BROADCAST_EXTENSION" ]
+      }
 
       deps = [
         ":common_objc",