├── ios-patches ├── .gitkeep └── 005_support_ios9.diff ├── webrtc ├── .gitignore ├── .gclient └── .gclient_entries ├── README.md ├── .gitmodules ├── Makefile ├── bin ├── apply_signal_patches ├── clean_webrtc.py └── print_build_env.py ├── IOS_PATCHES_README.md └── BUILDING.md /ios-patches/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webrtc/.gitignore: -------------------------------------------------------------------------------- 1 | .cipd 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebRTC for Signal-iOS 2 | 3 | See [BUILDING.md](BUILDING.md) for build instructions. 4 | See [IOS_PATCHES_README.md](IOS_PATCHES_README.md) for customizations. 5 | -------------------------------------------------------------------------------- /webrtc/.gclient: -------------------------------------------------------------------------------- 1 | solutions = [ 2 | { 3 | "url": "https://chromium.googlesource.com/external/webrtc.git", 4 | "managed": False, 5 | "name": "src", 6 | "deps_file": "DEPS", 7 | "custom_deps": {}, 8 | }, 9 | ] 10 | target_os = ["ios", "mac"] 11 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "src"] 2 | path = webrtc/src 3 | url = https://chromium.googlesource.com/external/webrtc.git 4 | [submodule "libwebrtc-android"] 5 | path = libwebrtc-android 6 | url = https://github.com/signalapp/libwebrtc-android.git 7 | [submodule "Builds"] 8 | path = Builds 9 | url = https://github.com/signalapp/signal-webrtc-ios-artifacts.git 10 | -------------------------------------------------------------------------------- /ios-patches/005_support_ios9.diff: -------------------------------------------------------------------------------- 1 | diff --git a/.gn b/.gn 2 | index 5c9f362c3f..9110455155 100644 3 | --- a/.gn 4 | +++ b/.gn 5 | @@ -63,7 +63,8 @@ default_args = { 6 | 7 | mac_sdk_min = "10.12" 8 | 9 | - ios_deployment_target = "10.0" 10 | + # http://bugs.webrtc.org/8570 11 | + ios_deployment_target = "9.0" 12 | 13 | # The SDK API level, in contrast, is set by build/android/AndroidManifest.xml. 14 | android32_ndk_api_level = 16 15 | diff --git a/tools_webrtc/ios/build_ios_libs.py b/tools_webrtc/ios/build_ios_libs.py 16 | index b0d28c0151..76a61f1f0b 100755 17 | --- a/tools_webrtc/ios/build_ios_libs.py 18 | +++ b/tools_webrtc/ios/build_ios_libs.py 19 | @@ -33,7 +33,7 @@ SDK_OUTPUT_DIR = os.path.join(SRC_DIR, 'out_ios_libs') 20 | SDK_FRAMEWORK_NAME = 'WebRTC.framework' 21 | 22 | DEFAULT_ARCHS = ENABLED_ARCHS = ['arm64', 'arm', 'x64', 'x86'] 23 | -IOS_DEPLOYMENT_TARGET = '10.0' 24 | +IOS_DEPLOYMENT_TARGET = '9.0' 25 | LIBVPX_BUILD_VP9 = False 26 | 27 | sys.path.append(os.path.join(SCRIPT_DIR, '..', 'libs')) 28 | @@ -156,6 +156,10 @@ def main(): 29 | _CleanTemporary(args.output_dir, architectures) 30 | return 0 31 | 32 | + # Ignoring x86 for now because of a GN build issue 33 | + # where the generated dynamic framework has the wrong architectures. 34 | + architectures.remove('x86') 35 | + 36 | gn_target_name = 'framework_objc' 37 | if not args.bitcode: 38 | gn_args.append('enable_dsyms=true') 39 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ROOT_DIR=./ 2 | WEBRTC_SRC_DIR=webrtc/src 3 | BUILD_ARTIFACTS_DIR=./Builds/Build 4 | 5 | default: full_build 6 | 7 | full_build: clean sync update_tools archive 8 | fast_build: clean sync archive 9 | 10 | update_step1: clean 11 | cd $(WEBRTC_SRC_DIR) && \ 12 | gclient sync --with_branch_heads && \ 13 | git branch -a 14 | echo "Updated. Now checkout the latest stable branch" 15 | 16 | update_step2: 17 | cd $(WEBRTC_SRC_DIR) && \ 18 | gclient sync --jobs 16 && \ 19 | git clean -df 20 | 21 | clean: 22 | bin/clean_webrtc.py 23 | 24 | patch: 25 | bin/apply_signal_patches 26 | 27 | sync: 28 | git submodule update 29 | cd $(WEBRTC_SRC_DIR) && \ 30 | gclient sync --jobs 16 31 | 32 | # This step can be really slow, as it downloads a ton of resources into the 33 | # webrtc/src directory. Subsequent calls are quick, so long as you don't blow 34 | # away the downloaded resources. Thus our `make clean` attempts to only clean 35 | # things that are changed by our build process, at the expense of some robustness 36 | update_tools: 37 | cd $(WEBRTC_SRC_DIR) && \ 38 | gclient runhooks --jobs 16 39 | 40 | build: 41 | $(WEBRTC_SRC_DIR)/tools_webrtc/ios/build_ios_libs.sh 42 | 43 | log_build_env: 44 | bin/print_build_env.py > webrtc/src/out_ios_libs/WebRTC.framework/build_env.txt 45 | 46 | archive: patch build log_build_env 47 | rm -fr $(BUILD_ARTIFACTS_DIR)/WebRTC.framework && \ 48 | mv $(WEBRTC_SRC_DIR)/out_ios_libs/WebRTC.framework $(BUILD_ARTIFACTS_DIR) 49 | -------------------------------------------------------------------------------- /bin/apply_signal_patches: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Applies Signal specific modifications to webrtc 4 | # 5 | # Example Usage: 6 | # 7 | # bin/apply-patches 8 | # 9 | 10 | BIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 11 | 12 | PATCHES_DIR="${BIN_DIR}/../libwebrtc-android/patches" 13 | IOS_PATCHES_DIR="${BIN_DIR}/../ios-patches" 14 | WEBRTC_DIR="${BIN_DIR}/../webrtc" 15 | 16 | if [ ! -d "$PATCHES_DIR" ] 17 | then 18 | echo " [!] PATCHES_DIR does not exist: ${PATCHES_DIR}" 19 | exit 1 20 | fi 21 | 22 | if [ ! -d "$IOS_PATCHES_DIR" ] 23 | then 24 | echo " [!] IOS_PATCHES_DIR does not exist: ${IOS_PATCHES_DIR}" 25 | exit 1 26 | fi 27 | 28 | if [ ! -d "$WEBRTC_DIR" ] 29 | then 30 | echo " [!] WEBRTC_DIR does not exist: ${WEBRTC_DIR}" 31 | exit 1 32 | fi 33 | 34 | cd "$WEBRTC_DIR/src" 35 | 36 | echo "Shared patches from ${PATCHES_DIR}" 37 | echo "###" 38 | for patch_file in $(ls "$PATCHES_DIR") 39 | do 40 | echo "" 41 | echo "Applying patch file: ${patch_file}" 42 | echo "..." 43 | patch -p1 < "${PATCHES_DIR}/${patch_file}" 44 | 45 | if [ $? -eq 0 ] 46 | then 47 | echo "Success!" 48 | else 49 | echo " [!] Failed to apply patch file: ${patch_file}" 50 | exit 1 51 | fi 52 | done 53 | 54 | echo "Patches from ${IOS_PATCHES_DIR}" 55 | echo "###" 56 | for patch_file in $(ls "$IOS_PATCHES_DIR") 57 | do 58 | echo "" 59 | echo "Applying patch file: ${patch_file}" 60 | echo "..." 61 | patch -p1 < "${IOS_PATCHES_DIR}/${patch_file}" 62 | 63 | if [ $? -eq 0 ] 64 | then 65 | echo "Success!" 66 | else 67 | echo " [!] Failed to apply patch file: ${patch_file}" 68 | exit 1 69 | fi 70 | done 71 | 72 | -------------------------------------------------------------------------------- /bin/clean_webrtc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Attempts to reverse any Signal specific modifications to webrtc. 4 | # If our patches change, this may have to be revisited in the future. 5 | # 6 | # Example Usage: 7 | # 8 | # ./clean_webrtc.py 9 | # 10 | 11 | import os 12 | import subprocess 13 | import contextlib 14 | 15 | @contextlib.contextmanager 16 | def pushd(new_dir): 17 | previous_dir = os.getcwd() 18 | os.chdir(new_dir) 19 | yield 20 | os.chdir(previous_dir) 21 | 22 | BIN_DIR = os.path.dirname(__file__) 23 | 24 | def make_pristine(path, ignore_failures = False): 25 | print("Cleaning %s" % path) 26 | if not os.path.exists(path): 27 | if ignore_failures: 28 | print("path=%s does not exist, but that's OK" % path) 29 | return 30 | else: 31 | raise RuntimeError("path=%s does not exist" % path) 32 | 33 | with pushd(path): 34 | subprocess.check_output(["git", "clean", "-dfx"]) 35 | subprocess.check_output(["git", "stash"]) 36 | 37 | def main(): 38 | webrtc_src_dir = os.path.join(BIN_DIR, "../webrtc/src") 39 | 40 | # This directory moved, so it might need to be cleaned before updating, but 41 | # it won't be expected to exist in the future. 42 | legacy_sdk_dir = os.path.join(webrtc_src_dir, "webrtc", "sdk") 43 | make_pristine(legacy_sdk_dir, ignore_failures = True) 44 | 45 | sdk_dir = os.path.join(webrtc_src_dir, "sdk") 46 | make_pristine(sdk_dir) 47 | 48 | tools_dir = os.path.join(webrtc_src_dir, "tools_webrtc") 49 | make_pristine(tools_dir) 50 | 51 | third_party_dir = os.path.join(webrtc_src_dir, "third_party", "opus") 52 | make_pristine(third_party_dir) 53 | 54 | if __name__ == "__main__": 55 | main() 56 | 57 | -------------------------------------------------------------------------------- /bin/print_build_env.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from string import Template 4 | import subprocess 5 | import os 6 | import re 7 | import contextlib 8 | 9 | ## 10 | # Prints some details about the current build environment. 11 | # 12 | # Example Usage: 13 | # ./print_build_env.py 14 | # 15 | 16 | BIN_DIR = os.path.dirname(__file__) 17 | webrtc_src_dir = os.path.join(BIN_DIR, '../webrtc/src') 18 | 19 | @contextlib.contextmanager 20 | def pushd(new_dir): 21 | previous_dir = os.getcwd() 22 | os.chdir(new_dir) 23 | yield 24 | os.chdir(previous_dir) 25 | 26 | def determine_git_branch(directory): 27 | with pushd(directory): 28 | git_branch_output = subprocess.check_output(["git", "branch"]) 29 | git_branch = [line.replace("* ", "") for line in git_branch_output.split("\n") if re.search("^\*", line)][0] 30 | return git_branch 31 | 32 | def determine_git_sha(directory): 33 | with pushd(directory): 34 | return subprocess.check_output(["git", "rev-parse", "HEAD"]).strip("\n") 35 | 36 | def get_build_details(): 37 | template = Template("""## WebRTC Build Details 38 | 39 | To track down potential future issues, we log some of our build environment details. 40 | 41 | webrtc git branch: 42 | $webrtc_git_branch 43 | 44 | webrtc git sha: 45 | $webrtc_git_sha 46 | 47 | build_script git sha: 48 | $build_script_git_sha 49 | 50 | xcodebuild -version: 51 | $xcode_version 52 | 53 | xcode-select -p: 54 | $xcode_path 55 | 56 | gcc -v: 57 | $gcc_version 58 | 59 | osx_version_details: 60 | $osx_version_details 61 | 62 | hostname: 63 | $hostname 64 | """) 65 | 66 | webrtc_git_branch = determine_git_branch(webrtc_src_dir) 67 | webrtc_git_sha = determine_git_sha(webrtc_src_dir) 68 | build_script_git_sha = determine_git_sha("./") 69 | xcode_version = subprocess.check_output(["xcodebuild", "-version"]).strip("\n") 70 | xcode_path = subprocess.check_output(["xcode-select", "-p"]).strip("\n") 71 | gcc_version = subprocess.check_output(["gcc", "-v"], stderr=subprocess.STDOUT).strip("\n") 72 | osx_version_details = subprocess.check_output(["sw_vers"]).strip("\n") 73 | hostname = subprocess.check_output(["scutil", "--get", "ComputerName"]).strip("\n") 74 | 75 | details = template.substitute( 76 | webrtc_git_branch = webrtc_git_branch, 77 | webrtc_git_sha = webrtc_git_sha, 78 | build_script_git_sha = build_script_git_sha, 79 | xcode_version = xcode_version, 80 | xcode_path = xcode_path, 81 | gcc_version = gcc_version, 82 | osx_version_details = osx_version_details, 83 | hostname = hostname 84 | ) 85 | 86 | return details 87 | 88 | def main(): 89 | print(get_build_details()) 90 | 91 | if __name__ == "__main__": 92 | main() 93 | -------------------------------------------------------------------------------- /IOS_PATCHES_README.md: -------------------------------------------------------------------------------- 1 | Patches required to build webrtc for Signal on iOS 2 | 3 | ## Current Patches 4 | 5 | ### patch file: libwebrtc-andoird/patches/opus.patch 6 | 7 | Hardcode CBR mode for opus 8 | 9 | ### patch file: ios-patches/005_support_ios9.diff 10 | 11 | Upstream removed support for iOS9. 12 | 13 | Reverts commits: 14 | ad3971f40f5c38d340cd1a2642c189cef3368c02 15 | ffe9376a13e03901a6351d58a8da5e6d28b3ae52 16 | 17 | A related restriction is that supporting 32bit simulator is related to 18 | supporting iOS9 builds. So part of the reversion re-sets the build target to 19 | iOS9, and the other part re-disables support for 32-bit simulator. 20 | 21 | ## Retired Patches 22 | 23 | ### patch file: ios-patches/004_metalkit_aspect_fill.diff 24 | 25 | Retired: fixed in upstream webrtc:4feb2044db4 26 | 27 | The MetalKit backed video renderer is currently hardcoded to AspectFit, 28 | which causes letterboxing for our fullscreen video preview. This fix was 29 | suggested on the mailing list, and may be unnecessary in future 30 | versions. 31 | 32 | https://groups.google.com/forum/#!searchin/discuss-webrtc/RTCMTLVideoView%7Csort:relevance/discuss-webrtc/Fn4Q0dUranY/1YZApRVWAwAJ 33 | 34 | ### patch file: ios-patches/003_support_ios8.diff 35 | 36 | Retired: Signal-iOS no longer supports iOS8 37 | 38 | In M58 WebRTC introduced MetalKit backed rendering, which enables a 39 | higher-performance (lower power consumption) video renderer. However, 40 | MetalKit isn't available on iOS8 and since WebRTC doesn't officially 41 | support iOS8, we were crashing on launch. 42 | 43 | Changes to support iOS8 include: 44 | - Having a runtime check to see if MetalKit is available before 45 | instantiating anything from MetalKit. 46 | - Ensure the MetalKit dylib is loaded "weakly" be specifying iOS8 as the minimum 47 | deployment target. 48 | - Adding "@availability" checks as necessary to satisfy the compiler 49 | after changing the minimum deployment target. 50 | 51 | ### patch file: 002_issue2832803002_20001.diff 52 | 53 | There is a build error when building Signal-iOS because some of the 54 | headers referenced in the frameworks public headers are themselves, not 55 | public. 56 | 57 | Read more at: 58 | https://codereview.webrtc.org/2832803002 59 | 60 | This is fixed in WebRTC master and this patch can be removed in WebRTC 61 | version >= 60 62 | 63 | ### patch file: ios-patches/001_issue2833833002_1_10001.diff 64 | 65 | There is an error when building WebRTC.framework in XCode 8.3. This 66 | should be resolved in WebRTC version >=60. At which point we should 67 | remove the patch. 68 | 69 | Patch downloaded from: 70 | https://codereview.chromium.org/2833833002 71 | 72 | Read more at: 73 | https://bugs.chromium.org/p/webrtc/issues/detail?id=7481 74 | https://chromium.googlesource.com/chromium/src/+/b1eb09e2deb0335502f6b744a902dd0251a209f3 75 | 76 | -------------------------------------------------------------------------------- /BUILDING.md: -------------------------------------------------------------------------------- 1 | ### Building WebRTC 2 | 3 | A prebuilt version of WebRTC.framework resides in the Signal Carthage submodule 4 | However, if you'd like to build it from source, with our modifications see below. 5 | 6 | These instructions are derived from the WebRTC documentation: 7 | 8 | https://webrtc.org/native-code/ios/ 9 | 10 | Initial Setup for first time building WebRTC.framework 11 | 12 | ## Installation prerequisites 13 | 14 | ### Apple Dev Tools 15 | 16 | **Note** currently building WebRTC requires Xcode9+ 17 | 18 | ### Install depot tools 19 | 20 | cd 21 | git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 22 | cd depot_tools 23 | export PATH=/depot_tools:"$PATH" 24 | 25 | ## Fetch WebRTC source 26 | 27 | git clone https://github.com/signalapp/signal-webrtc-ios 28 | cd signal-webrtc-ios 29 | 30 | # Fetch the webrtc src root plus our shared patches 31 | git submodule update --init 32 | 33 | # Install webrtc submodules specified in DEPS 34 | cd webrtc 35 | gclient sync 36 | 37 | # This process dirties the working directory. If this is your first build, 38 | # you can skip this step. Otherwise we want to make sure we start from a 39 | # pristine webrtc dir. 40 | ../bin/clean_webrtc.py 41 | 42 | ## Updating WebRTC.framework (optional) 43 | 44 | This section is only required if you want to use a newer version. 45 | based on: https://www.chromium.org/developers/how-tos/get-the-code/working-with-release-branches 46 | 47 | # Make sure you are in 'signal-webrtc-ios/webrtc/src'. 48 | 49 | # The first time your run this might take a while because it fetches 50 | # an extra 1/2 GB or so of branch commits. 51 | gclient sync --with_branch_heads 52 | 53 | # OPTIONAL: If that failed, try repeating after running fetch 54 | git fetch 55 | gclient sync --with_branch_heads 56 | 57 | # List available branch heads 58 | git branch -a 59 | 60 | # Checkout the branch 'src' tree. 61 | # You can find a list of release notes here: https://webrtc.org/release-notes/ 62 | git checkout branch-heads/$LATEST_STABLE_RELEASE_NUMBER 63 | 64 | # Checkout all the submodules at their branch DEPS revisions. 65 | gclient sync --jobs 16 66 | 67 | # Clean up anything that's since been removed from upstream. 68 | git clean -df 69 | 70 | ## Building WebRTC.framework 71 | 72 | Finally. Why we're all here. 73 | 74 | # Apply Signal Patches 75 | ../../bin/apply_signal_patches 76 | 77 | # the webrtc project includes a script to build a fat framework for arm/arm64/i386/x86_64 78 | # NOTE: the i386 build is currently broken, so you can't run iPhone5 simulators 79 | tools_webrtc/ios/build_ios_libs.sh 80 | 81 | # If you get errors about missing build tools, like 'gn', you may be 82 | # able to install them with the following (then go back to "Building 83 | # WebRTC.framework" step: 84 | gclient runhooks 85 | 86 | # Integrate into Signal 87 | 88 | # Remove the existing directory to make sure any obsolete files are removed 89 | rm -r $SIGNAL_IOS_REPO_ROOT/ThirdParty/WebRTC/Build/WebRTC.framework 90 | 91 | # Move the WebRTC.framework into Signal-iOS's WebRTC directory. 92 | # This is a submodule to keep the size of the primary Signal-iOS repository down, 93 | mv out_ios_libs/WebRTC.framework $SIGNAL_IOS_REPO_ROOT/ThirdParty/WebRTC/Build/ 94 | 95 | # Make sure we add any new files, since we gitignore * 96 | cd $SIGNAL_IOS_REPO_ROOT/ThirdParty/WebRTC/Build 97 | git add -f WebRTC.framework 98 | git commit -m "update artifact to (e.g. M72)" 99 | 100 | -------------------------------------------------------------------------------- /webrtc/.gclient_entries: -------------------------------------------------------------------------------- 1 | entries = { 2 | 'src': 'https://chromium.googlesource.com/external/webrtc.git', 3 | 'src/base': 'https://chromium.googlesource.com/chromium/src/base@586a25c28de02b658605d9caa3cdb1049e741cdd', 4 | 'src/build': 'https://chromium.googlesource.com/chromium/src/build@444ba3628830dafcae37bc8b3c7f8a52794a94e0', 5 | 'src/buildtools': 'https://chromium.googlesource.com/chromium/src/buildtools@0218c0f9ac9fdba00e5c27b5aca94d3a64c74f34', 6 | 'src/buildtools/clang_format/script': 'https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git@96636aa0e9f047f17447f2d45a094d0b59ed7917', 7 | 'src/buildtools/mac:gn/gn/mac-amd64': 'https://chrome-infra-packages.appspot.com/gn/gn/mac-amd64@git_revision:81ee1967d3fcbc829bac1c005c3da59739c88df9', 8 | 'src/buildtools/third_party/libc++/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxx.git@5938e0582bac570a41edb3d6a2217c299adc1bc6', 9 | 'src/buildtools/third_party/libc++abi/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxxabi.git@0d529660e32d77d9111912d73f2c74fc5fa2a858', 10 | 'src/buildtools/third_party/libunwind/trunk': 'https://chromium.googlesource.com/external/llvm.org/libunwind.git@69d9b84cca8354117b9fe9705a4430d789ee599b', 11 | 'src/ios': 'https://chromium.googlesource.com/chromium/src/ios@d10cddfaf828e1b4032831becb29d627cd872b22', 12 | 'src/testing': 'https://chromium.googlesource.com/chromium/src/testing@8d29c9ddf904d0c53560c6baf30536e628dbe81f', 13 | 'src/third_party': 'https://chromium.googlesource.com/chromium/src/third_party@39da171c1e6e96b895b15833e4dfdf4d801a4b29', 14 | 'src/third_party/boringssl/src': 'https://boringssl.googlesource.com/boringssl.git@2e0d354690064c90ee245c715b92e2bb32492571', 15 | 'src/third_party/catapult': 'https://chromium.googlesource.com/catapult.git@903755a1f84b0a3dc6813f5f177c14a89e72c38d', 16 | 'src/third_party/colorama/src': 'https://chromium.googlesource.com/external/colorama.git@799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8', 17 | 'src/third_party/depot_tools': 'https://chromium.googlesource.com/chromium/tools/depot_tools.git@96104d42dad1ff62acc4aa58540286690ea4a34a', 18 | 'src/third_party/ffmpeg': 'https://chromium.googlesource.com/chromium/third_party/ffmpeg.git@68f1932090d5e35d958434d0588a33986cd3d65d', 19 | 'src/third_party/freetype/src': 'https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@f37083edf0ef562fb8bae0dfc6f916b1037f71fe', 20 | 'src/third_party/googletest/src': 'https://chromium.googlesource.com/external/github.com/google/googletest.git@f5edb4f542e155c75bc4b516f227911d99ec167c', 21 | 'src/third_party/gtest-parallel': 'https://chromium.googlesource.com/external/github.com/google/gtest-parallel@3fca10f81ee3b40380207228be2ecf515f051b61', 22 | 'src/third_party/harfbuzz-ng/src': 'https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@c73d7ba75d4556d9b8e05b10d6572f74f4814f7a', 23 | 'src/third_party/icu': 'https://chromium.googlesource.com/chromium/deps/icu.git@64e5d7d43a1ff205e3787ab6150bbc1a1837332b', 24 | 'src/third_party/jsoncpp/source': 'https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git@f572e8e42e22cfcf5ab0aea26574f408943edfa4', 25 | 'src/third_party/libFuzzer/src': 'https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git@e9b95bcfe2f5472fac2e516a0040aedf2140dd62', 26 | 'src/third_party/libjpeg_turbo': 'https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@2de84a43e683c2c3c8ff4922da16b9053f024144', 27 | 'src/third_party/libsrtp': 'https://chromium.googlesource.com/chromium/deps/libsrtp.git@650611720ecc23e0e6b32b0e3100f8b4df91696c', 28 | 'src/third_party/libvpx/source/libvpx': 'https://chromium.googlesource.com/webm/libvpx.git@0308a9a132612006056f9920c069a1942e49c26c', 29 | 'src/third_party/libyuv': 'https://chromium.googlesource.com/libyuv/libyuv.git@b36c86fdfe746d7be904c3a565b047b24d58087e', 30 | 'src/third_party/nasm': 'https://chromium.googlesource.com/chromium/deps/nasm.git@c8b248039ec1f75a7c5733bbe76d7fa416ce097a', 31 | 'src/third_party/openh264/src': 'https://chromium.googlesource.com/external/github.com/cisco/openh264@6f26bce0b1c4e8ce0e13332f7c0083788def5fdf', 32 | 'src/third_party/usrsctp/usrsctplib': 'https://chromium.googlesource.com/external/github.com/sctplab/usrsctp@7a8bc9a90ca96634aa56ee712856d97f27d903f8', 33 | 'src/third_party/yasm/source/patched-yasm': 'https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm.git@720b70524a4424b15fc57e82263568c8ba0496ad', 34 | 'src/tools': 'https://chromium.googlesource.com/chromium/src/tools@b800d29944dad5218467d8d5df0f33cf38ee46ef', 35 | 'src/tools/clang/dsymutil:chromium/llvm-build-tools/dsymutil': 'https://chrome-infra-packages.appspot.com/chromium/llvm-build-tools/dsymutil@OWlhXkmj18li3yhJk59Kmjbc5KdgLh56TwCd1qBdzlIC', 36 | 'src/tools/luci-go:infra/tools/luci/isolate/${platform}': 'https://chrome-infra-packages.appspot.com/infra/tools/luci/isolate/${platform}@git_revision:25958d48e89e980e2a97daeddc977fb5e2e1fb8c', 37 | 'src/tools/luci-go:infra/tools/luci/isolated/${platform}': 'https://chrome-infra-packages.appspot.com/infra/tools/luci/isolated/${platform}@git_revision:25958d48e89e980e2a97daeddc977fb5e2e1fb8c', 38 | 'src/tools/luci-go:infra/tools/luci/swarming/${platform}': 'https://chrome-infra-packages.appspot.com/infra/tools/luci/swarming/${platform}@git_revision:25958d48e89e980e2a97daeddc977fb5e2e1fb8c', 39 | 'src/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@779c4f0f8488c64587b75dbb001d18c3c0c4cda9', 40 | } 41 | --------------------------------------------------------------------------------