FFmpeg as distributed in Tellop (Electron 43.1.0's libffmpeg.dylib): source code
================================================================================

Tellop, published by Pathnomic Labs FZ-LLC, is built on Electron 43.1.0
and carries a copy of the FFmpeg library for macOS on Apple silicon, at

    Tellop.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib

It is the library Electron publishes as its separate FFmpeg release,
built without proprietary codecs:

    https://github.com/electron/electron/releases/download/v43.1.0/ffmpeg-v43.1.0-darwin-arm64.zip
    SHA-256 of the zip:     56a0ebd2ca4318cb1c307305ab198d42c501b2b4236e32e1c447a1d0d0b47b5c
    SHA-256 of the library: f8a5f9ef32f48ea4d168582561895d3a75df80891e18e001b0d84a54ddd5e4b9
                            (1,224,240 bytes, before Tellop signs it)

Tellop puts it in place of the library Electron otherwise ships, before
signing. FFmpeg is free software under the GNU Lesser General Public
License (LGPL), version 2.1 or later, as this build configures it
(section 2). The library also contains libopus, under a BSD licence.

This archive is the complete corresponding source of that library,
offered under the LGPL: FFmpeg's source as Chromium carries it, libopus's
source, the build files that controlled its compilation (Chromium's
build files, and Electron's tagged source with the build settings and
changes Electron used), a script that rebuilds the library, and these
instructions. Pathnomic Labs made no changes to any of this source code:
every file under chromium/ and upstream/ is exactly as its repository
holds it. The script builds in a copy, where it applies Electron's own
changes and writes three small files of its own: a top build file in
place of Chromium's, the settings file a Chromium checkout writes for
itself, and the version line of a Rust toolchain this build does not
use (section 3).

The archive covers the copy for Macs with Apple silicon, the only one
Tellop carries today.


1. What is in this archive
--------------------------

  README.txt
      This file.

  SHA256SUMS
      The SHA-256 of every other file here. Check them with:
          shasum -a 256 -c SHA256SUMS

  build-libffmpeg.sh
      The script that rebuilds the library (section 3), written by
      Pathnomic Labs.

  upstream/electron-43.1.0.tar.gz
      Electron 43.1.0's source, exactly as GitHub serves its tag (MIT).
      From:    https://github.com/electron/electron/archive/refs/tags/v43.1.0.tar.gz
      SHA-256: 1de5d00f715e38b8d0275e4097f3436e2b2e80f1ee598f16ea0018eae750ad74
      Commit:  b5c102b3f0f7e9c5be064ba337a3547a83cf7d09

  chromium/
      The parts of a Chromium checkout this build uses, in the places a
      checkout has them, each exactly as its repository holds it at the
      revision named below. Chromium's Git server makes a new
      archive of a folder on every download, with the time of the
      download in it, so those archives are never the same bytes twice.
      Each folder is instead identified by its Git tree id: the id its
      repository gives that folder at that revision, which identifies
      every file in it and its executable bit. Each single file is
      identified by its Git blob id and its SHA-256.

      chromium/third_party/ffmpeg/
          FFmpeg as Chromium carries it, with Chromium's build file
          (BUILD.gn), its list of the files to compile
          (ffmpeg_generated.gni) and its configurations
          (chromium/config/). LGPL-2.1-or-later.
          From:     https://chromium.googlesource.com/chromium/third_party/ffmpeg
          Revision: ad41607c61898cf7150e0fb20fe4bbabd44922a3
          Git tree: a9be7747b4fa194379b40c1b4f8a999fcad8dfdf (10,808 files)

      chromium/third_party/opus/
          libopus, which the library contains, with Chromium's build
          file for it. BSD-3-Clause.
          From:     https://chromium.googlesource.com/chromium/src, third_party/opus
          Revision: 0c3cca15d78645281db2d339b2dc3d6fad4ee90a
          Git tree: 375f7e8c7a7fedc53a64ce1ab4e2c920dd24a7ce (715 files)

      chromium/build/
          Chromium's build configuration and build scripts: the
          compiler and linker settings, the toolchain definitions and
          the scripts the build runs. BSD-3-Clause.
          From:     https://chromium.googlesource.com/chromium/src, build
          Revision: 0c3cca15d78645281db2d339b2dc3d6fad4ee90a
          Git tree: 489fbb46bfe9a44f710aa29610b67f5e6c01da01 (1,471 files)

      chromium/build_overrides/
          Chromium's build settings. BSD-3-Clause.
          From:     https://chromium.googlesource.com/chromium/src, build_overrides
          Revision: 0c3cca15d78645281db2d339b2dc3d6fad4ee90a
          Git tree: 32c28cc90f9e04695768766eabcebb708344244a (24 files)

      chromium/buildtools/
          Chromium's build files for the C++ runtime libraries.
          BSD-3-Clause.
          From:     https://chromium.googlesource.com/chromium/src, buildtools
          Revision: 0c3cca15d78645281db2d339b2dc3d6fad4ee90a
          Git tree: c83a070b321b35fab9942ad3da31d25ee490a0ca (85 files)

      chromium/third_party/libc++/src/
      chromium/third_party/libc++abi/src/
      chromium/third_party/llvm-libc/src/
          LLVM's C++ runtime libraries. Chromium's build compiles them
          for every program it links, so this build does too, but none
          of their code ends up in the library: it is written in C and
          uses no C++ (section 4). Apache-2.0 WITH LLVM-exception.
          From:     https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx
          Revision: 5abc7f839700f0f17338434e1c1c6a8c87c00c11
          Git tree: 809750c69034fcfb0cabbdb200db96c79a61733b (12,292 files)
          From:     https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi
          Revision: 8f11bb1d4438d0239d0dfc1bd9456a9f31629dda
          Git tree: 63eed58f0937ba832a2195cd848f9f53ef8ecea9 (161 files)
          From:     https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libc
          Revision: 6e5ec6f78d8b9f2e8a50fcc5692d1fc8b2964bde
          Git tree: 95bbb58fb4c3c86534d5e2ec0c0b7640f25ccfa4 (7,499 files)

      Single files of Chromium, all at revision
      0c3cca15d78645281db2d339b2dc3d6fad4ee90a of
      https://chromium.googlesource.com/chromium/src (BSD-3-Clause):
          chromium/.gn
              Git blob 8859ecde27105c5256dcbc687e3d8eeacbd8cde6
          chromium/DEPS
              Git blob 48a7f94892ac9dc034f8e2720d3733db6f580f34
          chromium/chrome/VERSION
              Git blob c984f2be477b540532a20c5b3887602e4a0fdc12
          chromium/testing/test.gni
              Git blob c958fbcfc2dba4b1a41e8a691bc6e4399ccaafbb
          chromium/tools/clang/scripts/update.py
              Git blob 7a62e6ef4464996e6b2dfdd48930eb24d8822d04
          chromium/tools/rust/update_rust.py
              Git blob dd75c148ce20ea1890ef8cdaddee11f34c44daab
          chromium/third_party/rust/cxx/chromium_integration/rust_cxx.gni
              Git blob d43a3bb3b0591995d9cac70cb1426b9f9b30b574
          chromium/third_party/llvm-libc/BUILD.gn
              Git blob 1c036893d34693e2e5bb3af3487d495de8ace89b
          chromium/LICENSE
              Git blob 2249a28657f86c645f8978b75babc1bd52aca318
      and two of ANGLE, at revision
      bbf3d8a4755268f016087be2f56099fa5a5f3f6e of
      https://chromium.googlesource.com/angle/angle, the revision
      Chromium's DEPS names (BSD-3-Clause):
          chromium/third_party/angle/dotfile_settings.gni
              Git blob d27fae199a7a7cc5f4b306f5bb2be930c0ceae8c
          chromium/third_party/angle/LICENSE
              Git blob 0f65fd60fd68d465a2283378849f16532f5ee4f1

      The licence texts, each beside the files it covers:
          FFmpeg (LGPL-2.1-or-later):
              chromium/third_party/ffmpeg/COPYING.LGPLv2.1 and LICENSE.md
          libopus (BSD-3-Clause):
              chromium/third_party/opus/src/COPYING
          Chromium's files (BSD-3-Clause):
              chromium/LICENSE, and chromium/buildtools/LICENSE
          ANGLE's file (BSD-3-Clause):
              chromium/third_party/angle/LICENSE
          LLVM's C++ runtime libraries (Apache-2.0 WITH LLVM-exception):
              LICENSE.TXT in each of their src/ folders
          Electron (MIT):
              LICENSE, inside upstream/electron-43.1.0.tar.gz

      Chromium 150.0.7871.47 is revision
      0c3cca15d78645281db2d339b2dc3d6fad4ee90a: its chrome/VERSION
      file, above, says so.

To compare a folder with its repository, run this in it (it needs Git,
which Xcode includes). It prints the folder's Git tree id and leaves the
folder as it was: Git's own records go to a temporary folder, which it
then deletes.

    d=$(mktemp -d) && git --git-dir="$d" --work-tree=. -c core.autocrlf=false init -q && git --git-dir="$d" --work-tree=. -c core.autocrlf=false add -A -f . && git --git-dir="$d" write-tree; rm -rf "$d"


2. How Electron built the library
---------------------------------

Each fact here is read from the files in this archive.

  - Electron 43.1.0 builds on Chromium 150.0.7871.47 (chromium_version
    in Electron's DEPS file).

  - Chromium 150.0.7871.47 uses FFmpeg at revision
    ad41607c61898cf7150e0fb20fe4bbabd44922a3 of
    https://chromium.googlesource.com/chromium/third_party/ffmpeg
    (ffmpeg_revision in chromium/DEPS). That is Chromium's own copy of
    FFmpeg, which follows FFmpeg's main development line; the library
    reports its FFmpeg version as git-2026-05-18-f9a9429269.

  - Electron's release workflow
    (.github/actions/build-electron/action.yml) makes its FFmpeg
    release with these two commands:

        gn gen out/ffmpeg --args="import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true use_siso=true $MAC_SDK_ARG $GN_EXTRA_ARGS"
        e build --target electron:electron_ffmpeg_zip -C ../../out/ffmpeg $QUIET_FLAG

    For Apple silicon, $GN_EXTRA_ARGS is empty and $MAC_SDK_ARG names
    the macOS SDK its build machine uses. use_remoteexec and use_siso
    choose Google's remote build service and the program that runs the
    build there: they change where the compiler runs, not what it makes.
    The target electron_ffmpeg_zip (in Electron's BUILD.gn) zips the
    library that //third_party/ffmpeg builds.

  - Electron's build/args/ffmpeg.gn holds the build arguments:

        import("//electron/build/args/all.gn")
        is_component_build = false
        is_component_ffmpeg = true
        is_official_build = true
        ffmpeg_branding = "Chromium"
        enable_dsyms = false
        proprietary_codecs = false

    Electron's default build sets ffmpeg_branding = "Chrome" and
    proprietary_codecs = true (in all.gn); this build sets them back,
    which is what leaves the proprietary codecs out.
    is_component_ffmpeg = true makes FFmpeg a library of its own.

  - With those arguments, Chromium's FFmpeg build uses the configuration
    in chromium/third_party/ffmpeg/chromium/config/Chromium/mac/arm64/.
    Its config.h says FFMPEG_LICENSE "LGPL version 2.1 or later" and
    sets CONFIG_GPL, CONFIG_NONFREE, CONFIG_VERSION3, CONFIG_GPLV3 and
    CONFIG_LGPLV3 to 0: no part under the GPL, a version 3 licence or
    non-free terms is built. Its config_components.h turns on, and only
    on:
        decoders:  flac, mp3, vorbis, libopus, and the PCM formats
                   pcm_alaw, pcm_f32le, pcm_mulaw, pcm_s16be, pcm_s16le,
                   pcm_s24be, pcm_s24le, pcm_s32le, pcm_u8
        demuxers:  flac, matroska (and webm), mov (and mp4, m4a, 3gp,
                   3g2, mj2), mp3, ogg, wav
        parsers:   flac, mpegaudio, opus, vorbis, vp9
    and no encoder, muxer, filter, protocol or device. The files FFmpeg
    compiles for it are listed in ffmpeg_generated.gni, and BUILD.gn
    builds them, with libopus, into libffmpeg.dylib.

  - Electron changes FFmpeg with one patch
    (electron/patches/ffmpeg/link_with_loader_path.patch): the library's
    install name becomes @loader_path/libffmpeg.dylib, the name the
    shipped library has.

  - Electron changes Chromium with the patches in
    electron/patches/chromium/, applied in the order of its .patches
    file. Nine of them change files this build reads, and
    build-libffmpeg.sh applies them in that order:
        build_gn.patch
        build_resolve_pgo_profiles_from_electron_state_files.patch
        build_libc_as_static_library.patch
        build_make_libcxx_abi_unstable_false_for_electron.patch
        build_allow_electron_to_use_exec_script.patch
        fix_check_for_file_existence_before_setting_mtime.patch
        fix_restore_sdk_inputs_cross-toolchain_deps_for_macos.patch
        build_fix_profile_runtime_resolution_for_pgo_instrumented_builds.patch
        build_disable_llvm_unroll-add-parallel-reductions_on_apple_targets.patch
    Four more change files in this archive that a Mac build of FFmpeg
    never reads, and the script does not apply them:
        gtk_visibility.patch
            (a Linux build file)
        ignore_rc_check.patch
            (a Windows build script)
        build_run_reclient_cfg_generator_after_chrome.patch
            (the set-up of Google's remote build service)
        build_gn_arg_to_support_linker_wrapper_script_on_windows.patch
            (a Windows build file)
    Electron's other patches change parts of Chromium that are not in
    this archive and not in the library.

  - Electron builds with profile-guided optimisation: measurements from
    running Electron that tell the compiler which code to optimise for
    speed. For Apple silicon the profile is
    electron-macos-arm64-1782757142-c0d5334217.profdata (named in
    electron/build/pgo_profiles/macos-arm64.pgo.txt), which Electron
    publishes at
    https://dev-cdn-experimental.electronjs.org/pgo/electron-macos-arm64-1782757142-c0d5334217.profdata
    (211,338,984 bytes, SHA-256
    854f93db0e166d4e7de191349f355854e5d14d22827f646b646c1d61bc14eba6,
    as downloaded on 2026-10-02). It is measured data, not source code,
    and is not in this archive. It changes how fast the compiled code
    runs, not what it does. build-libffmpeg.sh builds without it
    (chrome_pgo_phase=0); electron/build/pgo_profiles/README.md says how
    Electron's own build downloads and uses it.

  - Electron's build machine compiled with the macOS 26.4 SDK (the
    library records it). Chromium 150 names the 26.5 SDK as its own.


3. Rebuilding it
----------------

You need:

  - a Mac with Apple silicon;
  - Xcode 26 or later, selected as the developer tools to use
    (sudo xcode-select -s /Applications/Xcode.app). Chromium's build
    asks Xcode for its version and stops without it, since Apple's
    Command Line Tools alone cannot answer; the script checks for Xcode
    first;
  - a macOS 26 SDK: Xcode 26's own, or the one Apple's Command Line
    Tools 26.5 install at
    /Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk. The macOS
    27 SDK, which Xcode 27 carries, does not work: its list of macOS's
    own library names an architecture this version of Chromium's linker
    does not know;
  - about 1.5 GB of free disk, and the network, to download the build
    programs (about 52 MB).

From the folder this archive unpacked into, naming the SDK's folder:

    MAC_SDK_PATH=/Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk bash build-libffmpeg.sh

The library is then work/src/out/ffmpeg/libffmpeg.dylib. On the Mac of
section 4 the script took about 30 seconds, downloads included. It
leaves the archive's own files as they are and works in work/ (or the
folder named after it). In order, it:

  1. checks that Xcode and the SDK are there, then every file against
     SHA256SUMS;
  2. copies chromium/ to work/src/ and unpacks Electron's source into
     work/src/electron/, where Chromium's build looks for it;
  3. applies Electron's FFmpeg patch and the nine Chromium patches of
     section 2, in Electron's order;
  4. writes three small files of its own, in work/src/ only:
         BUILD.gn, in place of Chromium's top build file, which this
             archive does not carry: it names FFmpeg as the only thing
             to build;
         build/config/gclient_args.gni, the settings file gclient,
             Chromium's checkout tool, writes from the list
             gclient_gn_args in Chromium's DEPS: the same settings, with
             the values a checkout of Electron gives them (Electron's
             DEPS sets four of them, Chromium's DEPS the rest);
         third_party/rust-toolchain/VERSION, the one file of
             Chromium's Rust toolchain the build reads: its version line
                 rustc 1.96.0 4c4205163abcbd08948b3efab796c543ba1ea687 (4c4205163abcbd08948b3efab796c543ba1ea687-5-llvmorg-23-init-10931-g20b6ec66 chromium)
             which the build checks against tools/rust/update_rust.py.
             No Rust is compiled for this library, so the script writes
             that line instead of downloading the toolchain (Chromium's
             DEPS names it as
             Mac_arm64/rust-toolchain-4c4205163abcbd08948b3efab796c543ba1ea687-5-llvmorg-23-init-10931-g20b6ec66.tar.xz,
             245,300,284 bytes, SHA-256
             0c71d7426a8990069a9bb1d72e158b8a22711d60a2991e102d3dceff3e399cdf).
     Apart from these three files and Electron's changes of step 3,
     the build uses the archive's files as they are;
  5. downloads the build programs Chromium's DEPS names, at its
     versions and digests, and checks each by its SHA-256:
         Chromium's clang compiler and lld linker
             https://storage.googleapis.com/chromium-browser-clang/Mac_arm64/clang-llvmorg-23-init-10931-g20b6ec66-11.tar.xz
             SHA-256 94aac4f9e8a68559b579c76b863a5e0df6e80ba2900d2b7b5a6f1475a08a390c
         Chromium's llvm-objdump and llvm-otool, which the link step runs
             https://storage.googleapis.com/chromium-browser-clang/Mac_arm64/llvmobjdump-llvmorg-23-init-10931-g20b6ec66-11.tar.xz
             SHA-256 c658c070370514fab55d952e085b25fb4a1e573f59ca385b7097ab2b089a039a
         GN, which writes the build plan
             https://chrome-infra-packages.appspot.com/dl/gn/gn/mac-arm64/+/git_revision:3357c4f51b1a9e676378c695dd9c7e9911c35ee6
             SHA-256 9cf33cd2d2426bb4559ab46174ec1031eac9919ed24971174327b6ab4331e415
         Ninja, which runs the build plan
             https://chrome-infra-packages.appspot.com/dl/infra/3pp/tools/ninja/mac-arm64/+/version:3@1.12.1.chromium.4
             SHA-256 c5e9b4ffab3b2edefbc41849fc81f116c8d047b258906becc061be9ecaf04afd
  6. builds, from work/src:

         buildtools/mac/gn gen out/ffmpeg --root-pattern=//:ffmpeg_kit --args="import(\"//electron/build/args/ffmpeg.gn\") chrome_pgo_phase=0 mac_sdk_path=\"$MAC_SDK_PATH\""
         third_party/ninja/ninja -C out/ffmpeg libffmpeg.dylib

     These are Electron's arguments, without the profile of section 2,
     and with the SDK named. --root-pattern tells GN to plan only what
     FFmpeg needs, so the rest of Chromium need not be present.

To build a changed library, change the files under work/src/ (FFmpeg's
are in work/src/third_party/ffmpeg/) and run the ninja line again. The
LGPL's own text, in FFmpeg's COPYING.LGPLv2.1, says what you may do with
the result.


4. How a rebuild compares with the copy Tellop carries
------------------------------------------------------

Pathnomic Labs ran build-libffmpeg.sh from this archive on 2026-10-02,
on a Mac with an Apple M5 Pro and macOS 26.6.2, with Xcode 27.0 (build
27A266a) selected and the macOS 26.5 SDK of Apple's Command Line Tools
26.6, at /Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk.
Compared with the library in Electron's release, the library it built:

  - exports the same 1,337 symbols, by name and by kind (nm -gU);
  - uses the same functions of macOS's own libSystem, and links no other
    library (otool -L);
  - has the same install name, @loader_path/libffmpeg.dylib, and the
    same minimum macOS, 12.0;
  - registers the same 13 decoders, 6 demuxers and 5 parsers, and no
    encoder, muxer, protocol or bitstream filter, and reports the same
    versions: libavcodec 62.33.100, libavformat 62.17.100, libavutil
    60.31.100, FFmpeg git-2026-05-18-f9a9429269;
  - contains no C++ code: nothing of LLVM's C++ libraries reaches it.

Its data is the same size. Its machine code is about 4% larger, from the
profile-guided optimisation it is built without and the other SDK, so
its bytes differ, as any rebuild's do. The comparison above covers the
library's interface and contents, not each machine instruction.


5. Using a library you build
----------------------------

A library built from this archive, with or without your own changes to
FFmpeg, has the interface of the one Tellop carries (section 4).

Tellop is signed with Pathnomic Labs' Apple Developer ID. Today Tellop
refuses to start a copy whose files no longer match that signature,
which replacing any file causes: its start-up check is how a tampered
copy is stopped. How a copy you have changed this way may be allowed to
start is a question Pathnomic Labs has put to its legal counsel. It is
not settled, and this archive does not describe such a route.

Section 17 of Tellop's terms ("Open-source software") says that nothing
in them restricts the rights an open-source licence grants, and that
you may modify a component under the LGPL for your own use and reverse
engineer Tellop to debug those modifications.


6. Questions
------------

support@pathnomic.com, or Pathnomic Labs FZ-LLC, Compass Building -
Al Hulaila, Al Hulaila Industrial Zone-FZ, Ras Al Khaimah, 16111,
United Arab Emirates.
