Enable building WebRTC without built-in software codecs

This CL adds a GN build flag to include builtin software codecs
(enabled by default).

When setting the flag to false, libvpx can also be excluded. The
benefit is that the resulting binary is smaller.

Replaces https://webrtc-review.googlesource.com/c/src/+/29203

Bug: webrtc:7925
Change-Id: Id330ea8a43169e449ee139eca18e4557cc932e10
Reviewed-on: https://webrtc-review.googlesource.com/36340
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Patrik Höglund <phoglund@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21818}
diff --git a/BUILD.gn b/BUILD.gn
index 9e24f37..45069a4 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -212,6 +212,10 @@
     defines += [ "ENABLE_EXTERNAL_AUTH" ]
   }
 
+  if (rtc_use_builtin_sw_codecs) {
+    defines += [ "USE_BUILTIN_SW_CODECS" ]
+  }
+
   if (build_with_chromium) {
     defines += [
       # NOTICE: Since common_inherited_config is used in public_configs for our
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index 434c464..a8abe97 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -695,7 +695,6 @@
       "../api:video_frame_api",
       "../api/audio_codecs:builtin_audio_decoder_factory",
       "../api/audio_codecs:builtin_audio_encoder_factory",
-      "../common_video",
       "../media:rtc_audio_video",
       "../media:rtc_internal_video_codecs",
       "../media:rtc_media",
diff --git a/examples/unityplugin/simple_peer_connection.cc b/examples/unityplugin/simple_peer_connection.cc
index 71d4265..c5ea6f7 100644
--- a/examples/unityplugin/simple_peer_connection.cc
+++ b/examples/unityplugin/simple_peer_connection.cc
@@ -18,7 +18,7 @@
 #include "api/videosourceproxy.h"
 #include "media/engine/internaldecoderfactory.h"
 #include "media/engine/internalencoderfactory.h"
-#include "media/engine/stereocodecfactory.h"
+#include "media/engine/multiplexcodecfactory.h"
 #include "media/engine/webrtcvideocapturerfactory.h"
 #include "media/engine/webrtcvideodecoderfactory.h"
 #include "media/engine/webrtcvideoencoderfactory.h"
@@ -104,10 +104,10 @@
         nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
         webrtc::CreateBuiltinAudioDecoderFactory(),
         std::unique_ptr<webrtc::VideoEncoderFactory>(
-            new webrtc::StereoEncoderFactory(
+            new webrtc::MultiplexEncoderFactory(
                 rtc::MakeUnique<webrtc::InternalEncoderFactory>())),
         std::unique_ptr<webrtc::VideoDecoderFactory>(
-            new webrtc::StereoDecoderFactory(
+            new webrtc::MultiplexDecoderFactory(
                 rtc::MakeUnique<webrtc::InternalDecoderFactory>())),
         nullptr, nullptr);
   }
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 3fe8a86..371d2b1 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -170,19 +170,11 @@
     "engine/scopedvideodecoder.h",
     "engine/scopedvideoencoder.cc",
     "engine/scopedvideoencoder.h",
-    "engine/simulcast.cc",
-    "engine/simulcast.h",
     "engine/simulcast_encoder_adapter.cc",
     "engine/simulcast_encoder_adapter.h",
-    "engine/videodecodersoftwarefallbackwrapper.cc",
-    "engine/videodecodersoftwarefallbackwrapper.h",
-    "engine/videoencodersoftwarefallbackwrapper.cc",
-    "engine/videoencodersoftwarefallbackwrapper.h",
     "engine/vp8_encoder_simulcast_proxy.cc",
     "engine/vp8_encoder_simulcast_proxy.h",
-    "engine/webrtcvideodecoderfactory.cc",
     "engine/webrtcvideodecoderfactory.h",
-    "engine/webrtcvideoencoderfactory.cc",
     "engine/webrtcvideoencoderfactory.h",
   ]
 
@@ -207,6 +199,7 @@
   deps += [
     ":rtc_constants",
     ":rtc_media_base",
+    ":rtc_software_fallback_wrappers",
     "..:webrtc_common",
     "../api:video_frame_api_i420",
     "../api/video_codecs:video_codecs_api",
@@ -227,6 +220,32 @@
   ]
 }
 
+rtc_static_library("rtc_software_fallback_wrappers") {
+  sources = [
+    "engine/videodecodersoftwarefallbackwrapper.cc",
+    "engine/videodecodersoftwarefallbackwrapper.h",
+    "engine/videoencodersoftwarefallbackwrapper.cc",
+    "engine/videoencodersoftwarefallbackwrapper.h",
+  ]
+
+  configs += [ ":rtc_media_warnings_config" ]
+
+  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 = [
+    ":rtc_h264_profile_id",
+    ":rtc_media_base",
+    "../api/video_codecs:video_codecs_api",
+    "../modules/video_coding:video_codec_interface",
+    "../rtc_base:checks",
+    "../rtc_base:rtc_base_approved",
+    "../system_wrappers:field_trial_api",
+  ]
+}
+
 rtc_static_library("rtc_audio_video") {
   visibility = [ "*" ]
   defines = []
@@ -246,12 +265,18 @@
     "engine/nullwebrtcvideoengine.h",
     "engine/payload_type_mapper.cc",
     "engine/payload_type_mapper.h",
+    "engine/simulcast.cc",
+    "engine/simulcast.h",
     "engine/webrtcmediaengine.cc",
     "engine/webrtcmediaengine.h",
     "engine/webrtcvideocapturer.cc",
     "engine/webrtcvideocapturer.h",
     "engine/webrtcvideocapturerfactory.cc",
     "engine/webrtcvideocapturerfactory.h",
+    "engine/webrtcvideodecoderfactory.cc",
+    "engine/webrtcvideodecoderfactory.h",
+    "engine/webrtcvideoencoderfactory.cc",
+    "engine/webrtcvideoencoderfactory.h",
     "engine/webrtcvideoengine.cc",
     "engine/webrtcvideoengine.h",
     "engine/webrtcvoiceengine.cc",
@@ -299,10 +324,13 @@
   } else {
     deps += [ "../modules/audio_processing/aec_dump:null_aec_dump_factory" ]
   }
