Third-Party Notices and Licensing GuideLink to the section Third-Party Notices and Licensing Guide
On this page
Status: 2026-10-15. This lists the runtime dependencies of the Python reference gateway (gateway/), the .NET SDK (dotnet/src/Univip.Protocol, Univip.Client), the .NET gateway (dotnet/src/Univip.Gateway) and the website (site/), with their licences. It also explains, in plain terms, what someone who distributes these programs has to watch for. It is not legal advice. Licences were read from the packages themselves (NuGet .nuspec and licence files, Python dist-info metadata, npm package.json and licence files, the PyAV wheel's FFmpeg build, ffmpeg -L, Debian copyright files); section 7 says how. Re-check them when a version changes.
1. This repositoryLink to the section 1. This repository
The code, schemas, API description and tools are Apache-2.0 (LICENSE). The specification text is CC BY 4.0 (LICENSE-SPEC.md).
2. Summary for distributorsLink to the section 2. Summary for distributors
| You distribute | Watch for |
|---|---|
| The .NET SDK or .NET gateway as built from NuGet | Every NuGet dependency is MIT. JsonSchema.Net is held at 8.0.5, the last version whose NuGet binaries carry no maintenance-fee agreement; do not upgrade it to 9.x without reading section 3.1. |
| The .NET gateway together with an FFmpeg build | That FFmpeg build's licence. Ubuntu's ffmpeg (with libx264) is GPL-2.0-or-later. The gateway only runs it as a separate program (section 5.1). media.encoder lets you pick a non-GPL encoder. |
The Python gateway with the media extra (aiortc) |
The PyAV wheel bundles libx264 and libx265 (GPL) inside the process, although its metadata says BSD-3-Clause and LGPL (section 5.2). |
The Python gateway with the mavlink extra |
pymavlink is LGPL-3.0 (section 4). |
The website as built (site/dist/, what univip.org serves) |
Two fonts under the SIL Open Font License 1.1, MiniSearch (MIT), and Mermaid (MIT) with its dependencies are part of it. The build writes their licence and notice texts to third-party-licenses.txt next to the pages (section 6). |
| Anything that encodes or decodes H.264 | H.264 is covered by patents. A software licence (GPL, BSD) does not grant patent rights; commercial products usually need a patent licence (section 5.3). |
3. .NETLink to the section 3. .NET
3.1 SDK (Univip.Protocol, Univip.Client)Link to the section 3.1 SDK (Univip.Protocol, Univip.Client)
| Package | Version | Licence (from the package) | Notes |
|---|---|---|---|
| JsonSchema.Net | 8.0.5 | MIT (<license type="expression">MIT</license>, LICENSE) |
Schema validation (Univip.Protocol) |
| JsonPointer.Net | 6.0.1 | MIT (as above) | dependency of JsonSchema.Net |
| Json.More.Net | 2.2.0 | MIT (as above) | dependency of JsonPointer.Net |
| Humanizer.Core | 3.0.1 | MIT (<license type="expression">MIT</license>) |
dependency of JsonPointer.Net |
| .NET runtime and ASP.NET Core shared framework | 10.0 | MIT (LICENSE.txt of the .NET installation) |
Univip.Client uses ASP.NET Core |
Why JsonSchema.Net is held at 8.0.5. From 9.0.0, the NuGet packages of JsonSchema.Net, JsonPointer.Net (7.x) and Json.More.Net (3.x) declare a licence file, OSMFEULA.txt, the json-everything "Open Source Maintenance Fee Agreement", instead of an SPDX expression. In summary:
- The source code remains MIT.
- The agreement covers only the binary releases the project publishes.
- A monthly fee applies to users who use the software "as part of revenue-generating activities" and have an annual gross revenue of at least US$10,000, unless they already pay the maintainers for support.
- The fee "is not a license fee". The agreement does not restrict compiling from source, or obtaining or redistributing binaries from other sources.
A VMS vendor shipping the SDK with those binaries could owe the fee: the same kind of usage condition that led the project to avoid SIPSorcery. Univip.Protocol therefore pins JsonSchema.Net 8.0.5, whose package and dependencies declare plain MIT. The pin was checked as follows:
- The resolved graph (
obj/project.assets.json) is JsonSchema.Net 8.0.5, JsonPointer.Net 6.0.1, Json.More.Net 2.2.0 and Humanizer.Core 3.0.1. Each.nuspecdeclares<license type="expression">MIT</license>, and the first three ship an MITLICENSEfile. - 8.0.5 has the API
Univip.Protocoluses exceptEvaluationOptions.IncludeApplicatorErrors. Without that option, 8.0.5 still reports the leaf errors ofanyOf/oneOf, but not the summary error of the applicator itself. - The validator built against each version was run over every repository example and about 8,000 mutations of them (members removed, retyped, set to unknown values; extra members; a higher MINOR), strictly and as a receiver: 16,110 cases. The validity verdict and the tolerated errors were identical in every case. The only difference was the
anyOf/oneOfsummary errors listed by 9.4.1. - All .NET test suites pass on 8.0.5.
Upgrading to 9.x would bring the agreement back. Alternatives then are to pay the fee or to build json-everything from its MIT source.
3.2 .NET gateway (Univip.Gateway), in addition to Univip.ProtocolLink to the section 3.2 .NET gateway (Univip.Gateway), in addition to Univip.Protocol
| Package | Version | Licence (from the package) |
|---|---|---|
| BouncyCastle.Cryptography | 2.7.0 | MIT (LICENSE.md in the package) |
| YamlDotNet | 18.1.0 | MIT |
| ASP.NET Core shared framework | 10.0 | MIT |
The gateway also runs an external ffmpeg program for video (section 5.1). It does not link to it.
4. Python gateway (univip-gateway)Link to the section 4. Python gateway (univip-gateway)
These are the versions installed in the reference virtual environment, with the licence each package declares in its metadata.
| Package | Version | Licence | Required by |
|---|---|---|---|
| aiohttp | 3.14.5 | Apache-2.0 AND MIT | core |
| aiohappyeyeballs | 2.7.1 | PSF-2.0 | aiohttp |
| aiosignal | 1.4.0 | Apache-2.0 | aiohttp |
| attrs | 26.1.0 | MIT | aiohttp, jsonschema |
| frozenlist | 1.8.0 | Apache-2.0 | aiohttp |
| multidict | 7.1.0 | Apache-2.0 | aiohttp |
| propcache | 0.5.4 | Apache-2.0 | aiohttp |
| yarl | 1.25.1 | Apache-2.0 | aiohttp |
| idna | 3.20 | BSD-3-Clause | yarl |
| jsonschema | 4.26.0 | MIT | core |
| jsonschema-specifications | 2025.9.1 | MIT | jsonschema |
| referencing | 0.37.0 | MIT | core |
| rpds-py | 2026.9.1 | MIT | referencing |
| typing_extensions | 4.16.0 | PSF-2.0 | several |
| PyYAML | 6.0.3 | MIT | core |
| aiortc | 1.15.0 | BSD-3-Clause | media |
| aioice | 0.10.2 | BSD-3-Clause | aiortc |
| av (PyAV) | 17.1.0 | BSD-3-Clause for PyAV itself; bundles FFmpeg, libx264, libx265 and more (section 5.2) | aiortc |
| pylibsrtp | 1.0.0 | BSD-3-Clause; statically includes libsrtp2 2.7.0 and OpenSSL 3.5.4 (Apache-2.0) | aiortc |
| cryptography | 50.0.2 | Apache-2.0 OR BSD-3-Clause; includes OpenSSL 4.0.3 (Apache-2.0) | aiortc |
| pyOpenSSL | 26.4.0 | Apache-2.0 | aiortc |
| cffi | 2.1.1 | MIT-0 | cryptography |
| pycparser | 3.11 | BSD-3-Clause | cffi |
| google-crc32c | 1.9.0 | Apache-2.0 (bundles libcrc32c) | aiortc |
| dnspython | 2.9.0 | ISC | aioice |
| ifaddr | 0.2.0 | MIT | aioice |
| pyee | 14.0.0 | MIT | aiortc |
| Pillow | 12.3.0 | MIT-CMU; bundles libjpeg-turbo, libpng, libtiff, FreeType, HarfBuzz, Little CMS, OpenJPEG, libwebp, libavif, zstd, Brotli, xz, libxcb under their own licences (permissive, or with a permissive option) | media |
| pymavlink | 2.4.50 | LGPL-3.0 | mavlink |
| fastcrc | 0.5.0 | MIT | pymavlink |
| lxml | 6.1.3 | BSD-3-Clause | pymavlink |
What to do.
- For the permissive licences (MIT, BSD, ISC, Apache-2.0, PSF), keep their copyright and licence notices with any binary distribution. Apache-2.0 also asks you to keep
NOTICEfiles (propcache and yarl ship one). - pymavlink is LGPL-3.0. If you distribute it, provide its source (or a written offer for it), keep its licence, and let users replace it with a modified version. Since Python imports it at run time, the latter is normally satisfied.
5. FFmpeg and H.264 encodersLink to the section 5. FFmpeg and H.264 encoders
5.1 .NET gateway: FFmpeg as a separate programLink to the section 5.1 .NET gateway: FFmpeg as a separate program
The .NET gateway starts ffmpeg (found on PATH or through UNIVIP_FFMPEG) as a child process. It writes raw frames to the child's standard input and reads the encoded stream from its standard output. The gateway and FFmpeg are separate programs that communicate through pipes; neither is linked into the other. FFmpeg's licence therefore governs the FFmpeg build, not the gateway, whose code stays Apache-2.0.
media.encoder chooses the encoder:
media.encoder |
Encoder licence | What it means for an FFmpeg build you ship |
|---|---|---|
libx264 (default) |
GPL-2.0-or-later (x264 LLC also sells commercial licences) | The FFmpeg build must be configured with --enable-gpl and is then GPL. Ubuntu's ffmpeg 6.1.1 is (ffmpeg -L prints the GPL-2.0-or-later notice). |
libopenh264 |
OpenH264 source is BSD-2-Clause | FFmpeg can stay LGPL. On patents, see section 5.3: Cisco's patent coverage applies to the OpenH264 binaries Cisco itself distributes, under Cisco's conditions. Ubuntu's FFmpeg is not built with it. |
h264_vaapi, h264_nvenc, h264_qsv |
The FFmpeg wrappers are part of FFmpeg (LGPL unless GPL parts are enabled) | The GPU driver and runtime (Mesa or Intel media driver, NVIDIA driver, oneVPL) have their own licences. |
If you only use an FFmpeg you did not ship, for example one installed from the operating system's packages, there is nothing to distribute and the GPL asks nothing of you.
If you distribute a GPL FFmpeg build, for example in a container image, an appliance or an installer, you must do the following for that build:
- pass it on under the GPL;
- include its licence and notices;
- provide the complete corresponding source of FFmpeg, x264 and the other GPL parts, or a written offer for it.
That obligation does not extend to the gateway, which only talks to FFmpeg through pipes.
5.2 Python gateway: PyAV links FFmpeg and libx264 into the processLink to the section 5.2 Python gateway: PyAV links FFmpeg and libx264 into the process
aiortc encodes H.264 with av.CodecContext.create("libx264", "w") (aiortc/codecs/h264.py). This was verified in the installed av 17.1.0 wheel (manylinux_2_28_x86_64):
- Metadata. PyAV's own
License-Expressionis BSD-3-Clause. Its bundled CycloneDX SBOM lists only libxcb, libXau and libdrm, not FFmpeg or x264. - Reported licence.
av.library_metareports every FFmpeg library as "LGPL version 3 or later". The configure line includes--enable-version3 --enable-libx264 --enable-libx265but not--enable-gpl. - Bundled libraries. The wheel's
av.libs/directory nevertheless containslibx264-*.so.165andlibx265-*.so.216. Thelibavcodecshared library lists both asNEEDEDdependencies, andav.codec.Codec("libx264", "w")is available. libx264 and libx265 are GPL-2.0-or-later.
The reported "LGPL" string and the package metadata therefore understate the licence of what the wheel contains: it includes GPL code, linked into the gateway's process. Licence scanners that read package metadata will miss this.
Anyone who redistributes the Python gateway with this wheel should treat the PyAV/FFmpeg part as GPL. In practice that is GPL-3.0, since LGPL-3.0 FFmpeg combined with GPL-2.0-or-later x264 can only go out as GPL-3.0. The distributor must provide the corresponding source of FFmpeg, x264 and x265.
Because the libraries run inside the Python process, it is a legal question whether the gateway itself is affected. The cautious reading is that such a distribution as a whole should be offered under GPL-compatible terms; Apache-2.0 is compatible with GPL-3.0.
Ways to avoid GPL code in a distribution:
- Build PyAV against an FFmpeg without x264/x265. aiortc then has no H.264 encoder, so the Python gateway could offer only VP8.
- Use the .NET gateway with
media.encoder: libopenh264or a hardware encoder.
Other libraries bundled in av.libs/, with the licences of the same projects as given in Debian's copyright files (not all of them are installed here):
| Library | Licence |
|---|---|
| dav1d | BSD-2-Clause |
| Opus | BSD-3-Clause |
| libvpx | BSD-3-Clause |
| LAME | LGPL-2.0+ |
| GnuTLS | LGPL-2.1+ |
| Nettle, GMP, libunistring | LGPL-3+ or GPL-2+ |
| ALSA library | LGPL-2.1+ |
| oneVPL | MIT |
| libdrm, libxcb, libXau | MIT-style |
| libwebp | BSD-3-Clause |
| SVT-AV1 | BSD-3-Clause-Clear (with its AOM patent licence) |
| opencore-amr | Apache-2.0 (not installed here) |
5.3 H.264 patentsLink to the section 5.3 H.264 patents
H.264 is covered by patents licensed through a pool (Via LA). Software licences (GPL, BSD, MIT) do not grant those patent rights. Cisco pays the royalties for the OpenH264 binaries it distributes from its own servers, under Cisco's conditions; a build from source, or a copy you ship yourself, is not covered by that arrangement. Hardware encoders may or may not be covered by the hardware vendor's licence. Products that encode or decode H.264 commercially should get advice on patent licensing. (Proposed spec finding H-S9 asks Part 09 to mention this.)
6. Website (site/)Link to the section 6. Website (site/)
These third-party files are part of the published site. npm run build copies their licence texts into site/dist/third-party-licenses.txt, which is served at /third-party-licenses.txt.
| Package | Version | Licence | In the published site |
|---|---|---|---|
| MiniSearch | 7.2.0 | MIT | Bundled into the site script, for search |
| Mermaid | 12.2.0 | MIT | Loaded on pages containing diagrams; its dependencies are included in the generated notices |
B612 font (@fontsource/b612) |
5.3.0 | OFL-1.1 | Font files, Latin subset |
Public Sans font (@fontsource-variable/public-sans) |
5.3.0 | OFL-1.1 | Font files |
The generated notice file conservatively includes licence and notice files for the production dependency closure pinned in site/package-lock.json, excluding type declarations. This includes libraries used inside Mermaid's lazy-loaded chunks.
The build tools are not published with the site: Vite 8.3.4 (MIT), TypeScript 7.0.2 (Apache-2.0), markdown-it 15.0.2 (MIT), Shiki 4.5.0 (MIT; only its HTML output is published), github-slugger 2.0.0 (ISC), Vitest 5.0.4 (MIT) and Wrangler 4.151.0 (MIT OR Apache-2.0). site/package-lock.json pins them and their dependencies.
7. How this was verifiedLink to the section 7. How this was verified
- NuGet. The
.nuspecand licence files of each package in the resolved dependency graph (obj/project.assets.json) were read in the local package cache (~/.nuget/packages). Older versions of JsonSchema.Net and its dependencies were checked with their.nuspecfromapi.nuget.org. - Python.
importlib.metadatawas read for the installed runtime closure ofunivip-gateway[media,mavlink](License-Expression,License, classifiers and licence files). - PyAV. Checks used:
av.library_meta(configuration and licence strings),av.codec.Codec(...), the wheel'sav.libs/directory,readelf -donlibavcodec, the SBOM inav-17.1.0.dist-info/sboms/, andstringson the bundled x264 and x265 libraries. For pylibsrtp and cryptography,stringson their extension modules gave the libsrtp and OpenSSL versions. - npm. The
licensefield and the licence file of each package insite/node_moduleswere read, andsite/dist/assets/was listed to see which of them end up in the published site. - System FFmpeg.
ffmpeg -version,ffmpeg -Landffmpeg -encoderswere run against Ubuntu 24.04's 6.1.1, and/usr/share/doc/*/copyrightwas read for x264 and the other libraries.