blob: 72bec31d2fe6423b22727e69122edd06778a192c [file] [log] [blame]
kjellanderc76dc952016-06-03 03:09:32 -07001# Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
2#
3# Use of this source code is governed by a BSD-style license
4# that can be found in the LICENSE file in the root of the source
5# tree. An additional intellectual property rights grant can be found
6# in the file PATENTS. All contributing project authors may
7# be found in the AUTHORS file in the root of the source tree.
8
9import("//build/config/linux/pkg_config.gni")
mbonadei9aa3f0a2017-01-24 06:58:22 -080010import("../webrtc.gni")
kjellanderc76dc952016-06-03 03:09:32 -070011
12group("media") {
Dan Minor9c686132018-01-15 10:20:00 -050013 deps = []
14 if (!build_with_mozilla) {
15 deps += [
16 ":rtc_media",
17 ":rtc_media_base",
18 ]
19 }
kjellanderc76dc952016-06-03 03:09:32 -070020}
21
22config("rtc_media_defines_config") {
Fredrik Solenberge1dcce22019-02-05 12:43:03 +010023 defines = [ "HAVE_WEBRTC_VIDEO" ]
kjellanderc76dc952016-06-03 03:09:32 -070024}
25
Mirko Bonadei86d053c2019-10-17 21:32:04 +020026rtc_library("rtc_h264_profile_id") {
Per Kjellandera7f2d842018-01-10 15:54:53 +000027 visibility = [ "*" ]
zhihuang130ca7e2017-06-21 01:02:59 -070028 sources = [
29 "base/h264_profile_level_id.cc",
30 "base/h264_profile_level_id.h",
31 ]
32
zhihuang130ca7e2017-06-21 01:02:59 -070033 deps = [
34 "..:webrtc_common",
Artem Titov94b57c02019-03-21 13:35:10 +010035 "../rtc_base",
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +010036 "../rtc_base:checks",
ehmaldonadof6a861a2017-07-19 10:40:47 -070037 "../rtc_base:rtc_base_approved",
Mirko Bonadei276827c2018-10-16 14:13:50 +020038 "../rtc_base/system:rtc_export",
zhihuang130ca7e2017-06-21 01:02:59 -070039 ]
Mirko Bonadei2dcf3482020-06-05 14:30:41 +020040 absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
zhihuang130ca7e2017-06-21 01:02:59 -070041}
42
Niels Möller6daa2782018-01-23 10:37:42 +010043rtc_source_set("rtc_media_config") {
44 visibility = [ "*" ]
Mirko Bonadeiccbe95f2020-01-21 12:10:10 +010045 sources = [ "base/media_config.h" ]
Niels Möller6daa2782018-01-23 10:37:42 +010046}
47
Mirko Bonadei86d053c2019-10-17 21:32:04 +020048rtc_library("rtc_vp9_profile") {
Emircan Uysalerf73d40f2018-12-04 11:00:52 -050049 visibility = [ "*" ]
Emircan Uysaler98badbc2018-06-28 10:59:02 -070050 sources = [
51 "base/vp9_profile.cc",
52 "base/vp9_profile.h",
53 ]
54
55 deps = [
56 "..:webrtc_common",
57 "../api/video_codecs:video_codecs_api",
58 "../rtc_base:rtc_base_approved",
Mirko Bonadei66e76792019-04-02 11:33:59 +020059 "../rtc_base/system:rtc_export",
Emircan Uysaler98badbc2018-06-28 10:59:02 -070060 ]
Mirko Bonadei2dcf3482020-06-05 14:30:41 +020061 absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
Emircan Uysaler98badbc2018-06-28 10:59:02 -070062}
63
Johannes Kronc8f31342019-12-19 15:05:20 +010064rtc_library("rtc_sdp_fmtp_utils") {
65 visibility = [ "*" ]
66 sources = [
67 "base/sdp_fmtp_utils.cc",
68 "base/sdp_fmtp_utils.h",
69 ]
70
71 deps = [
72 "../api/video_codecs:video_codecs_api",
73 "../rtc_base:stringutils",
Johannes Kronc8f31342019-12-19 15:05:20 +010074 ]
Mirko Bonadei2dcf3482020-06-05 14:30:41 +020075 absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
Johannes Kronc8f31342019-12-19 15:05:20 +010076}
77
Mirko Bonadei86d053c2019-10-17 21:32:04 +020078rtc_library("rtc_media_base") {
Per Kjellandera7f2d842018-01-10 15:54:53 +000079 visibility = [ "*" ]
kjellanderc76dc952016-06-03 03:09:32 -070080 defines = []
81 libs = []
Patrik Höglunda8005cf2017-12-13 16:05:42 +010082 deps = [
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +020083 ":rtc_h264_profile_id",
84 ":rtc_media_config",
85 ":rtc_vp9_profile",
86 "..:webrtc_common",
Yves Gerey3e707812018-11-28 16:47:49 +010087 "../api:array_view",
Niels Möllera6fe2612018-01-19 11:28:54 +010088 "../api:audio_options_api",
Marina Cioceae77912b2020-02-27 16:16:55 +010089 "../api:frame_transformer_interface",
Niels Möllere942b142019-09-17 14:30:41 +020090 "../api:media_stream_interface",
Mirko Bonadeifcfeefe2019-09-10 10:51:23 +020091 "../api:rtc_error",
Niels Möller6dcd4dc2019-08-26 10:45:28 +020092 "../api:rtp_parameters",
Mirko Bonadeid9708072019-01-25 20:26:48 +010093 "../api:scoped_refptr",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +020094 "../api/audio_codecs:audio_codecs_api",
Mirko Bonadeieaaaf412019-09-13 14:42:15 +020095 "../api/crypto:frame_decryptor_interface",
96 "../api/crypto:frame_encryptor_interface",
97 "../api/crypto:options",
Patrik Höglund56d94522019-11-18 15:53:32 +010098 "../api/transport:stun_types",
Niels Möllera8370302019-09-02 15:16:49 +020099 "../api/transport/rtp:rtp_source",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200100 "../api/video:video_bitrate_allocation",
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200101 "../api/video:video_bitrate_allocator_factory",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200102 "../api/video:video_frame",
103 "../api/video:video_frame_i420",
Chen Xing5d24b162019-06-10 12:59:38 +0200104 "../api/video:video_rtp_headers",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200105 "../api/video_codecs:video_codecs_api",
106 "../call:call_interfaces",
Markus Handell32565f62019-12-04 10:58:17 +0100107 "../call:video_stream_api",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200108 "../common_video",
109 "../modules/audio_processing:audio_processing_statistics",
Henrik Boström87e3f9d2019-05-27 10:44:24 +0200110 "../modules/rtp_rtcp:rtp_rtcp_format",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200111 "../rtc_base",
Patrik Höglunda8005cf2017-12-13 16:05:42 +0100112 "../rtc_base:checks",
Tommi8d2c5a82018-03-19 11:12:48 +0100113 "../rtc_base:rtc_base_approved",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200114 "../rtc_base:rtc_base_approved",
Tommi8d2c5a82018-03-19 11:12:48 +0100115 "../rtc_base:rtc_task_queue",
Patrik Höglunda8005cf2017-12-13 16:05:42 +0100116 "../rtc_base:sanitizer",
Patrik Höglund3e113432017-12-15 14:40:10 +0100117 "../rtc_base:stringutils",
Markus Handell1e257ca2020-07-07 15:43:11 +0200118 "../rtc_base/synchronization:mutex",
Sebastian Janssonb55015e2019-04-09 13:44:04 +0200119 "../rtc_base/synchronization:sequence_checker",
Niels Möllere8e4dc42019-06-11 14:04:16 +0200120 "../rtc_base/system:file_wrapper",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200121 "../rtc_base/system:rtc_export",
122 "../rtc_base/third_party/sigslot",
Åsa Persson3f7e0ed2019-10-18 15:03:13 +0200123 "../system_wrappers:field_trial",
Mirko Bonadei2dcf3482020-06-05 14:30:41 +0200124 ]
125 absl_deps = [
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200126 "//third_party/abseil-cpp/absl/algorithm:container",
127 "//third_party/abseil-cpp/absl/strings",
128 "//third_party/abseil-cpp/absl/types:optional",
Patrik Höglunda8005cf2017-12-13 16:05:42 +0100129 ]
kjellanderc76dc952016-06-03 03:09:32 -0700130 sources = [
Steve Anton10542f22019-01-11 09:11:00 -0800131 "base/adapted_video_track_source.cc",
132 "base/adapted_video_track_source.h",
133 "base/audio_source.h",
kjellanderc76dc952016-06-03 03:09:32 -0700134 "base/codec.cc",
135 "base/codec.h",
Ruslan Burakov493a6502019-02-27 15:32:48 +0100136 "base/delayable.h",
Steve Anton10542f22019-01-11 09:11:00 -0800137 "base/media_channel.cc",
138 "base/media_channel.h",
139 "base/media_constants.cc",
140 "base/media_constants.h",
141 "base/media_engine.cc",
142 "base/media_engine.h",
143 "base/rid_description.cc",
144 "base/rid_description.h",
145 "base/rtp_data_engine.cc",
146 "base/rtp_data_engine.h",
147 "base/rtp_utils.cc",
148 "base/rtp_utils.h",
149 "base/stream_params.cc",
150 "base/stream_params.h",
151 "base/turn_utils.cc",
152 "base/turn_utils.h",
153 "base/video_adapter.cc",
154 "base/video_adapter.h",
155 "base/video_broadcaster.cc",
156 "base/video_broadcaster.h",
Steve Anton10542f22019-01-11 09:11:00 -0800157 "base/video_common.cc",
158 "base/video_common.h",
159 "base/video_source_base.cc",
160 "base/video_source_base.h",
magjed0928a3c2016-11-25 00:40:18 -0800161 ]
magjed0928a3c2016-11-25 00:40:18 -0800162}
163
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200164rtc_library("rtc_constants") {
magjed0928a3c2016-11-25 00:40:18 -0800165 defines = []
166 libs = []
Anders Carlssona114c882018-01-04 15:10:22 +0100167 deps = []
magjed0928a3c2016-11-25 00:40:18 -0800168 sources = [
mallikarjun829deda482017-11-20 17:48:13 +0530169 "engine/constants.cc",
charujain66748462017-09-14 13:53:02 -0700170 "engine/constants.h",
Anders Carlssona114c882018-01-04 15:10:22 +0100171 ]
172}
173
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200174rtc_library("rtc_simulcast_encoder_adapter") {
Jonathan Yu9a5da492018-10-19 00:51:18 -0700175 visibility = [ "*" ]
176 defines = []
177 libs = []
178 sources = [
179 "engine/simulcast_encoder_adapter.cc",
180 "engine/simulcast_encoder_adapter.h",
181 ]
182 deps = [
Rasmus Brandt5cad55b2019-12-19 09:47:11 +0100183 ":rtc_media_base",
Elad Alon8f01c4e2019-06-28 15:19:43 +0200184 "../api:fec_controller_api",
Mirko Bonadeid9708072019-01-25 20:26:48 +0100185 "../api:scoped_refptr",
Erik Språngf93eda12019-01-16 17:10:57 +0100186 "../api/video:video_codec_constants",
Yves Gerey3e707812018-11-28 16:47:49 +0100187 "../api/video:video_frame",
Jonathan Yu9a5da492018-10-19 00:51:18 -0700188 "../api/video:video_frame_i420",
Chen Xing5d24b162019-06-10 12:59:38 +0200189 "../api/video:video_rtp_headers",
Erik Språngf4e0c292019-10-01 18:50:03 +0200190 "../api/video_codecs:rtc_software_fallback_wrappers",
Jonathan Yu9a5da492018-10-19 00:51:18 -0700191 "../api/video_codecs:video_codecs_api",
Markus Handell32565f62019-12-04 10:58:17 +0100192 "../call:video_stream_api",
Jonathan Yu9a5da492018-10-19 00:51:18 -0700193 "../modules/video_coding:video_codec_interface",
194 "../modules/video_coding:video_coding_utility",
195 "../rtc_base:checks",
196 "../rtc_base:rtc_base_approved",
Erik Språng7f24fb92019-02-13 10:49:37 +0100197 "../rtc_base/experiments:rate_control_settings",
Sebastian Janssonb55015e2019-04-09 13:44:04 +0200198 "../rtc_base/synchronization:sequence_checker",
Mirko Bonadei66e76792019-04-02 11:33:59 +0200199 "../rtc_base/system:rtc_export",
Jonathan Yu9a5da492018-10-19 00:51:18 -0700200 "../system_wrappers",
201 "../system_wrappers:field_trial",
Jonathan Yu9a5da492018-10-19 00:51:18 -0700202 ]
Mirko Bonadei2dcf3482020-06-05 14:30:41 +0200203 absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
Jonathan Yu9a5da492018-10-19 00:51:18 -0700204}
205
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200206rtc_library("rtc_encoder_simulcast_proxy") {
Florent Castellie7862cc2018-12-06 13:38:24 +0100207 visibility = [ "*" ]
208 defines = []
209 libs = []
210 sources = [
211 "engine/encoder_simulcast_proxy.cc",
212 "engine/encoder_simulcast_proxy.h",
213 ]
214 deps = [
215 ":rtc_simulcast_encoder_adapter",
Florent Castellie7862cc2018-12-06 13:38:24 +0100216 "../api/video:video_bitrate_allocation",
217 "../api/video:video_frame",
Chen Xing5d24b162019-06-10 12:59:38 +0200218 "../api/video:video_rtp_headers",
Florent Castellie7862cc2018-12-06 13:38:24 +0100219 "../api/video_codecs:video_codecs_api",
220 "../modules/video_coding:video_codec_interface",
Mirko Bonadei66e76792019-04-02 11:33:59 +0200221 "../rtc_base/system:rtc_export",
Florent Castellie7862cc2018-12-06 13:38:24 +0100222 ]
Florent Castellie7862cc2018-12-06 13:38:24 +0100223}
224
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200225rtc_library("rtc_internal_video_codecs") {
Per Kjellandera0f5f602018-01-10 15:57:32 +0000226 visibility = [ "*" ]
Karl Wiberg7ba22b82018-04-27 04:31:53 +0200227 allow_poison = [ "software_video_codecs" ]
Anders Carlssona114c882018-01-04 15:10:22 +0100228 defines = []
229 libs = []
Patrik Höglund99175c62018-01-08 11:05:10 +0100230 deps = [
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200231 ":rtc_constants",
Florent Castellie7862cc2018-12-06 13:38:24 +0100232 ":rtc_encoder_simulcast_proxy",
Mirko Bonadei75baa492018-01-11 17:07:30 +0100233 ":rtc_h264_profile_id",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200234 ":rtc_media_base",
Jonathan Yu9a5da492018-10-19 00:51:18 -0700235 ":rtc_simulcast_encoder_adapter",
Yves Gerey3e707812018-11-28 16:47:49 +0100236 "../:webrtc_common",
237 "../api/video:encoded_image",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200238 "../api/video:video_bitrate_allocation",
Yves Gerey3e707812018-11-28 16:47:49 +0100239 "../api/video:video_frame",
Chen Xing5d24b162019-06-10 12:59:38 +0200240 "../api/video:video_rtp_headers",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200241 "../api/video_codecs:rtc_software_fallback_wrappers",
242 "../api/video_codecs:video_codecs_api",
243 "../call:call_interfaces",
244 "../call:video_stream_api",
245 "../modules:module_api",
Patrik Höglund99175c62018-01-08 11:05:10 +0100246 "../modules/video_coding:video_codec_interface",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200247 "../modules/video_coding:webrtc_h264",
248 "../modules/video_coding:webrtc_multiplex",
249 "../modules/video_coding:webrtc_vp8",
250 "../modules/video_coding:webrtc_vp9",
Danil Chapovalovc46385c2020-03-11 10:45:57 +0100251 "../modules/video_coding/codecs/av1:libaom_av1_decoder",
Danil Chapovalov4553f452020-04-01 18:15:32 +0200252 "../modules/video_coding/codecs/av1:libaom_av1_encoder",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200253 "../rtc_base:checks",
254 "../rtc_base:deprecation",
255 "../rtc_base:rtc_base_approved",
256 "../rtc_base/system:rtc_export",
257 "../test:fake_video_codecs",
Patrik Höglund99175c62018-01-08 11:05:10 +0100258 ]
Mirko Bonadei2dcf3482020-06-05 14:30:41 +0200259 absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
Anders Carlssona114c882018-01-04 15:10:22 +0100260 sources = [
Emircan Uysaler7c03bdc2019-01-16 15:07:56 -0500261 "engine/fake_video_codec_factory.cc",
262 "engine/fake_video_codec_factory.h",
Steve Anton10542f22019-01-11 09:11:00 -0800263 "engine/internal_decoder_factory.cc",
264 "engine/internal_decoder_factory.h",
265 "engine/internal_encoder_factory.cc",
266 "engine/internal_encoder_factory.h",
267 "engine/multiplex_codec_factory.cc",
268 "engine/multiplex_codec_factory.h",
Jonathan Yu327b7532018-10-24 17:21:36 -0700269
270 # TODO(bugs.webrtc.org/7925): stop exporting this header once downstream
Florent Castellie7862cc2018-12-06 13:38:24 +0100271 # targets depend on :rtc_encoder_simulcast_proxy directly.
272 "engine/encoder_simulcast_proxy.h",
Anders Carlssona114c882018-01-04 15:10:22 +0100273 ]
Anders Carlssona114c882018-01-04 15:10:22 +0100274}
275
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200276rtc_library("rtc_audio_video") {
Per Kjellandera7f2d842018-01-10 15:54:53 +0000277 visibility = [ "*" ]
Anders Carlsson45340ca2019-01-14 14:23:23 +0100278 allow_poison = [ "audio_codecs" ] # TODO(bugs.webrtc.org/8396): Remove.
Anders Carlssona114c882018-01-04 15:10:22 +0100279 defines = []
280 libs = []
281 deps = [
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200282 ":rtc_constants",
283 ":rtc_media_base",
284 "..:webrtc_common",
285 "../api:call_api",
286 "../api:libjingle_peerconnection_api",
Florent Castellib05ca4b2020-03-05 13:39:55 +0100287 "../api:media_stream_interface",
Niels Möller6dcd4dc2019-08-26 10:45:28 +0200288 "../api:rtp_parameters",
Mirko Bonadeid9708072019-01-25 20:26:48 +0100289 "../api:scoped_refptr",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200290 "../api:transport_api",
Danil Chapovalov85b8ce22019-05-31 15:51:04 +0200291 "../api/audio:audio_mixer_api",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200292 "../api/audio_codecs:audio_codecs_api",
Danil Chapovalov4c7112a2019-03-27 18:51:45 +0100293 "../api/task_queue",
Mirko Bonadei738bfa72019-09-17 14:47:38 +0200294 "../api/transport:bitrate_settings",
Niels Möllera8370302019-09-02 15:16:49 +0200295 "../api/transport/rtp:rtp_source",
Elad Alon80f53b72019-10-11 16:19:43 +0200296 "../api/units:data_rate",
Yves Gerey3e707812018-11-28 16:47:49 +0100297 "../api/video:video_bitrate_allocation",
Jiawei Ouc2ebe212018-11-08 10:02:56 -0800298 "../api/video:video_bitrate_allocator_factory",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200299 "../api/video:video_codec_constants",
300 "../api/video:video_frame",
301 "../api/video:video_frame_i420",
Chen Xing5d24b162019-06-10 12:59:38 +0200302 "../api/video:video_rtp_headers",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200303 "../api/video_codecs:rtc_software_fallback_wrappers",
304 "../api/video_codecs:video_codecs_api",
305 "../call",
306 "../call:call_interfaces",
307 "../call:video_stream_api",
308 "../common_video",
309 "../modules/audio_device",
310 "../modules/audio_device:audio_device_impl",
311 "../modules/audio_mixer:audio_mixer_impl",
Alessio Bazzicab768e882018-11-07 14:29:54 +0000312 "../modules/audio_processing:api",
Artem Titov94b57c02019-03-21 13:35:10 +0100313 "../modules/audio_processing/aec_dump",
Sam Zackrisson41478c72019-10-15 10:10:26 +0200314 "../modules/audio_processing/agc:gain_control_interface",
Artem Titov94b57c02019-03-21 13:35:10 +0100315 "../modules/video_coding",
Patrik Höglunda97af1f2018-01-16 10:11:40 +0100316 "../modules/video_coding:video_codec_interface",
Sergio Garcia Murillo43800f92018-06-21 16:16:38 +0200317 "../modules/video_coding:video_coding_utility",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200318 "../rtc_base",
Jonas Olssonabbe8412018-04-03 13:40:05 +0200319 "../rtc_base:audio_format_to_string",
Anders Carlssona114c882018-01-04 15:10:22 +0100320 "../rtc_base:checks",
Jakob Ivarsson39adce12020-06-25 14:09:58 +0200321 "../rtc_base:ignore_wundef",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200322 "../rtc_base:rtc_task_queue",
323 "../rtc_base:stringutils",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200324 "../rtc_base/experiments:field_trial_parser",
Elad Alon80f53b72019-10-11 16:19:43 +0200325 "../rtc_base/experiments:min_video_bitrate_experiment",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200326 "../rtc_base/experiments:normalize_simulcast_size_experiment",
Rasmus Brandt2b9317a2019-10-30 13:01:46 +0100327 "../rtc_base/experiments:rate_control_settings",
Markus Handell1e257ca2020-07-07 15:43:11 +0200328 "../rtc_base/synchronization:mutex",
Mirko Bonadei276827c2018-10-16 14:13:50 +0200329 "../rtc_base/system:rtc_export",
Artem Titova76af0c2018-07-23 17:38:12 +0200330 "../rtc_base/third_party/base64",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200331 "../system_wrappers",
Mirko Bonadei17f48782018-09-28 08:51:10 +0200332 "../system_wrappers:field_trial",
333 "../system_wrappers:metrics",
Mirko Bonadei2dcf3482020-06-05 14:30:41 +0200334 ]
335 absl_deps = [
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200336 "//third_party/abseil-cpp/absl/algorithm:container",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200337 "//third_party/abseil-cpp/absl/strings",
338 "//third_party/abseil-cpp/absl/types:optional",
Anders Carlssona114c882018-01-04 15:10:22 +0100339 ]
340
341 sources = [
342 "engine/adm_helpers.cc",
343 "engine/adm_helpers.h",
Steve Anton10542f22019-01-11 09:11:00 -0800344 "engine/null_webrtc_video_engine.h",
Anders Carlssona114c882018-01-04 15:10:22 +0100345 "engine/payload_type_mapper.cc",
346 "engine/payload_type_mapper.h",
Anders Carlssondd8c1652018-01-30 10:32:13 +0100347 "engine/simulcast.cc",
348 "engine/simulcast.h",
Jonas Oreland6d835922019-03-18 10:59:40 +0100349 "engine/unhandled_packets_buffer.cc",
350 "engine/unhandled_packets_buffer.h",
Steve Anton10542f22019-01-11 09:11:00 -0800351 "engine/webrtc_media_engine.cc",
352 "engine/webrtc_media_engine.h",
Steve Anton10542f22019-01-11 09:11:00 -0800353 "engine/webrtc_video_engine.cc",
354 "engine/webrtc_video_engine.h",
355 "engine/webrtc_voice_engine.cc",
356 "engine/webrtc_voice_engine.h",
kjellanderc76dc952016-06-03 03:09:32 -0700357 ]
358
ehmaldonadoe9cc6862016-09-05 06:10:18 -0700359 public_configs = []
Niels Möller85818772019-04-09 08:24:58 +0200360 if (!build_with_chromium) {
kjellanderc76dc952016-06-03 03:09:32 -0700361 public_configs += [ ":rtc_media_defines_config" ]
362 deps += [ "../modules/video_capture:video_capture_internal_impl" ]
363 }
aleloi048cbdd2017-05-29 02:56:27 -0700364 if (rtc_enable_protobuf) {
Jakob Ivarsson39adce12020-06-25 14:09:58 +0200365 deps += [
366 "../modules/audio_coding:ana_config_proto",
367 "../modules/audio_processing/aec_dump:aec_dump_impl",
368 ]
aleloi048cbdd2017-05-29 02:56:27 -0700369 } else {
370 deps += [ "../modules/audio_processing/aec_dump:null_aec_dump_factory" ]
371 }
kjellanderc76dc952016-06-03 03:09:32 -0700372}
kjellander82a94492016-06-12 22:12:01 -0700373
Danil Chapovalov4844c5f2019-04-10 14:10:10 +0200374# Heavy but optional helper for unittests and webrtc users who prefer to use
375# defaults factories or do not worry about extra dependencies and binary size.
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200376rtc_library("rtc_media_engine_defaults") {
Danil Chapovalov4844c5f2019-04-10 14:10:10 +0200377 visibility = [ "*" ]
378 allow_poison = [
379 "audio_codecs",
Danil Chapovalov41300af2019-07-10 12:44:43 +0200380 "default_task_queue",
Danil Chapovalov4844c5f2019-04-10 14:10:10 +0200381 "software_video_codecs",
382 ]
383 sources = [
384 "engine/webrtc_media_engine_defaults.cc",
385 "engine/webrtc_media_engine_defaults.h",
386 ]
387 deps = [
388 ":rtc_audio_video",
389 "../api/audio_codecs:builtin_audio_decoder_factory",
390 "../api/audio_codecs:builtin_audio_encoder_factory",
391 "../api/task_queue:default_task_queue_factory",
392 "../api/video:builtin_video_bitrate_allocator_factory",
393 "../api/video_codecs:builtin_video_decoder_factory",
394 "../api/video_codecs:builtin_video_encoder_factory",
395 "../modules/audio_processing:api",
396 "../rtc_base:checks",
Ken MacKay831ce5f2019-12-02 10:26:34 -0800397 "../rtc_base/system:rtc_export",
Danil Chapovalov4844c5f2019-04-10 14:10:10 +0200398 ]
399}
400
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200401rtc_library("rtc_data") {
Seth Hampson66d6c3b2019-08-30 09:02:46 -0700402 defines = [
403 # "SCTP_DEBUG" # Uncomment for SCTP debugging.
404 ]
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200405 deps = [
406 ":rtc_media_base",
407 "..:webrtc_common",
408 "../api:call_api",
409 "../api:transport_api",
410 "../p2p:rtc_p2p",
411 "../rtc_base",
412 "../rtc_base:rtc_base_approved",
Markus Handell1e257ca2020-07-07 15:43:11 +0200413 "../rtc_base/synchronization:mutex",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200414 "../rtc_base/third_party/sigslot",
415 "../system_wrappers",
Mirko Bonadei2dcf3482020-06-05 14:30:41 +0200416 ]
417 absl_deps = [
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200418 "//third_party/abseil-cpp/absl/algorithm:container",
Danil Chapovalov5740f3e2019-10-10 11:12:15 +0200419 "//third_party/abseil-cpp/absl/base:core_headers",
Seth Hampson66d6c3b2019-08-30 09:02:46 -0700420 "//third_party/abseil-cpp/absl/types:optional",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200421 ]
zhihuang38ede132017-06-15 12:52:32 -0700422
423 if (rtc_enable_sctp) {
424 sources = [
Steve Anton10542f22019-01-11 09:11:00 -0800425 "sctp/sctp_transport.cc",
426 "sctp/sctp_transport.h",
427 "sctp/sctp_transport_internal.h",
zhihuang38ede132017-06-15 12:52:32 -0700428 ]
Kári Tristan Helgason4d3e24a2017-12-01 15:26:41 +0100429 } else {
430 # libtool on mac does not like empty targets.
Mirko Bonadeiccbe95f2020-01-21 12:10:10 +0100431 sources = [ "sctp/noop.cc" ]
zhihuang38ede132017-06-15 12:52:32 -0700432 }
433
zhihuang38ede132017-06-15 12:52:32 -0700434 if (rtc_enable_sctp && rtc_build_usrsctp) {
zhihuang38ede132017-06-15 12:52:32 -0700435 deps += [ "//third_party/usrsctp" ]
436 }
zhihuang38ede132017-06-15 12:52:32 -0700437}
438
439rtc_source_set("rtc_media") {
Per Kjellandera7f2d842018-01-10 15:54:53 +0000440 visibility = [ "*" ]
Anders Carlsson45340ca2019-01-14 14:23:23 +0100441 allow_poison = [ "audio_codecs" ] # TODO(bugs.webrtc.org/8396): Remove.
Mirko Bonadei75baa492018-01-11 17:07:30 +0100442 deps = [
zhihuang38ede132017-06-15 12:52:32 -0700443 ":rtc_audio_video",
444 ":rtc_data",
445 ]
446}
447
kjellander82a94492016-06-12 22:12:01 -0700448if (rtc_include_tests) {
Mirko Bonadei86d053c2019-10-17 21:32:04 +0200449 rtc_library("rtc_media_tests_utils") {
kjellander82a94492016-06-12 22:12:01 -0700450 testonly = true
451
Anders Carlsson5f2bb622018-05-14 09:48:06 +0200452 defines = []
kjellandera2ef4f92017-03-06 06:04:55 -0800453 deps = [
Mirko Bonadei75baa492018-01-11 17:07:30 +0100454 ":rtc_audio_video",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200455 ":rtc_internal_video_codecs",
456 ":rtc_media",
457 ":rtc_media_base",
Jonathan Yu9a5da492018-10-19 00:51:18 -0700458 ":rtc_simulcast_encoder_adapter",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200459 "../api:call_api",
Elad Alon8f01c4e2019-06-28 15:19:43 +0200460 "../api:fec_controller_api",
Mirko Bonadeid9708072019-01-25 20:26:48 +0100461 "../api:scoped_refptr",
Yves Gerey3e707812018-11-28 16:47:49 +0100462 "../api/video:encoded_image",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200463 "../api/video:video_bitrate_allocation",
464 "../api/video:video_frame",
Niels Möllerc6ce9c52018-05-11 11:15:30 +0200465 "../api/video:video_frame_i420",
Chen Xing5d24b162019-06-10 12:59:38 +0200466 "../api/video:video_rtp_headers",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200467 "../api/video_codecs:video_codecs_api",
468 "../call:call_interfaces",
469 "../call:mock_rtp_interfaces",
aleloi440b6d92017-08-22 05:43:23 -0700470 "../call:video_stream_api",
Artem Titov94b57c02019-03-21 13:35:10 +0100471 "../common_video",
472 "../modules/audio_processing",
Alessio Bazzicab768e882018-11-07 14:29:54 +0000473 "../modules/audio_processing:api",
Mirko Bonadeib5728d92017-12-06 07:51:33 +0100474 "../modules/rtp_rtcp:rtp_rtcp_format",
Patrik Höglund99175c62018-01-08 11:05:10 +0100475 "../modules/video_coding:video_codec_interface",
charujaincb728ea2017-09-18 03:08:08 -0700476 "../modules/video_coding:video_coding_utility",
kjellandera2ef4f92017-03-06 06:04:55 -0800477 "../p2p:rtc_p2p",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200478 "../rtc_base",
Patrik Höglunda8005cf2017-12-13 16:05:42 +0100479 "../rtc_base:checks",
Mirko Bonadeie3abb812018-11-23 13:15:08 +0100480 "../rtc_base:gunit_helpers",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200481 "../rtc_base:rtc_base_approved",
Tommi8d2c5a82018-03-19 11:12:48 +0100482 "../rtc_base:rtc_task_queue",
Patrik Höglund3e113432017-12-15 14:40:10 +0100483 "../rtc_base:stringutils",
Markus Handell1e257ca2020-07-07 15:43:11 +0200484 "../rtc_base/synchronization:mutex",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200485 "../rtc_base/third_party/sigslot",
486 "../test:test_support",
487 "//testing/gtest",
Mirko Bonadei2dcf3482020-06-05 14:30:41 +0200488 ]
489 absl_deps = [
Steve Anton2c9ebef2019-01-28 17:27:58 -0800490 "//third_party/abseil-cpp/absl/algorithm:container",
Yves Gerey69807e82018-10-30 22:23:02 +0100491 "//third_party/abseil-cpp/absl/strings",
kjellandera2ef4f92017-03-06 06:04:55 -0800492 ]
kjellander82a94492016-06-12 22:12:01 -0700493 sources = [
Steve Anton10542f22019-01-11 09:11:00 -0800494 "base/fake_frame_source.cc",
495 "base/fake_frame_source.h",
496 "base/fake_media_engine.cc",
497 "base/fake_media_engine.h",
498 "base/fake_network_interface.h",
499 "base/fake_rtp.cc",
500 "base/fake_rtp.h",
Steve Anton10542f22019-01-11 09:11:00 -0800501 "base/fake_video_renderer.cc",
502 "base/fake_video_renderer.h",
503 "base/test_utils.cc",
504 "base/test_utils.h",
505 "engine/fake_webrtc_call.cc",
506 "engine/fake_webrtc_call.h",
507 "engine/fake_webrtc_video_engine.cc",
508 "engine/fake_webrtc_video_engine.h",
kjellander82a94492016-06-12 22:12:01 -0700509 ]
kjellander82a94492016-06-12 22:12:01 -0700510 }
511
ehmaldonado3a7f35b2016-09-14 05:10:01 -0700512 rtc_media_unittests_resources = [
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200513 "../resources/media/captured-320x240-2s-48.frames",
514 "../resources/media/faces.1280x720_P420.yuv",
Rasmus Brandt5cad55b2019-12-19 09:47:11 +0100515 "../resources/media/faces_I400.jpg",
516 "../resources/media/faces_I411.jpg",
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200517 "../resources/media/faces_I420.jpg",
518 "../resources/media/faces_I422.jpg",
519 "../resources/media/faces_I444.jpg",
ehmaldonado3a7f35b2016-09-14 05:10:01 -0700520 ]
kjellander32c4a202016-08-30 02:53:49 -0700521
522 if (is_ios) {
523 bundle_data("rtc_media_unittests_bundle_data") {
524 testonly = true
525 sources = rtc_media_unittests_resources
Mirko Bonadeiccbe95f2020-01-21 12:10:10 +0100526 outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
kjellander32c4a202016-08-30 02:53:49 -0700527 }
528 }
529
ehmaldonado38a21322016-09-02 04:10:34 -0700530 rtc_test("rtc_media_unittests") {
kjellander82a94492016-06-12 22:12:01 -0700531 testonly = true
532
johan073ece42016-08-26 02:59:47 -0700533 defines = []
kjellandera2ef4f92017-03-06 06:04:55 -0800534 deps = [
Mirko Bonadei75baa492018-01-11 17:07:30 +0100535 ":rtc_audio_video",
Anders Carlssona114c882018-01-04 15:10:22 +0100536 ":rtc_constants",
Mirko Bonadei75baa492018-01-11 17:07:30 +0100537 ":rtc_data",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200538 ":rtc_encoder_simulcast_proxy",
539 ":rtc_internal_video_codecs",
540 ":rtc_media",
541 ":rtc_media_base",
Danil Chapovalov4844c5f2019-04-10 14:10:10 +0200542 ":rtc_media_engine_defaults",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200543 ":rtc_media_tests_utils",
Johannes Kronc8f31342019-12-19 15:05:20 +0100544 ":rtc_sdp_fmtp_utils",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200545 ":rtc_simulcast_encoder_adapter",
546 ":rtc_vp9_profile",
Yves Gerey3e707812018-11-28 16:47:49 +0100547 "../:webrtc_common",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200548 "../api:create_simulcast_test_fixture_api",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200549 "../api:libjingle_peerconnection_api",
550 "../api:mock_video_bitrate_allocator",
551 "../api:mock_video_bitrate_allocator_factory",
552 "../api:mock_video_codec_factory",
Erik Språng9e79e6b2019-04-25 16:01:03 +0200553 "../api:mock_video_encoder",
Niels Möller6dcd4dc2019-08-26 10:45:28 +0200554 "../api:rtp_parameters",
Mirko Bonadeid9708072019-01-25 20:26:48 +0100555 "../api:scoped_refptr",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200556 "../api:simulcast_test_fixture_api",
557 "../api/audio_codecs:builtin_audio_decoder_factory",
558 "../api/audio_codecs:builtin_audio_encoder_factory",
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200559 "../api/rtc_event_log",
Danil Chapovalov4c7112a2019-03-27 18:51:45 +0100560 "../api/task_queue",
561 "../api/task_queue:default_task_queue_factory",
Danil Chapovalov99b71df2018-10-26 15:57:48 +0200562 "../api/test/video:function_video_factory",
Erik Språng014dd3c2019-11-28 13:44:25 +0100563 "../api/transport:field_trial_based_config",
Jonas Oreland49ac5952018-09-26 16:04:32 +0200564 "../api/units:time_delta",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200565 "../api/video:builtin_video_bitrate_allocator_factory",
566 "../api/video:video_bitrate_allocation",
567 "../api/video:video_frame",
Niels Möllerc6ce9c52018-05-11 11:15:30 +0200568 "../api/video:video_frame_i420",
Chen Xing5d24b162019-06-10 12:59:38 +0200569 "../api/video:video_rtp_headers",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200570 "../api/video_codecs:builtin_video_decoder_factory",
571 "../api/video_codecs:builtin_video_encoder_factory",
572 "../api/video_codecs:video_codecs_api",
573 "../audio",
574 "../call:call_interfaces",
575 "../common_video",
Johannes Kron3e983682020-03-29 22:17:00 +0200576 "../media:rtc_h264_profile_id",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200577 "../modules/audio_device:mock_audio_device",
578 "../modules/audio_processing",
Alessio Bazzicab768e882018-11-07 14:29:54 +0000579 "../modules/audio_processing:api",
Patrik Höglund62139292017-12-19 16:44:45 +0100580 "../modules/audio_processing:mocks",
Åsa Persson23cd45a2018-07-03 10:40:40 +0200581 "../modules/rtp_rtcp",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200582 "../modules/video_coding:simulcast_test_fixture_impl",
Patrik Höglund99175c62018-01-08 11:05:10 +0100583 "../modules/video_coding:video_codec_interface",
Johannes Kron3e983682020-03-29 22:17:00 +0200584 "../modules/video_coding:webrtc_h264",
Sergio Garcia Murillo43800f92018-06-21 16:16:38 +0200585 "../modules/video_coding:webrtc_vp8",
Danil Chapovalovc46385c2020-03-11 10:45:57 +0100586 "../modules/video_coding/codecs/av1:libaom_av1_decoder",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200587 "../p2p:p2p_test_utils",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200588 "../rtc_base",
Patrik Höglunda8005cf2017-12-13 16:05:42 +0100589 "../rtc_base:checks",
Mirko Bonadeie3abb812018-11-23 13:15:08 +0100590 "../rtc_base:gunit_helpers",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200591 "../rtc_base:rtc_base_approved",
Mirko Bonadeie3abb812018-11-23 13:15:08 +0100592 "../rtc_base:rtc_base_tests_utils",
Tommi8d2c5a82018-03-19 11:12:48 +0100593 "../rtc_base:rtc_task_queue",
Patrik Höglund3e113432017-12-15 14:40:10 +0100594 "../rtc_base:stringutils",
Elad Alon80f53b72019-10-11 16:19:43 +0200595 "../rtc_base/experiments:min_video_bitrate_experiment",
Markus Handell1e257ca2020-07-07 15:43:11 +0200596 "../rtc_base/synchronization:mutex",
Artem Titov94b57c02019-03-21 13:35:10 +0100597 "../rtc_base/third_party/sigslot",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200598 "../test:audio_codec_mocks",
Markus Handell32565f62019-12-04 10:58:17 +0100599 "../test:fake_video_codecs",
kjellandera2ef4f92017-03-06 06:04:55 -0800600 "../test:field_trial",
Tommi25eb47c2019-08-29 16:39:05 +0200601 "../test:rtp_test_utils",
Niels Möller04a3cc12019-05-21 13:01:58 +0200602 "../test:test_main",
Danil Chapovalov6fe6b5a2019-04-10 12:50:24 +0200603 "../test:test_support",
604 "../test:video_test_common",
605 "//third_party/abseil-cpp/absl/algorithm:container",
Karl Wiberg918f50c2018-07-05 11:40:33 +0200606 "//third_party/abseil-cpp/absl/memory",
Yves Gerey69807e82018-10-30 22:23:02 +0100607 "//third_party/abseil-cpp/absl/strings",
Niels Möller04a3cc12019-05-21 13:01:58 +0200608 "//third_party/abseil-cpp/absl/types:optional",
kjellandera2ef4f92017-03-06 06:04:55 -0800609 ]
kjellander82a94492016-06-12 22:12:01 -0700610 sources = [
611 "base/codec_unittest.cc",
Markus Handell0357b3e2020-03-16 13:40:51 +0100612 "base/media_engine_unittest.cc",
Steve Anton10542f22019-01-11 09:11:00 -0800613 "base/rtp_data_engine_unittest.cc",
614 "base/rtp_utils_unittest.cc",
Johannes Kronc8f31342019-12-19 15:05:20 +0100615 "base/sdp_fmtp_utils_unittest.cc",
Steve Anton10542f22019-01-11 09:11:00 -0800616 "base/stream_params_unittest.cc",
617 "base/turn_utils_unittest.cc",
618 "base/video_adapter_unittest.cc",
619 "base/video_broadcaster_unittest.cc",
Steve Anton10542f22019-01-11 09:11:00 -0800620 "base/video_common_unittest.cc",
Florent Castellie7862cc2018-12-06 13:38:24 +0100621 "engine/encoder_simulcast_proxy_unittest.cc",
Steve Anton10542f22019-01-11 09:11:00 -0800622 "engine/internal_decoder_factory_unittest.cc",
623 "engine/multiplex_codec_factory_unittest.cc",
624 "engine/null_webrtc_video_engine_unittest.cc",
ossuc54071d2016-08-17 02:45:41 -0700625 "engine/payload_type_mapper_unittest.cc",
magjed6cc25612017-07-10 03:26:36 -0700626 "engine/simulcast_encoder_adapter_unittest.cc",
Åsa Persson31cb8f92018-06-27 10:44:56 +0200627 "engine/simulcast_unittest.cc",
Jonas Oreland6d835922019-03-18 10:59:40 +0100628 "engine/unhandled_packets_buffer_unittest.cc",
Steve Anton10542f22019-01-11 09:11:00 -0800629 "engine/webrtc_media_engine_unittest.cc",
Steve Anton10542f22019-01-11 09:11:00 -0800630 "engine/webrtc_video_engine_unittest.cc",
kjellander82a94492016-06-12 22:12:01 -0700631 ]
632
oprypin45197522017-06-22 01:47:20 -0700633 # TODO(kthelgason): Reenable this test on iOS.
634 # See bugs.webrtc.org/5569
635 if (!is_ios) {
Steve Anton10542f22019-01-11 09:11:00 -0800636 sources += [ "engine/webrtc_voice_engine_unittest.cc" ]
oprypin45197522017-06-22 01:47:20 -0700637 }
638
deadbeef40610e22016-12-22 10:53:38 -0800639 if (rtc_enable_sctp) {
Yura Yarosheviche114fb62019-10-25 12:48:11 +0300640 sources += [
641 "sctp/sctp_transport_reliability_unittest.cc",
642 "sctp/sctp_transport_unittest.cc",
643 ]
deadbeef40610e22016-12-22 10:53:38 -0800644 }
645
ossu11bfc532017-02-16 05:37:06 -0800646 if (rtc_opus_support_120ms_ptime) {
647 defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ]
648 } else {
649 defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ]
650 }
651
ehmaldonado3a7f35b2016-09-14 05:10:01 -0700652 data = rtc_media_unittests_resources
653
kjellander82a94492016-06-12 22:12:01 -0700654 if (is_android) {
655 deps += [ "//testing/android/native_test:native_test_support" ]
kjellander28a0ffd2016-08-24 07:48:42 -0700656 shard_timeout = 900
657 }
kjellander32c4a202016-08-30 02:53:49 -0700658
659 if (is_ios) {
660 deps += [ ":rtc_media_unittests_bundle_data" ]
kjellander82a94492016-06-12 22:12:01 -0700661 }
Taylor Brandstetterc2128732020-07-03 16:37:57 -0700662
663 if (rtc_enable_sctp && rtc_build_usrsctp) {
664 deps += [ "//third_party/usrsctp" ]
665 }
kjellander82a94492016-06-12 22:12:01 -0700666 }
667}