+  if (rtc_use_builtin_sw_codecs) {
+    deps += [ ":rtc_internal_video_codecs" ]
+  }
   deps += [
     ":rtc_constants",
-    ":rtc_internal_video_codecs",
     ":rtc_media_base",
+    ":rtc_software_fallback_wrappers",
     "..:webrtc_common",
     "../api:call_api",
     "../api:libjingle_peerconnection_api",
@@ -598,6 +626,7 @@
       ":rtc_media",
       ":rtc_media_base",
       ":rtc_media_tests_utils",
+      ":rtc_software_fallback_wrappers",
       "../api:libjingle_peerconnection_api",
       "../api:mock_video_codec_factory",
       "../api:video_frame_api",
@@ -613,7 +642,6 @@
       "../modules/audio_processing:audio_processing",
       "../modules/video_coding:simulcast_test_utility",
       "../modules/video_coding:video_coding_utility",
-      "../modules/video_coding:webrtc_vp8",
       "../modules/video_coding:webrtc_vp8_helpers",
       "../p2p:p2p_test_utils",
       "../rtc_base:rtc_base",
diff --git a/media/engine/internaldecoderfactory.cc b/media/engine/internaldecoderfactory.cc
index e8cecb7..04baffd 100644
--- a/media/engine/internaldecoderfactory.cc
+++ b/media/engine/internaldecoderfactory.cc
@@ -10,10 +10,13 @@
 
 #include "media/engine/internaldecoderfactory.h"
 
+#include "api/video_codecs/sdp_video_format.h"
 #include "media/base/mediaconstants.h"
+#if defined(USE_BUILTIN_SW_CODECS)
 #include "modules/video_coding/codecs/h264/include/h264.h"
-#include "modules/video_coding/codecs/vp8/include/vp8.h"
-#include "modules/video_coding/codecs/vp9/include/vp9.h"
+#include "modules/video_coding/codecs/vp8/include/vp8.h"  // nogncheck
+#include "modules/video_coding/codecs/vp9/include/vp9.h"  // nogncheck
+#endif
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 
@@ -22,16 +25,19 @@
 std::vector<SdpVideoFormat> InternalDecoderFactory::GetSupportedFormats()
     const {
   std::vector<SdpVideoFormat> formats;
+#if defined(USE_BUILTIN_SW_CODECS)
   formats.push_back(SdpVideoFormat(cricket::kVp8CodecName));
   if (VP9Decoder::IsSupported())
     formats.push_back(SdpVideoFormat(cricket::kVp9CodecName));
   for (const SdpVideoFormat& h264_format : SupportedH264Codecs())
     formats.push_back(h264_format);
+#endif
   return formats;
 }
 
 std::unique_ptr<VideoDecoder> InternalDecoderFactory::CreateVideoDecoder(
     const SdpVideoFormat& format) {
+#if defined(USE_BUILTIN_SW_CODECS)
   if (cricket::CodecNamesEq(format.name, cricket::kVp8CodecName))
     return VP8Decoder::Create();
 
@@ -42,6 +48,7 @@
 
   if (cricket::CodecNamesEq(format.name, cricket::kH264CodecName))
     return H264Decoder::Create();
+#endif
 
   RTC_LOG(LS_ERROR) << "Trying to create decoder for unsupported format";
   return nullptr;
diff --git a/media/engine/internalencoderfactory.cc b/media/engine/internalencoderfactory.cc
index 5f8479c..d093b25 100644
--- a/media/engine/internalencoderfactory.cc
+++ b/media/engine/internalencoderfactory.cc
@@ -12,9 +12,12 @@
 
 #include <utility>
 
+#include "api/video_codecs/sdp_video_format.h"
+#if defined(USE_BUILTIN_SW_CODECS)
 #include "modules/video_coding/codecs/h264/include/h264.h"
-#include "modules/video_coding/codecs/vp8/include/vp8.h"
-#include "modules/video_coding/codecs/vp9/include/vp9.h"
+#include "modules/video_coding/codecs/vp8/include/vp8.h"  // nogncheck
+#include "modules/video_coding/codecs/vp9/include/vp9.h"  // nogncheck
+#endif
 #include "rtc_base/logging.h"
 
 namespace webrtc {
@@ -22,12 +25,14 @@
 std::vector<SdpVideoFormat> InternalEncoderFactory::GetSupportedFormats()
     const {
   std::vector<SdpVideoFormat> supported_codecs;
+#if defined(USE_BUILTIN_SW_CODECS)
   supported_codecs.push_back(SdpVideoFormat(cricket::kVp8CodecName));
   if (webrtc::VP9Encoder::IsSupported())
     supported_codecs.push_back(SdpVideoFormat(cricket::kVp9CodecName));
 
   for (const webrtc::SdpVideoFormat& format : webrtc::SupportedH264Codecs())
     supported_codecs.push_back(format);
+#endif
 
   return supported_codecs;
 }
@@ -42,6 +47,7 @@
 
 std::unique_ptr<VideoEncoder> InternalEncoderFactory::CreateVideoEncoder(
     const SdpVideoFormat& format) {
+#if defined(USE_BUILTIN_SW_CODECS)
   if (cricket::CodecNamesEq(format.name, cricket::kVp8CodecName))
     return VP8Encoder::Create();
 
@@ -50,6 +56,7 @@
 
   if (cricket::CodecNamesEq(format.name, cricket::kH264CodecName))
     return H264Encoder::Create(cricket::VideoCodec(format));
+#endif
 
   RTC_LOG(LS_ERROR) << "Trying to created encoder of unsupported format "
                     << format.name;
diff --git a/media/engine/videodecodersoftwarefallbackwrapper.cc b/media/engine/videodecodersoftwarefallbackwrapper.cc
index 87fb622..1b87b97 100644
--- a/media/engine/videodecodersoftwarefallbackwrapper.cc
+++ b/media/engine/videodecodersoftwarefallbackwrapper.cc
@@ -13,7 +13,6 @@
 #include <string>
 #include <utility>
 
-#include "media/engine/internaldecoderfactory.h"
 #include "modules/video_coding/include/video_error_codes.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
diff --git a/media/engine/videoencodersoftwarefallbackwrapper.cc b/media/engine/videoencodersoftwarefallbackwrapper.cc
index a7a2ed0..75057a9 100644
--- a/media/engine/videoencodersoftwarefallbackwrapper.cc
+++ b/media/engine/videoencodersoftwarefallbackwrapper.cc
@@ -14,7 +14,6 @@
 #include <utility>
 
 #include "media/base/h264_profile_level_id.h"
-#include "media/engine/internalencoderfactory.h"
 #include "modules/video_coding/include/video_error_codes.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
diff --git a/media/engine/webrtcmediaengine.cc b/media/engine/webrtcmediaengine.cc
index 6c6464a..338c0d9 100644
--- a/media/engine/webrtcmediaengine.cc
+++ b/media/engine/webrtcmediaengine.cc
@@ -27,6 +27,7 @@
 
 namespace cricket {
 
+#if defined(USE_BUILTIN_SW_CODECS)
 namespace {
 
 MediaEngineInterface* CreateWebRtcMediaEngine(
@@ -86,6 +87,7 @@
       adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
       video_decoder_factory, audio_mixer, audio_processing);
 }
+#endif
 
 std::unique_ptr<MediaEngineInterface> WebRtcMediaEngineFactory::Create(
     rtc::scoped_refptr<webrtc::AudioDeviceModule> adm,
diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc
index 2357bdf..42a2a0b 100644
--- a/media/engine/webrtcvideoengine.cc
+++ b/media/engine/webrtcvideoengine.cc
@@ -25,7 +25,9 @@
 #include "call/call.h"
 #include "common_video/h264/profile_level_id.h"
 #include "media/engine/constants.h"
-#include "media/engine/convert_legacy_video_factory.h"
+#if defined(USE_BUILTIN_SW_CODECS)
+#include "media/engine/convert_legacy_video_factory.h"  // nogncheck
+#endif
 #include "media/engine/simulcast.h"
 #include "media/engine/webrtcmediaengine.h"
 #include "media/engine/webrtcvoiceengine.h"
@@ -46,6 +48,7 @@
 // webrtc:7925 is fixed.
 class DecoderFactoryAdapter {
  public:
+#if defined(USE_BUILTIN_SW_CODECS)
   explicit DecoderFactoryAdapter(
       std::unique_ptr<WebRtcVideoDecoderFactory> external_video_decoder_factory)
       : cricket_decoder_with_params_(new CricketDecoderWithParams(
@@ -53,6 +56,7 @@
         decoder_factory_(ConvertVideoDecoderFactory(
             std::unique_ptr<WebRtcVideoDecoderFactory>(
                 cricket_decoder_with_params_))) {}
+#endif
 
   explicit DecoderFactoryAdapter(
       std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory)
@@ -514,6 +518,7 @@
   }
 }
 
+#if defined(USE_BUILTIN_SW_CODECS)
 WebRtcVideoEngine::WebRtcVideoEngine(
     std::unique_ptr<WebRtcVideoEncoderFactory> external_video_encoder_factory,
     std::unique_ptr<WebRtcVideoDecoderFactory> external_video_decoder_factory)
@@ -523,6 +528,7 @@
           std::move(external_video_encoder_factory))) {
   RTC_LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
 }
+#endif
 
 WebRtcVideoEngine::WebRtcVideoEngine(
     std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
diff --git a/media/engine/webrtcvideoengine.h b/media/engine/webrtcvideoengine.h
index c6f5412..231ce67 100644
--- a/media/engine/webrtcvideoengine.h
+++ b/media/engine/webrtcvideoengine.h
@@ -96,11 +96,13 @@
 // WebRtcVideoEngine is used for the new native WebRTC Video API (webrtc:1667).
 class WebRtcVideoEngine {
  public:
+#if defined(USE_BUILTIN_SW_CODECS)
   // Internal SW video codecs will be added on top of the external codecs.
   WebRtcVideoEngine(
       std::unique_ptr<WebRtcVideoEncoderFactory> external_video_encoder_factory,
       std::unique_ptr<WebRtcVideoDecoderFactory>
           external_video_decoder_factory);
+#endif
 
   // These video codec factories represents all video codecs, i.e. both software
   // and external hardware codecs.
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index a588bc6..721773d 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -10,6 +10,8 @@
 
 rtc_static_library("video_coding") {
   visibility = [ "*" ]
+  deps = []
+
   sources = [
     "codec_database.cc",
     "codec_database.h",
@@ -88,16 +90,20 @@
     suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
   }
 
-  deps = [
+  if (rtc_use_builtin_sw_codecs) {
+    deps += [
+      ":webrtc_i420",
+      ":webrtc_vp8",
+      ":webrtc_vp9",
+    ]
+  }
+
+  deps += [
     ":codec_globals_headers",
     ":video_codec_interface",
     ":video_coding_utility",
     ":webrtc_h264",
-    ":webrtc_i420",
-    ":webrtc_multiplex",
-    ":webrtc_vp8",
     ":webrtc_vp8_helpers",
-    ":webrtc_vp9",
     "..:module_api",
     "..:module_api_public",
     "../..:webrtc_common",
@@ -320,31 +326,7 @@
 }
 
 # This target includes VP8 files that may be used for any VP8 codec, internal SW or external HW.
-rtc_source_set("webrtc_vp8_helpers") {
-  sources = [
-    "codecs/vp8/include/vp8_common_types.h",
-    "codecs/vp8/screenshare_layers.h",
-    "codecs/vp8/simulcast_rate_allocator.h",
-    "codecs/vp8/temporal_layers.h",
-  ]
-
-  deps = [
-    ":video_coding_utility",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../:typedefs",
-    "../../api/video_codecs:video_codecs_api",
-    "../../common_video",
-    "../../rtc_base:checks",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-    "../../system_wrappers:field_trial_api",
-    "../../system_wrappers:metrics_api",
-  ]
-}
-
-# This target includes the internal SW codec.
-rtc_static_library("webrtc_vp8") {
+rtc_static_library("webrtc_vp8_helpers") {
   visibility = [ "*" ]
   sources = [
     "codecs/vp8/default_temporal_layers.cc",
@@ -352,8 +334,47 @@
     "codecs/vp8/include/vp8.h",
     "codecs/vp8/include/vp8_common_types.h",
     "codecs/vp8/screenshare_layers.cc",
+    "codecs/vp8/screenshare_layers.h",
     "codecs/vp8/simulcast_rate_allocator.cc",
+    "codecs/vp8/simulcast_rate_allocator.h",
     "codecs/vp8/temporal_layers.cc",
+    "codecs/vp8/temporal_layers.h",
+  ]
+
+  # TODO(jschuh): Bug 1348: fix this warning.
+  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+
+  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 = [
+    ":video_codec_interface",
+    ":video_coding_utility",
+    "..:module_api",
+    "../..:webrtc_common",
+    "../../:typedefs",
+    "../../api:optional",
+    "../../api:video_frame_api",
+    "../../api/video_codecs:video_codecs_api",
+    "../../common_video",
+    "../../rtc_base:checks",
+    "../../rtc_base:rtc_base_approved",
+    "../../rtc_base:rtc_numerics",
+    "../../system_wrappers",
+    "../../system_wrappers:field_trial_api",
+    "../../system_wrappers:metrics_api",
+    "//third_party/libyuv",
+  ]
+}
+
+# This target includes the internal SW codec.
+rtc_static_library("webrtc_vp8") {
+  visibility = [ "*" ]
+  sources = [
+    "codecs/vp8/include/vp8.h",
+    "codecs/vp8/include/vp8_common_types.h",
     "codecs/vp8/vp8_impl.cc",
     "codecs/vp8/vp8_impl.h",
   ]
@@ -375,6 +396,7 @@
     "../../:typedefs",
     "../../api:optional",
     "../../api:video_frame_api",
+    "../../api/video_codecs:video_codecs_api",
     "../../common_video",
     "../../rtc_base:checks",
     "../../rtc_base:rtc_base_approved",
@@ -468,7 +490,6 @@
       ":mock_headers",
       ":video_codec_interface",
       ":video_coding",
-      ":webrtc_vp8",
       ":webrtc_vp8_helpers",
       "../../api:video_frame_api",
       "../../api:video_frame_api_i420",
@@ -502,7 +523,6 @@
       ":video_codec_interface",
       ":video_coding",
       ":video_coding_utility",
-      ":webrtc_vp8",
       ":webrtc_vp8_helpers",
       "../..:webrtc_common",
       "../../:typedefs",
@@ -510,7 +530,7 @@
       "../../api:video_frame_api_i420",
       "../../api/video_codecs:video_codecs_api",
       "../../common_video:common_video",
-      "../../media:rtc_internal_video_codecs",
+      "../../media:rtc_audio_video",
       "../../rtc_base:checks",
       "../../rtc_base:rtc_base_approved",
       "../../rtc_base:rtc_task_queue",
@@ -562,7 +582,6 @@
       ":video_coding_utility",
       ":webrtc_h264",
       ":webrtc_multiplex",
-      ":webrtc_vp8",
       ":webrtc_vp8_helpers",
       ":webrtc_vp9",
       "../..:webrtc_common",
@@ -576,6 +595,7 @@
       "../../media:rtc_h264_profile_id",
       "../../media:rtc_internal_video_codecs",
       "../../media:rtc_media_base",
+      "../../media:rtc_software_fallback_wrappers",
       "../../rtc_base:checks",
       "../../rtc_base:rtc_base",
       "../../rtc_base:rtc_base_tests_utils",
diff --git a/modules/video_coding/codec_database.cc b/modules/video_coding/codec_database.cc
index 0108019..0cf8d48 100644
--- a/modules/video_coding/codec_database.cc
+++ b/modules/video_coding/codec_database.cc
@@ -10,10 +10,13 @@
 
 #include "modules/video_coding/codec_database.h"
 
+#if defined(USE_BUILTIN_SW_CODECS)
 #include "modules/video_coding/codecs/h264/include/h264.h"
-#include "modules/video_coding/codecs/i420/include/i420.h"
-#include "modules/video_coding/codecs/vp8/include/vp8.h"
-#include "modules/video_coding/codecs/vp9/include/vp9.h"
+#include "modules/video_coding/codecs/i420/include/i420.h"  // nogncheck
+#include "modules/video_coding/codecs/vp8/include/vp8.h"    // nogncheck
+#include "modules/video_coding/codecs/vp9/include/vp9.h"    // nogncheck
+#endif
+
 #include "modules/video_coding/internal_defines.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
@@ -24,6 +27,7 @@
 
 namespace webrtc {
 
+#if defined(USE_BUILTIN_SW_CODECS)
 // Create an internal Decoder given a codec type
 static std::unique_ptr<VCMGenericDecoder> CreateDecoder(VideoCodecType type) {
   switch (type) {
@@ -48,6 +52,7 @@
   RTC_LOG(LS_WARNING) << "No internal decoder of this type exists.";
   return std::unique_ptr<VCMGenericDecoder>();
 }
+#endif
 
 VCMDecoderMapItem::VCMDecoderMapItem(VideoCodec* settings,
                                      int number_of_cores,
@@ -413,8 +418,12 @@
     ptr_decoder.reset(new VCMGenericDecoder(
         external_dec_item->external_decoder_instance, true));
   } else {
+#if !defined(USE_BUILTIN_SW_CODECS)
+    RTC_LOG(LS_ERROR) << "No decoder of this type exists.";
+#else
     // Create decoder.
     ptr_decoder = CreateDecoder(decoder_item->settings->codecType);
+#endif
   }
   if (!ptr_decoder)
     return nullptr;
diff --git a/modules/video_coding/video_codec_initializer.cc b/modules/video_coding/video_codec_initializer.cc
index 8a86571..d81358d 100644
--- a/modules/video_coding/video_codec_initializer.cc
+++ b/modules/video_coding/video_codec_initializer.cc
@@ -10,6 +10,7 @@
 
 #include "modules/video_coding/include/video_codec_initializer.h"
 
+#include "api/video_codecs/video_encoder.h"
 #include "common_types.h"  // NOLINT(build/include)
 #include "common_video/include/video_bitrate_allocator.h"
 #include "modules/video_coding/codecs/vp8/screenshare_layers.h"
diff --git a/modules/video_coding/video_sender.cc b/modules/video_coding/video_sender.cc
index 4d211655..bfc9615 100644
--- a/modules/video_coding/video_sender.cc
+++ b/modules/video_coding/video_sender.cc
@@ -14,7 +14,6 @@
 #include "common_types.h"  // NOLINT(build/include)
 #include "common_video/include/video_bitrate_allocator.h"
 #include "common_video/libyuv/include/webrtc_libyuv.h"
-#include "modules/video_coding/codecs/vp8/temporal_layers.h"
 #include "modules/video_coding/encoded_frame.h"
 #include "modules/video_coding/include/video_codec_interface.h"
 #include "modules/video_coding/utility/default_video_bitrate_allocator.h"
diff --git a/pc/createpeerconnectionfactory.cc b/pc/createpeerconnectionfactory.cc
index 3f389af..48867be 100644
--- a/pc/createpeerconnectionfactory.cc
+++ b/pc/createpeerconnectionfactory.cc
@@ -22,6 +22,7 @@
 
 namespace webrtc {
 
+#if defined(USE_BUILTIN_SW_CODECS)
 rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
     rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
     rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory) {
@@ -66,6 +67,7 @@
       network_thread, worker_thread, signaling_thread, std::move(media_engine),
       std::move(call_factory), std::move(event_log_factory));
 }
+#endif
 
 rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
     rtc::Thread* network_thread,
@@ -97,6 +99,7 @@
       std::move(call_factory), std::move(event_log_factory));
 }
 
+#if defined(USE_BUILTIN_SW_CODECS)
 rtc::scoped_refptr<PeerConnectionFactoryInterface>
 CreatePeerConnectionFactoryWithAudioMixer(
     rtc::Thread* network_thread,
@@ -128,5 +131,6 @@
       audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
       video_decoder_factory, nullptr);
 }
+#endif
 
 }  // namespace webrtc
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index e370a05..24f9206 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -320,17 +320,15 @@
     }
 
     rtc_static_library("peerconnectionfactory_objc") {
-      sources = [
-        "objc/Framework/Classes/PeerConnection/RTCDefaultVideoDecoderFactory.m",
-        "objc/Framework/Classes/PeerConnection/RTCDefaultVideoEncoderFactory.m",
+      sources = []
+      deps = []
+
+      sources += [
         "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h",
         "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h",
         "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm",
         "objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoCodecVP8.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoCodecVP9.mm",
       ]
-
       public_configs = [ ":common_config_objc" ]
 
       if (!build_with_chromium && is_clang) {
@@ -339,9 +337,10 @@
         suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
       }
 
-      deps = [
+      deps += [
         ":common_objc",
         ":corevideoframebuffer_objc",
+        ":default_codec_factory_objc",
         ":peerconnectionfactory_base_objc",
         ":video_objc",
         ":videotoolbox_objc",
@@ -354,8 +353,6 @@
         "../api/video_codecs:video_codecs_api",
         "../media:rtc_audio_video",
         "../media:rtc_media_base",
-        "../modules/video_coding:webrtc_vp8",
-        "../modules/video_coding:webrtc_vp9",
         "../pc:create_pc_factory",
         "../pc:peerconnection",
         "../rtc_base:rtc_base",
@@ -363,6 +360,59 @@
       ]
     }
 
+    rtc_static_library("default_codec_factory_objc") {
+      sources = [
+        "objc/Framework/Classes/PeerConnection/RTCDefaultVideoDecoderFactory.m",
+        "objc/Framework/Classes/PeerConnection/RTCDefaultVideoEncoderFactory.m",
+      ]
+
+      deps = [
+        ":common_objc",
+      ]
+      if (rtc_use_builtin_sw_codecs) {
+        deps += [
+          ":vp8",
+          ":vp9",
+        ]
+      }
+    }
+
+    rtc_static_library("vp8") {
+      sources = [
+        "objc/Framework/Classes/PeerConnection/RTCVideoCodecVP8.mm",
+      ]
+
+      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 = [
+        ":peerconnectionfactory_base_objc",
+        "../modules/video_coding:webrtc_vp8",
+        "../system_wrappers:metrics_default",
+      ]
+    }
+
+    rtc_static_library("vp9") {
+      sources = [
+        "objc/Framework/Classes/PeerConnection/RTCVideoCodecVP9.mm",
+      ]
+
+      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 = [
+        ":peerconnectionfactory_base_objc",
+        "../modules/video_coding:webrtc_vp9",
+        "../system_wrappers:metrics_default",
+      ]
+    }
+
     # Build the PeerConnectionFactory without audio/video support.
     # This target depends on the objc_peeerconnectionfactory_base which still
     # includes some audio/video related objects such as RTCAudioSource because
@@ -711,10 +761,6 @@
           "objc/Framework/Headers/WebRTC/RTCTracing.h",
           "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
           "objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoDecoderVP8.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoDecoderVP9.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoEncoderVP8.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoEncoderVP9.h",
           "objc/Framework/Headers/WebRTC/RTCVideoFrame.h",
           "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
           "objc/Framework/Headers/WebRTC/RTCVideoRenderer.h",
@@ -727,6 +773,14 @@
           common_objc_headers +=
               [ "objc/Framework/Headers/WebRTC/RTCMTLVideoView.h" ]
         }
+        if (rtc_use_builtin_sw_codecs) {
+          common_objc_headers += [
+            "objc/Framework/Headers/WebRTC/RTCVideoDecoderVP8.h",
+            "objc/Framework/Headers/WebRTC/RTCVideoDecoderVP9.h",
+            "objc/Framework/Headers/WebRTC/RTCVideoEncoderVP8.h",
+            "objc/Framework/Headers/WebRTC/RTCVideoEncoderVP9.h",
+          ]
+        }
         sources = common_objc_headers
         public_headers = common_objc_headers
 
@@ -848,13 +902,11 @@
         "../api/video_codecs:video_codecs_api",
         "../common_video",
         "../media:rtc_audio_video",
-        "../media:rtc_internal_video_codecs",
         "../media:rtc_media",
         "../media:rtc_media_base",
         "../modules:module_api",
         "../modules/video_coding:video_codec_interface",
         "../modules/video_coding:video_coding_utility",
-        "../modules/video_coding:webrtc_h264",
         "../rtc_base:checks",
         "../rtc_base:rtc_base_approved",
         "../system_wrappers",
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 635d29c..7a6c036 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -145,7 +145,6 @@
 generate_jni("generated_video_jni") {
   sources = [
     "api/org/webrtc/EncodedImage.java",
-    "api/org/webrtc/HardwareVideoEncoderFactory.java",
     "api/org/webrtc/MediaCodecVideoDecoder.java",
     "api/org/webrtc/MediaCodecVideoEncoder.java",
     "api/org/webrtc/SurfaceTextureHelper.java",
@@ -167,27 +166,24 @@
     "src/java/org/webrtc/EglBase14.java",
     "src/java/org/webrtc/NV12Buffer.java",
     "src/java/org/webrtc/NV21Buffer.java",
-    "src/java/org/webrtc/VP8Decoder.java",
-    "src/java/org/webrtc/VP8Encoder.java",
-    "src/java/org/webrtc/VP9Decoder.java",
-    "src/java/org/webrtc/VP9Encoder.java",
     "src/java/org/webrtc/VideoDecoderWrapper.java",
     "src/java/org/webrtc/VideoEncoderWrapper.java",
     "src/java/org/webrtc/WrappedNativeI420Buffer.java",
     "src/java/org/webrtc/WrappedNativeVideoDecoder.java",
     "src/java/org/webrtc/WrappedNativeVideoEncoder.java",
   ]
+  if (rtc_use_builtin_sw_codecs) {
+    sources += [ "api/org/webrtc/HardwareVideoEncoderFactory.java" ]  # TODO(andersc): This currently depends on SoftwareVideoEncoderFactory
+  }
   jni_package = ""
   jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
 }
 
 rtc_static_library("video_jni") {
-  sources = [
-    "src/jni/androidmediacodeccommon.h",
-    "src/jni/androidmediadecoder.cc",
-    "src/jni/androidmediadecoder_jni.h",
-    "src/jni/androidmediaencoder.cc",
-    "src/jni/androidmediaencoder_jni.h",
+  sources = []
+  deps = []
+
+  sources += [
     "src/jni/androidvideotracksource.cc",
     "src/jni/androidvideotracksource.h",
     "src/jni/encodedimage.cc",
@@ -217,8 +213,6 @@
     "src/jni/videoframe.cc",
     "src/jni/videoframe.h",
     "src/jni/videotrack.cc",
-    "src/jni/vp8codec.cc",
-    "src/jni/vp9codec.cc",
     "src/jni/wrapped_native_i420_buffer.cc",
     "src/jni/wrapped_native_i420_buffer.h",
     "src/jni/wrappednativecodec.cc",
@@ -246,7 +240,22 @@
     ]
   }
 
-  deps = [
+  if (rtc_use_builtin_sw_codecs) {
+    sources += [
+      "src/jni/androidmediacodeccommon.h",
+      "src/jni/androidmediadecoder.cc",
+      "src/jni/androidmediadecoder_jni.h",
+      "src/jni/androidmediaencoder.cc",
+      "src/jni/androidmediaencoder_jni.h",
+    ]
+
+    deps += [
+      ":vp8_jni",
+      ":vp9_jni",
+      "../../media:rtc_internal_video_codecs",
+    ]
+  }
+  deps += [
     ":base_jni",
     ":generated_video_jni",
     ":native_api_jni",
@@ -257,15 +266,13 @@
     "../../common_video:common_video",
     "../../media:rtc_audio_video",
     "../../media:rtc_h264_profile_id",
-    "../../media:rtc_internal_video_codecs",
     "../../media:rtc_media_base",
+    "../../media:rtc_software_fallback_wrappers",
     "../../modules:module_api",
     "../../modules/utility:utility",
     "../../modules/video_coding:codec_globals_headers",
     "../../modules/video_coding:video_codec_interface",
     "../../modules/video_coding:video_coding_utility",
-    "../../modules/video_coding:webrtc_vp8",
-    "../../modules/video_coding:webrtc_vp9",
     "../../rtc_base:checks",
     "../../rtc_base:rtc_base",
     "../../rtc_base:rtc_base_approved",
@@ -288,6 +295,66 @@
   ]
 }
 
+generate_jni("generated_vp8_jni") {
+  sources = [
+    "src/java/org/webrtc/VP8Decoder.java",
+    "src/java/org/webrtc/VP8Encoder.java",
+  ]
+
+  jni_package = ""
+  jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
+}
+
+rtc_static_library("vp8_jni") {
+  sources = [
+    "src/jni/vp8codec.cc",
+  ]
+
+  if (is_clang) {
+    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
+    suppressed_configs += [
+      "//build/config/clang:extra_warnings",
+      "//build/config/clang:find_bad_constructs",
+    ]
+  }
+
+  deps = [
+    ":base_jni",
+    ":generated_vp8_jni",
+    "../../modules/video_coding:webrtc_vp8",
+  ]
+}
+
+generate_jni("generated_vp9_jni") {
+  sources = [
+    "src/java/org/webrtc/VP9Decoder.java",
+    "src/java/org/webrtc/VP9Encoder.java",
+  ]
+
+  jni_package = ""
+  jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
+}
+
+rtc_static_library("vp9_jni") {
+  sources = [
+    "src/jni/vp9codec.cc",
+  ]
+
+  if (is_clang) {
+    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
+    suppressed_configs += [
+      "//build/config/clang:extra_warnings",
+      "//build/config/clang:find_bad_constructs",
+    ]
+  }
+
+  deps = [
+    ":base_jni",
+    ":generated_vp9_jni",
+    "../../modules/video_coding:webrtc_vp9",
+  ]
+}
+
 rtc_static_library("media_jni") {
   sources = [
     "src/jni/pc/media.cc",
@@ -366,6 +433,7 @@
   # made public because we don't have a proper NDK yet. Header APIs here are not
   # considered public and are subject to change.
   visibility = [ "*" ]
+
   sources = [
     "src/jni/androidnetworkmonitor_jni.h",
     "src/jni/pc/androidnetworkmonitor.cc",
@@ -567,8 +635,6 @@
     "api/org/webrtc/CameraEnumerator.java",
     "api/org/webrtc/CameraVideoCapturer.java",
     "api/org/webrtc/DataChannel.java",
-    "api/org/webrtc/DefaultVideoDecoderFactory.java",
-    "api/org/webrtc/DefaultVideoEncoderFactory.java",
     "api/org/webrtc/DtmfSender.java",
     "api/org/webrtc/EglBase.java",
     "api/org/webrtc/EglRenderer.java",
@@ -578,8 +644,6 @@
     "api/org/webrtc/GlShader.java",
     "api/org/webrtc/GlTextureFrameBuffer.java",
     "api/org/webrtc/GlUtil.java",
-    "api/org/webrtc/HardwareVideoDecoderFactory.java",
-    "api/org/webrtc/HardwareVideoEncoderFactory.java",
     "api/org/webrtc/IceCandidate.java",
     "api/org/webrtc/JavaI420Buffer.java",
     "api/org/webrtc/MediaCodecVideoDecoder.java",
@@ -604,8 +668,6 @@
     "api/org/webrtc/ScreenCapturerAndroid.java",
     "api/org/webrtc/SdpObserver.java",
     "api/org/webrtc/SessionDescription.java",
-    "api/org/webrtc/SoftwareVideoDecoderFactory.java",
-    "api/org/webrtc/SoftwareVideoEncoderFactory.java",
     "api/org/webrtc/StatsObserver.java",
     "api/org/webrtc/StatsReport.java",
     "api/org/webrtc/SurfaceEglRenderer.java",
@@ -661,11 +723,21 @@
     "src/java/org/webrtc/WrappedNativeI420Buffer.java",
     "src/java/org/webrtc/WrappedNativeVideoEncoder.java",
     "src/java/org/webrtc/WrappedNativeVideoDecoder.java",
-    "src/java/org/webrtc/VP8Encoder.java",
-    "src/java/org/webrtc/VP8Decoder.java",
-    "src/java/org/webrtc/VP9Encoder.java",
-    "src/java/org/webrtc/VP9Decoder.java",
   ]
+  if (rtc_use_builtin_sw_codecs) {
+    java_files += [
+      "api/org/webrtc/DefaultVideoDecoderFactory.java",
+      "api/org/webrtc/DefaultVideoEncoderFactory.java",
+      "api/org/webrtc/HardwareVideoDecoderFactory.java",  ## TODO(andersc): make this not depend on SoftwareVideoDecoderFactory
+      "api/org/webrtc/HardwareVideoEncoderFactory.java",  ## TODO(andersc): make this not depend on SoftwareVideoEncoderFactory
+      "api/org/webrtc/SoftwareVideoDecoderFactory.java",
+      "api/org/webrtc/SoftwareVideoEncoderFactory.java",
+      "src/java/org/webrtc/VP8Encoder.java",
+      "src/java/org/webrtc/VP8Decoder.java",
+      "src/java/org/webrtc/VP9Encoder.java",
+      "src/java/org/webrtc/VP9Decoder.java",
+    ]
+  }
 
   deps = [
     "../../modules/audio_device:audio_device_java",
diff --git a/sdk/android/src/jni/pc/media.cc b/sdk/android/src/jni/pc/media.cc
index 8d11a36..4705cf2 100644
--- a/sdk/android/src/jni/pc/media.cc
+++ b/sdk/android/src/jni/pc/media.cc
@@ -30,6 +30,7 @@
   return webrtc::CreateRtcEventLogFactory().release();
 }
 
+#if defined(USE_BUILTIN_SW_CODECS)
 cricket::MediaEngineInterface* CreateMediaEngine(
     AudioDeviceModule* adm,
     const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
@@ -42,6 +43,7 @@
       adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
       video_decoder_factory, audio_mixer, audio_processor);
 }
+#endif
 
 cricket::MediaEngineInterface* CreateMediaEngine(
     rtc::scoped_refptr<AudioDeviceModule> adm,
diff --git a/sdk/android/src/jni/pc/peerconnectionfactory.cc b/sdk/android/src/jni/pc/peerconnectionfactory.cc
index 33fa959..1a7008a 100644
--- a/sdk/android/src/jni/pc/peerconnectionfactory.cc
+++ b/sdk/android/src/jni/pc/peerconnectionfactory.cc
@@ -220,6 +220,7 @@
   cricket::WebRtcVideoDecoderFactory* legacy_video_decoder_factory = nullptr;
   std::unique_ptr<cricket::MediaEngineInterface> media_engine;
   if (jencoder_factory.is_null() && jdecoder_factory.is_null()) {
+#if defined(USE_BUILTIN_SW_CODECS)
     // This uses the legacy API, which automatically uses the internal SW
     // codecs in WebRTC.
     if (video_hw_acceleration_enabled) {
@@ -230,13 +231,16 @@
         adm, audio_encoder_factory, audio_decoder_factory,
         legacy_video_encoder_factory, legacy_video_decoder_factory, audio_mixer,
         audio_processor));
+#endif
   } else {
     // This uses the new API, does not automatically include software codecs.
     std::unique_ptr<VideoEncoderFactory> video_encoder_factory = nullptr;
     if (jencoder_factory.is_null()) {
+#if defined(USE_BUILTIN_SW_CODECS)
       legacy_video_encoder_factory = CreateLegacyVideoEncoderFactory();
       video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
           WrapLegacyVideoEncoderFactory(legacy_video_encoder_factory));
+#endif
     } else {
       video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
           CreateVideoEncoderFactory(jni, jencoder_factory));
@@ -244,9 +248,11 @@
 
     std::unique_ptr<VideoDecoderFactory> video_decoder_factory = nullptr;
     if (jdecoder_factory.is_null()) {
+#if defined(USE_BUILTIN_SW_CODECS)
       legacy_video_decoder_factory = CreateLegacyVideoDecoderFactory();
       video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
           WrapLegacyVideoDecoderFactory(legacy_video_decoder_factory));
+#endif
     } else {
       video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
           CreateVideoDecoderFactory(jni, jdecoder_factory));
@@ -483,12 +489,14 @@
     jlong native_factory,
     const JavaParamRef<jobject>& local_egl_context,
     const JavaParamRef<jobject>& remote_egl_context) {
+#if defined(USE_BUILTIN_SW_CODECS)
   OwnedFactoryAndThreads* owned_factory =
       reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
   SetEglContext(jni, owned_factory->legacy_encoder_factory(),
                 local_egl_context);
   SetEglContext(jni, owned_factory->legacy_decoder_factory(),
                 remote_egl_context);
+#endif
 }
 
 static jlong JNI_PeerConnectionFactory_GetNativePeerConnectionFactory(
diff --git a/sdk/android/src/jni/pc/video.cc b/sdk/android/src/jni/pc/video.cc
index d3eed5f..06dbc5c 100644
--- a/sdk/android/src/jni/pc/video.cc
+++ b/sdk/android/src/jni/pc/video.cc
@@ -16,7 +16,9 @@
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "api/videosourceproxy.h"
-#include "media/engine/convert_legacy_video_factory.h"
+#if defined(USE_BUILTIN_SW_CODECS)
+#include "media/engine/convert_legacy_video_factory.h"  // nogncheck
+#endif
 #include "media/engine/webrtcvideodecoderfactory.h"
 #include "media/engine/webrtcvideoencoderfactory.h"
 #include "rtc_base/logging.h"
@@ -46,6 +48,7 @@
 void SetEglContext(JNIEnv* env,
                    cricket::WebRtcVideoEncoderFactory* encoder_factory,
                    const JavaRef<jobject>& egl_context) {
+#if defined(USE_BUILTIN_SW_CODECS)
   if (encoder_factory) {
     MediaCodecVideoEncoderFactory* media_codec_factory =
         static_cast<MediaCodecVideoEncoderFactory*>(encoder_factory);
@@ -54,8 +57,14 @@
       media_codec_factory->SetEGLContext(env, egl_context.obj());
     }
   }
+#else
+  if (Java_Context_isEgl14Context(env, egl_context)) {
+    RTC_LOG(LS_INFO) << "Set EGL context for HW encoding.";
+  }
+#endif
 }
 
+#if defined(USE_BUILTIN_SW_CODECS)
 void SetEglContext(JNIEnv* env,
                    cricket::WebRtcVideoDecoderFactory* decoder_factory,
                    const JavaRef<jobject>& egl_context) {
@@ -68,6 +77,7 @@
     }
   }
 }
+#endif
 
 void* CreateVideoSource(JNIEnv* env,
                         rtc::Thread* signaling_thread,
@@ -81,6 +91,7 @@
       .release();
 }
 
+#if defined(USE_BUILTIN_SW_CODECS)
 cricket::WebRtcVideoEncoderFactory* CreateLegacyVideoEncoderFactory() {
   return new MediaCodecVideoEncoderFactory();
 }
@@ -104,6 +115,7 @@
                  legacy_decoder_factory))
       .release();
 }
+#endif
 
 }  // namespace jni
 }  // namespace webrtc
diff --git a/sdk/android/src/jni/vp8codec.cc b/sdk/android/src/jni/vp8codec.cc
index 3011222..295a03a 100644
--- a/sdk/android/src/jni/vp8codec.cc
+++ b/sdk/android/src/jni/vp8codec.cc
@@ -11,8 +11,8 @@
 #include <jni.h>
 
 #include "modules/video_coding/codecs/vp8/include/vp8.h"
-#include "sdk/android/generated_video_jni/jni/VP8Decoder_jni.h"
-#include "sdk/android/generated_video_jni/jni/VP8Encoder_jni.h"
+#include "sdk/android/generated_vp8_jni/jni/VP8Decoder_jni.h"
+#include "sdk/android/generated_vp8_jni/jni/VP8Encoder_jni.h"
 #include "sdk/android/src/jni/jni_helpers.h"
 
 namespace webrtc {
diff --git a/sdk/android/src/jni/vp9codec.cc b/sdk/android/src/jni/vp9codec.cc
index e49d276..d9cc387 100644
--- a/sdk/android/src/jni/vp9codec.cc
+++ b/sdk/android/src/jni/vp9codec.cc
@@ -11,8 +11,8 @@
 #include <jni.h>
 
 #include "modules/video_coding/codecs/vp9/include/vp9.h"
-#include "sdk/android/generated_video_jni/jni/VP9Decoder_jni.h"
-#include "sdk/android/generated_video_jni/jni/VP9Encoder_jni.h"
+#include "sdk/android/generated_vp9_jni/jni/VP9Decoder_jni.h"
+#include "sdk/android/generated_vp9_jni/jni/VP9Encoder_jni.h"
 #include "sdk/android/src/jni/jni_helpers.h"
 
 namespace webrtc {
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoDecoderFactory.m b/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoDecoderFactory.m
index ba27ad2..c412056 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoDecoderFactory.m
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoDecoderFactory.m
@@ -11,22 +11,26 @@
 #import "WebRTC/RTCVideoCodecFactory.h"
 
 #import "WebRTC/RTCVideoCodecH264.h"
+#if defined(USE_BUILTIN_SW_CODECS)
 #import "WebRTC/RTCVideoDecoderVP8.h"
 #if !defined(RTC_DISABLE_VP9)
 #import "WebRTC/RTCVideoDecoderVP9.h"
 #endif
+#endif
 
 @implementation RTCDefaultVideoDecoderFactory
 
 - (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info {
   if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
     return [[RTCVideoDecoderH264 alloc] init];
+#if defined(USE_BUILTIN_SW_CODECS)
   } else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) {
     return [RTCVideoDecoderVP8 vp8Decoder];
 #if !defined(RTC_DISABLE_VP9)
   } else if ([info.name isEqualToString:kRTCVideoCodecVp9Name]) {
     return [RTCVideoDecoderVP9 vp9Decoder];
 #endif
+#endif
   }
 
   return nil;
@@ -35,9 +39,11 @@
 - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
   return @[
     [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name],
+#if defined(USE_BUILTIN_SW_CODECS)
     [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp8Name],
 #if !defined(RTC_DISABLE_VP9)
-    [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name]
+    [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name],
+#endif
 #endif
   ];
 }
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoEncoderFactory.m b/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoEncoderFactory.m
index 154fac7..8148fc7 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoEncoderFactory.m
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCDefaultVideoEncoderFactory.m
@@ -12,10 +12,12 @@
 
 #import "WebRTC/RTCVideoCodec.h"
 #import "WebRTC/RTCVideoCodecH264.h"
+#if defined(USE_BUILTIN_SW_CODECS)
 #import "WebRTC/RTCVideoEncoderVP8.h"
 #if !defined(RTC_DISABLE_VP9)
 #import "WebRTC/RTCVideoEncoderVP9.h"
 #endif
+#endif
 
 @implementation RTCDefaultVideoEncoderFactory
 
@@ -40,30 +42,37 @@
       [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name
                                    parameters:constrainedBaselineParams];
 
+#if defined(USE_BUILTIN_SW_CODECS)
   RTCVideoCodecInfo *vp8Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp8Name];
 
 #if !defined(RTC_DISABLE_VP9)
   RTCVideoCodecInfo *vp9Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name];
 #endif
