summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/g3doc
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /third_party/libwebrtc/g3doc
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/g3doc')
-rw-r--r--third_party/libwebrtc/g3doc/OWNERS5
-rw-r--r--third_party/libwebrtc/g3doc/abseil-in-webrtc.md85
-rw-r--r--third_party/libwebrtc/g3doc/add-new-test-binary.md33
-rw-r--r--third_party/libwebrtc/g3doc/become_a_committer.md84
-rw-r--r--third_party/libwebrtc/g3doc/field-trials.md70
-rw-r--r--third_party/libwebrtc/g3doc/how_to_write_documentation.md68
-rw-r--r--third_party/libwebrtc/g3doc/implementation_basics.md141
-rw-r--r--third_party/libwebrtc/g3doc/index.md6
-rw-r--r--third_party/libwebrtc/g3doc/logo.svg675
-rw-r--r--third_party/libwebrtc/g3doc/sitemap.md55
-rw-r--r--third_party/libwebrtc/g3doc/style-guide.md308
-rw-r--r--third_party/libwebrtc/g3doc/style-guide/OWNERS1
-rw-r--r--third_party/libwebrtc/g3doc/style-guide/h-cc-pairs.md32
-rw-r--r--third_party/libwebrtc/g3doc/supported-platforms-and-compilers.md34
14 files changed, 1597 insertions, 0 deletions
diff --git a/third_party/libwebrtc/g3doc/OWNERS b/third_party/libwebrtc/g3doc/OWNERS
new file mode 100644
index 0000000000..9ece35c39b
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/OWNERS
@@ -0,0 +1,5 @@
+titovartem@webrtc.org
+
+per-file abseil-in-webrtc.md=danilchap@webrtc.org
+per-file abseil-in-webrtc.md=mbonadei@webrtc.org
+per-file style-guide.md=danilchap@webrtc.org
diff --git a/third_party/libwebrtc/g3doc/abseil-in-webrtc.md b/third_party/libwebrtc/g3doc/abseil-in-webrtc.md
new file mode 100644
index 0000000000..034f6c2fb4
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/abseil-in-webrtc.md
@@ -0,0 +1,85 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'danilchap' reviewed: '2021-05-12'} *-->
+
+# Using Abseil in WebRTC
+
+You may use a subset of the utilities provided by the [Abseil][abseil]
+library when writing WebRTC C++ code. Below, we list the explicitly
+*allowed* and the explicitly *disallowed* subsets of Abseil; if you
+find yourself in need of something that isn&rsquo;t in either subset,
+please add it to the *allowed* subset in this doc in the same CL that
+adds the first use.
+
+[abseil]: https://abseil.io/about/
+
+
+## How to depend on Abseil
+
+For build targets of type `rtc_library`, `rtc_source_set` and
+`rtc_static_library`, dependencies on Abseil need to be listed in `absl_deps`
+instead of `deps`.
+
+This is needed in order to support the Abseil component build in Chromium. In
+that build mode, WebRTC will depend on a monolithic Abseil build target that
+will generate a shared library.
+
+## **Allowed**
+
+* `absl::AnyInvocable`
+* `absl::bind_front`
+* `absl::Cleanup`
+* `absl::InlinedVector`
+* `absl::Nonnull` and `absl::Nullable`
+* `absl::WrapUnique`
+* `absl::optional` and related stuff from `absl/types/optional.h`.
+* `absl::string_view`
+* The functions in `absl/strings/ascii.h`, `absl/strings/match.h`,
+ and `absl/strings/str_replace.h`.
+* The functions in `absl/strings/escaping.h`.
+* `absl::is_trivially_copy_constructible`,
+ `absl::is_trivially_copy_assignable`, and
+ `absl::is_trivially_destructible` from `absl/meta/type_traits.h`.
+* `absl::variant` and related stuff from `absl/types/variant.h`.
+* The functions in `absl/algorithm/algorithm.h` and
+ `absl/algorithm/container.h`.
+* `absl/base/const_init.h` for mutex initialization.
+* The macros in `absl/base/attributes.h`, `absl/base/config.h` and
+ `absl/base/macros.h`.
+* `absl/numeric/bits.h`
+
+
+## **Disallowed**
+
+### `absl::make_unique`
+
+*Use `std::make_unique` instead.*
+
+### `absl::Mutex`
+
+*Use `webrtc::Mutex` instead.*
+
+Chromium has a ban on new static initializers, and `absl::Mutex` uses
+one. To make `absl::Mutex` available, we would need to nicely ask the
+Abseil team to remove that initializer (like they already did for a
+spinlock initializer). Additionally, `absl::Mutex` handles time in a
+way that may not be compatible with the rest of WebRTC.
+
+### `absl::Span`
+
+*Use `rtc::ArrayView` instead.*
+
+`absl::Span` differs from `rtc::ArrayView` on several points, and both
+of them differ from the `std::span` that was voted into
+C++20&mdash;and `std::span` is likely to undergo further changes
+before C++20 is finalized. We should just keep using `rtc::ArrayView`
+and avoid `absl::Span` until C++20 is finalized and the Abseil team
+has decided if they will change `absl::Span` to match.
+[Bug](https://bugs.webrtc.org/9214).
+
+### `absl::StrCat`, `absl::StrAppend`, `absl::StrJoin`, `absl::StrSplit`
+
+*Use `rtc::SimpleStringBuilder` to build strings.*
+
+These are optimized for speed, not binary size. Even `StrCat` calls
+with a modest number of arguments can easily add several hundred bytes
+to the binary.
diff --git a/third_party/libwebrtc/g3doc/add-new-test-binary.md b/third_party/libwebrtc/g3doc/add-new-test-binary.md
new file mode 100644
index 0000000000..177c212b89
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/add-new-test-binary.md
@@ -0,0 +1,33 @@
+# Add a new test binary
+
+This page lists all the steps needed in order to add an `rtc_test` target to
+WebRTC's BUILD.gn files and ensure the test binary will run on the presubmit and
+postsubmit infrastructure.
+
+1. While working on your CL, add an `rtc_test` target, with `testonly = true`,
+ and `../test:test_main` among its dependencies (`rtc_test` targets require
+ a `main()` function).
+
+2. Add the newly created `rtc_test` target to the `group("default")` target in
+ the root [BUILD.gn](https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/BUILD.gn).
+ The target needs to be added within the `rtc_include_tests` section.
+
+3. Add the name of the newly created `rtc_test` into
+ [infra/specs/gn_isolate_map.pyl](https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/infra/specs/gn_isolate_map.pyl).
+
+4. Add the name of the newly created `rtc_test` into
+ [infra/specs/test_suites.pyl](https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/infra/specs/test_suites.pyl).
+ By default, you should add it to the `android_tests`, `desktop_tests` and
+ `ios_simulator_tests` sections.
+
+5. Run the script
+ [infra/specs/generate_buildbot_json.py](https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/infra/specs/generate_buildbot_json.py)
+ (no arguments) to generate the JSON scripts based on the previsouly modified .pyl scripts.
+
+6. Build, test, review and submit!
+
+The bots will execute the new configs as part of the CQ. Inspect some logs to
+verify that your test is in fact executed by the bots where you expect them to be.
+
+The details of the (many) config files are described in
+https://chromium.googlesource.com/chromium/src/testing/+/HEAD/buildbot/README.md.
diff --git a/third_party/libwebrtc/g3doc/become_a_committer.md b/third_party/libwebrtc/g3doc/become_a_committer.md
new file mode 100644
index 0000000000..b2f49721e1
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/become_a_committer.md
@@ -0,0 +1,84 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'titovartem' reviewed: '2021-10-26'} *-->
+
+# How to get tryjob access or become WebRTC committer
+
+## Overview
+
+There are two levels of WebRTC contributors access:
+
+1. Tryjob access - permits contributor to run tests for their changes using
+ WebRTC infrastructure
+2. WebRTC committer rights - permits to submit changes to the WebRTC code base.
+ This includes tryjob access.
+
+## Getting tryjob access
+
+To get tryjob access applicant has to do a contribution around 10-20 CLs to the
+WebRTC code base. After that, they should file a bug using
+[Get tryjob access template][7], specifying the email which was used for the
+contributions and to which access will be granted, and listing contributed CLs.
+
+The access will be granted when the ticket is resolved by one of the project
+members. In case of rejection the explanation will be provided.
+
+## WebRTC committer duties
+
+WebRTC committers are responsible for keeping WebRTC codebase in a good shape
+including, but not limited to the following aspects:
+
+* Code complexity and correctness
+* C++ best practices
+* Code formatting
+* Test coverage
+* Class/function level and conceptual documentation
+
+Whenever a committer sets `Code Review +1` label on the CL, they approve that
+the CL fulfills WebRTC style guides, language mastery, testability and
+documentation. Being a committer means being responsible for the WebRTC codebase
+health and code quality.
+
+## Becoming a WebRTC committer
+
+To write code in WebRTC you don't need to be a committer (also see [FAQ][1]),
+but to submit code to WebRTC you do. So if you don't plan to work on the WebRTC
+codebase regularly, you can ask other committers through code review to submit
+your patches, but if you are going to work in the WebRTC codebase, then it's
+recommended to apply for WebRTC committer rights obtaining process.
+
+1. If you are going to write in C++ make yourself familiar with with C++ style
+ guides:
+
+ * [Google style guide][5]
+ * [Chromium style guide][2]
+ * [WebRTC style guide][3]
+
+2. Create a ticket to obtain WebRTC committers rights in Monorail. Please use
+ [this template][6] of it.
+
+3. Pick a mentor among WebRTC committers, who will review your CLs. For C++
+ authors, the mentor will also look for C++ readability skills. It's
+ recommended to ask someone who is familiar with the code base which you will
+ be working on (you can check OWNERS files to find such person). Otherwise
+ you can reach out to committers mailing list \<committers@webrtc.org\>.
+
+4. Send CLs to the mentor for review and attach them to the created ticket.
+
+5. When the mentor decides that you are ready (for C++ authors their C++
+ readability skills are good enough), they will send a proposal for granting
+ WebRTC committer rights to the reviewing committee mailing list to review.
+ If the proposal will be approved, then committer rights will be granted.
+ Committee members will have up to 5 business days to answer. In case of
+ rejection detailed feedback on what aspects should be improved will be
+ provided.
+
+6. Also as any contributor you must sign and return the
+ [Contributor License Agreement][4]
+
+[1]: https://webrtc.googlesource.com/src/+/refs/heads/main/docs/faq.md#to-be-a-contributor_do-i-need-to-sign-any-agreements
+[2]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/styleguide/c++/c++.md
+[3]: https://webrtc.googlesource.com/src/+/refs/heads/main/g3doc/style-guide.md
+[4]: https://developers.google.com/open-source/cla/individual?hl=en
+[5]: https://google.github.io/styleguide/cppguide.html
+[6]: https://bugs.chromium.org/p/webrtc/issues/entry?template=Become+WebRTC+committer
+[7]: https://bugs.chromium.org/p/webrtc/issues/entry?template=Get+tryjob+access
diff --git a/third_party/libwebrtc/g3doc/field-trials.md b/third_party/libwebrtc/g3doc/field-trials.md
new file mode 100644
index 0000000000..724a302fe1
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/field-trials.md
@@ -0,0 +1,70 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'lndmrk' reviewed: '2022-06-23'} *-->
+
+# Field trials
+
+WebRTC provides some means to alter its default behavior during run-time,
+colloquially known as *field trials*. This is foremost used for A/B testing new
+features and are related to
+[Chromium field trials](https://chromium.googlesource.com/chromium/src/+/main/testing/variations/README.md)
+to facilitate interoperability.
+
+A field trial consist of a key-value pair of strings. By convention, the field
+trial key is prefixed with `WebRTC-` and each word is capitalized without
+spaces. Sometimes the key is further subdivided into a category, for example,
+`WebRTC-MyCategory-MyExperiment`. The field trial value is an opaque string and
+it is up to the author to define what it represents. There are
+[helper functions](https://webrtc.googlesource.com/src/+/refs/heads/main/api/field_trials_view.h)
+to use a field trial as a boolean, with the string `Enabled` representing true
+and `Disabled` representing false. You can also use
+[field trial parameters](https://webrtc.googlesource.com/src/+/refs/heads/main/rtc_base/experiments/field_trial_parser.h)
+if you wish to encode more elaborate data types.
+
+The set of field trials can be instantiated from a single string with the format
+`<key-1>/<value-1>/<key-2>/<value-2>/`. Note the final `/` at the end! In
+Chromium you can launch with the `--force-fieldtrials` flag to instantiate field
+trials this way, for example:
+
+```
+--force-fieldtrials="WebRTC-Foo/Enabled/WebRTC-Bar/Disabled/"
+```
+
+## Policy
+
+The policy for field trials is:
+
+- A field trial should only be used to test out new code or parameters for a
+ limited time period. It should not be used for configuring persistent
+ behavior.
+- The field trial must have an end date. The end date may be pushed back if
+ necessary, but should not be pushed back indefinitely.
+- A field trial must be associated with a bug that
+ - reserves the field trial key, and
+ - is assigned to an owner.
+
+## Creating a field trial
+
+Before creating a new field trial, make sure to read the [policy](#policy).
+
+Either create a new or reuse an existing bug and make sure it is assigned to the
+correct owner. Take note of the bug ID. Next, decide how long you need the field
+trial to last. It should be rare to have field trials lasting more than 12
+months. You can use the `NextAction` field in the bug to help you remember the
+end date.
+
+Using this information, add a new entry to `ACTIVE_FIELD_TRIALS` in
+`experiments/field_trials.py`. You may not add new items to
+`POLICY_EXEMPT_FIELD_TRIALS` since it is reserved for field trials that were
+created before the policy was in place.
+
+## Removing a field trial
+
+Any field trial that has expired or otherwise is not needed anymore may be
+removed by following these steps:
+
+- Remove all references from the code base. You can find these by, e.g.
+ grepping for the field trial key.
+- Clean up potential glue code that might have been added.
+- Remove the field trial from `ACTIVE_FIELD_TRIALS` in
+ `experiments/field_trials.py`.
+- If all work is finished, also close the associated bug.
diff --git a/third_party/libwebrtc/g3doc/how_to_write_documentation.md b/third_party/libwebrtc/g3doc/how_to_write_documentation.md
new file mode 100644
index 0000000000..6c6a4902ee
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/how_to_write_documentation.md
@@ -0,0 +1,68 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'titovartem' reviewed: '2023-01-16'} *-->
+
+# How to write WebRTC documentation
+
+## Audience
+
+Engineers and tech writers who wants to contribute to WebRTC documentation
+
+## Conceptual documentation
+
+Conceptual documentation provides overview of APIs or systems. Examples can
+be threading model of a particular module or data life cycle. Conceptual
+documentation can skip some edge cases in favor of clarity. The main point
+is to impart understanding.
+
+Conceptual documentation often cannot be embedded directly within the source
+code because it usually describes multiple APIs and entities, so the only
+logical place to document such complex behavior is through a separate
+conceptual document.
+
+A concept document needs to be useful to both experts and novices. Moreover,
+it needs to emphasize clarity, so it often needs to sacrifice completeness
+and sometimes strict accuracy. That's not to say a conceptual document should
+intentionally be inaccurate. It just means that is should focus more on common
+usage and leave rare ones or side effects for class/function level comments.
+
+In the WebRTC repo, conceptual documentation is located in `g3doc` subfolders
+of related components. To add a new document for the component `Foo` find a
+`g3doc` subfolder for this component and create a `.md` file there with
+desired documentation. If there is no `g3doc` subfolder, create a new one.
+
+Please put the following file header into any created documentation file as the
+first line:
+
+```markdown
+<!-- go/cmark -->
+```
+
+When you want to specify a link from one page to another - use the absolute
+path:
+
+```
+[My document](/module/g3doc/my_document.md)
+```
+
+If you are a Googler also please specify an owner, who will be responsible for
+keeping this documentation updated, by adding the next lines at the beginning
+of your `.md` file immediately after page title:
+
+```markdown
+<!--* freshness: {owner: '<user name>' reviewed: '<last review date in format yyyy-mm-dd>' *-->
+```
+
+After the document is ready you should add it into `/g3doc/sitemap.md`, so it
+will be discoverable by others.
+
+### Documentation format
+
+The documentation is written in GitHub Markdown
+([spec](https://github.github.com/gfm/#:~:text=GitHub%20Flavored%20Markdown%2C%20often%20shortened,a%20strict%20superset%20of%20CommonMark.)).
+
+## Class/function level comments
+
+Documentation of specific classes and function APIs and their usage, including
+their purpose, is embedded in the .h files defining that API. See
+[C++ style guide](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++.md)
+for pointers on how to write API documentatin in .h files.
diff --git a/third_party/libwebrtc/g3doc/implementation_basics.md b/third_party/libwebrtc/g3doc/implementation_basics.md
new file mode 100644
index 0000000000..ae1f199b68
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/implementation_basics.md
@@ -0,0 +1,141 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'hta' reviewed: '2021-05-31'} *-->
+
+# Basic concepts and primitives
+
+## Time
+
+Internally, time is represent using the [webrtc::Timestamp][1] class. This
+represents
+time with a resolution of one microsecond, using a 64-bit integer, and provides
+converters to milliseconds or seconds as needed.
+
+All timestamps need to be measured from the system monotonic time.
+
+The epoch is not specified (because we can't always know if the system clock is
+correct), but whenever an absolute epoch is needed, the Unix time
+epoch (Jan 1, 1970 at 0:00 GMT) is used.
+
+Conversion from/to other formats (for example milliseconds, NTP times,
+timestamp strings) should happen as close to the interface requiring that
+format as possible.
+
+NOTE: There are parts of the codebase that don't use Timestamp, parts of the
+codebase that use the NTP epoch, and parts of the codebase that don't use the
+monotonic clock. They need to
+be updated.
+
+## Threads
+
+All execution happens on a TaskQueue instance. How a TaskQueue is implemented
+varies by platform, but they all have the [webrtc::TaskQueueBase][3] API.
+
+This API offers primitives for posting tasks, with or without delay.
+
+Some core parts use the [rtc::Thread][2], which is a subclass of TaskQueueBase.
+This may contain a SocketServer for processing I/O, and is used for policing
+certain calling pattern between a few core threads (the NetworkThread cannot
+do Invoke on the Worker thread, for instance).
+
+## Reserved class suffixes
+
+C++ classes with names ending in the suffixes "Factory", "Builder" and "Manager" are supposed to behave
+in certain well known ways.
+
+For a particular class name Foo, the following classes, if they exist, should
+behave as follows:
+
+* FooFactory: Has a Create function that creates a Foo object and returns the
+ object or an owning reference to it (for instance std::unique_ptr or
+ rtc::scoped_refptr<Foo>). The Create function should NOT alter the factory
+ state; ideally, it is marked const. Ownership of the returned object is only
+ with the caller.
+
+* FooBuilder: Has a Build function that returns ownership of a Foo object (as
+ above). The Builder can only be used once, and resources given to the Builder
+ before the Build function is called are either released or owned by the Foo
+ object. The Create function may be reference-qualified (declared as ```Foo
+ Build() &&```), which means it is invoked as ```std::move(builder).Build()```,
+ and C++ will ensure that it is not used again.
+
+* FooManager: Has a Create function that returns an rtc::scoped_refptr<Foo> (if
+ shared ownership) or a Foo* (if the Manager retains sole ownership). If
+ Create() cannot fail, consider returning a Foo&. The Manager is responsible
+ for keeping track of the object; if the Create function returns a Foo*, the
+ Foo object is guaranteed to be destroyed when the FooManager is destroyed.
+
+If a Manager class manages multiple classes of objects, the Create functions
+should be appropriately named (the FooAndBarManager would have CreateFoo() and
+CreateBar() functions), and the class will have a suitable name for the group of
+objects it is managing.
+
+FooFactory is mainly useful for the case where preparation for producing Foo
+objects is complex. If Foo can be created with just an argument list, consider
+exposing its constructor instead; if Foo creation can fail, consider having
+a free function called CreateFoo instead of a factory.
+
+Note that classes with these names exist that do not follow these conventions.
+When they are detected, they need to be marked with TODO statements and bugs
+filed on them to get them into a conformant state.
+
+## Synchronization primitives
+
+### PostTask and thread-guarded variables
+
+The preferred method for synchronization is to post tasks between threads,
+and to let each thread take care of its own variables (lock-free programming).
+All variables in
+classes intended to be used with multiple threads should therefore be
+annotated with RTC_GUARDED_BY(thread).
+
+For classes used with only one thread, the recommended pattern is to let
+them own a webrtc::SequenceChecker (conventionally named sequence_checker_)
+and let all variables be RTC_GUARDED_BY(sequence_checker_).
+
+Member variables marked const do not need to be guarded, since they never
+change. (But note that they may point to objects that can change!)
+
+When posting tasks with callbacks, it is the duty of the caller to check
+that the object one is calling back into still exists when the callback
+is made. A helper for this task is the [webrtc::ScopedTaskSafety][5]
+flag, which can automatically drop callbacks in this situation, and
+associated classes.
+
+### Synchronization primitives to be used when needed
+
+When it is absolutely necessary to let one thread wait for another thread
+to do something, Thread::Invoke can be used. This function is DISCOURAGED,
+since it leads to performance issues, but is currently still widespread.
+
+When it is absolutely necessary to access one variable from multiple threads,
+the webrtc::Mutex can be used. Such variables MUST be marked up with
+RTC_GUARDED_BY(mutex), to allow static analysis that lessens the chance of
+deadlocks or unintended consequences.
+
+### Synchronization primitives that are being removed
+The following non-exhaustive list of synchronization primitives are
+in the (slow) process of being removed from the codebase.
+
+* sigslot. Use [webrtc::CallbackList][4] instead, or, when there's only one
+ signal consumer, a single std::function.
+
+* AsyncInvoker.
+
+* RecursiveCriticalSection. Try to use [webrtc::Mutex][6] instead, and don't recurse.
+
+## Enum-To-String functions
+If there is a need to convert an enum to a string representation, such as for
+enums exposed at the Javascript API interface, the recommended way is to write
+a function named AsString, declared "static constexpr" and returning an
+absl::string_view. The declaration should be right after the enum declaration,
+in the same scope; the implementation (which must be marked "inline") should
+be at the end of the same header file.
+
+If the enum is not defined within a class, the "static" keyword is not needed.
+
+[1]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/api/units/timestamp.h;drc=b95d90b78a3491ef8e8aa0640dd521515ec881ca;l=29
+[2]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/rtc_base/thread.h;drc=1107751b6f11c35259a1c5c8a0f716e227b7e3b4;l=194
+[3]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/api/task_queue/task_queue_base.h;drc=1107751b6f11c35259a1c5c8a0f716e227b7e3b4;l=25
+[4]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/rtc_base/callback_list.h;drc=54b91412de3f579a2d5ccdead6e04cc2cc5ca3a1;l=162
+[5]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/rtc_base/task_utils/pending_task_safety_flag.h;drc=86ee89f73e4f4799b3ebcc0b5c65837c9601fe6d;l=117
+[6]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/rtc_base/synchronization/mutex.h;drc=0d3c09a8fe5f12dfbc9f1bcd5790fda8830624ec;l=40
diff --git a/third_party/libwebrtc/g3doc/index.md b/third_party/libwebrtc/g3doc/index.md
new file mode 100644
index 0000000000..8016054d3c
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/index.md
@@ -0,0 +1,6 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'titovartem' reviewed: '2021-03-01'} *-->
+
+# WebRTC C++ library
+
+This is a home page for WebRTC C++ library documentation
diff --git a/third_party/libwebrtc/g3doc/logo.svg b/third_party/libwebrtc/g3doc/logo.svg
new file mode 100644
index 0000000000..634b8cb116
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/logo.svg
@@ -0,0 +1,675 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve">
+<path fill="#F26822" d="M319,513.4c0,42-34,76-76,76c-42,0-76-34-76-76c0-42,34-76,76-76C285,437.4,319,471.4,319,513.4z"/>
+<path fill="#FFCD05" d="M469.3,407c0,42-34,76-76,76c-42,0-76-34-76-76c0-42,34-76,76-76C435.3,330.9,469.3,365,469.3,407z"/>
+<path fill="#0E89CB" d="M283.6,405.3c0,42-34,76-76,76c-42,0-76-34-76-76c0-42,34-76,76-76C249.5,329.3,283.6,363.3,283.6,405.3z"/>
+<path fill="#099948" d="M435.6,513.4c0,42-34,76-76,76c-42,0-76-34-76-76c0-42,34-76,76-76C401.5,437.4,435.6,471.4,435.6,513.4z"/>
+<path fill="#BE2026" d="M376.5,337.7c0,42-34,76-76,76c-42,0-76-34-76-76s34-76,76-76C342.4,261.7,376.5,295.7,376.5,337.7z"/>
+<path fill="#ED1C24" d="M317.3,407c0,1.6,0.1,3.2,0.2,4.7c33.7-7.8,58.9-37.9,58.9-74c0-1.6-0.1-3.2-0.2-4.7
+ C342.5,340.7,317.3,370.9,317.3,407z"/>
+<path fill="#4FB848" d="M327.4,444.6c13.1,22.9,37.7,38.4,66,38.4c11.5,0,22.4-2.6,32.2-7.2c-13.1-22.9-37.7-38.4-66-38.4
+ C348,437.4,337.2,440,327.4,444.6z"/>
+<path fill="#19763B" d="M283.6,513.4c0,18.6,6.7,35.6,17.7,48.8c11.1-13.2,17.7-30.2,17.7-48.8c0-18.6-6.7-35.6-17.7-48.8
+ C290.2,477.8,283.6,494.8,283.6,513.4z"/>
+<path fill="#105F88" d="M177.5,475c9.2,4,19.4,6.2,30.1,6.2c28,0,52.4-15.2,65.6-37.7c-9.2-4-19.4-6.2-30.1-6.2
+ C215,437.4,190.6,452.5,177.5,475z"/>
+<path fill="#6A0C0D" d="M224.8,331.3c-0.2,2.1-0.3,4.2-0.3,6.4c0,36,25.1,66.2,58.8,74c0.2-2.1,0.3-4.2,0.3-6.4
+ C283.6,369.2,258.4,339.1,224.8,331.3z"/>
+<g>
+
+ <image overflow="visible" opacity="0.2" width="905" height="940" xlink:href="data:image/png;base64,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
+ABCRAAAAiEgAAAAQkQAAAIhIAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAAgIgEAABARAIAACAi
+AQAAEJEAAACISAAAAEQkAAAAiEgAAABEJAAAACISAAAAEQkAAICIBAAAQEQCAACAiAQAAEBEAgAA
+ICIBAAAQkQAAAIhIAAAARCQAAACISAAAAEQkAAAAIhIAAAARCQAAgIgEAABARAIAACAiAQAAQEQC
+AAAgIgEAABCRAAAAiEgAAABEJAAAACISAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAAICIBAABA
+RAIAACAiAQAAEJEAAACISAAAAEQkAAAAIhIAAAARCQAAACISAAAAEQkAAICIBAAAQEQCAAAgIgEA
+ABCRAAAAICIBAAAQkQAAAIhIAAAARCQAAAAiEgAAABEJAAAAIhIAAAARCQAAgIgEAABARAIAACAi
+AQAAEJEAAAAgIgEAABCRAAAAiEgAAABEJAAAACISAAAAEQkAAICIBAAAABEJAACAiAQAAEBEAgAA
+ICIBAAAQkQAAAIhIAAAAEJEAAACISAAAAEQkAAAAIhIAAAARCQAAgIgEAAAAEQkAAICIBAAAQEQC
+AAAgIgEAABCRAAAAiEgAAABEJAAAAIhIAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAAgIgEAABA
+RAIAACAiAQAAEJEAAACISAAAAEQkAAAAiEgAAABEJAAAACISAAAAEQkAAICIBAAAQEQCAAAgIt0E
+AAAAiEgAAABEJAAAACISAAAAEQkAAICIBAAAQEQCAACAiAQAAEBEAgAAICIBAAAQkQAAAIhIAAAA
+RCQAAACISAAAAEQkAAAAIhIAAAARCQAAgIgEAABARAIAAICIBAAAQEQCAAAgIgEAABCRAAAAiEgA
+AABEJAAAACISAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAAICIBAABARAIAACAiAQAAEJEAAACI
+SAAAAEQkAAAAIhIAAABEJAAAACISAAAAEQkAAICIBAAAQEQCAAAgIgEAABCRAAAAICIBAAAQkQAA
+AIhIAAAARCQAAAAiEgAAABEJAAAAIhIAAAARCQAAgIgEAABARAIAACAiAQAAEJEAAAAgIgEAABCR
+AAAAiEgAAABEJAAAACISAAAAEQkAAAAiEgAAABEJAACAiAQAAEBEAgAAICIBAAAQkQAAAIhIAAAA
+EJEAAACISAAAAEQkAAAAIhIAAAARCQAAgIgEAAAAEQkAAICIBAAAQEQCAAAgIgEAABCRAAAAiEgA
+AAAQkQAAAIhIAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAAgIgEAABARAIAACAiAQAAEJEAAACI
+SAAAAEQkAAAAiEgAAABEJAAAACISAAAAEQkAAICIBAAAQEQCAACAiAQAAEBEAgAAICIBAAAQkQAA
+AIhIAAAARCQAAACISAAAAEQkAAAAIhIAAAARCQAAgIgEAABARAIAACAiAQAAQEQCAAAgIgEAABCR
+AAAAiEgAAABEJAAAACISAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAAICIBAABARAIAACAiAQAA
+EJEAAACISAAAAEQkAAAAIhIAAAARCQAAACISAAAAEQkAAICIBAAAQEQCAAAgIgEAABCRAAAAICIB
+AAAQkQAAAIhIAAAARCQAAAAiEgAAABEJAAAAIhIAAAARCQAAgIgEAABARAIAACAiAQAAEJEAAACI
+SAAAABCRAAAAiEgAAABEJAAAACISAAAAEQkAAICIBAAAABEJAACAiAQAAEBEAgAAICIBAAAQkQAA
+AIhIAAAAEJEAAACISAAAAEQkAAAAIhIAAAARCQAAgIgEAAAAEQkAAICIBAAAQEQCAAAgIgEAABCR
+AAAAiEgAAABEJAAAAIhIAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAAgIgEAABARAIAACAiAQAA
+EJEAAACISAAAAEQkAAAAiEgAAABEJAAAACISAAAAEQkAAICIBAAAQEQCAAAgIgEAAEBEAgAAICIB
+AAAQkQAAAIhIAAAARCQAAAAiEgAAAEQkAAAAIhIAAAARCQAAgIgEAABARAIAACAiAQAAQEQCAAAg
+IgEAABCRAAAAiEgAAABEJAAAACISAAAARCQAAAAiEgAAABEJAACAiAQAAEBEAgAA3MC6eYqIBAAA
+QER+Do9sAAAAIhIAAABEJAAAACISAAAAEQkAAICIBAAAQEQCAAAgIgEAAEBEAgAAv5m93kUkAAAA
+IvI+PFIBAACISAAAABCRAAAAiEgAAABEJAAAwN2sv/zri8hP+eUAAAD//xx9veH3dNfv71dF5OqP
+Q8gCAEDg3Hl17iwi3xFpDjoAAPh9ATrz/UQklx24HjkBAIDPCEpE5NQDyoEHAACfFXNnDuisEz72
+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
+AElFTkSuQmCC" transform="matrix(0.24 0 0 0.24 185.9425 343.3783)">
+ </image>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M231.9,504H220c-10.5,0-19-8.5-19-19V377.4c0-10.5,8.5-19,19-19h149.1c10.5,0,19,8.5,19,19V485
+ c0,10.5-8.5,19-19,19h-50.8l-101.9,50L231.9,504z"/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/third_party/libwebrtc/g3doc/sitemap.md b/third_party/libwebrtc/g3doc/sitemap.md
new file mode 100644
index 0000000000..c1221e5335
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/sitemap.md
@@ -0,0 +1,55 @@
+* [Home](/g3doc/index.md)
+* How to contribute
+ * Code
+ * [Style guide](/g3doc/style-guide.md)
+ * [`.h` and `.cc` files come in pairs](/g3doc/style-guide/h-cc-pairs.md)
+ * [How to write code in the `api/` directory](/api/README.md)
+ * [Using Abseil in WebRTC](/g3doc/abseil-in-webrtc.md)
+ * [Code of conduct](/CODE_OF_CONDUCT.md)
+ * [Documentation](/g3doc/how_to_write_documentation.md)
+ * [Become a committer](/g3doc/become_a_committer.md)
+* [Public C++ API](/api/g3doc/index.md)
+ * [API header files](/native-api.md)
+ * [Threading](/api/g3doc/threading_design.md)
+* Implementation
+ * [Basic concepts](/g3doc/implementation_basics.md)
+ * [Supported Platforms and Compilers](/g3doc/supported-platforms-and-compilers.md)
+ * Network
+ * [ICE](/p2p/g3doc/ice.md)
+ * STUN
+ * TURN
+ * [DTLS](/pc/g3doc/dtls_transport.md)
+ * [RTP](/pc/g3doc/rtp.md)
+ * [SRTP](/pc/g3doc/srtp.md)
+ * [SCTP](/pc/g3doc/sctp_transport.md)
+ * [Pacing buffer](/modules/pacing/g3doc/index.md)
+ * Congestion control and bandwidth estimation
+ * Audio
+ * [NetEq](/modules/audio_coding/neteq/g3doc/index.md)
+ * AudioEngine
+ * [ADM](/modules/audio_device/g3doc/audio_device_module.md)
+ * [Audio Coding](/modules/audio_coding/g3doc/index.md)
+ * [Audio Mixer](/modules/audio_mixer/g3doc/index.md)
+ * AudioProcessingModule
+ * [APM](/modules/audio_processing/g3doc/audio_processing_module.md)
+ * Video
+ * [Adaptation](/video/g3doc/adaptation.md)
+ * [Video coding](/modules/video_coding/g3doc/index.md)
+ * [Stats](/video/g3doc/stats.md)
+ * DataChannel
+ * [PeerConnection](/pc/g3doc/peer_connection.md)
+ * Desktop capture
+ * [Stats](/stats/g3doc/stats.md)
+ * [Logging](/logging/g3doc/rtc_event_log.md)
+* Testing
+ * Media Quality and performance
+ * [PeerConnection Framework](/test/pc/e2e/g3doc/index.md)
+ * [Architecture](/test/pc/e2e/g3doc/architecture.md)
+ * [Video analyzer](/test/pc/e2e/g3doc/default_video_quality_analyzer.md)
+ * Call framework
+ * Video codecs test framework
+ * Network emulation
+ * [Implementation](/test/network/g3doc/index.md)
+ * Performance stats collection
+* Experimentation
+ * [Field trials](/g3doc/field-trials.md)
diff --git a/third_party/libwebrtc/g3doc/style-guide.md b/third_party/libwebrtc/g3doc/style-guide.md
new file mode 100644
index 0000000000..b32163f906
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/style-guide.md
@@ -0,0 +1,308 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'danilchap' reviewed: '2022-01-17'} *-->
+
+# WebRTC coding style guide
+
+## General advice
+
+Some older parts of the code violate the style guide in various ways.
+If making large changes to such code, consider first cleaning it up in a
+ separate CL.
+
+## C++
+
+WebRTC follows the [Chromium C++ style guide][chr-style] and the
+[Google C++ style guide][goog-style]. In cases where they conflict, the Chromium
+style guide trumps the Google style guide, and the rules in this file trump them
+both.
+
+[chr-style]: https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++.md
+[goog-style]: https://google.github.io/styleguide/cppguide.html
+
+### C++ version
+
+WebRTC is written in C++17, but with some restrictions:
+
+* We only allow the subset of C++17 (language and library) that is not banned by
+ Chromium; see the [list of banned C++ features in Chromium][chr-style-cpp].
+* We only allow the subset of C++17 that is also valid C++20; otherwise, users
+ would not be able to compile WebRTC in C++20 mode.
+
+[chr-style-cpp]: https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++-features.md
+
+### Abseil
+
+You may use a subset of the utilities provided by the [Abseil][abseil] library
+when writing WebRTC C++ code; see the
+[instructions on how to use Abseil in WebRTC](abseil-in-webrtc.md).
+
+[abseil]: https://abseil.io/about/
+
+### <a name="h-cc-pairs"></a>`.h` and `.cc` files come in pairs
+
+`.h` and `.cc` files should come in pairs, with the same name (except for the
+file type suffix), in the same directory, in the same build target.
+
+* If a declaration in `path/to/foo.h` has a definition in some `.cc` file, it
+ should be in `path/to/foo.cc`.
+* If a definition in `path/to/foo.cc` file has a declaration in some `.h` file,
+ it should be in `path/to/foo.h`.
+* Omit the `.cc` file if it would have been empty, but still list the `.h` file
+ in a build target.
+* Omit the `.h` file if it would have been empty. (This can happen with unit
+ test `.cc` files, and with `.cc` files that define `main`.)
+
+See also the
+[examples and exceptions on how to treat `.h` and `.cpp` files](style-guide/h-cc-pairs.md).
+
+This makes the source code easier to navigate and organize, and precludes some
+questionable build system practices such as having build targets that don't pull
+in definitions for everything they declare.
+
+### `TODO` comments
+
+Follow the [Google styleguide for `TODO` comments][goog-style-todo]. When
+referencing a WebRTC bug, prefer using the URL form (excluding the scheme part):
+
+```cpp
+// TODO(bugs.webrtc.org/12345): Delete the hack when blocking bugs are resolved.
+```
+
+The short form used in commit messages, e.g. `webrtc:12345`, is discouraged.
+
+[goog-style-todo]: https://google.github.io/styleguide/cppguide.html#TODO_Comments
+
+### Deprecation
+
+Annotate the declarations of deprecated functions and classes with the
+[`[[deprecated]]` attribute][DEPRECATED] to cause an error when they're used
+inside WebRTC and a compiler warning when they're used by dependant projects.
+Like so:
+
+```cpp
+[[deprecated("bugs.webrtc.org/12345")]]
+std::pony PonyPlz(const std::pony_spec& ps);
+```
+
+NOTE 1: The annotation goes on the declaration in the `.h` file, not the
+definition in the `.cc` file!
+
+NOTE 2: In order to have unit tests that use the deprecated function without
+getting errors, do something like this:
+
+```cpp
+std::pony DEPRECATED_PonyPlz(const std::pony_spec& ps);
+[[deprecated("bugs.webrtc.org/12345")]]
+inline std::pony PonyPlz(const std::pony_spec& ps) {
+ return DEPRECATED_PonyPlz(ps);
+}
+```
+
+In other words, rename the existing function, and provide an inline wrapper
+using the original name that calls it. That way, callers who are willing to
+call it using the `DEPRECATED_`-prefixed name don't get the warning.
+
+NOTE 3: Occasionally, with long descriptions, `git cl format` will do the wrong
+thing with the attribute. In that case, you can use the
+[`ABSL_DEPRECATED` macro][ABSL_DEPRECATED], which is formatted in a more
+readable way.
+
+[DEPRECATED]: https://en.cppreference.com/w/cpp/language/attributes/deprecated
+[ABSL_DEPRECATED]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/base/attributes.h?q=ABSL_DEPRECATED
+
+### ArrayView
+
+When passing an array of values to a function, use `rtc::ArrayView`
+whenever possible—that is, whenever you're not passing ownership of
+the array, and don't allow the callee to change the array size.
+
+For example,
+
+| instead of | use |
+|-------------------------------------|----------------------|
+| `const std::vector<T>&` | `ArrayView<const T>` |
+| `const T* ptr, size_t num_elements` | `ArrayView<const T>` |
+| `T* ptr, size_t num_elements` | `ArrayView<T>` |
+
+See the [source code for `rtc::ArrayView`](api/array_view.h) for more detailed
+docs.
+
+### Strings
+
+WebRTC uses std::string, with content assumed to be UTF-8. Note that this
+has to be verified whenever accepting external input.
+
+For concatenation of strings, use rtc::SimpleStringBuilder.
+
+The following string building tools are NOT recommended:
+* The + operator. See https://abseil.io/tips/3 for why not.
+* absl::StrCat, absl::StrAppend, absl::StrJoin. These are optimized for
+ speed, not code size, and have significant code size overhead.
+* strcat. It is too easy to create buffer overflows.
+
+### sigslot
+
+SIGSLOT IS DEPRECATED.
+
+Prefer `webrtc::CallbackList`, and manage thread safety yourself.
+
+### Smart pointers
+
+The following smart pointer types are recommended:
+
+ * `std::unique_ptr` for all singly-owned objects
+ * `rtc::scoped_refptr` for all objects with shared ownership
+
+Use of `std::shared_ptr` is *not permitted*. It is banned in the Chromium style
+guide (overriding the Google style guide). See the
+[list of banned C++ library features in Chromium][chr-std-shared-ptr] for more
+information.
+
+In most cases, one will want to explicitly control lifetimes, and therefore use
+`std::unique_ptr`, but in some cases, for instance where references have to
+exist both from the API users and internally, with no way to invalidate pointers
+held by the API user, `rtc::scoped_refptr` can be appropriate.
+
+[chr-std-shared-ptr]: https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++-features.md#shared-pointers-banned
+
+### `std::bind`
+
+Don't use `std::bind`—there are pitfalls, and lambdas are almost as succinct and
+already familiar to modern C++ programmers.
+
+### `std::function`
+
+`std::function` is allowed, but remember that it's not the right tool for every
+occasion. Prefer to use interfaces when that makes sense, and consider
+`rtc::FunctionView` for cases where the callee will not save the function
+object.
+
+### Forward declarations
+
+WebRTC follows the
+[Google C++ style guide on forward declarations][goog-forward-declarations].
+In summary: avoid using forward declarations where possible; just `#include` the
+headers you need.
+
+[goog-forward-declarations]: https://google.github.io/styleguide/cppguide.html#Forward_Declarations
+
+### RTTI and dynamic_cast
+
+The Google style guide [permits the use of dynamic_cast](https://google.github.io/styleguide/cppguide.html#Run-Time_Type_Information__RTTI_).
+
+However, WebRTC does not permit it. WebRTC (and Chrome) is compiled with the
+-fno-rtti flag, and the overhead of enabling RTTI it is on the order of 220
+Kbytes (for Android Arm64).
+
+Use static_cast and take your own steps to ensure type safety.
+
+## C
+
+There's a substantial chunk of legacy C code in WebRTC, and a lot of it is old
+enough that it violates the parts of the C++ style guide that also applies to C
+(naming etc.) for the simple reason that it pre-dates the use of the current C++
+style guide for this code base. If making large changes to C code, consider
+converting the whole thing to C++ first.
+
+## Java
+
+WebRTC follows the [Google Java style guide][goog-java-style].
+
+[goog-java-style]: https://google.github.io/styleguide/javaguide.html
+
+## Objective-C and Objective-C++
+
+WebRTC follows the
+[Chromium Objective-C and Objective-C++ style guide][chr-objc-style].
+
+[chr-objc-style]: https://chromium.googlesource.com/chromium/src/+/main/styleguide/objective-c/objective-c.md
+
+## Python
+
+WebRTC follows [Chromium's Python style][chr-py-style].
+
+[chr-py-style]: https://chromium.googlesource.com/chromium/src/+/main/styleguide/python/python.md
+
+## Build files
+
+The WebRTC build files are written in [GN][gn], and we follow the
+[GN style guide][gn-style]. Additionally, there are some
+WebRTC-specific rules below; in case of conflict, they trump the Chromium style
+guide.
+
+[gn]: https://gn.googlesource.com/gn/
+[gn-style]: https://gn.googlesource.com/gn/+/HEAD/docs/style_guide.md
+
+### <a name="webrtc-gn-templates"></a>WebRTC-specific GN templates
+
+As shown in the table below, for library targets (`source_set` and
+`static_library`), you should default on using `rtc_library` (which abstracts
+away the complexity of using the correct target type for Chromium component
+builds).
+
+The general rule is for library targets is:
+1. Use `rtc_library`.
+2. If the library is a header only target use `rtc_source_set`.
+3. If you really need to generate a static library, use `rtc_static_library`
+ (same for shared libraries, in such case use `rtc_shared_library`).
+
+To ensure that all our [GN targets][gn-target] are built with the same
+configuration, only use the following [GN templates][gn-templ].
+
+| instead of | use |
+|------------------|-----------------------------------------------------------------------------------------|
+| `executable` | `rtc_executable` |
+| `shared_library` | `rtc_shared_library` |
+| `source_set` | `rtc_source_set` (only for header only libraries, for everything else use `rtc_library` |
+| `static_library` | `rtc_static_library` (use `rtc_library` unless you really need `rtc_static_library` |
+| `test` | `rtc_test` |
+
+
+[gn-templ]: https://gn.googlesource.com/gn/+/HEAD/docs/language.md#Templates
+[gn-target]: https://gn.googlesource.com/gn/+/HEAD/docs/language.md#Targets
+
+### Target visibility and the native API
+
+The [WebRTC-specific GN templates](#webrtc-gn-templates) declare build targets
+whose default `visibility` allows all other targets in the WebRTC tree (and no
+targets outside the tree) to depend on them.
+
+Prefer to restrict the `visibility` if possible:
+
+* If a target is used by only one or a tiny number of other targets, prefer to
+ list them explicitly: `visibility = [ ":foo", ":bar" ]`
+* If a target is used only by targets in the same `BUILD.gn` file:
+ `visibility = [ ":*" ]`.
+
+Setting `visibility = [ "*" ]` means that targets outside the WebRTC tree can
+depend on this target; use this only for build targets whose headers are part of
+the [native WebRTC API](native-api.md).
+
+### Conditional compilation with the C preprocessor
+
+Avoid using the C preprocessor to conditionally enable or disable pieces of
+code. But if you can't avoid it, introduce a GN variable, and then set a
+preprocessor constant to either 0 or 1 in the build targets that need it:
+
+```gn
+if (apm_debug_dump) {
+ defines = [ "WEBRTC_APM_DEBUG_DUMP=1" ]
+} else {
+ defines = [ "WEBRTC_APM_DEBUG_DUMP=0" ]
+}
+```
+
+In the C, C++, or Objective-C files, use `#if` when testing the flag,
+not `#ifdef` or `#if defined()`:
+
+```c
+#if WEBRTC_APM_DEBUG_DUMP
+// One way.
+#else
+// Or another.
+#endif
+```
+
+When combined with the `-Wundef` compiler option, this produces compile time
+warnings if preprocessor symbols are misspelled, or used without corresponding
+build rules to set them.
diff --git a/third_party/libwebrtc/g3doc/style-guide/OWNERS b/third_party/libwebrtc/g3doc/style-guide/OWNERS
new file mode 100644
index 0000000000..a3ecbc9948
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/style-guide/OWNERS
@@ -0,0 +1 @@
+danilchap@webrtc.org
diff --git a/third_party/libwebrtc/g3doc/style-guide/h-cc-pairs.md b/third_party/libwebrtc/g3doc/style-guide/h-cc-pairs.md
new file mode 100644
index 0000000000..08eed85c23
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/style-guide/h-cc-pairs.md
@@ -0,0 +1,32 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'danilchap' reviewed: '2021-05-12'} *-->
+
+# `.h` and `.cc` files come in pairs
+
+This is an overflow page for [this](/g3doc/style-guide.md#h-cc-pairs)
+style rule.
+
+## Example violations
+
+Example violations, which should be avoided in new code:
+
+* Declarations in `path/to/include/foo.h`, definitions in
+ `path/to/source/foo.cc`. **Fix:** The `.h` and `.cc` files should be
+ in the same directory.
+* Declarations in `foo.h`, definitions in both `foo_bar.cc` and
+ `foo_baz.cc`. **Fix:** The `.h` and `.cc` files should come in
+ pairs, so either split `foo.h` into `foo_bar.h` and `foo_baz.h`, or
+ merge `foo_bar.cc` and `foo_baz.cc` into `foo.cc`.
+
+## Exception for platform-specific code
+
+If the functions in a header file need different implementations for
+different platforms, we allow the following arrangement:
+
+* Declarations in `foo.h`.
+* A complete set of matching definitions in `foo_win.cc`, another
+ complete set of matching definitions in `foo_mac.cc`, and so on.
+* As per the main rule, these files should all be in the same
+ directory and in the same build target. The build target should use
+ platform conditionals to ensure that exactly one of the `.cc` files
+ are included.
diff --git a/third_party/libwebrtc/g3doc/supported-platforms-and-compilers.md b/third_party/libwebrtc/g3doc/supported-platforms-and-compilers.md
new file mode 100644
index 0000000000..4e65767499
--- /dev/null
+++ b/third_party/libwebrtc/g3doc/supported-platforms-and-compilers.md
@@ -0,0 +1,34 @@
+<!-- go/cmark -->
+<!--* freshness: {owner: 'mbonadei' reviewed: '2021-06-25'} *-->
+
+# WebRTC supported plaftorms and compilers
+
+## Operating systems and CPUs
+
+The list of officially supported operating systems and CPUs is:
+
+* Android: armeabi-v7a, arm64-v8a, x86, x86_64.
+* iOS: arm64, x86_64.
+* Linux: armeabi-v7a, arm64-v8a, x86, x86_64.
+* macOS: x86_64, arm64 (M1).
+* Windows: x86_64.
+
+Other platforms are not officially supported (which means there is no CI
+coverage for them) but patches to keep WebRTC working with them are welcomed by
+the WebRTC Team.
+
+## Compilers
+
+WebRTC officially supports clang on all the supported platforms. The clang
+version officially supported is the one used by Chromium (hence the version is
+really close to Tip of Tree and can be checked
+[here](https://source.chromium.org/chromium/chromium/src/+/main:tools/clang/scripts/update.py)
+by looking at the value of `CLANG_REVISION`).
+
+See also
+[here](https://source.chromium.org/chromium/chromium/src/+/main:docs/clang.md)
+for some clang related documentation from Chromium.
+
+Other compilers are not officially supported (which means there is no CI
+coverage for them) but patches to keep WebRTC working with them are welcomed by
+the WebRTC Team.