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/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 4d21165..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"