-
-  return @[ constrainedHighInfo,
-            constrainedBaselineInfo,
-            vp8Info,
-#if !defined(RTC_DISABLE_VP9)
-            vp9Info
 #endif
-            ];
+
+  return @[
+    constrainedHighInfo,
+    constrainedBaselineInfo,
+#if defined(USE_BUILTIN_SW_CODECS)
+    vp8Info,
+#if !defined(RTC_DISABLE_VP9)
+    vp9Info,
+#endif
+#endif
+  ];
 }
 
 - (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
   if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
     return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
+#if defined(USE_BUILTIN_SW_CODECS)
   } else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) {
     return [RTCVideoEncoderVP8 vp8Encoder];
 #if !defined(RTC_DISABLE_VP9)
   } else if ([info.name isEqualToString:kRTCVideoCodecVp9Name]) {
     return [RTCVideoEncoderVP9 vp9Encoder];
 #endif
+#endif
   }
 
   return nil;
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h
index 32e2390..3b0e930 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h
@@ -23,12 +23,14 @@
 
 }  // namespace webrtc
 
+#if defined(USE_BUILTIN_SW_CODECS)
 namespace cricket {
 
 class WebRtcVideoEncoderFactory;
 class WebRtcVideoDecoderFactory;
 
 }  // namespace cricket
+#endif
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -56,6 +58,7 @@
                             audioProcessingModule:
                                 (rtc::scoped_refptr<webrtc::AudioProcessing>)audioProcessingModule;
 
+#if defined(USE_BUILTIN_SW_CODECS)
 /* Initialize object with legacy injectable native audio/video encoder/decoder factories
    TODO(andersc): Remove this when backwards compatiblity is no longer needed.
  */
@@ -67,6 +70,7 @@
       legacyNativeVideoEncoderFactory:(cricket::WebRtcVideoEncoderFactory*)videoEncoderFactory
       legacyNativeVideoDecoderFactory:(cricket::WebRtcVideoDecoderFactory*)videoDecoderFactory
                     audioDeviceModule:(nullable webrtc::AudioDeviceModule *)audioDeviceModule;
+#endif
 
 @end
 
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm
index f9c75cfc..ec9d16c 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm
@@ -58,6 +58,17 @@
 - (instancetype)init {
 #ifdef HAVE_NO_MEDIA
   return [self initWithNoMedia];
+#elif !defined(USE_BUILTIN_SW_CODECS)
+  return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
+                       nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
+                       nativeVideoEncoderFactory:std::unique_ptr<webrtc::VideoEncoderFactory>(
+                                                     new webrtc::ObjCVideoEncoderFactory(
+                                                         [[RTCVideoEncoderFactoryH264 alloc] init]))
+                       nativeVideoDecoderFactory:std::unique_ptr<webrtc::VideoDecoderFactory>(
+                                                     new webrtc::ObjCVideoDecoderFactory(
+                                                         [[RTCVideoDecoderFactoryH264 alloc] init]))
+                               audioDeviceModule:nullptr
+                           audioProcessingModule:nullptr];
 #else
   return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
                        nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
@@ -139,6 +150,7 @@
   return [self initWithNoMedia];
 #else
   if (self = [self initNative]) {
+#if defined(USE_BUILTIN_SW_CODECS)
     if (!videoEncoderFactory) {
       auto legacy_video_encoder_factory = rtc::MakeUnique<webrtc::ObjCVideoEncoderFactory>(
           [[RTCVideoEncoderFactoryH264 alloc] init]);
@@ -149,6 +161,7 @@
           [[RTCVideoDecoderFactoryH264 alloc] init]);
       videoDecoderFactory = ConvertVideoDecoderFactory(std::move(legacy_video_decoder_factory));
     }
+#endif
     _nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(),
                                                          _workerThread.get(),
                                                          _signalingThread.get(),
@@ -165,6 +178,7 @@
 #endif
 }
 
+#if defined(USE_BUILTIN_SW_CODECS)
 - (instancetype)
     initWithNativeAudioEncoderFactory:
         (rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
@@ -190,6 +204,7 @@
   return self;
 #endif
 }
+#endif
 
 - (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints {
   std::unique_ptr<webrtc::MediaConstraints> nativeConstraints;
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 5155b78..5e597a8 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -87,7 +87,6 @@
     "../modules/utility",
     "../modules/video_coding",
     "../modules/video_coding:video_coding_utility",
-    "../modules/video_coding:webrtc_vp8_helpers",
     "../modules/video_processing",
     "../rtc_base:rtc_base_approved",
     "../rtc_base:rtc_numerics",
@@ -321,7 +320,6 @@
       "../modules/video_coding:video_codec_interface",
       "../modules/video_coding:video_coding_utility",
       "../modules/video_coding:webrtc_h264",
-      "../modules/video_coding:webrtc_vp8",
       "../modules/video_coding:webrtc_vp8_helpers",
       "../modules/video_coding:webrtc_vp9",
       "../rtc_base:checks",
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index 65700ef..9e0a8ae 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -19,7 +19,6 @@
 #include "common_video/include/video_bitrate_allocator.h"
 #include "common_video/include/video_frame.h"
 #include "modules/pacing/paced_sender.h"
-#include "modules/video_coding/codecs/vp8/temporal_layers.h"
 #include "modules/video_coding/include/video_codec_initializer.h"
 #include "modules/video_coding/include/video_coding.h"
 #include "modules/video_coding/include/video_coding_defines.h"
diff --git a/webrtc.gni b/webrtc.gni
index fb1d77c..5dc2675 100644
--- a/webrtc.gni
+++ b/webrtc.gni
@@ -139,6 +139,9 @@
   # as Chromium, must turn this flag off so that WebRTC does not also
   # initialize.
   rtc_initialize_ffmpeg = !build_with_chromium
+
+  # Disable this to build without support for built-in software codecs.
+  rtc_use_builtin_sw_codecs = true
 }
 
 if (!build_with_mozilla) {