This is the multi-page printable view of this section. Click here to print.
Ateliere Live
- 1: Overview
- 2: Introduction to Ateliere Live technology
- 3: Installation and configuration
- 3.1: Hardware examples
- 3.2: The System Controller
- 3.3: The base platform
- 3.3.1: NTP
- 3.3.2: Linux settings
- 3.3.3: Disabling unattended upgrades of CUDA toolkit
- 3.3.4: Installing older releases
- 3.4: Configuration and monitoring GUI
- 3.4.1: Custom MongoDB installation
- 3.5: Prometheus and Grafana for monitoring
- 3.6: Control panel GUI examples
- 4: Tutorials and How-To's
- 4.1: Getting Started
- 4.2: Using the configuration-and-monitoring GUI
- 4.3: Viewing the multiview and outputs
- 4.4: Creating a video mixer control panel in Companion
- 4.5: Setting up multi-view outputs using the REST API
- 4.6: Security in Ateliere Live
- 4.7: Statistics in Ateliere Live
- 4.8: Using Media Player metadata in HTML pages
- 5: Releases
- 5.1: Release 9.0.0
- 5.2: Release 8.0.0
- 5.3: Release 7.0.0
- 5.4: Release 6.0.0
- 5.5: Release 5.0.0
- 5.6: Release 4.0.0
- 5.7: Release 3.0.0
- 5.8: Release 2.0.0
- 5.9: Release 1.0.0
- 5.10: Upgrade instructions
- 6: Reference
- 6.1: Ateliere Live 9.0.0 developer reference
- 6.1.1: System controller config
- 6.1.2: REST API v3
- 6.1.3: Rendering Engine config
- 6.1.4: Operational Control API
- 6.1.4.1: Overview of JSON protocol
- 6.1.4.2: Rendering Engine components
- 6.1.4.3: Control API reference
- 6.1.5: C++ SDK
- 6.1.5.1: Classes
- 6.1.5.1.1: Acl::AclLog::FileLocationFormatterFlag
- 6.1.5.1.2: Acl::AclLog::ThreadNameFormatterFlag
- 6.1.5.1.3: Acl::ControlDataAddress
- 6.1.5.1.4: Acl::ControlDataCommon::ConnectionEvent
- 6.1.5.1.5: Acl::ControlDataCommon::Response
- 6.1.5.1.6: Acl::ControlDataCommon::StatusMessage
- 6.1.5.1.7: Acl::ControlDataSender
- 6.1.5.1.8: Acl::ControlDataSender::Settings
- 6.1.5.1.9: Acl::ISystemControllerInterface
- 6.1.5.1.10: Acl::ISystemControllerInterface::Callbacks
- 6.1.5.1.11: Acl::ISystemControllerInterface::Response
- 6.1.5.1.12: Acl::SystemControllerConnection
- 6.1.5.1.13: Acl::SystemControllerConnection::Settings
- 6.1.5.1.14: Acl::UUID
- 6.1.5.1.15: fmt::formatter< Acl::ControlDataAddress >
- 6.1.5.1.16: fmt::formatter< Acl::ControlDataCommon::EventType >
- 6.1.5.1.17: fmt::formatter< Acl::ISystemControllerInterface::StatusCode >
- 6.1.5.1.18: fmt::formatter< Acl::SystemControllerConnection::ComponentType >
- 6.1.5.1.19: fmt::formatter< Acl::UUID >
- 6.1.5.2: Files
- 6.1.5.2.1: include/AclLog.h
- 6.1.5.2.2: include/ControlDataAddress.h
- 6.1.5.2.3: include/ControlDataCommon.h
- 6.1.5.2.4: include/ControlDataSender.h
- 6.1.5.2.5: include/ISystemControllerInterface.h
- 6.1.5.2.6: include/SystemControllerConnection.h
- 6.1.5.2.7: include/UUID.h
- 6.1.5.3: Namespaces
- 6.1.5.3.1: Acl
- 6.1.5.3.2: Acl::AclLog
- 6.1.5.3.3: Acl::ControlDataCommon
- 6.1.5.3.4: fmt
- 6.1.5.3.5: spdlog
- 6.2: Ateliere Live 8.0.0 developer reference
- 6.2.1: System controller config
- 6.2.2: REST API v3
- 6.2.3: Rendering Engine config
- 6.2.4: Operational Control API
- 6.2.4.1: Overview of JSON protocol
- 6.2.4.2: Rendering Engine components
- 6.2.4.3: Control API reference
- 6.2.5: C++ SDK
- 6.2.5.1: Classes
- 6.2.5.1.1: Acl::AclLog::FileLocationFormatterFlag
- 6.2.5.1.2: Acl::AclLog::ThreadNameFormatterFlag
- 6.2.5.1.3: Acl::AlignedAudioFrame
- 6.2.5.1.4: Acl::AlignedFrame
- 6.2.5.1.5: Acl::ControlDataAddress
- 6.2.5.1.6: Acl::ControlDataCommon::ConnectionEvent
- 6.2.5.1.7: Acl::ControlDataCommon::Response
- 6.2.5.1.8: Acl::ControlDataCommon::StatusMessage
- 6.2.5.1.9: Acl::ControlDataSender
- 6.2.5.1.10: Acl::ControlDataSender::Settings
- 6.2.5.1.11: Acl::DeviceMemory
- 6.2.5.1.12: Acl::IControlDataReceiver
- 6.2.5.1.13: Acl::IControlDataReceiver::IRequest
- 6.2.5.1.14: Acl::IControlDataReceiver::RequestData
- 6.2.5.1.15: Acl::IControlDataReceiver::Settings
- 6.2.5.1.16: Acl::IMediaStreamer
- 6.2.5.1.17: Acl::IMediaStreamer::Configuration
- 6.2.5.1.18: Acl::IMediaStreamer::Settings
- 6.2.5.1.19: Acl::IngestApplication
- 6.2.5.1.20: Acl::IngestApplication::Settings
- 6.2.5.1.21: Acl::ISystemControllerInterface
- 6.2.5.1.22: Acl::ISystemControllerInterface::Callbacks
- 6.2.5.1.23: Acl::ISystemControllerInterface::Response
- 6.2.5.1.24: Acl::MediaReceiver
- 6.2.5.1.25: Acl::MediaReceiver::CustomSystemControllerCallResponse
- 6.2.5.1.26: Acl::MediaReceiver::NewStreamParameters
- 6.2.5.1.27: Acl::MediaReceiver::Settings
- 6.2.5.1.28: Acl::SystemControllerConnection
- 6.2.5.1.29: Acl::SystemControllerConnection::Settings
- 6.2.5.1.30: Acl::TimeCommon::TAIStatus
- 6.2.5.1.31: Acl::TimeCommon::TimeStructure
- 6.2.5.1.32: Acl::UUID
- 6.2.5.1.33: fmt::formatter< Acl::AudioChannelLayout >
- 6.2.5.1.34: fmt::formatter< Acl::ControlDataAddress >
- 6.2.5.1.35: fmt::formatter< Acl::ControlDataCommon::EventType >
- 6.2.5.1.36: fmt::formatter< Acl::FieldOrder >
- 6.2.5.1.37: fmt::formatter< Acl::ISystemControllerInterface::StatusCode >
- 6.2.5.1.38: fmt::formatter< Acl::SystemControllerConnection::ComponentType >
- 6.2.5.1.39: fmt::formatter< Acl::UUID >
- 6.2.5.2: Files
- 6.2.5.2.1: include/AclLog.h
- 6.2.5.2.2: include/AlignedFrame.h
- 6.2.5.2.3: include/Base64.h
- 6.2.5.2.4: include/ControlDataAddress.h
- 6.2.5.2.5: include/ControlDataCommon.h
- 6.2.5.2.6: include/ControlDataSender.h
- 6.2.5.2.7: include/DeviceMemory.h
- 6.2.5.2.8: include/IControlDataReceiver.h
- 6.2.5.2.9: include/IMediaStreamer.h
- 6.2.5.2.10: include/IngestApplication.h
- 6.2.5.2.11: include/IngestUtils.h
- 6.2.5.2.12: include/ISystemControllerInterface.h
- 6.2.5.2.13: include/MediaEnumerations.h
- 6.2.5.2.14: include/MediaReceiver.h
- 6.2.5.2.15: include/SystemControllerConnection.h
- 6.2.5.2.16: include/TimeCommon.h
- 6.2.5.2.17: include/UUID.h
- 6.2.5.3: Namespaces
- 6.2.5.3.1: Acl
- 6.2.5.3.2: Acl::AclLog
- 6.2.5.3.3: Acl::ControlDataCommon
- 6.2.5.3.4: Acl::IngestUtils
- 6.2.5.3.5: Acl::TimeCommon
- 6.2.5.3.6: fmt
- 6.2.5.3.7: spdlog
- 6.3: Ateliere Live 7.0.0 developer reference
- 6.3.1: REST API v3
- 6.3.2: Ateliere Live Rendering Engine configuration documentation
- 6.3.3: Ateliere Live Rendering Engine command documentation
- 6.3.4: C++ SDK
- 6.3.4.1: Classes
- 6.3.4.1.1: AclLog::CommandLogFormatter
- 6.3.4.1.2: AclLog::FileLocationFormatterFlag
- 6.3.4.1.3: AclLog::ThreadNameFormatterFlag
- 6.3.4.1.4: AlignedAudioFrame
- 6.3.4.1.5: AlignedFrame
- 6.3.4.1.6: ControlDataCommon::ConnectionStatus
- 6.3.4.1.7: ControlDataCommon::Response
- 6.3.4.1.8: ControlDataCommon::StatusMessage
- 6.3.4.1.9: ControlDataSender
- 6.3.4.1.10: ControlDataSender::Settings
- 6.3.4.1.11: DeviceMemory
- 6.3.4.1.12: IControlDataReceiver
- 6.3.4.1.13: IControlDataReceiver::IncomingRequest
- 6.3.4.1.14: IControlDataReceiver::ReceiverResponse
- 6.3.4.1.15: IControlDataReceiver::Settings
- 6.3.4.1.16: IMediaStreamer
- 6.3.4.1.17: IMediaStreamer::Configuration
- 6.3.4.1.18: IMediaStreamer::Settings
- 6.3.4.1.19: IngestApplication
- 6.3.4.1.20: IngestApplication::Settings
- 6.3.4.1.21: ISystemControllerInterface
- 6.3.4.1.22: ISystemControllerInterface::Callbacks
- 6.3.4.1.23: ISystemControllerInterface::Response
- 6.3.4.1.24: MediaReceiver
- 6.3.4.1.25: MediaReceiver::NewStreamParameters
- 6.3.4.1.26: MediaReceiver::Settings
- 6.3.4.1.27: SystemControllerConnection
- 6.3.4.1.28: SystemControllerConnection::Settings
- 6.3.4.1.29: TimeCommon::TAIStatus
- 6.3.4.1.30: TimeCommon::TimeStructure
- 6.3.4.2: Files
- 6.3.4.2.1: include/AclLog.h
- 6.3.4.2.2: include/AlignedFrame.h
- 6.3.4.2.3: include/Base64.h
- 6.3.4.2.4: include/ControlDataCommon.h
- 6.3.4.2.5: include/ControlDataSender.h
- 6.3.4.2.6: include/DeviceMemory.h
- 6.3.4.2.7: include/IControlDataReceiver.h
- 6.3.4.2.8: include/IMediaStreamer.h
- 6.3.4.2.9: include/IngestApplication.h
- 6.3.4.2.10: include/IngestUtils.h
- 6.3.4.2.11: include/ISystemControllerInterface.h
- 6.3.4.2.12: include/MediaReceiver.h
- 6.3.4.2.13: include/PixelFormat.h
- 6.3.4.2.14: include/SystemControllerConnection.h
- 6.3.4.2.15: include/TimeCommon.h
- 6.3.4.2.16: include/UUIDUtils.h
- 6.3.4.3: Namespaces
- 6.3.4.3.1: ACL
- 6.3.4.3.2: AclLog
- 6.3.4.3.3: ControlDataCommon
- 6.3.4.3.4: IngestUtils
- 6.3.4.3.5: spdlog
- 6.3.4.3.6: TimeCommon
- 6.3.4.3.7: UUIDUtils
- 6.3.5: System controller config
- 7: Troubleshooting
- 8: Credits
- 8.1: C++ SDK Credits
- 8.2: REST API Credits
1 - Overview
Ateliere Live is a software-based platform for production of media using standard, off-the-shelf hardware and datacenter building blocks.
The Ateliere Live system consists of multiple software components, distributed geographically between recording studios, remote production control rooms and datacenters.
All Ateliere Live components have the same understanding of the time ‘now’. The time reference used by all software components is TAI (Temps Atomique International), which provides a monotonically, steady time reference no matter the geographic location.
This makes it possible to compensate for differences in relative delay between the media streams. The synchronized timing makes the system unique compared to other solutions usually bound to buffer levels and various queueing mechanisms.
The synchronization of the streams transported over networks with various delays makes it possible to build a distributed production environment, where the mixing of the video and audio sources can take place at a different location compared to the studio where they were captured.
System overview

Ateliere Live components
Media sources, such as video cameras and microphones, are connected to a computer called Ingest. In practice, this will usually be some kind of off-the-shelf desktop computer, potentially equipped with a frame grabber card to allow physical input interfaces such as SDI cables, but it could also be a smartphone with a dedicated app using the built-in camera.
The Ingest is responsible for receiving the media data from the source, encode it and transport it using a network to the production environment inside the cloud/datacenter.
From the datacenter the remote production team can get multi-view streams of the available media sources to base their production decisions on, as well as a low-delay feedback display showing the result of the production.
The production in the datacenter will also output a high quality program output, which is broadcast to the viewers. Both the multi-views and the feedback display will usually have a lower quality compared to the high quality program output that is broadcast to the viewers. This is to allow an as short as possible end-to-end delay between what happens in front of the cameras in the studio and the output stream on the feedback display.
This in turn allows for feedback loops back to the studio, for instance for video cameras that are remotely controlled by the production team based on what they see on the multi-views, or having additional feedback displays in the studio.
2 - Introduction to Ateliere Live technology
Ateliere Live is a software-based platform and solution for live media production that enables remote and distributed workflows in software running on standard, off-the-shelf hardware. It can be deployed on-premises or in private or public cloud.
The system is built with an ‘API first’ philosophy throughout. It is built in several stacked conceptual layers, and a customer may choose how many layers to include in their solution, depending on which customisations they wish to do themselves. It is implemented in a distributed manner with a number of different software binaries the customer is responsible for running on their own hardware and operating system. If using all layers, the full solution provides media capture, synchronised contribution, video & audio mixing including Digital Video Effects and HTML-based graphics overlay, various production control panel integrations and a fully customisable multiview, primary distribution and a management & orchestration API layer with a configuration & monitoring GUI on top of it.
The layers of the platform are the “Base Layer”, the “Rendering Engine & Generic Control Panels” layer and the “GUIs & Orchestration, Specific Control Panels” layer.

Ateliere Live Layers
The base layer
The base layer of the platform can in a very simplified way be described as being responsible for transporting media of diverse types from many different locations into a central location in perfect sync, present it there to higher layer software that processes it in some way, and to distribute the end result. This piece of software, which is not a part of the base layer, is referred to as a “rendering engine”. The base layer also carries control commands from remote control panels into the rendering engine, without having any knowledge of the actual control command syntax.
The following image shows a schematic of the roles played by the base layer. The parts in blue are higher layer functionality.

Base Layer
The base layer is separated into three components based on their different roles in a distributed computing system:
- the Ingest component handles acquisition of the media sources and timestamping of media frames, followed by encoding, muxing and origination of reliable transport over unreliable networks using SRT or RIST
- the Production Pipeline component handles terminating all incoming media streams from ingests, demuxing and decoding, aligning all the sources according to timestamps and feeding them synchronously into the rendering engine. It also receives the resulting media frames from the rendering engine and encodes, muxes and streams out the media streams using MPEG-TS over UDP or SRT. It constructs a multiview from the aligned sources by fully customizable scaling and compositing. Finally, it receives control commands from the control panel component, aligns them in time with the media sources and feeds them into the rendering engine. NOTE that the rendering engine is NOT a part of the base layer, and must be supplied by a higher layer or by the implementer themselves.
- The control panel component is responsible for acquiring control command data (the internal syntax of which it has no knowledge of), timestamp it, and send it to the production pipeline component.
The base layer is delivered as libraries and header files, to be used to build binaries that make up the platform. The ingest component is for convenience also delivered as a precompiled binary named acl-ingest as there is very little customization to be done around it at the current moment.
The functionalities in the base layer are managed via a REST API. A separate software program called the System Controller acts as a REST service and communicates with the rest of the Base Layer software to control and monitor it. The REST API is Open API 2.0 compliant, and is documented here. Apart from the three components (ingest, production pipeline, controlpanel), the concepts of a Stream (transporting one source from one ingest to one production pipeline using one specific set of properties) and a controlconnection (transporting control commands from one control panel to one production pipeline or from one production pipeline to another) are central to the REST API.
The rendering engine and generic control panels layer
Though it is fully possible to use only the base layer and to build everything else yourself, a very capable version of a rendering engine is supplied. Our rendering engine implementation consists of a modular video mixer, an audio router and mixer, an interface towards 3rd party audio mixers, and an HTML renderer to overlay HTML-based graphics. It defines a control protocol for configuration and control which can be used by specific control panel implementations.
The rendering engine is delivered bundled with the production pipeline component as a binary named acl-renderingengine. This is because the production pipeline component from the base layer is only delivered as a library that the rendering engine implementation makes use of.
Communication with the rendering engine for configuration and control takes place over the control connections from control panels, as provided by the base layer. The control panels are contructed by using the control panel library, but to assist in getting up and running fast, a few generic control panels are provided, that will act as proxies for control commands. There is one that sets up a TCP server and accepts control commands over connections to it, and another one that acts as a websocket server for the same purpose. Finally there is one that takes commands over stdin from a terminal session forwards control commands.
The GUI and orchestration layer
On top of the REST API it is possible to build GUIs for configuring and monitoring the system. One default GUI is provided.
Prometheus-exporters can be configured to report on the details of the machines in the system, and there is also an exporter for the REST API statistics. The data in Prometheus can then be presented in Grafana.
Using the control command protocol defined by our rendering engine and either the generic control panels or custom control panel integrations, GUIs can be constructed to configure and control the components inside the rendering engine. For example, Bitfocus Companion can be configured to send control commands to the tcpcontrolpanel which will send them further into the system. The custom integration audio_control_gui can be used to interface with audio panels that support the Mackie Control protocol and to send control commands to the tcpcontrolpanel.
Direct editing mode vs proxy editing mode
The components of the Ateliere Live platform can be combined in many different ways. The two most common ways is the Direct Editing Mode and the Proxy Editing Mode. The direct editing mode is what has commonly been done for remote productions, where the mixer operator edits directly in the flow that goes out to the viewer.

Direct editing mode
In the proxy editing mode, the operator works with a low delay but lower quality flow, makes mixing decisions, and then those decisions are replicated in a frame accurate manner on a high quality flow that is delayed in time.

Proxy editing mode
There are good reasons for using a proxy editing mode. The mixer operator may be communicating via intercom with personnel at the venue, such as camera operators, or PTZ cameras may be operated remotely. In these cases it is important that the delay from the cameras to the production pipeline and out to the mixer operator is as short as possible. But having a low latency for this flow goes in direct opposition to having a high quality video compression and a very reliable transport. Therefore, in the proxy editing mode, we have both a low delay workflow and a high quality but slower workflow. This way both requirements can be satisfied. This technique is made possible by the synchronization functionalities of the base layer platform.
3 - Installation and configuration
A working knowledge of the technical basis of the Ateliere Live solution is beneficial before starting with this installation guide.
This guide will often point to subpages for the detailed description of steps. The major steps of this guide are:
- Hardware and operating system requirements
- Install, configure and start the System Controller
- The base platform components
- Install prerequisites
- Preparing the base system for installation
- Install Ateliere Live platform
- Configure and start the Ateliere Live components
- Install the configuration-and-monitoring GUI (optional)
- Install Prometheus and Grafana, and configure them (optional)
- Install and start control panel GUI examples
Warning
Some installation scripts described in this guide are using sudo to install software. As always when using sudo, make sure you understand what the scripts do before running them!1. Hardware and operating system requirements
The bulk of the platform runs on computer systems based on x86 CPUs and running the Ubuntu 22.04 operating system. This includes the following software components: the ingest, the production pipeline, the control panel integrations, and the system controller. The remaining components, i.e. the configuration and monitoring GUI, the control panel GUI examples, and the Prometheus database and Grafana frontend can be run in the platform of choice, as they are cross platform.
The platform does not have explicit hardware performance requirements, as it will utilize the performance of the system it is given, but suggestions for hardware specifications can be found here.
Ateliere Live is supported and tested on Ubuntu 22.04 LTS. Other versions may work but are not officially supported.
2. Install, configure and start the System Controller
The System Controller is the central backend that ties together and controls the different components of the base platform, and that provides the REST API that is used by the user to configure and monitor the system. When each Ateliere Live component, such as an Ingest or a Production Pipeline, starts up it connects to and registers with the System Controller, so it is a good idea to install and configure the System Controller first.
Instructuctions on how to install and configure it can be found here.
3. The base platform components
The base platform consists of the software components Ingests, Production Pipelines, and Control Panel interfaces. Each machine that is intended to act as an aquisition device for media shall run exactly one instance of the Ingest application, as it is responsible for interfacing with third party software such as SDKs for SDI cards and NDI.
The production pipeline application instance (interchangably called a rendering engine application instance in parts of this documentation) uses the resources of its host machine in a non-exclusive way (including the GPU), so there may therefore reside more than one instance on a single host machine.
The control panel integrations preferably reside on a machine close to the actual control panel.
However, in a very minimal system not all of these machines need to be separate; in fact, all the above could run on a single computer if so is desired.
A guide to installing and configuring the Ateliere Live base platform can be found here.
4. Install the configuration-and-monitoring GUI (optional)
There is a basic configuration-and-monitoring GUI that is intended to be used as an easy way to get going with using the system. It uses the REST API to configure and monitor the system.
Instructions for how to install it can be found here and a tutorial for how to use it can be found here
5. Install Prometheus and Grafana, and configure them (optional)
To collect useful system metrics for stability and performance monitoring, we advise to use Prometheus. For visualizing the metrics collected by Prometheus you could use Grafana.
The System controller receives a lot of internal metrics from the Ateliere Live components. These can be pulled by a Prometheus instance from the endpoint https://system-controller-host:port/metrics.
It is also possible to install external exporters for various hardware and OS metrics.
To install and run prometheus exporters on the servers that run ingest and production pipeline software, as well as installing, configuring and running the Prometheus database and the associated Grafana instance on the server dedicated to management and orchestration, follow this guide.
6. Install and start control panel GUI examples
To install the example control panel GUIs that are delivered as source code, follow this guide.
3.1 - Hardware examples
The following hardware specifications serve as examples of how much can be expected from certain hardware setups. The maximum number of inputs and outputs are highly dependent on the quality and resolution settings chosen when setting up a production, so these numbers shall be seen as approximations of what can be expected from a certain hardware under some form of normal use.
Hardware example #1
| System Specifications | |
|---|---|
| CPU | Intel Core i7 12700K |
| RAM | Kingston FURY Beast 32GB (2x16GB) 3200MHz CL16 DDR4 |
| Graphics Card | NVIDIA RTX A2000 12GB |
| PSU | 750W PSU |
| Motherboard | ASUS Prime H670-Plus D4 DDR4 S-1700 ATX |
| SSD | Samsung 980 NVMe M.2 1TB SSD |
| Capture Card (Ingest only) | Blackmagic Design Decklink Duo 2 |
One such server is capable of fulfilling either of the two use-cases below:
- Ingest server
- With Proxy editing: ingesting 4 sources (encoded as 4 Low Delay streams, AVC 720p50 1 Mbps and 4 High Quality streams, HEVC 1080p50 25 Mbps).
- With Direct editing: ingesting 6 sources, (HEVC 1080p50 25 Mbps).
- Production server, running both a High Quality and a Low Delay pipeline with at least 10 connected sources (i.e. at least 20 incoming streams), with at least one 1080p50 multi-view output, one 1080p High Quality program output and one 720p Low Delay output.
Hardware example #2
| System Specifications | |
|---|---|
| CPU | Intel Core i7 12700K |
| RAM | Kingston FURY Beast 32GB (2x16GB) 6000MHz CL36 DDR5 |
| Graphics Card | NVIDIA RTX 4000 SFF Ada Generation 20GB |
| PSU | 750W PSU |
| Motherboard | ASUS ROG Maximus Z690 Hero DDR5 ATX |
| SSD | WD Blue SN570 M.2 1TB SSD |
| Capture Card (Ingest only) | Blackmagic Design Decklink Quad 2 |
One such server is capable of fulfilling either of the two use-cases below:
- Ingest server
- With Proxy editing: ingesting 6-8 sources (encoded as 6-8 Low Delay streams, AVC 720p50 1 Mbps and 6-8 High Quality streams, HEVC 1080p50 25 Mbps).
- With Direct editing: ingesting 8-10 sources (HEVC 1080p50 25 Mbps).
- Production server, running both the High Quality and the Low Delay pipeline with at least 20 connected sources (i.e. at least 40 incoming streams), with at least three 4K multi-view outputs, four 1080p High Quality outputs and four 720p Low Delay outputs.
3.2 - The System Controller
The System Controller is the central backend that ties together and controls the different components of the base platform, and that provides the REST API that is used by the user to configure and monitor the system.
When each Ateliere Live component (such as an Ingest or a Production Pipeline) starts up, it connects to and registers with the System Controller. This means the System Controller must run in a network location that is reachable from all other components.
From release 6.0.0 and on, the System Controller is distributed as a debian package, acl-system-controller.
To install the System Controller application, do the following:
sudo apt -y install acl-system-controller_<version>_amd64.deb
The System Controller binary will be installed in the directory /opt/ateliere_live/bin/ and its configuration file will be placed in /etc/opt/ateliere_live/.
The System Controller is configured either using a settings file or using environment variables, or a combination thereof. The settings file, named acl_sc_settings.json, is searched for in /etc/opt/ateliere_live and current directory, or the search path can be pointed to using a flag on the command line when starting the application:
./acl-system-controller for default search paths or ./acl-system-controller -settings-path /path/to/directory/where/settings_file/exists
To use environment variables overriding settings from the configuration file, construct the variables from the json objects in the settings file by prepending with ACL_SC and then the json object flattened out with _ as the delimiter, e.g.:
export ACL_SC_LOGGER_LEVEL=debug
export ACL_SC_PROTO=https
Starting with the basic configuration file in the release, edit a few settings inside it (see this guide for help with the security related parameters):
- change the
pskparameter to something random of your own - change the
saltto some long string of your own - set the
usernameandpasswordto protect the REST API - specify TLS certificate and key files
- set the
hostandportparameters to where the System Controller shall be reached
Also consider setting the file_name_prefix to set the log file location, otherwise it defaults to /tmp/.
Warning
Since passwords will be inserted in this configuration file, it is recommended to set the file rights to only allow reading by the user that executes the System Controller.From the installation directory, the System Controller is started with:
./acl-system-controller
If started successfully, it will display a log message showing the server endpoint.
The System Controller comes with built-in Swagger documentation that makes it easy to explore the API in a regular web browser. To access the Swagger REST API documentation hosted by the System Controller, open https://<IP>:<port>/swagger/ in your browser. The Swagger UI can be used to poll or edit the state of the actual system by using the “Try it out” buttons.
Running the System Controller as a service
It may be useful to run the System Controller as a service in Ubuntu, so that it starts automatically on boot and restarts if it terminates abnormally. In Ubuntu 22.04 systemd manages the services. Here follows an example of how a service can be configured, started and monitored.
First create a “service unit file”, named for example /etc/systemd/system/acl-system-controller.service and put the following in it:
[Unit]
Description=Ateliere Live System Controller service
[Service]
User=<YOUR_USER>
Environment=<ANY_ENV_VARS_HERE>
ExecStart=/opt/ateliere_live/bin/acl-system-controller
Restart=always
[Install]
WantedBy=multi-user.target
Replace <YOUR_USER> with the user that will be executing the System Controller binary on the host machine. The Environment attribute is used if you want to set any parameters as environment variables.
After saving the service unit file, run:
sudo systemctl daemon-reload
sudo systemctl enable acl-system-controller.service
sudo systemctl start acl-system-controller
The service should now be started. The status of the service can be queried using:
sudo systemctl status acl-system-controller.service
3.3 - The base platform
This page describes the steps needed to install and configure the base platform.
Install Third-party packages
Ateliere Live has a few dependencies on third party software that have to be installed separately first. Which ones are needed depends on the component of Ateliere Live that you will be running on the specific system.
A machine running the Ingest needs the following:
- CUDA Toolkit
- oneVPL
- Blackmagic Desktop Video (Optional, is needed when using Blackmagic DeckLink SDI cards)
- NDI SDK for Linux
- Base packages via ‘apt’
A machine running the Rendering Engine only needs a subset:
- CUDA Toolkit
- Base packages via ‘apt’
A machine running control panels needs yet fewer:
- Base packages via ‘apt’
Hint
For ease of use during the installation instructions below, for each commands section it is suggested to copy the contents, place them in a shell script, and run that shell script.CUDA Toolkit
For video encoding and decoding on NVidia GPUs you need Nvidia CUDA Toolkit installed. It must be installed on Ingest machines even if they don’t have Nvidia cards.
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update
sudo apt -y install cuda
You need to reboot the system after installation. Then check the installation by running nvidia-smi. If installing more dependencies, it is ok to proceed with that and reboot once after installing all parts.
oneVPL
All machines running the Ingest application need the Intel oneAPI Video Processing Library (oneVPL) installed. It is used for encoding and thumbnail processing on Intel GPUs and is required even for Ingests which will not use the Intel GPU for encoding. Install oneVPL by running:
sudo apt install -y gpg-agent wget
# Download and run oneVPL offline installer:
# https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#onevpl
VPL_INSTALLER=l_oneVPL_p_2023.1.0.43488_offline.sh
wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/e2f5aca0-c787-4e1d-a233-92a6b3c0c3f2/$VPL_INSTALLER
chmod +x $VPL_INSTALLER
sudo ./$VPL_INSTALLER -a -s --eula accept
# Install the latest general purpose GPU (GPGPU) run-time and development software packages
# https://dgpu-docs.intel.com/driver/client/overview.html
wget -qO - https://repositories.intel.com/graphics/intel-graphics.key | \
sudo gpg --dearmor --output /usr/share/keyrings/intel-graphics.gpg
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/graphics/ubuntu jammy arc' | \
sudo tee /etc/apt/sources.list.d/intel.gpu.jammy.list
sudo apt update
sudo apt install -y ffmpeg intel-media-va-driver-non-free libdrm2 libmfx-gen1.2 libva2
# Add VA environment variables
if [[ -z "${LIBVA_DRIVERS_PATH}" ]]; then
sudo sh -c "echo 'LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri' >> /etc/environment"
fi
if [[ -z "${LIBVA_DRIVER_NAME}" ]]; then
sudo sh -c "echo 'LIBVA_DRIVER_NAME=iHD' >> /etc/environment"
fi
# Give users access to the GPU device for compute and render node workloads
# https://www.intel.com/content/www/us/en/develop/documentation/installation-guide-for-intel-oneapi-toolkits-linux/top/prerequisites/install-intel-gpu-drivers.html
sudo usermod -aG video,render ${USER}
# Set environment variables for development
echo "# oneAPI environment variables for development" >> ~/.bashrc
echo "source /opt/intel/oneapi/setvars.sh > /dev/null" >> ~/.bashrc
You need to reboot the system after installation. If installing more dependencies, it is ok to proceed with that and reboot once after installing all parts.
Support for Blackmagic Design SDI grabber cards
If the Ingest shall be able to use Blackmagic DeckLink SDI cards, the drivers need to be installed.
Download https://www.blackmagicdesign.com/se/support/family/capture-and-playback (Desktop Video).
Unpack and install (Replace all commands with the version you downloaded):
sudo apt install dctrl-tools dkms
tar -xvf Blackmagic_Desktop_Video_Linux_12.7.tar.gz
cd Blackmagic_Desktop_Video_Linux_12.7/deb/x86_64
sudo dpkg -i desktopvideo_12.7a4_amd64.deb
Support for NDI sources
For machines running Ingests, you need to install the NDI library and additional dependencies:
## Install library
sudo apt -y install avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan
wget https://downloads.ndi.tv/SDK/NDI_SDK_Linux/Install_NDI_SDK_v5_Linux.tar.gz
tar -xvzf Install_NDI_SDK_v5_Linux.tar.gz
PAGER=skip-pager ./Install_NDI_SDK_v5_Linux.sh <<< y
cd NDI\ SDK\ for\ Linux/lib/x86_64-linux-gnu/
NDI_LIBRARY_FILE=$(ls libndi.so.5.*.*)
cd ../../..
sudo cp NDI\ SDK\ for\ Linux/lib/x86_64-linux-gnu/${NDI_LIBRARY_FILE} /usr/lib/x86_64-linux-gnu
sudo ln -fs /usr/lib/x86_64-linux-gnu/${NDI_LIBRARY_FILE} /usr/lib/x86_64-linux-gnu/libndi.so
sudo ln -fs /usr/lib/x86_64-linux-gnu/${NDI_LIBRARY_FILE} /usr/lib/x86_64-linux-gnu/libndi.so.5
sudo ldconfig
sudo cp NDI\ SDK\ for\ Linux/include/* /usr/include/.
Base packages installed via ‘apt’
When installing version 5.0.0 or earlier, please refer to this guide for this step.
All systems that run an Ingest, Rendering Engine or Control Panel need chrony as NTP client.
The systemd-coredump package is also really handy to have installed to be able to debug core dumps later on, but is technically optional.
These packages can be installed with the apt package manager:
sudo apt -y update && sudo apt -y upgrade && sudo apt -y install chrony systemd-coredump
Preparing the base system for installation
To prepare the system for Ateliere Live, the NTP client must be configured correctly by following this guide, and some general Linux settings shall be configured by following this guide. Also, CUDA should be prevented from automatically installing upgrades by following this guide.
Installing the Ateliere Live components
When installing version 5.0.0 or earlier, please refer to this guide for this step.
The following Ateliere Live .deb packages are distributed:
- acl-system-controller - Contains the System Controller application (explained in separate section)
- acl-libingest - Contains the library used by the Ingest application
- acl-ingest - Contains the Ingest application
- acl-libproductionpipeline - Contains the libraries used by the Rendering Engine application
- acl-renderingengine - Contains Ateliere Live’s default Rendering Engine application
- acl-libcontroldatasender - Contains the libraries used by Control Panel applications
- acl-controlpanels - Contains the generic Control Panel applications
- acl-dev - Contains the header files required for development of custom Control Panels and Rendering Engines
All binaries will be installed in the directory /opt/ateliere_live/bin. Libraries are installed in /opt/ateliere_live/lib. Header files are installed in /opt/ateliere_live/include.
Ingest
To install the Ingest application, install the following .deb-packages:
sudo apt -y install ./acl-ingest_<version>_amd64.deb ./acl-libingest_<version>_amd64.deb
Rendering engine
To install the Rendering Engine application, install the following .deb-packages:
sudo apt -y install ./acl-renderingengine_<version>_amd64.deb ./acl-libproductionpipeline_<version>_amd64.deb
Control panels
To install the generic Control Panel applications acl-manualcontrolpanel, acl-tcpcontrolpanel and acl-websocketcontrolpanel, install the following .deb-packages:
sudo apt -y install ./acl-controlpanels_<version>_amd64.deb ./acl-libcontroldatasender_<version>_amd64.deb
Dev
To install the acl-dev package containing the header files needed for building your own applications, install the following .deb-package:
sudo apt -y install ./acl-dev_<version>_amd64.deb
Configuring and starting the Ingest(s)
The Ingest component is a binary which ingests raw video input sources such as SDI or NDI, timestamps, processes, encodes and originates transport to the rest of the platform.
Settings for the ingest binary are added as environment variables. There is one setting that must be set:
ACL_SYSTEM_CONTROLLER_PSKshall be set to the same as in the settings file of the System Controller
Also, there are some parameters that have default settings that you will most probably want to override:
ACL_SYSTEM_CONTROLLER_IPandACL_SYSTEM_CONTROLLER_PORTshall be set to the location where the System Controller is hostedACL_INGEST_NAMEis optional but is well used as an aid to identify the Ingest in the REST interface if multiple instances are connected to the same System Controller
You may also want to set the log location by setting ACL_LOG_PATH. The log location defaults to /tmp/.
Hint
In case you forget the names of these environment variables or want to see their default values, run the component with the--help flag, e.g. ./acl-ingest --help.As an example, from the installation directory, the Ingest is started with:
ACL_SYSTEM_CONTROLLER_IP="10.10.10.10" ACL_SYSTEM_CONTROLLER_PORT=8080 ACL_SYSTEM_CONTROLLER_PSK="FBCZeWB3kMj5me58jmcpmEd3bcPZbp4q" ACL_INGEST_NAME="My Ingest" ./acl-ingest
If started successfully, it will display a log message showing that the Ingest is up and running.
Running the Ingest SW as a service
It may be useful to run the Ingest SW as a service in Ubuntu, so that it starts automatically on boot and restarts if it terminates abnormally. In Ubuntu 22.04 systemd manages the services. Here follows an example of how a service can be configured, started and monitored.
First create a “service unit file”, named for example /etc/systemd/system/acl-ingest.service and put the following in it:
[Unit]
Description=Ateliere Live Ingest service
[Service]
User=<YOUR_USER>
Environment=ACL_SYSTEM_CONTROLLER_PSK=<YOUR_PSK>
ExecStart=/bin/bash -c '\
source /opt/intel/oneapi/setvars.sh; \
exec /opt/ateliere_live/bin/acl-ingest'
Restart=always
[Install]
WantedBy=multi-user.target
Replace <YOUR_USER> with the user that will be executing the Ingest binary on the host machine. The Environment attribute should be set in the same way as described above for manually starting the binary.
After saving the service unit file, run:
sudo systemctl daemon-reload
sudo systemctl enable acl-ingest.service
sudo systemctl start acl-ingest
The service should now be started. The status of the service can be queried using:
sudo systemctl status acl-ingest.service
Configuring and starting the Production pipeline(s) including rendering engine
The production pipeline component and the rendering engine component are combined into one binary named acl-renderingengine and terminates transport of media streams from ingests, demuxes, decodes, aligns according to timestamps and clock sync, separately mixes audio and video (including HTML-based graphics insertion) and finally encodes, muxes and originates transport of finished mixed outputs as well as multiviews.
It is possible to run just one production pipeline if doing direct editing (the “traditional way”, in the stream) or to use two pipelines in order to set up a proxy editing workflow. In the latter case, there is one designated for the Low Delay flow which will be used for quick feedbacks on the editing commands and one designated for High Quality flows which will produce the final quality stream to broadcast to the viewers. The Production Pipeline is simply called a “pipeline” in the REST API. The rendering engine is not managed through the REST API but rather through the control command API from the control panels.
Settings for the production pipeline binary are added as environment variables. There is one setting that must be set:
ACL_SYSTEM_CONTROLLER_PSKshall be set to the same as in the settings file of the System Controller
Also, there are some parameters that have default settings that you will most probably want to override:
ACL_SYSTEM_CONTROLLER_IPandACL_SYSTEM_CONTROLLER_PORTshall be set to the location where the System Controller is hostedACL_RENDERING_ENGINE_NAMEis needed to identify the different production pipelines in the REST API and shall thus be set uniquely and descriptivelyACL_MY_PUBLIC_IPshall be set to the IP address or hostname where the ingest shall find the production pipeline. If the production pipeline is behind a NAT or needs DNS resolving, setting this variable is necessaryDISPLAYis needed but may already be set by the operating system. If not (because the server is headless) it needs to be set.
Hint
If running a headless server and setting theDISPLAY environment variable, run an instance of Xvfb to provide the virtual “display” to point towards. E.g. start Xvfb by running Xvfb -ac :99 -screen 0 1280x1024x16, and when starting the Rendering Engine set DISPLAY=:99. It is recommended to start Xvfb as a service on headless machines.It is possible to provide a user-defined Rendering Engine configuration by pointing to a JSON-formatted configuration file. The format of the file is detailed in this guide. To provide a user-defined Rendering Engine configuration, set ACL_RENDERING_ENGINE_CONFIG to the full filename and path of the configuration file.
You may also want to set the log location by setting ACL_LOG_PATH. The log location defaults to /tmp/.
Here is an example of how to start two instances (one for Low Delay flow and one for High Quality Flow) of the acl-renderingengine application and name them accordingly so that you and the GUI can tell them apart. First start the Low Delay instance by running:
ACL_SYSTEM_CONTROLLER_IP="10.10.10.10" ACL_SYSTEM_CONTROLLER_PORT=8080 ACL_SYSTEM_CONTROLLER_PSK="FBCZeWB3kMj5me58jmcpmEd3bcPZbp4q" ACL_RENDERING_ENGINE_NAME="My LD Pipeline" ./acl-renderingengine
Then start the High Quality Rendering Engine in the same way:
ACL_SYSTEM_CONTROLLER_IP="10.10.10.10" ACL_SYSTEM_CONTROLLER_PORT=8080 ACL_SYSTEM_CONTROLLER_PSK="FBCZeWB3kMj5me58jmcpmEd3bcPZbp4q" ACL_RENDERING_ENGINE_NAME="My HQ Pipeline" ./acl-renderingengine
Configuring and starting the generic Control Panels
TCP control panel
acl-tcpcontrolpanel is a control panel application that starts a TCP server on a configurable set of endpoints and relays control commands over a control connection if one has been set up. It is preferably run geographically very close to the control panel whose control commands it will relay, but can alternatively run close to the production pipeline that it is connected to. To start with, it is easiest to run it on the same machine as the associated production pipeline.
Settings for the tcp control panel binary are added as environment variables. There is one setting that must be set:
ACL_SYSTEM_CONTROLLER_PSKshall be set to the same as in the settings file of the System Controller
Also, there are some parameters that have default settings that you will most probably want to override:
ACL_SYSTEM_CONTROLLER_IPandACL_SYSTEM_CONTROLLER_PORTshall be set to the location where the System Controller is hostedACL_CONTROL_PANEL_NAMEcan be set to make it easier to identify the control panel through the REST APIACL_TCP_ENDPOINTfrom release 6.0.0 on, contains the IP address and port of the TCP endpoint to be opened, written as<ip>:>port>. Several clients can connect to the same listening port. In release 5.0.0 and earlier, instead useACL_TCP_ENDPOINTS, a comma-separated list of endpoints to be opened, where each endpoint is written as<ip>:>port>
You may also want to set the log location by setting ACL_LOG_PATH. The log location defaults to /tmp/.
As an example, from the installation directory, the tcp control panel is started with:
ACL_SYSTEM_CONTROLLER_IP="10.10.10.10" ACL_SYSTEM_CONTROLLER_PORT=8080 ACL_SYSTEM_CONTROLLER_PSK="FBCZeWB3kMj5me58jmcpmEd3bcPZbp4q" ACL_TCP_ENDPOINT=0.0.0.0:7000 ACL_CONTROL_PANEL_NAME="My TCP Control Panel" ./acl-tcpcontrolpanel
Websocket control panel
acl-websocketcontrolpanel is a control panel application that acts as a websocket server, and relays control commands that come in over websockets that are opened typically by web-based GUIs.
The basic settings are the same as for the tcp control panel. But to specify where the websocket server shall open an endpoint, use this environment variable:
ACL_WEBSOCKET_ENDPOINTis the endpoint to listen for incoming messages on. On the form<ip>:<port>
You may also want to set the log location by setting ACL_LOG_PATH. The log location defaults to /tmp/.
An example of how to start it is the following:
ACL_SYSTEM_CONTROLLER_IP="10.10.10.10" ACL_SYSTEM_CONTROLLER_PORT=8080 ACL_SYSTEM_CONTROLLER_PSK="FBCZeWB3kMj5me58jmcpmEd3bcPZbp4q ACL_WEBSOCKET_ENDPOINT=0.0.0.0:6999 ACL_CONTROL_PANEL_NAME="My Websocket Control Panel" ./acl-websocketcontrolpanel
Manual control panel
acl-manualcontrolpanel is a basic Control Panel application operated from the command line.
The basic settings are the same as for the other generic control panels but it does not open any network endpoints for input, instead the control commands are written in the terminal. It can be started with:
ACL_SYSTEM_CONTROLLER_IP="10.10.10.10" ACL_SYSTEM_CONTROLLER_PORT=8080 ACL_SYSTEM_CONTROLLER_PSK="FBCZeWB3kMj5me58jmcpmEd3bcPZbp4q ACL_CONTROL_PANEL_NAME="My Manual Control Panel" ./acl-manualcontrolpanel
3.3.1 - NTP
To ensure that all ingest servers and production pipelines are in sync, a clock synchronization protocol called NTP is required. Historically that has been handled by a systemd service service called timesyncd.
Chrony
Starting from version 4.0.0 of Ateliere Live the required NTP client has switched from systemd-timesyncd to chrony. Chrony is installed by defualt in many Linux distributions since it has a lot of advantages over using systemd-timesyncd. Some of the advantages are listed below.
- Full NTP support (systemd-timesyncd only supports Simple NTP)
- Syncing against multiple servers
- More complex but more accurate
- Gradually adjusts the system time instead of hard steps
Installation
Install chrony with:
$ sudo apt install chrony
This will replace systemd-timesyncd if installed.
NTP servers
The default configuration for chrony uses a pool of 8 NTP servers to
synchronize against. It is recommended to use these default servers hosted by Ubuntu.
Verify that the configuration is valid by checking the configuration file after
installing.
$ cat /etc/chrony/chrony.conf
...
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
...
The file should also contain the line below for the correct handling of leap seconds. It is used to set the leap second timezone to get the correct TAI time.
leapsectz right/UTC
Useful Commands
To get detailed information on how the system time is running compared to NTP,
use the chrony client chronyc. The subcommand tracking shows information
about the current system time and the selected time server used.
$ chronyc tracking Reference ID : C23ACA14 (sth1.ntp.netnod.se) Stratum : 2 Ref time (UTC) : Wed Mar 08 07:23:37 2023 System time : 0.000662344 seconds slow of NTP time Last offset : -0.000669114 seconds RMS offset : 0.001053432 seconds Frequency : 10.476 ppm slow Residual freq : +0.001 ppm Skew : 0.295 ppm Root delay : 0.007340557 seconds Root dispersion : 0.001045418 seconds Update interval : 1028.7 seconds Leap status : Normal
The sources subcommand to get a list of the other time
servers that chrony uses.
$ chronyc sources -v
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current best, '+' = combined, '-' = not combined,
| / 'x' = may be in error, '~' = too variable, '?' = unusable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- prod-ntp-5.ntp4.ps5.cano> 2 6 17 8 +59us[ -11us] +/- 23ms
^- pugot.canonical.com 2 6 17 7 -1881us[-1951us] +/- 48ms
^+ prod-ntp-4.ntp1.ps5.cano> 2 6 17 7 -1872us[-1942us] +/- 24ms
^+ prod-ntp-3.ntp1.ps5.cano> 2 6 17 6 +878us[ +808us] +/- 23ms
^- ntp4.flashdance.cx 2 6 17 7 -107us[ -176us] +/- 34ms
^+ time.cloudflare.com 3 6 17 8 -379us[ -449us] +/- 5230us
^* time.cloudflare.com 3 6 17 8 +247us[ +177us] +/- 5470us
^- ntp5.flashdance.cx 2 6 17 7 -1334us[-1404us] +/- 34ms
Leap seconds
Due to small variations in the Earth’s rotation speed a one second time adjustment is occasionally introduced in UTC (Coordinated Universal Time). This is usually handled by stepping back the clock in the NTP server one second. These hard steps could cause problems in such a time critical product as video production. To avoid this the system uses a clock known as TAI (International Atomic Time), which does not introduce any leap seconds, and is therefore slightly offset from UTC (37 seconds in 2023).
Leap smearing
Another technique for handling the introduction of a new leap second is called leap smearing. Instead of stepping back the clock in on big step, the leap second is introduced in many minor microsecond intervals during a longer period, usually over 12 to 24 hours. This technique is used by most of the larger cloud providers. Most NTP servers that use leap smearing don’t announce the current TAI offset and will thereby cause issues if used in combination with systems that are using TAI time. It is therefore highly recommended to use Ubuntu’s default NTP servers as described above, as none of these use leap smearing. Mixing leap smearing and non-leap smearing time servers will result in that components in the system will have clocks that are off from each other by 37 seconds (as of 2023), as the ones using leap smearing time servers without TAI offset will set the TAI clock to UTC.
3.3.2 - Linux settings
UDP buffers
To improve the performance while receiving and sending multiple streams, and not overflow UDP buffers (leading to receive buffer errors as identified using e.g. ‘netstat -suna’), it is recommended to adjust some UDP buffer settings on the host system.
Recommended value of the buffers is 16MB, but different setups may need larger buffers or would suffice with lower values. To change the buffer values issue:
sudo sysctl -w net.core.rmem_default=16000000
sudo sysctl -w net.core.rmem_max=16000000
sudo sysctl -w net.core.wmem_default=16000000
sudo sysctl -w net.core.wmem_max=16000000
To make the changes persistant edit/add the values to /etc/sysctl.conf:
net.core.rmem_default=16000000
net.core.rmem_max=16000000
net.core.wmem_default=16000000
net.core.wmem_max=16000000
Core dump
On the rare occasion that a segmentation fault or a similar error should occur, a core dump is generated by the operating system to record the state of the application to aid in troubleshooting. By default these core dumps are handled by the ‘apport’ service in Ubuntu and not written to file. To store them to file instead we recommend installing the systemd core dump service.
sudo apt install systemd-coredump
Core dumps will now be compressed and stored in /var/lib/systemd/coredump.
The systemd core dump package also includes a helpful CLI tool for accessing core dumps.
List all core dumps:
$ coredumpctl list
TIME PID UID GID SIG COREFILE EXE
Thu 2022-10-20 17:24:16 CEST 985485 1007 1008 11 present /usr/bin/example
You can print some basic information from the core dump to send to the Ateliere Live developer to aid debugging the crash
$ coredumpctl info 985485
In some cases, the developers might want to see the entire core dump to understand the crash, then save the core dump using
$ coredumpctl dump 985485 --output=myfilename.coredump
Core dumps will not persist between reboots.
3.3.3 - Disabling unattended upgrades of CUDA toolkit
CUDA Driver/library mismatch
Per default Ubuntu runs automatic upgrades on APT installed packages every night, a process called unattended upgrades. This will sometimes cause issues when the unattended upgrade process tries to update the CUDA toolkit, as it will be able to update the libraries, but cannot update the driver, as it is in use by some application. The result is that the CUDA driver cannot be used because of the driver-library mismatch and the Ateliere Live applications will fail to start.
In case an Ateliere Live application fails to start with some CUDA error, the easiest way to see if this is because of a driver-library mismatch, is to run nvidia-smi in a terminal and check the output:
$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
In case this happens, just reboot the machine and the new CUDA driver should be loaded instead of the old one at startup. (It is sometimes possible to manually reload the CUDA driver without rebooting, but this can be troublesome as you have to find all applications using the driver)
How to disable unattended upgrades of CUDA toolkit
One way to get rid of these unpleasant surprises when the applications suddenly no longer can start, without disabling unattended upgrades for other packages, is to blacklist the CUDA toolkit from the unattended upgrades process. This will make Ubuntu still update other packages, but CUDA toolkit will require a manual upgrade, which can be done at a suitable time point.
To blacklist the CUDA driver, open the file /etc/apt/apt.conf.d/50unattended-upgrades in a text editor and look for the Unattended-Upgrade::Package-Blacklist block. Add "cuda" and "(lib)?nvidia" to the list, like so:
// Python regular expressions, matching packages to exclude from upgrading
Unattended-Upgrade::Package-Blacklist {
"cuda";
"(lib)?nvidia";
};
This will disable unattended upgrades for packages with names starting with cuda, libnvidia or just nvidia.
How to manually update CUDA toolkit
Once you want to manually update the CUDA toolkit and the driver, run the following commands:
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install cuda
This will likely trigger the driver-library mismatch in case you run nvidia-smi. Then reboot the machine to reload the new driver.
Sometimes a reboot is required before the cuda package can be installed, so in case the upgrade did not work the first time, try a reboot, then apt install cuda and then reboot again.
3.3.4 - Installing older releases
This page describes a couple of steps in installing the base platform that are specific for releases 5.0.0 and older, and replaces these sections in the main documentation.
Base packages installed via ‘apt’
To make it possible to run the Ingest and Rendering Engine, some packages must be installed. The following base packages can be installed with the apt package manager:
sudo apt -y update && sudo apt -y upgrade && sudo apt -y install libssl3 libfdk-aac2 libopus0 libcpprest2.10 libspdlog1 libfmt8 libsystemd0 chrony libcairo2 systemd-coredump
The systemd-coredump package in the list above is really handy to have installed to be able to debug core dumps later on.
Installing the Ateliere Live components
Extract the following release artifacts from the release files listed under Releases:
- Ingest application consisting of binary
acl-ingestand shared librarylibacl-ingest.so - Production pipeline library
libacl-productionpipeline.soand associated header files - Rendering engine application
acl-renderingengine - Production control panel interface library
libacl-controldatasender.soand associated header files - Generic control panel applications
acl-manualcontrolpanel,acl-tcpcontrolpanelandacl-websocketcontrolpanel
3.4 - Configuration and monitoring GUI
The configuration and monitoring GUI releases are hosted by Ateliere in a Docker Registry in ECR in AWS.
The following guide will show how to install and run the configuration and monitoring GUI using Docker compose. The OS specific parts of the guide, how to install Docker and aws-cli, is written for Ubuntu 22.04.
Install Docker Engine
First install Docker on the machine you want to run the GUI and the GUI database:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Login to Docker container registry
To access the Ateliere Docker container registry and pull the GUI Docker image you need to have an AWS account in which you create a role with a policy that allows accessing ECR. Once the role has been created you need to send the ARN of the role to Ateliere so that permissions can be granted to that role. When the proper permissions are configured and the role has been assumed, it is possible to log into the Docker registry and the image can be pulled.
An example policy to add to the role could be:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": "*"
}
]
}
First install AWS CLI on the machine where the GUI will run:
sudo apt-get install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
There are a number of ways to use the AWS CLI to log into one’s AWS account and assume the role, depending on your organisational settings. For example, if you are using SSO though AWS IAM Identity Center you can follow this guide.
Once the role is assumed, it shall be possible to log into the Docker registry using:
aws --profile <your profile> --region us-east-1 ecr get-login-password | sudo docker login --username AWS --password-stdin 492750062338.dkr.ecr.us-east-1.amazonaws.com
If your user is in the docker group, sudo part can be skipped.
MongoDB configuration
The GUI uses MongoDB to store information. When starting up the MongoDB Docker container it will create a database user that the GUI backend will use to communicate with the Mongo database.
Create the file mongo-init.js for the API user (replace <API_USER> and <API_PASSWORD> with a username and password of your choice):
productionsDb = db.getSiblingDB('live-gui');
productionsDb.createUser({
user: '<API_USER>',
pwd: '<API_PASSWORD>',
roles: [{ role: 'readWrite', db: 'live-gui' }]
});
Create a docker-compose.yml file
Create a file docker-compose.yml to start the GUI backend and the MongoDB instance. Give the file the following content:
version: '3.7'
services:
liveui:
image: 492750062338.dkr.ecr.us-east-1.amazonaws.com/tf-ecr-live-gui:latest
container_name: liveui
environment:
MONGODB_URI: mongodb://<API_USER>:<API_PASSWORD>@mongodb:27017/live-gui
AGILE_URL: https://<SYSTEM_CONTROLLER_IP>:<SYSTEM_CONTROLLER_PORT>
AGILE_CREDENTIALS: <SYSTEM_CONTROLLER_USER>:<SYSTEM_CONTROLLER_PASSWORD>
NODE_TLS_REJECT_UNAUTHORIZED: 1
NEXTAUTH_SECRET: <INSERT_GENERATED_SECRET>
NEXTAUTH_URL: http://<SERVER_IP>:<SERVER_PORT>
BCRYPT_SALT_ROUNDS: 10
UI_LANG: en
restart: always
ports:
- <HOST_PORT>:3000
mongodb:
image: mongo:latest
container_name: mongodb
environment:
MONGO_INITDB_ROOT_USERNAME: <MONGODB_USERNAME>
MONGO_INITDB_ROOT_PASSWORD: <MONGODB_PASSWORD>
restart: always
ports:
- 27017:27017
volumes:
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
- ./mongodb:/data/db
Details about some of the parameters:
- image - Use
latesttag for always starting the latest version, set to:X.Y.Zto lock on a specific version. - ports - Internally port 3000 is used, open a mapping from your
HOST_PORTof choice to access the GUI at. - extra_hosts - Adding “host.docker.internal:host-gateway” makes it possible for docker container to access host machine from host.docker.internal
- MONGODB_URI - The mongodb connection string including credentials,
API_USERandAPI_PASSWORDshould match what you wrote inmongo-init.js - AGILE_URL - The URL to the Ateliere Live system controller REST API
- AGILE_CREDENTIALS - Credentials for the Ateliere Live system controller REST API, used by backend to talk to the Ateliere Live REST API.
- NODE_TLS_REJECT_UNAUTHORIZED - Set to 0 to disable SSL verification. This is useful if testing using self-signed certs
- NEXTAUTH_SECRET - The secret used to encrypt the JWT Token, can be generated by
openssl rand -base64 32 - NEXTAUTH_URL - The base url for the service, used for redirecting after login, eg. http://my-host-machine-ip:3000
- BCRYPT_SALT_ROUNDS - The number of salt rounds the bcrypt hashing function will perform, you probably don’t want this higher than 13 ( 13 = ~1 hash/second )
- UI_LANG - Set language for the user interface (en|sv). Default is en
- MONGODB_USERNAME - Select a username for a root user in MongoDB
- MONGODB_PASSWORD - Select a password for your root user in MongoDB
HTTPS support
The Ateliere Live GUI doesn’t have native support for HTTPS. In order to secure the communication to it you need to add something that can handle HTTPS termination in front of it. An example would be a load balancer on AWS or a container running nginx.
nginx example
This is an example nginx config and docker compose service definition that solves the task of redirecting from HTTP to HTTPS and also terminates the HTTPS connection and forwards the request to the Ateliere Live GUI. For more examples and documentation please visit the official nginx site.
Create an nginx server config in a directory called nginx along side your docker-compose.yml file, and add the file nginx/nginx.conf:
server {
listen 80;
listen [::]:80;
server_name $hostname;
server_tokens off;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 default_server ssl http2;
listen [::]:443 ssl http2;
server_name $hostname;
ssl_certificate /etc/nginx/ssl/live/ui/cert.pem;
ssl_certificate_key /etc/nginx/ssl/live/ui/key.pem;
location / {
proxy_pass http://liveui:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on; # Optional
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
}
}
Store your certificate and key file next to the docker-compose.yml file (cert.pem and key.pem in this example).
Update the docker-compose.yml file to also start the official nginx container, and point it to the nginx.conf, cert.pem and key.pem file via volume mounts.
version: '3.7'
services:
liveui:
image: 492750062338.dkr.ecr.us-east-1.amazonaws.com/tf-ecr-live-gui:latest
container_name: liveui
environment:
MONGODB_URI: mongodb://<API_USER>:<API_PASSWORD>@mongodb:27017/live-gui
AGILE_URL: https://<SYSTEM_CONTROLLER_IP>:<SYSTEM_CONTROLLER_PORT>
AGILE_CREDENTIALS: <SYSTEM_CONTROLLER_USER>:<SYSTEM_CONTROLLER_PASSWORD>
NODE_TLS_REJECT_UNAUTHORIZED: 1
NEXTAUTH_SECRET: <INSERT_GENERATED_SECRET>
NEXTAUTH_URL: https://<SERVER_IP>
BCRYPT_SALT_ROUNDS: 10
UI_LANG: en
restart: always
ports:
- 3000:3000
webserver:
image: nginx:latest
ports:
- 80:80
- 443:443
restart: always
volumes:
- ./nginx/:/etc/nginx/conf.d/:ro
- ./cert.pem:/etc/nginx/ssl/live/ui/cert.pem:ro
- ./key.pem:/etc/nginx/ssl/live/ui/key.pem:ro
mongodb:
image: mongo:latest
container_name: mongodb
environment:
MONGO_INITDB_ROOT_USERNAME: <MONGODB_USERNAME>
MONGO_INITDB_ROOT_PASSWORD: <MONGODB_PASSWORD>
restart: always
ports:
- 27017:27017
volumes:
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
- ./mongodb:/data/db
Note that the NEXTAUTH_URL parameter now should be the https address and not specify the port, as we use the default HTTP and HTTPS ports (without nginx we specified the internal GUI port, 3000).
Start, stop and signing in to the Ateliere Live GUI
Start the UI container by running Docker compose in the same directory as the docker-compose.yml file`:
sudo docker compose up -d
Once the containers are started you should now be able to reach the GUI at the host-port that you selected in the docker-compose.yml-file.
To login to the GUI, use username admin and type a password longer than 8 characters. This password will now be stored in the database and
required for any new logins. For more information on how to reset passwords and add new users, read more here
After signing in to the GUI, the statuses in the bottom left should all be green, else there is probably a problem in your System Controller or database configuration in the docker-compose.yml-file.
To stop the GUI and database container run:
sudo docker compose down
Installing support for VLC on client machine, to open Multiview directly from GUI:
On Windows operating system, the GUI supports redirecting the user via links to VLC. To make this work, the following open-source program needs to be installed: https://github.com/stefansundin/vlc-protocol/tree/main
This is not supported on Linux or Mac.
3.4.1 - Custom MongoDB installation
This page contains instruction on making a manual installation of MongoDB, instead of running MongoDB in Docker as is described here. In most cases we recommend running MongoDB in Docker, as it is easier to set up and manage.
Custom installation of MongoDB
Install the database software, MongoDB.
sudo apt-get install gnupg
curl -fsSL https://pgp.mongodb.com/server-6.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg \
--dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
Create a /etc/mongod.conf that contains the following:
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
Then start the database
sudo systemctl enable mongod
sudo systemctl start mongod
Create the file ~/mongosh-admin.js containing (replace <ADMIN_PASSWORD>):
use admin
db.createUser(
{
user: "admin",
pwd: "<ADMIN_PASSWORD>",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
Create the admin user
mongosh localhost < ~/mongosh-admin.js
Create the file ~/mongosh-api.js for the API user (replace <API_PASSWORD>):
productionsDb = db.getSiblingDB('live-gui');
productionsDb.createUser({
user: 'api',
pwd: '<API_PASSWORD>',
roles: [{ role: 'readWrite', db: 'live-gui' }]
});
Create the API user
mongosh -u admin -p <ADMIN_PASSWORD> < ~/mongosh-api.js
3.5 - Prometheus and Grafana for monitoring
To collect useful system metrics for stability and performance monitoring, we advise to use Prometheus. For visualizing the metrics collected by Prometheus you could use Grafana.
The System controller receives a lot of internal metrics from the Ateliere Live components. These can be pulled by a Prometheus instance from the endpoint https://system-controller-host:8080/metrics.
It is also possible to install external exporters for various hardware and OS metrics.
Prometheus
Installation
Use this guide to install Prometheus: https://prometheus.io/docs/prometheus/latest/installation/.
Configuration
Prometheus should be configured to poll or scrape the system
controller with something like this in the prometheus.yml file:
scrape_configs:
- job_name: 'system_controller_exporter'
scrape_interval: 5s
scheme: https
tls_config:
insecure_skip_verify: true
static_configs:
- targets: ['system-controller-host:8080']
External exporters
Node Exporter
Node Exporter is an exporter used for general hardware and OS metrics, such as CPU load and memory usage.
Instructions for installation and configuration can be found here: https://github.com/prometheus/node_exporter
Add a new scrape_config in prometheus.yml like so:
- job_name: 'node_exporter'
scrape_interval: 15s
static_configs:
- targets: ['node-exporter-host:9100']
DCGM Exporter
This exporter uses Nvidia DCGM to gather metrics from Nvidia GPUs. Includes encoder and decoder utilization.
More info and installation instructions to be found here: https://github.com/NVIDIA/dcgm-exporter
Add a new scrape_config in prometheus.yml like so:
- job_name: 'dcgm_exporter'
scrape_interval: 15s
static_configs:
- targets: ['dcgm-exporter-host:9400']
Grafana
Installation of Grafana is described here: https://grafana.com/docs/grafana/latest/setup-grafana/installation/
As a start, the following Dashboards can be used to visualize the Node Exporter and DCGM Exporter data:
Example of running Node Exporter and DCGM Exporter with Docker Compose
To simplify setup of the Node Exporter and DCGM Exporter on multiple machines to monitor, the following example Docker Compose file can be used. First, after a normal installation of Docker and the Docker Compose plugin, the Nvidia Container Toolkit must be installed and configured to allow access to the Nvidia GPU from inside a Docker container:
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Then the following example docker-compose.yml file can be used to start both the Node Exporter and the DCGM Exporter:
version: '3.8'
services:
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
dcgm_exporter:
image: nvcr.io/nvidia/k8s/dcgm-exporter:3.3.3-3.3.1-ubuntu22.04
container_name: dcgm_exporter
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [ gpu ]
restart: unless-stopped
environment:
- DCGM_EXPORTER_NO_HOSTNAME=1
cap_add:
- SYS_ADMIN
ports:
- "9400:9400"
Start the Docker containers as usual with docker compose up -d.
To verify the exporters work, you can use Curl to access the metrics data like:
curl localhost:9100/metrics for the Node Exporter and curl localhost:9400/metrics for the DCGM exporter. Note that the DCGM exporter might take several seconds before the first metrics are collected, resulting in that the first requests might yield an empty response body.
3.6 - Control panel GUI examples
The rendering engine, which contains the video mixer, HTML renderer, audio mixer, etc., is configured and controlled via a control command API over the control connections. Some source code examples of control panel integrations are provided, together with 3rd party software recommendations. All these use the generic control panels as proxies when communicating with the rendering engine. However, it is recommended for integrators to, when possible, write their own control panel integrations using the libraries and header files provided by the base layer of the platform instead of relaying the commands via the generic control panels.
Streamdeck and Companion
A good first starting point for a control panel to control the video (and audio) mixer is to use an Elgato Streamdeck in combination with the open source software Bitfocus Companion.
The source code examples
Unzip the file ateliere-live-unofficial-tools-<version>.zip to find several different source code examples of control panel integrations in various languages. Some communicate with the generic tcp control panel, some with the generic websocket control panel, some directly with the REST API. The source code is free to reuse and adapt.
The audio control interface and GUI
An example audio control panel interface and GUI is provided as source code in Python 3. It attempts to find a control panel HW, either the Korg nanoKONTROL2 or Behringer X-Touch Extender, via MIDI and to communicate with it using the Mackie Control protocol. (Note that the Korg nanoKONTROL2 does not use the Maicke protocol by default. Refer to the nanoKONTROL2 user manual on how to set it up)
The audio control panel uses the tkinter GUI library in the Python standard libraries, and also depends upon the python packages python_rtmidi and mido which can be installed using pip3 install.
The chroma key control panels
There is a Python3+tkinter-based GUI for configuring the chroma key (“green screen”) functionality, which communicates with the generic tcp control panel.
There is also a HTML-based version that communicates with the generic websocket control panel.
The thumbnail viewer
The thumbnail viewer is an example web GUI to poll the REST API and visualize all ingests and sources that are connected to a given System Controller. Thumbnails of all sources are shown, and updated every 5 seconds.
4 - Tutorials and How-To's
4.1 - Getting Started
This is a tutorial that describes the steps needed to set up a full Ateliere Live system, everything from the Base Platform to the configuration-and-monitoring GUI and the control panel integrations. It relies on links to a number of separate sub-guides.
Prerequisites
A working knowledge of the technical basis of the Ateliere Live solution is beneficial when starting with this tutorial but not required. It is assumed that sufficient hardware has been provided, i.e.:
- at least one server to be used for ingesting media via an SDI capture card or as NDI via a network interface
- at least one server to be used for running the production pipeline(s) including the rendering engine that performs the video and audio mixing, as well as the generic control panels
- one server that will run all management and orchestration software, including the System Controller, the configuration-and-monitoring GUI, the Prometheus database and the associated Grafana instance
- at least one computer that will have control panel hardware connected to it, run the control panel integration software, and receive and display the multiview video stream and the monitor feed media stream
The servers may be in the field, in a datacenter or in a private or public cloud. For cloud VMs, the requirement is that they have Nvidia GPUs with NvEnc+NvDec support. All major cloud providers have VMs with Nvidia T4’s.
In a very minimal system not all of these machines need to be separate; in fact, all the above could run on a single computer if so is desired. Recommended hardware requirements for the servers running the ingest and production pipelines can be found here.
Installing all components
A guide to installing all the components of the system can be found here, start by following it.
Using the configuration-and-monitoring GUI to set up and monitor a production workflow
A guide on how to use the basic configuration-and-monitoring GUI to set up a working system can be found here.
Using the Grafana dashboard example
Viewing the multiview and outputs
The multiview and outputs (low delay monitor feed and high quality program out) are sent from the platform as MPEG TS streams in SRT or UDP. For viewing the streams, please refer to this guide.
Creating a video mixer control panel in Companion
A good starting point for a video mixer control panel is to use Bitfocus Companion with an Elgato Streamdeck device. Some guidelines for how to use those to build a video mixer control panel for Ateliere Live can be found here
Using the audio control GUI
There is an example audio control panel integration that also includes a GUI. A guide on how to use it can be found here
4.2 - Using the configuration-and-monitoring GUI
Using the configuration-and-monitoring GUI to set up and monitor a production workflow
When loading the configuration and monitoring GUI in a web browser the first screen you will encounter is the login screen. Log in using the credentials that you set when installing. After logging in you will see the home screen. Make sure that the bottom strip says that the System Controller is online and that the database is online.
Configure sources
On the home screen, click the Inventory Management button. This will take you to the inventory management page. On the left side there is a list of all sources in the system at the moment. It is possible to filter the list based on source type, location, and active state. For each source, it is possible (and recommended) to click the Edit button to open the source configuration editing page. It is recommended to set a descriptive name (e.g. “Front wide camera”), a type, and a location for the source. This view is also used to configure which embedded audio channels to transport up to the production pipelines. Click Save to save your changes and exit this page and return to the inventory management page. Repeat the process for each source. Whenever a new source is added to the system, it is recommended to perform this step on it. Press the Home button to return to the home screen.
Create and start a production configuration
A production configuration is a description of how the system is configured for a specific production workflow, e.g. a TV program. On the home screen, click the Create New button to create a new production configuration. Give it a decriptive name, e.g. “Stockholm local news”, and click the Create button. This will bring you to the configuration page for the new production configuraton. Click Add Source to add a source to this production configuration. This will bring out a list of available sources on the left side of the screen. Again, it is possible to filter the sources the same way as on the inventory management page. Click Add for the sources that you want to have in your production configuration. The order of the sources is the same as the order they will be presented in the multiviewer. To change the order, drag and drop them. For each source, it is possible to set the UMD text by clicking the name above the thumbnail and editing it.
A preset is a collection of all the detailed variables of each part of the production configuration that will be set up. This includes detailed quality settings, network latency settings, etc. To choose a preset for your current production configuration, click Select Preset and select one of the pre-defined presets. Once that has been done, some settings can be edited by clicking the button with the cogwheel icon.
To run a production configuration click the Start button. Once the production is started, click the Home button to return to the home screen.
Use the runtime monitoring
On the top of the screen there will now be a pane for each pipeline that is running, and information on where to find the multiview and output streams. For the production configuration that is currently running, there is a Runtime Monitoring button, that is either green if all is well, or red if there are any error counters that have increased in the last minute. Clicking the button takes you to the runtime monitoring screen.
The runtime monitoring screen is built as an expanding tree, where each level and instance has a status icon that is either green or red. This way it is very easy to trace an error through the tree down to the erroring counter. On the lowest level, the actual counters can have three colors. White means it is an informational counter that cannot indicate an error. Green color means that the counter is able to indicate an error but at the moment it is fine. Red color means that the counter is currently indicating an error. Such a counter is red if it has increased in the last 60 seconds. A red counter will revert to green after 60 seconds without increasing.
Editing the database
To add or edit production presets and new users, the Mongo database can be manually edited.
The GUI tool MongoDB Compass can be used to edit the database, but MongoDB Shell and other MongoDB tools will also work. Since you connect to the MongoDB via the network, Compass can be used on any computer with network access to the GUI server on port 27017.
After installing MongoDB Compass, connect to the database by pressing the “New Connection” button. In the URI field, exchange localhost for the hostname of the GUI server (unless you run Compass on the same server as the GUI, of course). Add live_gui last in the URL-field, to access the GUI database only. Then under Advanced Connection Options, select Authentication and use method Username/Password. Type the <API_USER> and <API_PASSWORD> you put in the mongo-init.js file when setting up the GUI server.
The URI field should then look something like:
mongodb://<API_USER>:<API_PASSWORD>@<HOSTNAME>:27017/live-gui?authMechanism=DEFAULT
Add or edit production presets
Once connected you will see the databases to the left. The database live-gui contains the collections used by the GUI. To add a new, or modify an old production preset, open the presets collection under the live-gui database. To create a new preset, the easiest way is to clone an old preset and make your changes to it. Hover your mouse over one of the presets you want to clone, and press the Clone document button on the top right of the preset. In the popup window you can make your edits to the new preset. Most important is to set a new name for it in the "name" field. This is the name that will be displayed in the GUI when selecting which preset to use. Under pipelines the quality settings for the streams from the Ingests to the Pipelines can be set.
Add new users to the system
New users to the GUI can be added to the Mongo database as well. Open the users collection under the live-gui database. Then add a new user by pressing the Clone document button on one of the existing users. In the popup window, set the username of the new user and remove the hashed password, leaving the password field empty (i.e. "password": ""). Press insert to add the new user to the database. Then open the GUI in a web browser. On the sign-in page, write the username of the new user and then type a password to set it as the new password in the database. A new password must have at least 8 characters to be approved.
4.3 - Viewing the multiview and outputs
Viewing the multiview and outputs
The multiview and outputs (low delay monitor feed and high quality program out) are sent from the platform as MPEG TS streams in SRT or UDP. For viewing the streams, VLC can be used. For the multiview and low delay monitoring feeds it is important that the viewer does not add a lot of buffering delay. Therefore there is a need to configure it not to do so. The setting network-caching can be used to set the buffering. It can be done in the VLC GUI in settings, or on the command line by specifying --network-caching=140 when starting VLC, for example when using Windows:
C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" --network-caching=140 srt://mydomain:9900
4.4 - Creating a video mixer control panel in Companion
Create buttons in Companion by using the action tcp-udp: Send Command to send control commands that are listed here
An example companion config can be found here
4.5 - Setting up multi-view outputs using the REST API
This is a tutorial that describes how to create and update multi-view outputs from a Pipeline using the REST API of the System controller.
Prerequisites
Knowledge on how to set up a system and create a production using the REST API.
The multi-view generator
The Ateliere Live system includes a built-in multi-view generator that can be used with any Rendering Engine and produce multiple composited mosaic video steams of selected inputs with a given layout. The multi-view generator can technically be used both in the High Quality and Low Delay pipelines, but in the general case it is only used in the Low Delay pipeline.
Start a new multi-view output stream
To start a new multi-view output stream, use the [POST] /pipelines/{uuid}/multiviews/ endpoint in the REST API, where {uuid} is the UUID of the Pipeline component from which you want to create the multi-view output (generally the Low Delay pipeline). Then provide a JSON payload to describe how the multi-view output should look. For instance:
{
"layout": {
"output_height": 1080,
"output_width": 1920,
"views": [
{
"width": 960,
"height": 540,
"x": 0,
"y": 0
"input_slot": 1,
"label": "Camera 1",
},
... // More views here
]
},
"output": {
"format": "MPEG-TS-SRT",
"frame_rate_d": 1,
"frame_rate_n": 50,
"ip": "0.0.0.0",
"port": 4567,
"video_format": "AVC",
"video_kilobit_rate": 5000
}
}
The description contains two parts, the layout part describing how the multi-view output will look and the output part to describe the format the stream should be encoded to. Starting with the output part, this will generate a stream of MPEG-TS over SRT format, with the SRT in server mode (IP address is 0.0.0.0) on port 4567. The frame rate is set to 50 FPS and the encoding format is set to AVC (H264) and 5000 kilobits/second. To playback the stream, use ffplay or VLC.
ffplay srt://<ip-address>:4567
or in VLC, press Media and then Open network stream and write srt://<ip-address>:4567 in the dialog that pops up. Note that the default latency in VLC is quite high (several seconds) compared to ffplay.
Multi-view layout
The layout part of the JSON payload contains a description of the multi-view. The parameters output_height and output_width defines the resolution of the main frame in pixels, i.e. the resolution of the resulting video stream. Within this frame, multiple views can be placed. Each view can display any of the input sources connected to the pipeline, or any of the auxiliary feedback outputs from the Rendering Engine, more on that below. The views are defined as a width and height of the view in pixels and the x and y position of the view inside the outer frame (the position of the top left corner of the view in pixels from the top left corner of the frame, see the illustration below). Then the content of the view is defined using the input_slot parameter and an optional label to display under the view is provided using the label parameter. In case two views overlap, the one first appearing in the view array will be drawn on top of the other one. In case the aspect ratio of the view does not match the aspect ratio of the source, the video image will be resized with its aspect ratio kept, to fit entirely inside the defined view. Areas that are not covered by the video will be filled with black.

The input_slot parameter can be any of the sources connected to an input slot in the Pipeline. Just use the same input slot as used when the source was connected using the [POST] /streams endpoint. The input_slot parameter of the multi-view layout can also be any of the auxiliary feedback outputs of the Rendering Engine, i.e. video streams that are created by the Rendering Engine. These feedback streams also have their own input_slot number. To show which such feedback streams the Rendering Engine is providing, use the [GET] /pipelines/{uuid} endpoint with the UUID of the Pipeline. The result might look something like this:
{
"uuid": "ab552c6c-4226-a9ec-66b8-65f98753beaa",
"name": "My LD Pipeline",
"type": "pipeline",
"streams": [
...
],
"feedback_streams": [
{
"input_slot": 1001,
"name": "Program"
},
{
"input_slot": 1002,
"name": "Preview"
}
],
"multiviews": [
...
]
}
In this case the Rendering Engine provides two feedback streams to the multi-view generator, one called “Program” on input_slot 1001 which is the mixed output stream and one “Preview” on input_slot 1002 which shows what the Rendering Engine is previewing right now. The “Program” output is the same as the video stream you get from the Output component connected to the same pipeline.
Tally borders
Tally borders, i.e. colored borders around the views shown in the multi-view output that tell which views are currently being used in the program output (red frame) and the preview output (green frame) are automatically added to the multi-view outputs. Setting, removing and choosing the colors of the borders are controlled by the Rendering Engine. The Ateliere Live Rendering engine (acl-renderingengine) will also use borders on views containing the Program and Preview feedback outputs.
Update the layout
Once a multi-view output is created it will turn up when listing multi-view outputs using the [GET] /pipelines/{uuid}/multiviews endpoint, as well as in some of the other Pipeline related endpoints. When a multi-view output is created, the layout of that multi-view stream can be updated, without interrupting the stream. This can be done using the [PUT] /pipelines/{uuid}/multiviews/{viewid} endpoint. The viewid parameter is the id of the multi-view output stream within that Pipeline component. This id is provided in the JSON-blob returned with the HTTP response when creating the multi-view, and can also be retrieved using the [GET] /pipelines/{uuid} endpoint.
In the update request, an array of views, just like the one used when creating the multi-view output, is provided as a JSON payload. It is not possible to change the resolution of the main frame/stream or change any of the values set in the output section when the stream was created, as it would interrupt the stream. In case you want to alter any of these settings, you will need to stop the multi-view output and create a new one with the desired format.
Multiple multi-view outputs
The Pipeline supports outputting multiple multi-view output stream. Each output stream can have its own, unique layout and have different labels on the views compared to other multi-view outputs. The maximum number of multi-view output streams are limited by the hardware the Pipeline is running on.
Remove a multi-view output
A multi-view output stream can be closed by calling the [DELETE] /pipelines/{uuid}/multiviews/{viewid} with the id of the multi-view output to close.
4.6 - Security in Ateliere Live
This is a tutorial that describes how to setup and use encryption throughout the Ateliere Live system, as-well as other security related topics.
Connections in the system
There are several types of network connections in the Ateliere Live system that need encryption to protect them, which is especially important when running productions in a public cloud environment or at least transporting parts of a production’s data over public internet. These connections are:
- The HTTP requests to the REST API of the System Controller
- The WebSocket connections between the components in the system and the System Controller
- The SRT/RIST streams transporting the video and audio from the Ingests to the Production Pipelines.
- The TCP control connections used to transport control commands from the Control Panel to the Production Pipeline, and to propagate the commands from the Low Delay pipeline to the High Quality pipeline.
The last two connection types above will always be encrypted. Each stream/connection will be setup with its own uniquely generated encryption key. The REST API and the WebSocket connections between the components and the System Controller, however, require some manual setup by the user.
Warning
Even if encryption of the SRT/RIST stream connections between Ingests and Pipelines and the control connections are enabled automatically, when HTTPS is turned off in the System Controller, the encryption keys are passed between the components over unencrypted links where anyone can read them in clear text. This effectively means HTTPS must be enabled in the System Controller to consider the other connections secure as well.Enable HTTPS in the System Controller
Turning the HTTP requests of the REST API and the WebSocket connection between the components and the System Controller secure, requires the following steps to be taken:
- Get a TLS certificate from a certificate authority
- Point out the
cert.pemandkey.pemprovided by your certificate authority in the System Controller config file underhttps, attributescertificate_fileandprivate_key_file. Also make sureenabledunderhttpsis set totrue. - Start the System controller and make sure it prints that the API is served using
https - Try accessing the REST API using HTTPS to make sure it works as expected
WebSocket connections will automatically be encrypted when HTTPS is turned on.
In case a component trying to connect to the System Controller using HTTPS and fails with the following error message:
Failed to connect to System Controller, message: set_fail_handler: 8: TLS handshake failed
this is likely because the ACL_SYSTEM_CONTROLLER_IP is not set to the same hostname as the “Common Name” field is set to in the certificate. Set ACL_SYSTEM_CONTROLLER_IP to the same hostname as in the System Controller’s certificate to make it work.
Self-signed certificates
Self-signed certificates can be used by pointing out the cert.pem and key.pem files as above. The components connecting to a System Controller with self-signed certificates must also enable this by setting the environment variable ACL_INSECURE_HTTPS to true.
Note that it is recommended to always use certificates from a certificate authority.
Setting ACL_INSECURE_HTTPS to true means that the components never verify the server certificate. A somewhat more
secure way is to let the components trust a custom CA or a self signed certificate. This can be done by copying
the custom CA certificate file or self signed certificate to a file readable by the component. Then set the environment
variable ACL_CUSTOM_CA_CERT_FILE to the full path of this certificate file.
Pre-shared key (PSK)
Components connecting to the System Controller must authorize themselves to be accepted and connected. When components connect to the System Controller they present a pre-shared key (PSK) to the System Controller, which must match the PSK set in the System Controller for the component to be allowed to connect. The PSK is set in the System Controller’s config file using the psk attribute before it is started. The PSK must be 32 characters long. All components must then connect using the same PSK, by setting the environment variable ACL_SYSTEM_CONTROLLER_PSK before starting the application. In case the user fails to set the PSK before starting the application, it will immediately quit and print an error message.
Warning
In case HTTPS is not enabled in the System Controller, the PSK will be transported over an unencrypted network connection where anyone can read it in clear text!Authentication in the REST API
The System Controller REST API is protected with Basic Authentication that will require a username and password to access the API endpoints. To configure this, edit the client_auth part of the System Controller’s config file. Choose which username and password should grant access to the REST API and make sure enabled is set to true to actually activate the authentication check. The configured password is tested for strength on start. The System Controller will not start if the password is judged to be too easy to crack with brute-force.
Warning
In case HTTPS is not enabled in the System Controller, the username and password will be transported over an unencrypted network connection where anyone can read it!System Controller HTTP headers
The System Controller serves the REST API and sets a few headers in
the responses. Among these headers, the Content-Security-Policy
(CSP) can be fine-tuned according to your configuration needs.
The CSP header set in the distributed configuration file is:
Content-Security-Policy: frame-ancestors 'none'
This header plays a crucial role in enhancing security by controlling
iframe (inline frame) embedding, specifically for this site. The
frame-ancestors directive with the value 'none' signifies that no
pages or sites are allowed to embed the current page as an
iframe. This helps prevent various attacks such as cross-site
scripting (XSS) and code injection by blocking the embedding of this
site in others’ iframes.
4.7 - Statistics in Ateliere Live
This is a tutorial that explains in more detail how the statistics in Ateliere Live should be interpreted and how the system measures them.
Statistics
Timestamps and measurements
Let’s start by taking a closer look on how the system measures these statistics:
/ingests/{uuid}/streams/{stream_uuid} {
processing_time_audio,
processing_time_video,
audio_encode_duration,
video_encode_duration
}
/pipelines/{uuid}/streams/{stream_uuid} {
time_to_arrival_audio,
time_to_arrival_video,
time_to_ready_audio,
time_to_ready_video,
audio_decode_duration,
video_decode_duration
}
All media that is ingested will be assigned a timestamp as soon as the audio and video is captured, this is the capture timestamp. With this timestamp as a reference the system calculates three more timestamps which all measure the time passed since the capture timestamp was taken.
processing_time_audio & processing_time_video
After the capture step, the audio and video is converted into the format that the user selected, this may involve resizing, deinterlacing and any color format conversion that is needed. Next step will be to encode the audio and video. Once the encoding is done, a new timestamp is taken which then measures the difference between the capture time and the current time after the encoding is done. Note that these values may be negative (and in rare cases the following timestamps), in cases where the system has shifted the capture timestamp into the future to handle drifting.
time_to_arrival_audio & time_to_arrival_video
When the Rendering Engine receives the EFP stream, and has received a full audio or video frame, a new timestamp is taken, which measures the difference between the capture time and the current time after a full frame was received. This duration also includes the network transport time, i.e. the maximum time that the network protocol will use for re-transmissions. This value can be configured with the max_network_latency_ms value when setting up the stream.
time_to_ready_audio & time_to_ready_video
Next step will be to decode the compressed audio and video into raw data. When the media is decoded a new timestamp is taken, which measures the difference between the capture time and the current time after the decoding of a frame is done. This will be when a frame is ready to be delivered to the Rendering Engine. The alignment of the stream between Ingest and Pipeline must be larger than time_to_ready_audio/video statistics, otherwise the frames will be too late and dropped. This is a good value to check if you experience dropped frames, and potentially increase the alignment value if so. You can also experiment with lowering the bitrate or decreasing the max_network_latency_ms setting. If a frame is ready earlier than the aligment time, it will be queued until the system reaches the alignment time. For the video frames there is also a queue of compressed frames before the actual decoding, this queue makes sure that only a maximum of 10 decoded frames are kept in memory after the decoder. Due to this the difference between these timestamps and the alignment value normally is never larger than the duration of 10 video frames.
The sytem also tracks for how long a frame is processed by the encoders and decoders with the following values:
audio_encode_duration & video_encode_duration
These metrics show how long time audio and video frames take to pass through their respective encoder. This duration includes any delay in the encoder as well, measuring the time from when each frame is passed to the encoder until the encoder returns the compressed frame. For video this also includes the time to do any format conversions, resizing and de-interlacing. Note that B-frames will cause the metric to increase to more than one frame-time, as more frames are needed in some cases before the previous ones can be outputted to the stream.
audio_decode_duration & video_decode_duration
These metrics show how long time audio and video frames take to pass through their respective decoder. This duration includes any delay in the decoder as well, measuring the time from when each frame is passed to the decoder until the decoder returns the raw frame. Also here, B-frames will cause this time to be longer than one frame time, because the decoder has to wait for more frames before the decoding can start.

4.8 - Using Media Player metadata in HTML pages
This is a tutorial that describes how the playback state of currently active Media Players can be propagated and used in HTML pages within the production. The functionality is available from Ateliere Live version 6.0.0.
Subscribing to metadata
HTML pages loaded into the Rendering Engine can subscribe to metadata from Media Players located on other input slots of the Rendering Engine. The metadata can for instance be used to create graphics to aid the production crew.
In order for Media Player metadata to propagate to an HTML page, the page must first subscribe to metadata updates. This is done in the JavaScript code of the HTML page by calling the function window.aclInputSlotMetadataSubscribe() when the page has been loaded. After doing this the global variable aclInputSlotMetadata will become available and updated periodically.
In the simplest case:
<body onLoad="window.aclInputSlotMetadataSubscribe()">
Metadata structure
aclInputSlotMetadata is a JSON object with the Media Player information located in the “media_players” section and further organized by which input slot the Media Player is located at. An example with a media file being played at input slot number 2:
var aclInputSlotMetadata = {
"media_players": {
"2": {
"file_name": "/mnt/media/ads/Clip32.mov",
"is_paused": false,
"is_looping": true,
"current_time_ms": 400000,
"start_time_ms": 300000,
"input_duration_ms": 1800000,
"duration_ms": 120000,
"time_left_ms": 20000
}
}
}
HTML example
The file “media-playback.html” located in the Ateliere Live examples ZIP file provides a full example of how to subscribe to, and use, the metadata from a Media Player. It can be loaded into the Rendering Engine to create a view that displays the metadata of the currently playing file. The HTML page accepts the Media Player’s input slot number as a query parameter. For example, if a Media Player is located at input slot number 4 and media-playback.html is served at localhost:8899 (on the same machine as the Rendering Engine is running) the following commands can be used to load the page into a new input slot:
html create 5 1920 1080
html load http://localhost:8899/media-playback.html?slot=4
5 - Releases
5.1 - Release 9.0.0
Build date
2025-06-01
Release content
Product version
9.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest binary and shared library | ateliere-live-ingest-9.0.0-97acf8d.tar | 75c4247deb5e8bab282747a7ec8d9bb0021dd6c9270a9249fa0ced9d25dffdc0 |
| Rendering Engine binary and acl-libproductionpipeline shared library | ateliere-live-renderingengine-9.0.0-97acf8d.tar | b1e67d3fa8411944c84173b21e441f47589a1b7685097bb7af6781a50c1ec51b |
| Generic control panels and acl-libcontroldatasender shared library | ateliere-live-controlpanels-9.0.0-97acf8d.tar | 1a6e2d127377b1cfa08fb482be14093d47882238918c1f3a188d6db2f1c61879 |
| Include files | ateliere-live-dev-9.0.0-97acf8d.tar | 76984f03376aa9b9dc800bece92761509026a7aa67ab7029b8e9f4a1a95c9339 |
| System Controller | ateliere-live-systemcontroller-9.0.0-09f2653.tar | eae8198e7111cdef4dcdfae21020ccd14bc17b4e22495d5a0efe521df1d955ac |
Changelog
9.0.0
- The video mixer now features feedback loops, i.e. using the outputs of the Rendering Engine as inputs to the video mixer, based on the feedback input slot number
- New REST API endpoints for setting and getting the format of the Rendering Engines, i.e. which frame rate and resolution is used. This makes it possible to run productions with only media players, without any ingests
- The multiview tally support has been improved. Now all sources contributing to the program or preview output will be marked with a red or green border in all multiview streams
- The name of the
acl-websocketcontrolpanelapplication has been changed toacl-websocketcontrolproxyto better reflect what the application does - Control panels now reconnect automatically to the Rendering Engine they are connected to, in case the network connection gets temporarily broken and restored
- It is now possible to include an audio stream in the Multiview outputs. Any of the input or feedback audio sources can be used. Which (feedback) input slot to take the audio from is controlled using the REST API endpoints for multiviews
- It is now possible to have feedback streams in the Rendering Engine config connected to an input slot below 100. Earlier this was unsupported, in order to make a separation between ingested sources and feedbacks
- The underlying HTML rendering framework CEF (Chromium Embedded Framework) was updated to version 136
- Fix an issue where all control traffic would get stuck for 15 minutes in some rare situations due to non-clean shutdowns of Websocket control clients
- Fix a bug in the transition video node, to make the
factorparameter automatically jump to 0.0 and the program and preview to swap place when the parameter is set to 1.0 - Fix a bug where the Rendering Engine would crash in case an empty Javascript or URL was sent from the control API
- Fix a bug where the Rendering Engine would crash in some rare events with very lossy network connections
- Fix a bug where a Media Player would output 10 frames from the previous video and then get stuck in case it tries to load a file that is not found
- In future releases, the changes made to the System Controller config file in the
/etc/opt/ateliere_livedirectory will be kept when a newer version of the .deb is installed. However, when upgrading to 9.0.0 from a previous version, the old installation will still remove the file before a new default one is installed. A separate file with the.defaultextension will be installed, containing the default parameters for that release. This file will be overwritten when a new version is installed - Allow the parameter
feedback_input_slotto be omitted from the Rendering Engine config to turn it off, giving the same result as setting it to 0
8.0.2
- Fix a bug in
acl-websocketcontrolpanelwhere the application would crash in some situations when a client was disconnected
8.0.1
- Fix a bug where the automatic fade command in the audio faders would not reach their end value in certain situations
Known limitations
Media Player
Videos will be stretched in case the video played does not have the same aspect ratio as the Rendering Engine is using.
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
MPEG-TS over UDP
For Outputs and multi-view outputs it is currently not possible to bind to a specific IP and port with MPEG-TS over UDP, even if local_ip and local_port are exposed in the REST API.
Connection events
ConnectionEvents of type EventType::kConnect are only sent from the ControlDataSender or ControlDataReceiver itself and not propagated from other components as the kDisconnect events are.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Security
No known issues
5.2 - Release 8.0.0
Build date
2024-03-06
Release content
Product version
8.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest binary and shared library | ateliere-live-ingest-8.0.0-14fc64c.tar | 3974cb00db48ee763422a1d2b8787d95aa1dd4c168ea00cd6d233e8cccc7efb5 |
| Rendering Engine binary and acl-libproductionpipeline shared library | ateliere-live-renderingengine-8.0.0-14fc64c.tar | dee4f3058ddb8d009973269ce663b5652d1a236d778a9c909b4c6a164b91e34e |
| Generic control panels and acl-libcontroldatasender shared library | ateliere-live-controlpanels-8.0.0-14fc64c.tar | 0666a8749bdf917e2b7e18a93486da8fb871461681538b984733ef569bdc5769 |
| Include files | ateliere-live-dev-8.0.0-14fc64c.tar | e8787d6dc6d7533306f3a0276f8ced5eb80f7ca4859f3518bcf5719a619b50de |
| System Controller | ateliere-live-systemcontroller-8.0.0-1cbd095.tar | cdb70359c60c30aa90048584d495a448cda543b36b073d277a74395d6b9d53c7 |
Changelog
- The control command API has been completely rewritten and now supports synchronization of control panels and retrieving information from the Rendering Engine
- The control command API now have support for streaming the play head position of media player in real time
- The control command API can now be used to get audio loudness meters. Pre and post filter chain peak meters for each strip, and peak and EBU R 128 meters for each audio mixer output
- It is now possible to create, list and close HTML browsers and Media Players from the REST API, as was earlier only possible from the control command API
- The REST API and Prometheus metrics endpoint now expose duration metrics of the Rendering Engine. This is useful for monitoring the time resource usage of the Rendering Engine
- The video mixer has granted a new crop node, which can be used to crop an overlay video stream before compositing it over the background
- The views in the multiview no longer flashes to black when a frame is missing, instead a red triangle is shown in the bottom right corner as long as no new frames are delivered. The view will repeat the latest received frame to prevent the flashing to black
- SRT outputs (both output streams and multiviews) can have a custom SRT stream ID set from the REST API
- It is now possible to identify discontinuity error in the incoming MPEG-TS in ingested SRT sources by the continuity counter error metric in the REST API
- It is now possible to tweak the log file size and the number of log file rotations of the System Controller
- Fix issue in Rendering Engine where video frames would sometimes not be decoded in time, even if the incoming compressed video buffer had frames to be decoded
- Websocket ping-pong is now enabled in Websocket Control Panel to detect connection loss of clients
- The Pipeline now have metrics for the incoming message queue size for control commands
- Small performance improvement for Ingests with many concurrent video streams to Pipelines configured
- REST API endpoint
[DELETE] /pipelines/{uuid}/outputs/{output_uuid}/streamsnow returns HTTP status code 200 instead of 404 when no stream exists - REST API endpoint
[PUT] /pipelines/{uuid}/resetis deprecated and moved to[PUT] /pipelines/{uuid}/renderingengine/reset. The old URI will still work for this release for backwards compatibility, but will be removed in a future release - The system now has support for ingesting 25 FPS sources into 50 FPS productions
- Fix bug where an output would get stuck in a non-reversible state if it was configured as an audio only output and the user would then try to stop it and start it again as a source with video
- Fix bug where the
srt_modewould return an empty string in case a SRT source lost connection and reconnected - Fix issue where the Rendering Engine would stop producing output for ~250 milliseconds when an Output stream was stopped from the REST API
- Fix bug where the Rendering Engine would sometimes hang on shutdown when media players are started
- Fix a bug where the Rendering Engine would crash in case a HTML browser was closed too quickly after creating it
- Fix a bug where the Rendering Engine would not load a new URL in case a load command was sent too quickly after the HTML browser was created
- Fix issues with high CPU utilization in the Ingest
- Fix crash when shutting down the WebsocketControlPanel
- The TCPControlPanel has been removed in favour for the Websocket Control Panel
- All classes in the SDK are now moved into an Acl namespace
Known limitations
Media Player
Videos will be stretched in case the video played does not have the same aspect ratio as the Rendering Engine is using.
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
MPEG-TS over UDP
For Outputs and multi-view outputs it is currently not possible to bind to a specific IP and port with MPEG-TS over UDP, even if local_ip and local_port are exposed in the REST API.
Connection events
ConnectionEvents of type EventType::kConnect are only sent from the ControlDataSender or ControlDataReceiver itself and not propagated from other components as the kDisconnect events are.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Security
No known issues
5.3 - Release 7.0.0
Build date
2024-05-21
Release content
Product version
7.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest binary and shared library | agile-live-ingest-7.0.0-809031f.tar | 7532b16204bcf4d8e018284bbfd93606106132a2307428fcee098269c0117d86 |
| Rendering Engine binary and acl-libproductionpipeline shared library | agile-live-renderingengine-7.0.0-809031f.tar | a0e7ff5ef26dc6dc679d3db2fbdef65dd330baadce2e9ae0bb8abde88d09c1ca |
| Generic control panels and acl-libcontroldatasender shared library | agile-live-controlpanels-7.0.0-809031f.tar | 188f2ed50e9bf6726e02dc0a7a61c0ab99337890ce806a35dc3472580770291f |
| Include files | agile-live-dev-7.0.0-809031f.tar | 00e6b561cbf71275bbefb93d16f94cd7efb91f29204fff2823fd2a34982834ae |
| System Controller | agile-live-systemcontroller-7.0.0-6c26469.tar | 52618467f6417d12e77f3c03b012aa6444443cb523b562309318e7cf74e14890 |
Changelog
- Add support for customizing the video and audio mixers using a config file passed to the
acl-renderingengineapplication at startup - A new endpoint
[PUT] /pipelines/{uuid}/resethas been added to the REST API, which is used to make the Rendering Engine/Pipeline reset its runtime state back to what it was when the application started. This includes resetting audio strip mappings, resetting all parameters in all video graph nodes and closing all HTML browsers and media players - The REST API has been overhauled and improved, resulting in a version bump to
/api/v3. Major changes include removal of most of thecontrolreceviersconcept as well as improved format of the JSON responses of the control panel endpoints- The UUIDs of control receivers have now been removed. Instead exactly one
ControlDataReceiverinstance is connected to eachPipeline/MediaReceiver, meaning the Pipeline’s UUID is now used in place of the control receiver UUID when setting up control connections. - The C++ SDK has changed when creating
ControlDataReceiverandMediaStreamerinstances. Now they are grabbed/created via theMediaReceiverclass API. - The
ControlDataReceiverandMediaStreamers will now use their parentMediaReceiverWebSocket connection to the System Controller, reducing the overall number of network connections to the System Controller
- The UUIDs of control receivers have now been removed. Instead exactly one
- The EQ of the audio mixer has been reworked. It can now include up to 10 filters, where each filter can be configured to any of these types: lowpass, highpass, bandpass, lowshelf, highshelf, peak or notch. The audio quality of the already existing EQ filter types has been improved.
- The audio mixer (and audio router), video mixer, media players and HTML browsers can now be reset via the Control panel API.
- The quality of the deinterlacing algorithm of the Ingest has been improved
- The encoder of the Ingest now supports automatic reconfiguration when a format change occurs for the input source, without having to tear down and reconnect the stream via the REST API (Nvidia encoder only)
- The internal audio mixer has received a mute functionality, both for each input in an output bus, and for the master fader of each output bus.
- The internal audio mixer has a new automatic volume transition command, where a single command can be sent to fade the volume to a specified level over a set time
- Audio mixer outputs can now be set up as “post fader auxes”, to follow a certain audio mixer output, possibly removing some of the inputs from the aux mix (so called mix-minus)
- All Control Panel commands for the video mixer nodes are now prefixed with
videoto make them more coherent with the other commands which has the target module as the first keyword. The old way of having just the video node name as first keyword is still supported for backwards compatibility. - The REST API calls to list the Pipelines, Ingests and Control panels with the expand flag set to false will now return the name of the component together with the UUID, for easier mapping between name and UUID.
- The negotiated SRT latency, (i.e. max of the peer’s requested SRT latencies) can now be seen in the REST API for both outputs and SRT sources
- The multithreading performance of MediaStreamers has been improved, allowing more outputs to be set up from Rendering Engines
- The Ingest now supports sending an 8 bit incoming SRT sources as 10 bit HEVC to a production
- The System Controller now performs a version check on the major version of all components when they try to connect, and rejects those with another major version to prevent version mismatches
- Logging of important, successful events, such as stream/controlconnection setups and teardown has been improved
- Resolved an issue with outputs and multi-views where some SRT clients could cause the SRT connection to lock up and sometimes cause the Rendering Engine to freeze for up to two minutes
- SRT sources now have better drift detection and correction
- HTML browsers will no longer display an error message instead of the HTML page when the HTML page failed to load, e.g. if the server was not reachable. Use the logs for debugging why the HTML page is not shown instead
- Fix a bug where the Prometheus metrics endpoint in the System Controller would get stuck, reporting the same old values over and over again in some cases.
- The Prometheus metrics endpoint now stops reporting values for old metrics, whether they are temporarily or permanently gone
- Fix an issue where the lost_frames and dropped_frames counters were wrongly incremented for NDI sources when grabbing thumbnails
- Fix an issue where the TCP ports could lock up in the TCP control panel
- The default settings for the compressor has changed to make it inactive as default
- Logging of new and closed connections in acl-websocketcontrolpanel has been improved
- The Ingest will now return an error when trying to close an SRT source that is in use by a stream
- Fix a bug where the Rendering Engine would hang in some cases when a media player was closed
- Control Commands for the Media and HTML modules are now logged to the control command log
- All applications now shut down gracefully when SIGHUP is sent to them
- Fix bug where the UUID for the output was set to the UUID of the Pipeline for output stream metrics in the Prometheus exporter
- Fix bug where the sides of portrait mode HTML browsers would have video artifacts
- Fix bug where the RTT for Outputs and Multi-views was always reported as 0
- Fix bug where the video mixer could malfunction if the resolution of the Rendering Engine was changed between two productions
Known limitations
Media Player
Videos will be stretched in case the video played does not have the same aspect ratio as the Rendering Engine is using.
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
MPEG-TS over UDP
For Outputs and multi-view outputs it is currently not possible to bind to a specific IP and port with MPEG-TS over UDP, even if local_ip and local_port are exposed in the REST API.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Security
No known issues
5.4 - Release 6.0.0
Build date
2024-01-29
Release status
Type: Sixth production ready release
Release content
Product version
6.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest binary and shared library | agile-live-ingest-6.0.0-5d0d6e4.tar | cd21f5cf57a7ac5a4022d290c4badab87d768bafd8057c8142dc9397beb77086 |
| Rendering Engine binary and acl-libproductionpipeline shared library | agile-live-renderingengine-6.0.0-5d0d6e4.tar | 7aa15accad3a254a0f8a842cc41046f51d5e7a2b586489596831eb6310bf53f2 |
| Generic control panels and acl-libcontroldatasender shared library | agile-live-controlpanels-6.0.0-5d0d6e4.tar | 095ead70169afc0f4f5e2be00fc4507e787955cd4bfd93677a7e61779c0881e1 |
| Include files | agile-live-dev-6.0.0-5d0d6e4.tar | 2686768b00e38bb02fd211da981c55e1399604edbaef317601ea11ae82d31cf1 |
| System Controller | agile-live-systemcontroller-6.0.0-38a4fc7.tar | 86e58778cb5641ac1d7f2761ffabb3a69c51e24cbe2d41ed6b8df6093862f4b8 |
Warning
From this release the components will change from having their individual version numbers to have the same version number as the release (i.e. 6.0.0). This means the version of some components have changed to a lower number, while other have skipped a couple of major versions. In the end this makes it easier to verify all components in a system are from the same release.Changelog
- From this release Ateliere Live will be released as
.debpackages instead of an archive of binaries and shared libs. - To simplify compatibility verifications, all components inside Ateliere Live now have the same version number as the version of the release they belong to, in this release 6.0.0. This means some components have received an older version number compared to earlier and some components have skipped several major versions.
- The component -> System Controller communication has been changed from a request-response type of communication to a one-way communication, where the System Controller won’t send a response back and the component won’t expect a response back.
- More informative error messages from the System Controller in case requests fail
Ingest
- Support for ingesting SRT sources. Both caller and listener mode is supported, with or without passphrase. Currently AVC and HEVC video codecs are supported and AAC audio. New SRT sources can be set up using the REST API.
- Counters for
dropped_frames,lost_framesandduplicated_framesare now split into separate counters for audio and video calleddropped_audio_frames,dropped_video_frames,lost_audio_framesand so on - The NDI interface now supports interlaced NDI sources with individual fields
- The Ingest application now logs the enabled input interfaces more clearly and also outputs the API version of all interfaces supported on the machine.
Rendering Engine
- The Rendering Engine now supports playback of media files directly in the mixer itself. The player supports seeking as well as looping of the entire clip, or a section of the clip.
- The Rendering Engine can send information on the states of all media players to HTML pages. This way graphics can be shown for countdown until a clip ends, or to overlay such information to aid hosts in the studio.
- The generic control panel
acl-tcpcontrolpanelnow accepts multiple connections on a single port. As a result of this, the environment variable has changed name toACL_TCP_ENDPOINTwithout anSand only accepts a single endpoint. - Fix a crash when some invalid control commands was sent to the Rendering Engine.
Production Pipeline
- The visibility of the audio bars in the multi-views is now configurable per multi-view output.
Control Data Sender and Control Data Receiver
No changes
System Controller
- Fields are not correctly marked as “required” or “optional” in the OpenAPI specification served from the System Controller
- Fixed a bug where the metrics for
retransmitted_packetsandsent_byteson the GET requests to multi-view did not increment - The PSK is now checked for complexity. A too simple PSK (for instance just the same letter repeated 32 times) will not be accepted anymore
- Fix for CVE-2023-44487: DOS with HTTP/2
- The list of locations where the System Controller searches for the
acl_sc_settings.jsonfile has changed to just two locations:/etc/opt/agile_livefollowed by the current working directory. - The log file of the System Controller is now created with file permissions that let any user read it
- The public IP of Pipelines are now included in the REST API
Known limitations
Media Player
Videos will be stretched in case the video played does not have the same aspect ratio as the Rendering Engine is using.
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
MPEG-TS over UDP
For Outputs and multi-view outputs it is currently not possible to bind to a specific IP and port with MPEG-TS over UDP, even if local_ip and local_port are exposed in the REST API.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Security
No known issues
5.5 - Release 5.0.0
Build date
2023-10-09
Release status
Type: Fifth production ready release
Release content
Product version
5.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest and Rendering Engine binaries, headers, and shared libraries | agile-live-5.0.0-9d0ae4b.zip | 08681e43e592b7d347752457be7fadfbb1f09d9ba6145714c004003fcc45f666 |
| System Controller | agile-live-system-controller-5.0.0-1820bd9.zip | 826c99d8bc679ebe37762a4cfd408655807b19ac36419f826c9fbee02af1fe91 |
Library details
libacl-ingest.so
Version: 11.0.0
Library containing the core Ingest functionality used by the acl-ingest executable.
libacl-productionpipeline.so
Version: 12.0.0
Library containing the MediaReceiver, MediaStreamer and ControlDataReceiver classes, used to implement a Rendering Engine. Also used by the acl-renderingengine application
libacl-controldatasender.so
Version: 11.0.0
Library containing the ControlDataSender class, used to send control messages to a ControlDataReceiver component.
Changelog
- It is now possible to use hostnames instead of just IP addresses for ACL_SYSTEM_CONTROLLER_IP environment variable.
- HTTPS and client authentication are now enabled by default in the system
- The new environment variable
ACL_CUSTOM_CA_CERT_FILEmakes it possible to set a custom CA certificate to use for verifying the system controller’s certificate. This can be used in cases when the CA certificate cannot be added to the list of OS trusted CA certificates. - SRT logs are now printed to the components’ log files and not just to the terminal
Ingest 11.0.0
- SRT connections to Production Pipelines will now automatically try to reconnect in case the network link goes down.
Rendering Engine 3.0.0
- The Rendering Engine now features a built in HTML renderer using the Chromium web engine through Chromium Embedded Framework. The HTML renderer is capable of opening multiple “browsers”, connected to input slots of the operator’s choice, rendering HTML graphics hosted by HTTP servers or even loading regular webpages.
- A new chroma key node was added to make green screen effects possible.
- The internal audio mixer now features a high pass and a low pass filter
Production Pipeline 12.0.0
- The cadence and speed/quality balance can now be set for the MediaStreamer and Multi view outputs
- MediaStreamer now supports multiple output streams (e.g. both SRT and UDP, or multiple SRTs and UDP outputs with different settings), as long as they use the same encoding settings.
- Performance of the Production Pipeline has been improved. The load on the NvDec chip is reduced by up to ~50% and the load on the CUDA cores reduced by up to ~60% in certain conditions.
- The Multi View outputs now show peak meter audio bars for all views, which makes solving audio problems much easier, as one can see both the audio of the incoming and outgoing video streams.
- The Random Access Indicator (RAI) is now correctly set in the MPEG-TS output streams
- Outputs with SRT in caller mode will now start even if the connection was not successfully made. The SRT connection will try to connect until it succeeds, or is manually closed down. In case the network link is broken, the SRT caller will try to keep connecting until it succeeds or is manually closed down.
Control Data Sender 11.0.0 and Control Data Receiver 12.0.0
- The release now features a new
acl-websocketcontrolpanel, which works like the already existingacl-tcpcontrolpanel, but allows for multiple clients to connect via WebSocket to the control panel instead. - It is now possible to use hostnames instead of just IP addresses when connecting a Control Data Sender or Receiver to another Control Data Receiver.
- Fix bug where it was not possible to disconnect a Control Data Sender/Control Panel from a Receiver and connect it to another Receiver on another port.
System Controller 5.0.0
- The REST API now correctly flags parameters with a default value in the Swagger documentation. These values does not need to be passed in the JSON blob with the REST API call. Parameters without a default value are correctly flagged as required in the documentation.
- The Outputs part of the REST API has been updated to support multiple output streams from the same output component. The name of the REST API endpoints has been moved from
pipelines/{uuid}/outputs/{output_uuid}/streamtopipelines/{uuid}/outputs/{output_uuid}/streamsto reflect this. The POST request will return an id integer to identify the stream within the Output component. A new endpoint[DELETE] pipelines/{uuid}/outputs/{output_uuid}/streams/{stream_id}has been added to close a specific stream. All streams of an output can be closed with the old[DELETE] pipelines/{uuid}/outputs/{output_uuid}/streamsendpoint. - System controller now logs to file. Default log location is
/tmpwith the log file prefixed withacl-system-controller. - Requests to the REST API are now rate limited to prevent overloading the components and to mitigate DOS attacks.
- The IPBB cadence and speed/quality balance can now be specified for the encoder in both Output streams and Multiview output streams.
- Prometheus endpoint now stops reporting metrics for closed streams.
- Improve execution time of
[DELETE] streams/{stream_uuid} - Authentication has been added to the Prometheus endpoint.
- The parameters
ipandportin the[GET] pipelines/{uuid}/outputs/{output_uuid}/streamshas been corrected toremote_ipandremote_port. Their values are now reported correctly. - Security of the System Controller has been improved in several ways.
- Prometheus endpoint has been updated with some missing statistics
- The missing
audio_mappingparameter has been added to the[GET] ingests/{uuid}/streams/{stream_uuid}and[GET] pipelines/{uuid}/streams/{stream_uuid}endpoints. - The
sent_bytesparameter of the output statistics is now incremented as expected for both Multi View outputs and Output streams. - Fixed a bug where the System Controller application would crash when started with a filename as
-settings-pathparameter.
Known limitations
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
MPEG-TS over UDP
For Outputs and multi-view outputs it is currently not possible to bind to a specific IP and port with MPEG-TS over UDP, even if local_ip and local_port are exposed in the REST API.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Security
No known issues
5.6 - Release 4.0.0
Build date
2023-06-16
Release status
Type: Fourth production ready release
Release content
Product version
4.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest and Rendering Engine binaries, headers, and shared libraries | agile-live-4.0.0-d02f52d.zip | 9f95bfe78ab7d295268ad2de913ed18cda8b9407d977feb9afc7f5a738034a73 |
| System Controller | agile-live-system-controller-4.0.0-745ecee.zip | f19331fffa499db7d57d10c99af09b78e94fec5459188d6df832a009b0b92947 |
Library details
libacl-ingest.so
Version: 10.0.0
Library containing the core Ingest functionality used by the acl-ingest executable.
libacl-productionpipeline.so
Version: 11.0.0
Library containing the MediaReceiver, MediaStreamer and ControlDataReceiver classes, used to implement a Rendering Engine. Also used by the acl-renderingengine application
libacl-controldatasender.so
Version: 9.0.0
Library containing the ControlDataSender class, used to send control messages to a ControlDataReceiver component.
Changelog
- The system now requires Chrony as the NTP client for time synchronization. See NTP instructions for more details. The applications will not start if Chrony reports an drift greater than 5 ms.
- New environment variables
ACL_LOG_MAX_FILE_SIZEandACL_LOG_MAX_LOG_ROTATIONSto control the number and size of the rotated log files for the applications - Fix parsing of boolean environment variables
Ingest 10.0.0
- Support for transporting up to 16 channels of audio to the production, where a subset of the channels can be selected.
- Added support for using Opus as audio codec in transport to the Production Pipeline. This codec has a lower delay compared to the existing AAC codec. The user can now select codec per connected stream.
- Improved handling of NDI sources.
- Handle cases when SDI sources deliver one extra or one too few audio sample.
- The built-in MediaSourceGenerator now has a lower audio level of -20 LUFS.
Rendering Engine 2.0.0
- New audio mixer implementation with per-input-strip three-band parametric equalizer, compressor and panning.
- New automatic transition types: left and right wipe
- Add support for picture-in-picture effects. Currently the rendering engine support two separate picture-in-picture effects with an additional graphic effect on top.
- All control commands executed by a rendering engine is now written to a log file in
/tmp - Fix bug where disconnecting a source would leave the last frame frozen in the input slot with corrupted audio.
Production Pipeline 11.0.0
- It is now possible to include input slots where no stream has been connected yet to a multi-view output. The view will be empty until a source has been connected to that input slot, with the label visible.
- Views in the multi-view will remain after the corresponding input slot has been disconnected, showing a black frame with the label. The video will automatically turn up again when another stream is connected to the same input slot.
- Fix bug where the multi-view output would stop sending video when none of the sources in the multi-view were connected.
- Add support for SRT in caller mode for multi-view outputs and MediaStreamer outputs.
- Add support for setting the SRT latency and an optional passphrase for the multi-view outputs and MediaStreamer outputs.
MediaReceiverAPI has a new methodremoveCustomMultiViewSourceInputto remove a custom feedback input earlier registered usinggetCustomMultiViewSourceInput.- Improved latency of video decoder with ~1 frame.
Control Data Sender 9.0.0 and Control Data Receiver 10.0.0
- Fix application crash with
acl-tcpcontrolpanelon connection failure. - Updated control command protocol for video commands, where the first word addresses the node in the graph to make the change to. This allows for the same node to be used multiple times. See Rendering Engine commands for more details on the new protocol.
- Updated API where multiple, separate control commands can be sent in the same message, guaranteed to be delivered to the Rendering Engine at the same time point. The new method
sendMultiRequestToReceiversis used to send such messages. The old API for sending just a single control command per message is unchanged. - Raise the maximum control message length to 65535 bytes.
System Controller 4.0.0
- Expose a number of new metrics from the components for system monitoring in the REST API and Prometheus endpoint, including average/min/max encode and decode durations per stream, frame counters for video and audio in multiple locations, statistics for outgoing output streams and round trip time and measured bandwidth on the contribution links.
- The POST
/streamsendpoint now require anaudio_mappingto know which audio channels to transport to the production. Use"[[0,1]]"for the same behavior as in previous versions (i.e. transport only channels 0 and 1, encoded as stereo). - New counter
lost_framesfor Pipeline streams. It counts fully lost frames, not only broken frames, as thereceived_broken_framescounter. - The counter
lost_packetsin theGET /ingests/{uuid}/streamsendpoints has been removed in favor for thelost_packetsanddropped_packetsin the Pipeline. - Counter
queuing_video_frameshas changed name tovideo_frames_in_queue. - REST API now correctly returns the selected port when automatic port selection is requested (by setting the
local_portto 0), instead of returning the port number as 0. - REST API now show if sources are active or inactive, instead of hiding inactive sources (a source is active if it is ready to be used, as opposed to an inactive source, which has been seen earlier, but not any longer)
- Fix bug where the wrong port numbers of Control Connections would be shown in REST-API for port numbers automatically assigned by the OS.
Known limitations
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
MPEG-TS over UDP
For Outputs and multi-view outputs it is currently not possible to bind to a specific IP and port with MPEG-TS over UDP, even if local_ip and local_port are exposed in the REST API.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Security issues
There is no rate limiting implemented in any of the components. Should the application be running in a network where ports are accessible to unauthorized users, there is a risk of a denial of service (DOS). The network should be configured with firewall rules closing out unauthorized users.
Encryption (HTTPS) is not enabled by default in acl-system-controller. This means that pre-shared keys (PSK) used for encrypted communication between components and the System Controller will be exchanged in the clear and could be revealed.
Client authentication is not enabled by default in acl-system-controller so anyone with access to HTTP on the machine hosting acl-system-controller will have access to the REST API.
Even when client authentication is enabled, there is no enforcement of the length or format of the password. Also note that HTTPS should be enabled when using client authentication since the credentials would otherwise be sent in clear text.
It is strongly recommended to enable both HTTPS and client authentication.
5.7 - Release 3.0.0
Build date
2023-01-23
Release status
Type: Third production ready release
Release content
Product version
3.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest and Rendering Engine binaries, headers, and shared libraries | acl-3.0.0-d4de107.zip | 4743f2c8c6fe74b09d04a0210747276fac7ef9fa0145a7ee51ec54de4def84dc |
| System Controller | acl-system-controller-3.0.0-10046c8.zip | 919f469ed773bb3ad65735d41dd0942e08b91bd23a317f7227ccdccbc2807437 |
Library details
libacl-ingest.so
Version: 9.0.0
Library containing the core Ingest functionality used by the acl-ingest executable.
libacl-productionpipeline.so
Version: 10.0.0
Library containing the MediaReceiver, MediaStreamer and ControlDataReceiver classes, used to implement a Rendering Engine. Also used by the acl-renderingengine application
libacl-controldatasender.so
Version: 9.0.0
Library containing the ControlDataSender class, used to send control messages to a ControlDataReceiver component.
Changelog
Ingest 9.0.0
- Ingesting interlaced sources is now supported both with the Intel and Nvidia encoders. De-interlacing is automatically applied to interlaced input, so no extra work is needed by the user of the REST API when setting up the stream compared to a progressive source. The implementation supports de-interlacing 50i sources into 50p.
- The Ingest now supports encoding JPEG thumbnails using Nvidia GPUs. For now, only the first Nvidia GPU will be used on multi-GPU systems.
- Earlier when encoding HEVC with the Intel encoder, the setup would fail in case any of the
fast,faster,goodorbetterspeed/quality settings were used, as these were not supported by the encoder. Now these settings are automatically changed to the closest supported setting, i.e.fastandgoodis changed tobalanced,fastertofastestandbettertobest. - The Intel JPEG encoder now supports encoding JPEGs with a width that is not evenly divisible by 16. Also requests for thumbnails with odd number of pixels in width/height will automatically be encoded with one extra pixel in width/height compared to the request, instead of failing the request.
- The Intel JPEG encoder now supports encoding thumbnails of interlaced sources.
Rendering Engine 1.0.0
No new features since last release.
Production Pipeline 10.0.0
- The network endpoints of the incoming streams from the Ingests are now closed after the Ingest has connected.
Control Data Sender 9.0.0 and Control Data Receiver 10.0.0
- Support for connecting multiple ControlDataSenders (or Receivers) to a single ControlDataReceiver is now working again.
- Improved verification of the established connection between ControlData components.
- Message delay can now be set per incoming connection to a ControlDataReceiver.
System Controller 3.0.0
- New version of the REST API, v2, which is served from
/api/v2. The API has been reorganized and cleaned up to make it easier to use. StreamsandControl Connectionsnow get their own unique UUIDs when created using the REST API. This UUID is then used to reference the connection when making changes to and closing the connection. The UUID is returned when the connection is created and is also shown when querying information from the components on both sides of the connection. The oldconnection_idconcept has been completely removed.- The endpoints related to
Control Connectionsare now on the top level and the same endpoints are used whether the connection is originating from a ControlDataSender or a ControlDataReceiver. BothControl ConnectionsandStreamsare now closed using their UUID and the correspondingDELETEendpoints. Also thePATCHendpoints use the UUID of the connection to identify the connection to make changes to. - The
OutputandControl Receiverendpoint has been moved in under thePipelineendpoint to better show their tight connection. When querying the Pipeline endpoint it will return itsOutputsandControl Receivers. - The parameter
idused for an Ingest’s sources has been changed tosource_id. - The parameters
resolution_xandresolution_yhave been changed towidthandheight. - The endpoint for
/componentshas been removed in favor for the/ingests,/pipelinesand/controlpanelsendpoints. - The thumbnail endpoint now has a new parameter
encoderwhere the user can explicitly request that a certain encoder should be used for encoding the thumbnail. Current options areintel_gpu,nvidia_gpuorauto, where the last option will make the Ingest select the best encoder that is supported on the hardware the Ingest is running on.
Known limitations
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Audio channels
Only stereo audio is supported with two channels embedded per connected input.
Security issues
There is no rate limiting implemented in any of the components. Should the application be running in a network where ports are accessible to unauthorized users, there is a risk of a denial of service (DOS). The network should be configured with firewall rules closing out unauthorized users.
Encryption (HTTPS) is not enabled by default in acl-system-controller. This means that pre-shared keys (PSK) used for encrypted communication between components and the System Controller will be exchanged in the clear and could be revealed.
Client authentication is not enabled by default in acl-system-controller so anyone with access to HTTP on the machine hosting acl-system-controller will have access to the REST API.
Even when client authentication is enabled, there is no enforcement of the length or format of the password. Also note that HTTPS should be enabled when using client authentication since the credentials would otherwise be sent in clear text.
It is strongly recommended to enable both HTTPS and client authentication.
5.8 - Release 2.0.0
Build date
2022-11-17
Release status
Type: Second production ready release
Release content
Product version
2.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest and Rendering Engine binaries, headers, and shared libraries | acl_2.0.0-4ae95d4.zip | dacc86efa0c2c08b28658e4218abd4ba58f24381a37eba93f0dbac10d9702e2a |
| System Controller | acl_system_controller_2.0.0-85ac2cd.zip | 085465799bae8ceaa201ad462efedcdc19a2ea2f80e99c1332efc88ac0ce82dd |
Library details
libacl-ingest.so
Version: 8.0.0
Library containing the core Ingest functionality used by the acl-ingest executable.
libacl-productionpipeline.so
Version: 9.0.0
Library containing the MediaReceiver, MediaStreamer and ControlDataReceiver classes, used to implement a Rendering Engine. Also used by the acl-renderingengine application
libacl-controldatasender.so
Version: 8.0.0
Library containing the ControlDataSender class, used to send control messages to a ControlDataReceiver component.
Changelog
The supported OS has changed from Ubuntu 20.04 LTS to Ubuntu 22.04 LTS. Official support for Ubuntu 20.04 LTS is dropped from this release.
Ingest 8.0.0
- Changed to epoch aligned timestamps
- Improve duplicating and dropping of frames to cover up drifting cameras
- Expose counters for dropped, duplicated and lost frames per source in the REST API
- Fix a memory leak when generating thumbnails
- Interlaced sources are now shown in the REST API and correctly marked as interlaced
- Improved support for detecting connection and disconnection of SDI cables at runtime, as well as changes in the format of the sent SDI stream.
- Applications are now stopped by pressing
Ctrl-Cinstead of pressing enter to prevent accidental stopping - Thumbnails and source info are now cached for each source to improve response time in the REST API. This means that sources that are not connected to any production will only update its thumbnails and source info every ~5 seconds or so. Sources that are connected will update the info continuously.
- The field
activefor sources in the REST API was not working before and has now been removed in favor for a new fieldin_usewhich indicates if a source is currently being streamed somewhere or not. - Log files will now get a unique name by appending the date of creation to the filename
- Log files will now have the same log level as the terminal output
- Appending the
--helpflag to the ingest executable will print information about the binary and list the environment variables - A stack trace is now printed in case the application should crash
Rendering Engine 1.0.0
- First version of the Rendering Engine application
- Support for program, preview and cutting between them
- Support for fading between sources over a given time
- Support for graphics with key (alpha) by ingesting the fill and key (color and alpha) as two separate sources
- Support for fade to black
- Support for setting the audio volume per source
Production Pipeline 9.0.0
- Support for tally borders in the Multi-view generator with new API for setting and clearing the borders from the Rendering Engine in the
MediaReceiverclass. - Updated API for passing video memory to and from the Rendering Engine, now uses RAII classes for automatic memory handling. See upgrade guide for more details.
- The
MediaReceivernow passes themRenderingTimestampto the Rendering Engine, i.e. the timestamp when the frame was delivered. - Alignment is internally rounded to the nearest even frame time. This together with the changes in the Ingest results in that the frames delivered to the
RenderingEnginewill have rendering timestamps that are evenly devisable by the frame time. - PTS in
MediaStreamers are now calculated based on themRenderingTimestamp, instead of a newly taken timestamp when the frame was sent to theMediaStreamer. This will make the PTSes of the output streams equidistant, even if the Rendering Engine jitters slightly. - New class
PipelineSystemControllerInterfaceFactoryto help Rendering Engine implementors in creation ofSystemControllerConnections by reducing code duplication
Control Data Sender 8.0.0 and Control Data Receiver 9.0.0
- The control channel between
ControlDataSendersandControlDataReceiversare now encrypted by default. Read more about it in the security tutorial - The support for connecting multiple
ControlDataSendersorControlDataReceiversto anotherControlDataReceiveris temporarily disabled.
System Controller 2.0.0
- Added support for HTTPS communication with the REST API and encrypted connections between the components and the System Controller. Read about how to activate it in the security tutorial
- Components now automatically reconnects to the System Controller in case they loose connection to it. This means that the System Controller can be restarted during a broadcast and all components will automatically reconnect to it once it turns up again on the network. It also means that components can be started before the System Controller and get connected as soon as the System Controller is started
- REST API now features basic authentication. Read more about it in the security tutorial
- Streams (of audio and video) between Ingests and Production Pipelines are now automatically encrypted when set up by the System controller
- Control connections between Control Panels and Production Pipelines are now automatically encrypted when set up by the System controller
- Fix a bug where the System Controller would not search for the config file in all the directories listed in the documentation. Also make the application search in the application’s directory and not only the current working directory.
- New endpoint
[PATCH] /pipelines/{uuid}/streamconnections/{connection_id}to change the alignment of an already created stream during runtime. Note that changing the alignment will cause the audio and video of that stream to make a sudden jump and/or freeze for a moment, so it is not recommended to do this on stream connections that are on air - The endpoint
[POST] /streamnow has improved error messages in case the System Controller failed to start the stream. The endpoint also closes the Pipeline’s stream connection instead of leaving it open in case the Ingest failed to start the stream - The
[DELETE]endpoints for the specific components has been removed in favor for the general[DELETE] /components/{uuid}endpoint - Fix a bug where the System Controller would crash in some rare cases when a component is shut down at the same time as a REST request is using that component.
- Fix some false positive log outputs
Known limitations
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
Number of Control Senders per Control Receiver
For now the system is limited to only connect one Control Sender (or Receiver) to another Control Receiver. This means that, for now, it is only possible to connect a single Control Panel to a production.
Audio channels
Only stereo audio is supported with two channels embedded per connected input.
Security issues
There is no rate limiting implemented in any of the components. Should the application be running in a network where ports are accessible to unauthorized users, there is a risk of a denial of service (DOS). The network should be configured with firewall rules closing out unauthorized users.
Encryption (HTTPS) is not enabled by default in acl-system-controller. This means that pre-shared keys (PSK) used for encrypted communication between components and the System Controller will be exchanged in the clear and could be revealed.
Client authentication is not enabled by default in acl-system-controller so anyone with access to HTTP on the machine hosting acl-system-controller will have access to the REST API.
Even when client authentication is enabled, there is no enforcement of the length or format of the password. Also note that HTTPS should be enabled when using client authentication since the credentials would otherwise be sent in clear text.
It is strongly recommended to enable both HTTPS and client authentication.
5.9 - Release 1.0.0
Build date
2022-06-23
Release status
Type: First production ready release
Release content
Product version
1.0.0
Release artifacts
| Details | Filename | SHA-256 |
|---|---|---|
| Ingest binary, headers, and shared libraries | acl_v1.0.0-336067b-release.zip | f2beb75a0109403860d455bde14618e4e7a9bbf690b5a7ed79f743fb19224cef |
| Ingest binary, Headers, and shared libraries, debug build | acl_v1.0.0-336067b-debug.zip | e555ea542b84f73008efa0ab3769835e456c31f499ef88d6a315bb0506592d04 |
| System Controller | acl_system_controller_v1.0.0-0f2417f.zip | 82094afe07da10c81d96fab03babca1737ca48f57c2cde9584babebbe44db947 |
Library details
libacl-ingest.so
Version: 7.0.0
Library containing the IngestApplication class used to implement an Ingest component.
libacl-productionpipeline.so
Version: 8.0.0
Library containing the MediaReceiver, MediaStreamer and ControlDataReceiver classes, used to implement a Rendering Engine.
libacl-controldatasender.so
Version: 7.0.0
Library containing the ControlDataSender class, used to send control messages to a ControlDataReceiver component.
Changelog
Ingest 7.0.0
- New metrics are available for the Ingest streamconnections in the REST API that can be used to monitor the streams.
- Fixed bug where the Ingest would crash with a
std::runtime_errorif grabbing a thumbnail on hardware without an Intel CPU with integrated GPU. - Improved error messages for encoders and sources.
- Missing fields in the REST API for the Ingests have been added, such as
max_network_latency_msfor streamconnections. - Logs are now automatically flushed every 5 seconds.
- The class
StaticIngestSystemControllerhas been removed, please use theSystemControllerConnectionclass and the system controller instead.
Production Pipeline 8.0.0
- New metrics are available for the Pipeline streamconnections and Output in the REST API that can be used to monitor the streams.
- Fixed the AUD format in MEPG-TS output of the Pipelines when using HEVC, which earlier caused clicks in the audio channel and a lot of
Invalid NAL unit 4, skipping.errors when playing back the streams using ffmpeg. - Support for labels (so-called “Under Monitor Display”, UMD) in the multi-view outputs. The labels are set through the REST API when setting up multi-view outputs and can be changed at runtime.
- Missing fields in the REST API for the Pipelines have been added, such as
max_network_latency_ms,alignment_msandconvert_color_rangefor streamconnections. - Fixed DTS calculation for output streams in both the Multi-view generator and Output components.
- The network connections between a
ControlDataReceiverand otherControlDataReceiversare now using TCP as protocol instead of SRT, which means that the messages are delivered as soon as they arrive and that no control messages will be dropped due to to timeouts in the transport. - Fixed a minor CUDA memory leak in the multi-view generator that caused a slow, constantly growing GPU memory usage.
- Fixed CUDA memory corruption sometimes occurring when stopping and quickly restarting a multi-view output.
- Nvidia Ampere GPUs are now working with older CUDA drivers than version 510.
- Logs are now automatically flushed every 5 seconds.
- The classes
StaticMediaReceiverSystemControllerandStaticMediaStreamerSystemControllerhave been removed, please use theSystemControllerConnectionclass and the system controller instead.
Control Data Sender 7.0.0 and Control Data Receiver 8.0.0
- The network connections between a
ControlDataSenderandControlDataReceiversare now using TCP as protocol instead of SRT, which means that the messages are delivered as soon as they arrive and that no control messages will be dropped due to timeouts in the transport. - The classes
StaticControlDataSenderSystemControllerandStaticControlDataReceiverSystemControllerhave been removed, please use theSystemControllerConnectionclass and the System Controller instead.
System Controller 1.0.0
- Support for setting CORS and custom HTTP response headers in the configuration file.
- Improved validation of HTTP request payloads and improved error messages.
- New endpoint for deleting any type of component,
[DELETE] /component. - New, built-in Prometheus exporter, accessible through endpoint at
[GET] /metrics. - The version of the running system controller is now returned in each HTTP response in the
X-Binary-Versionheader.
Known limitations
GPU performance
The GPU utilization in the Ingest status message is currently not working. Use intel_gpu_top and/or nvidia-smi instead.
Drivers
You need to install the CUDA Toolkit on Ingest machines, even if they don’t have Nvidia cards.
MPEG-TS output
The timestamps in the MPEG-TS output are not equidistant, which might confuse some playback tools. Playback the stream using a tool that works for now, such as ffmpeg.
Pre-shared key
The pre-shared key used to authorize components in the System controller is currently hard-coded into the Ingest application. This means that the psk in the System controller’s example config file must be used, otherwise is it not possible to connect an Ingest to the system.
5.10 - Upgrade instructions
Upgrade to 9.0.0 from 8.0.0
- The
acl-websocketcontrolpanelapplication has changed name toacl-websocketcontrolproxy. Apart from this, the application works the same way as before.
System Controller
- Before connecting streams to a Pipeline the endpoint
[PUT] /pipelines/{uuid}/renderingengine/formatmust be called to set the required resolution and frame rate of the pipeline. Use[GET] /pipelines/{uuid}/renderingengine/formatto get the currently set format. The PUT endpoint can only be called when all inputs, outputs and control connections are closed. At startup the default format is set to 1920x1080 50 FPS.
Upgrade to 8.0.0 from 7.0.0
The control protocol has been changed. For more information see the new protocol description.
System Controller
- The endpoint
[POST] /pipelines/{uuid}/resethas been deprecated and moved to[POST] /pipelines/{uuid}/renderingengine/reset. The old endpoint is kept for backwards compatibility.
C++ SDK
- All C++ classes has been moved into the
Aclnamespace, make sure to prependAcl::where needed. - The callbacks
ControlDataSender::Settings::mConnectionStatusCallbackandIControlDataReceiver::Settings::mConnectionStatusCallbackhas been removed and replaced by a new callbackmConnectionEventCallback. With this the enum classConnectionTypeand structConnectionStatushas been removed and replaced by enum classEventTypeand structConnectionEvent. With the old callback only connection notifications from the directly connected components would be sent to the user. With this new event callback, connection event notifications are propagated from other components, not directly connected to the user. ControlDataSender::sendRequestToReceiversandIControlDataReceiver::sendStatusMessageToSenderandIControlDataReceiver::sendRequestToReceivershas parameter type of the request data from avector<uint8_t>to anstd::string. TheControlDataSender::sendRequestToReceiversalso has two new parameters for requester UUID, used to identify clients of the control panel in case there are multiple such, and the number of hops to send the message.- The
ControlDataSender::sendMultiRequestToReceiversandIControlDataReceiver::sendMultiRequestToReceiversmethods has been removed in favor for implementing multi message requests in the underlying protocol instead. IControlDataReceiverhas changed from a push to a pull-based implementation where themIncomingRequestCallbackwas removed and replaced by agetRequestsmethod where the application can ask theIControlDataReceiverfor all messages that should have been delivered by a specific time point. ThemPreviewIncomingRequestCallbackwas also removed without a replacement.- UUIDs now use a custom class instead of raw strings in the SDK.
Upgrade to 7.0.0 from 6.0.0
System Controller
- All REST API calls now must use the
/api/v3prefix - The UUID of the Control Receivers has been removed, use the UUID of the Pipeline instead in
[POST] /controlconnections - All endpoints starting with
/pipelines/{uuid}/controlreceivershave been removed. To get the statistics of the controlreceiver, see thecontrolreceiverpart of the response from the[GET] /pipelines/{uuid}?expand=truerequest. In this response theconnected_tohas been renamedoutgoing_connectionsand the list of incoming connections insidelistening_interfacehas been moved out of that object and namedincoming_connections - The parameter
connected_toin, among other endpoints,[GET] /controlpanels/{uuid}has been renamed tooutgoing_connections - The
statusJSON object for responses from controlreceivers, controlpanels and outputs has been removed and all parameters inside of it has been moved out
C++ SDK
ControlDataReceiverandMediaStreamerclasses have now been removed from the SDK and replaced by the interface classesIControlDataReceiverandIMediaStreamer. UseMediaReceiver::createMediaStreamerOutputto create newMediaStreamerinstances andMediaReceiver::getControlDataReceiverto get theControlDataReceiverinstance.getGitRevision()andgetBuildInfo()have been removed from the SDK. UsegetVersion()instead.MediaReceiver::Settingsnow have a new functionmResetCallbackthat must be set to a callback that should be called- A new parameter
const ControlDataReceiver::Settings& receiverSettingsis required when callingMediaReceiver::startto set up the internalControlDataReceiver.
Upgrade to 6.0.0 from 5.0.0
System Controller
- In endpoints
/ingests/{uuid}?expand=true,/ingests/{uuid}/sourcesand/ingest/{uuid}/sources/{source_id}these three metrics has been split into audio and video variants:acl_ingest_source_dropped_frameshas been split intoacl_ingest_source_dropped_audio_framesandacl_ingest_source_dropped_video_frames, metricacl_ingest_source_duplicated_framesis split intoacl_ingest_source_duplicated_audio_framesandacl_ingest_source_duplicated_video_frames; andacl_ingest_source_lost_framesis split intoacl_ingest_source_lost_audio_framesandacl_ingest_source_lost_video_frames. - In case the entropy of the PSK set in the System Controller was too low, the System Controller won’t start. Generate a new PSK and use that one.
- The System Controller does not longer search for the configuration file
acl_sc_settings.jsonin the directories/etc/acl_system_controller,/app,/service,/acl_system_controlleror/opt/acl_system_controller. Either put the file in the current working directory of the system controller application, in the directory/etc/opt/agile_live, or explicitly point at the directory of the config file using the flag--settings-path <PATH>when starting the System Controller.
Rendering Engine
- For the
acl-tcpcontrolpanelthe environment variableACL_TCP_ENDPOINTShas changed name toACL_TCP_ENDPOINTand only accept a single endpoint. This endpoint will now accept multiple connections.
C++ SDK
AlignedFrame::PixelFormathas been replaced withACL::PixelFormat, found in PixelFormat.h.ISystemControllerInterface::sendRequesthas been replaced withISystemControllerInterface::sendMessage, the System Controller will no longer send a response on messages. Since connection is over TCP, if the message could be sent, it has arrived properly to the System Controller, so there is no need for a response message that verifies that.
Upgrade to 5.0.0 from 4.0.0
System Controller
- Endpoints
/pipelines/{uuid}/outputs/{output_uuid}/streamhave been moved to/pipelines/{uuid}/outputs/{output_uuid}/streamsto indicate multiple streams for the same Output can be created. The POST request takes the same parameters as before, but returns an ID of the newly created stream, which is globally unique together with the UUID of the Output. As of now, it is only possible to start multiple streams if the encoder settings match for all streams. Use the new endpoint[DELETE] /pipelines/{uuid}/outputs/{output_uuid}/streams/{stream_id}to stop a stream with a given ID. - The response of
[GET] /pipelines/{uuid}/outputs/{output_uuid}/streamsdiffers from the old variant. In the new one not just a single active stream is presented, but a list ofactive_streams. - The
[POST] /pipelines/{uuid}/outputs/{output_uuid}/streamand[POST] /pipelines/{uuid}/multiviewsendpoints now support setting thepic_modeandspeed_quality_balanceto control the quality of the encoding. While they don’t have to be explicitly specified in the REST API request as they have default values (pic_mode_ipandbalanced), it might be desirable to manually specify them.
ProductionPipeline
MediaReceiver::starthas changed signature. It now takes aCUcontextas the second parameter, which should be a CUDA context reference to the device to run the CUDA operations on.- The
MediaReceiver::Settingsstruct has a new parametermAlignedFrameFreeStreamwhich should be a CUDA stream within the CUDA context passed to theMediaReceiver::startmethod, to use as the stream to make the asynchronous free on, after all the DeviceMemory pointers have been released. MediaStreamer::configurenow has a second parameter to aCUcontext, which is the CUDA context defining which device to run the MediaStreamer on.PipelineSystemControllerInterfaceFactoryconstructor now takes an extracustomCaCertFileparameter, pointing out an optional CA certificate file to use for validating certificates from the System Controller.
Upgrade to 4.0.0 from 3.0.0
System Controller
- The endpoint
POST /streamsnow require two additional parametersaudio_formatandaudio_mapping. The first one selects ifAAC-LCor the newOpuscodec should be used for audio encoding. AAC-LC has slightly higher quality, but is slower to encode. Opus has a lower latency and gives better quality at lower bitrates. The second parameter,audio_mappingtells the Ingest which audio channels to pick from the source and if they should be encoded as mono or stereo streams. (Stereo streams save bandwidth, but does not need to be used as stereo in the Rendering Engine). For example the mapping[4, [1, 2], 0]will result in 4 channels out in the Rendering Engine, where the channel with index 4 is output at index 0 and encoded as a mono channel, index 1 and 2 in the Ingest are encoded as stereo and output at channels 1 and 2 in the output and channel 0 in the input is encoded as mono and output to channel 3 in the output. Channel 4 in the input (and 5 and above) are ignored. To get the same behavior as in the previous release, passAAC-LCand[[0,1]]respectively foraudio_formatandaudio_mapping. - Metric
queueing_video_frameshas changed name tovideo_frames_in_queue. - In
POST /pipelines/{uuid}/outputs/{output_uuid}/streamandPOST /pipelines/{uuid}/multiviewsthe parametersipandportare removed and replaced by four parameters calledlocal_ip,local_port,remote_ipandremote_port. In MPEG-TS over SRT mode, their useage depends on the SRT mode. When in listener mode (srt_mode == listener) only thelocal_ipandlocal_portare used to set the address to listen to. Setlocal_portto 0, to make the OS automatically pick an available port. In SRT caller mode bothlocal_ip,local_portandremote_ip,remote_portare used. Theremote_*ones define the remote address to connect to and thelocal*ones the local address to bind to. To get the old behavior, where the local bind address is automatically chosen, setlocal_ipto0.0.0.0andlocal_portto 0 to automatically pick an unused port. For MPEG-TS over UDP mode, set the address to send the stream to using theremote_*parameters (Thelocal_*variants should be present but must be set to0.0.0.0and0, currently). - The output of the
GET /pipelines/{uuid}/outputs/{output_uuid}/streamandGET /pipelines/{uuid}/multiviewsendpoints have changed the layout. See the REST API documentation for more details. - The
video_kilobit_rateparameter inGET /pipelines/{uuid}/streams/{stream_uuid}has been removed. Use the same parameter in theGET /ingests/{uuid}/streams/{stream_uuid}endpoint instead. - The counter
lost_packetsin theGET /ingests/{uuid}/streams/{stream_uuid}endpoint has been removed in favor for thelost_packetsanddropped_packetsin the Pipeline.
ProductionPipeline
- The API of
ControlDataReceiver::IncomingRequesthas changed to get anstd::vectorof messages (std::vector<uint8_t>), to allow multiple messages to be delivered at the same time point. Just loop through the messages and handle them as before. - The settings for
mDebugVideoandmDebugAudiohas been removed fromMediaReceiver::Settings.
Upgrade to 3.0.0 from 2.0.0
System Controller
- The System Controller uses the new API prefix
/api/v2, so all calls must update to this API version. The old API/api/v1has been removed. - All calls to the Control Receiver and Output endpoints must be updated, as these have been moved in under the
/pipelinesendpoint. See the REST API reference for details. - When setting up Control Connections, the old
[POST] /controlpanels/{uuid}/controlconnectionsand[POST] /controlpanels/{uuid}/controlconnectionsendpoints have been replaced with a single endpoint[POST] /controlconnections. The sending side component (whether a Control Panel or a Control Receiver) is passed as a parameter in the JSON HTTP body. Delete endpoints forcontrolconnectionsformerly under Control Panel and Control Receiver, have been replaced with a single endpoint[DELETE] /controlreceivers/{uuid}, which will close both sides of the connection. - When closing streams, the
[DELETE] /ingests/{uuid}/streamconnections/{connection_id}and[DELETE] /pipeline/{uuid}/streamconnections/{connection_id}have been replaced by a single endpoint[DELETE] /streams/{uuid}, which will close down both sides of the Stream. - The endpoints for getting information from either the Ingest or Pipeline end of a Stream has been moved from
[GET] /ingests/{uuid}/streamconnections/{connection_id}and[GET] /pipeline/{uuid}/streamconnections/{connection_id}to[GET] /ingests/{uuid}/streams/{stream_uuid}and[GET] /pipeline/{uuid}/streams/{stream_uuid}, wherestream_uuidis the system-wide, unique identifier of the stream and is the same UUID on both the Ingest and Pipeline side of the connection in contrast to the oldconnection_idwhich was different in the Ingest and the Pipeline. - The endpoint for changing the alignment of a stream has been moved from
[PATCH] /pipelines/{uuid}/streamconnections/{connection_id}to[PATCH] /streams/{uuid}. - The parameter
idreferring to a source has changed name tosource_idin[POST] /streamsand in responses from the Ingest when querying for information on the Sources or Streams. - The parameters
resolution_xandresoulution_yhave changed name towidthandheightin several endpoints, among others the[POST] /streamsand[POST] /ingests/{uuid}/sources/{source_id}/thumbnail. - The thumbnails endpoint has been moved from
[POST] /ingests/{uuid}/thumbnailto[POST] /ingests/{uuid}/sources/{source_id}/thumbnail, passing thesource_idparameter in the path instead of the JSON HTTP body. - The new
encoderparameter must be specified when requesting thumbnails using the[POST] /ingests/{uuid}/sources/{source_id}/thumbnailendpoint. Set it toautounless a specific implementation is required.
Upgrade to 2.0.0 from 1.0.0
System Controller
- Make sure to generate a new PSK (pre-shared key) for the
acl_sc_settings.jsonfile. This will be used to authorize components connecting to the System controller. All components connecting to the System controller must use the same PSK set using the environment variableACL_SYSTEM_CONTROLLER_PSK. In case a component is started without the environment variable it will log an error and stop. Read more about this in the Security tutorial.
ProductionPipeline
- The API of the former struct
AlignedData::DataFramehas changed.- The namespace
AlignedDatahas been removed and the struct itself has been renamed toAlignedFrame. The enumsCompressedVideoFormatandPixelFormatand typedefAudioSampleRowhave been moved inside the struct. - The field
mPTShas been removed and replaced by two new fieldsmCaptureTimestampandmRenderingTimestamp, where the first is the TAI timestamp in mircoseconds since the UNIX epoch when the frame was captured by the Ingest and the second one is the timestamp when the frame was delivered to the Rendering Engine from theMediaReceiver. Both these timestamps are rounded to the nearest even frame step since the UNIX epoch, which should make it easier to group frames with the same rendering time. ThemRenderingTimestampis also used by theOutputStreamerto calculate the timestamps for the outgoing streams, so in case the Rendering Engine creates newAlignedFrameinstances, make sure this value is incremented correctly for each frame that is put to theOutputStreamer. - The CUDA pointer
mVideoDataCudaPtrhas been removed in favor for anstd::shared_ptrto an RAII class calledDeviceMemorythat keeps track of the CUDA memory pointer adn releases the memory automatically once not longer used by anyone. This makes it possible for the Rendering Engine to make copies of the shared pointer and then discard theAlignedFrameit was delivered with, in order to, for instance, cache the video frame or to handle video and audio data separately. Please do remember that theDeviceMemoryfrom theAlignedFrames delivered by theMediaReceiveris read-only and should never be changed by any CUDA kernel, as this memory is also used by the multi-view generator to generate the multi-view outputs. The Rendering Engine might copy the shared pointer and keep it at long as it wants to, but never change the content of theDeviceMemoryor write to the CUDA memory pointed to by it.AlignedFrames(andDeviceMemoryinstances made outside of anAlignedFrame) created by the Rendering Engine can of course be changed and used freely.
- The namespace
6 - Reference
6.1 - Ateliere Live 9.0.0 developer reference
6.1.1 - System controller config
This page describes the configuration settings possible to set via the acl_sc_settings.json file.
| Expanded Config name | Config name | Description | Default value |
|---|---|---|---|
| psk | psk | The Pre-shared key used to authorize components to connect to the System Controller. Must be 32 characters long | "" |
| client_auth.enabled | enabled | Switch to enable basic authentication for clients in the REST API | true |
| client_auth.username | username | The username that will grant access to the REST API | “admin” |
| client_auth.password | password | Password that will grant access to the REST API | “changeme” |
| https.enabled | enabled | Switch to enable encryption of the REST API as well as the connections between the System Controller and the connected components | true |
| https.certificate_file | certificate_file | Path to the certificate file. In pem format | "" |
| https.private_key_file | private_key_file | Path to the private key file. In pem format | "" |
| logger.level | level | The level that the logging will produce output, available in ascending order: debug, info, warn, error | info |
| logger.file_name_prefix | file_name_prefix | The prefix of the log filename. A unique timecode and “.log” will automatically be appended to this prefix. The prefix can contain both the path and the prefix of the log file. | "" |
| site.port | port | Port on which the service is accessible | 8080 |
| site.host | host | Hostname on which the service is accessible | localhost |
| rate_limit.requests_per_sec | RateLimit.RequestsPerSec | The average number of requests that are handled per second, before requests are queued up. (Number of tokens added to the token bucket per second 1) | 300 |
| rate_limit.burst_limit | RateLimit.BurstLimit | The number of requests that can be handled in a short burst before rate limiting kicks in (Maximum number of tokens in the token bucket 1). | 10 |
| response_timeout | response_timeout | The maximum time of a request between the System Controller and a component before the request is timed out | 5000ms |
| cors.allowed_origins | allowed_origins | Comma-separated list of origin addresses that are allowed | ["*"] |
| cors.allowed_methods | allowed_methods | Comma-separated list of HTTP methods that the service accepts | [“GET”, “POST”, “PUT”, “PATCH”, “DELETE”] |
| cors.allowed_headers | allowed_headers | Comma-separated list of headers that are allowed | ["*"] |
| cors.exposed_headers | exposed_headers | Comma-separated list of headers that are allowed for exposure | [""] |
| cors.allow_credentials | allow_credentials | Allow the xKHR to set credentials cookies | false |
| cors.max_age | max_age | How long the preflight cache is stored before a new must be made | 300 |
| custom_headers.[N].key | key | Custom headers, the key of the header, e.g.: Cache-Control | None |
| custom_headers.[N].value | value | Custom headers, the value to the key of the header, e.g.: no-cache | None |
| allow_any_version | allow_any_version | Allow components of any version to connect. When set to false, components with another major version than the System Controller will be rejected | false |
6.1.2 - REST API v3
The following is a rendering of the OpenAPI for the Ateliere Live System Controller using Swagger. It does not have a backend server, so it cannot be run interactively.
This API is available from the server at the base URL /api/v3.
6.1.3 - Rendering Engine config
This page describes how to configure the Rendering Engine. This topic is closely related to this page on the control command protocol for the video and audio mixers.
Rendering Engine components
The Rendering Engine is an application that uses the Production Pipeline library in the base platform for transport, and adds to that media file playback, HTML rendering, a full video mixer and an audio mixer. The figure below shows a schematic of the different components and an example of how streams may transition through it.

HTML Renderers
Multiple HTML renderers can be instantiated in runtime by control panels, and in each an HTML page can be opened. Each HTML renderer produces a video stream, but no audio.
Media Players
Multiple media players can be instantiated in runtime by control panels, and in each a media file can be opened. Each media player produces a stream containing a video stream and all audio streams from the file.
Video Mixer
The Video mixer receives all video inputs into the system, i.e. streams from ingests, from HTML renderers and from media players. It outputs one or more named video output streams. The internal structure of the video mixer is defined at startup (as described in detail below), and controlling the video mixer is done in runtime by control panels.
Audio Mixer
Note
The audio mixer can be either our internal audio mixer or an integration towards an external third party audio mixer. The rest of the documentation here is valid for the internal audio mixer.The audio mixer takes a number of mono or stereo pair streams as inputs that we call input strips. It outputs a number of named output streams in stereo. The outputs of the audio mixer are defined at startup, and the audio mixer is controlled in runtime by control panels.
Combine outputs
The combination of video and audio outputs into full output streams from the Rendering Engine is configured at startup.
Configuring the Rendering Engine
Some aspects of the Rendering Engine can be configured. An initial configuration is provided at startup and can later be changed using the REST API when a running Rendering Engine is about to be used in another production with different configuration requirements. The initial configuration uses a configuration file in JSON format referenced by the ACL_RENDERING_ENGINE_CONFIG environment variable. Exactly how the configuration file is specified at startup is covered in this guide. The REST API takes a JSON payload with the exact same format. Specifically, the video mixer node graph, the audio mixer outputs and the combination of video and audio outputs can be configured.
As an example, here is the contents of such a JSON configuration file that we will refer to throughout this guide:
{
"version": "1.0",
"video": {
"nodes": {
"transition": {
"type": "transition"
},
"chroma_key_select": {
"type": "select"
},
"chroma_key": {
"type": "chroma_key"
},
"chroma_key_alpha_over": {
"type": "alpha_over"
},
"fade_to_black": {
"type": "fade_to_black"
},
"program": {
"type": "output"
},
"chroma_key_preview": {
"type": "output"
},
"preview": {
"type": "output"
}
},
"links": [
{
"from_node": "transition",
"from_socket": 0,
"to_node": "chroma_key_alpha_over",
"to_socket": 1
},
{
"from_node": "transition",
"from_socket": 1,
"to_node": "preview",
"to_socket": 0
},
{
"from_node": "chroma_key_select",
"from_socket": 0,
"to_node": "chroma_key",
"to_socket": 0
},
{
"from_node": "chroma_key",
"from_socket": 0,
"to_node": "chroma_key_alpha_over",
"to_socket": 0
},
{
"from_node": "chroma_key_alpha_over",
"from_socket": 0,
"to_node": "fade_to_black",
"to_socket": 0
},
{
"from_node": "fade_to_black",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
},
{
"from_node": "chroma_key",
"from_socket": 0,
"to_node": "chroma_key_preview",
"to_socket": 0
}
]
},
"audio": {
"outputs": [
{
"name": "main",
"channels": 2
},
{
"name": "aux1",
"channels": 2
},
{
"name": "aux2",
"channels": 2
}
]
},
"output_mapping": [
{
"name": "program",
"video_output": "program",
"audio_output": "main",
"feedback_input_slot": 1001,
"stream": true
},
{
"name": "preview",
"video_output": "preview",
"audio_output": "",
"feedback_input_slot": 1002,
"stream": false
},
{
"name": "aux1",
"video_output": "program",
"audio_output": "aux1",
"feedback_input_slot": 0,
"stream": true
},
{
"name": "chroma_key_preview",
"video_output": "chroma_key_preview",
"audio_output": "aux2",
"feedback_input_slot": 100,
"stream": true
}
]
}
Video Mixer node graph
The video mixer is defined as a tree graph of nodes that work together in sequence to produce one or several video outputs. Each node performs a specific action, and has zero or more input sockets and zero or more output sockets. Links connect output sockets on one node to input sockets on other nodes. Each node is named and the name is used to control the node in runtime. The node tree configuration is specified in the video section of the JSON file, which contains two parts: the list of nodes and the list of links connecting the nodes.
The following is a graphical representation of the video mixer node graph configuration in the JSON example file above, with two input nodes, three processing nodes and three output nodes, and links in between:

Video nodes block
The nodes object of the video block is a JSON object where the names/keys in the object is the unique name of the
node. The name is used to refer to the node when operating the mixer later on, so names that are easy to
understand what they are supposed to be used for in the production is recommended.
The name can only contain lower case letters, digits, _ and -. Space or other special characters are not allowed.
Each node is an JSON object with parameters defining the node properties.
Here the parameter type defines which type of node it is.
The supported types are listed below. They can be divided into three groups depending on if they provide input to the
graph, output from the graph or is a processing node, placed in the middle of the graph.
Input nodes
The input nodes take their input from the input slots of the Rendering Engine, which contains the latest frame for all connected sources (this includes connected cameras, HTML graphics, media players etc.) The nodes in this group does not have any input sockets, as they take the input frames from the input slots of the Rendering Engine. Which slot to take the frames from is dynamically controlled during runtime.
Alpha combine node (alpha_combine)
Input sockets: 0 (Sources are taken from the input slots of the mixer)
Output sockets: 1
The alpha combine node takes two inputs and combines the color from one of them with the alpha from the other one. The
node features multiple modes that can be set during runtime to either pick the alpha channel of the second video input,
or to take any of the other R, G and B channels, or to average the RGB channels and use as alpha for the output.
This node is useful in case videos with alpha is provided from SDI sources, where the alpha must be sent as a separate
video feed and then combined with the fill/color source in the mixer.
Select node (select)
Input sockets: 0 (Source is taken from the input slots of the mixer)
Output sockets: 1
The select node simply selects an input slot from the Rendering Engine and forwards that video stream.
Which input slot to forward is set during runtime.
The node is a variant of the transition node, but does not support the transitions supported by the transition node.
Transition node (transition)
Input sockets: 0 (Sources are taken from the input slots of the mixer)
Output sockets: 2 (One with the program output and one with the preview output)
The transition node takes two video streams from the Rendering Engine’s input slots, one to use as the program and one
as the preview output stream.
These are output through the two output sockets.
During runtime this node can be used to make transitions such as wipes and fades between the selected program and
preview.
Output nodes
This group only contains a single node, used to mark a point where processed video can exit the graph and be used in output mappings.
Output node (output)
Input sockets: 1
Output sockets: 0 (Output is sent out of the video mixer)
The output node marks an output point in the video mixer’s graph, where the video stream can be used by the output
mapping to be included in the Rendering Engine’s Output streams, or as streams to view in the multi-viewer.
The node takes a single input and makes it possible to use that video feed outside the video mixer.
Output nodes can be used both to output the program and preview feeds of a video mixer, but also to mark auxiliary
outputs, as in the example above, where chroma_key_preview is output to be included in the graph to be able to view
the result of the chroma keying, without the effect being keyed on to the program output.
Processing nodes
The processing nodes take their input from another node’s output and outputs a result that is sent to another node’s input. They are therefore placed in the middle of the graph, after nodes from the input group and before output nodes.
Alpha over node (alpha_over)
Input sockets: 2 (Index 0 for overlay video and index 1 for background video)
Output sockets: 1
The alpha over node composites the overlay video input on top of the background video input. The alpha of the overlay
video input is taken into consideration. During runtime, this node can be controlled to show or not to show the overlay,
and to fade the overlay in or out. This node is useful to composite things such as graphics or chroma keyed video onto a
background video.
Chroma key node (chroma_key)
Input sockets: 1
Output sockets: 1
The chroma key node takes an input video stream and performs chroma keying on it based on parameters set during runtime.
The video output will have the alpha channel (and in some cases also the color channels) altered. The result of this
node can then be composited on top of a background using an Alpha over node.
Crop node (crop)
Input sockets: 1
Output sockets: 1
The crop node takes an input video stream and crops the video based on parameters set during runtime. The parts of the video outside of the cropped area will be fully transparent.
Fade to black node (fade_to_black)
Input sockets: 1
Output sockets: 1
The fade to black node takes a single input video stream and can fade that video stream to and from black.
This node is normally used as the last node before the main program output node, to be able to fade to and from black at
the beginning and end of the broadcast.
Transform node (transform)
Input sockets: 1
Output sockets: 1
The transform node takes an input video stream and transform the result inside the visible canvas. This node can be
configured during runtime to scale and move the input video. This node is useful for picture-in-picture effects, or to
move a chroma key node output to the lower corner of the frame.
Video delay node (video_delay)
Input sockets: 1
Output sockets: 1
The video delay node is used to delay the video by a given number of frames. The number of frames to delay is controlled
during runtime. This node is useful whenever the need for dynamically delay a video stream arises, for example in
case an external audio mixer is used, which comes with a delay of some frames.
Video links block
The links array in the video block is a list of links between video nodes. The video frames are fed in one direction
from node to node via these links.
An input socket on a node can only have one connected link.
The output sockets on a node can have multiple connected links.
Each block contains the following keys:
from_node- The name of the node in thenodesobject, from which the link is receiving frames fromfrom_socket- The index of the output socket in the node from which this link originatesto_node- The name of the node in thenodesobject, to which the link is sending frames toto_socket- The index of the input socket in the node to which this link connects
Some examples
The simplest video mixer node graph imaginable would be a select node feeding an output node. This mixer would only be able to select one of the inputs and output it unaltered, like a video router would do:
The JSON file section for this is:
"video": {
"nodes": {
"input_select": {
"type": "select"
},
"program": {
"type": "output"
}
},
"links": [
{
"from_node": "input_select",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
}
]
}
A slightly more advanced node graph would be to use a transition node and two outputs, one for the program out and one for the preview:
The JSON file section for this is:
"video": {
"nodes": {
"transition": {
"type": "transition"
},
"program": {
"type": "output"
},
"preview": {
"type": "output"
}
},
"links": [
{
"from_node": "transition",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
},
{
"from_node": "transition",
"from_socket": 1,
"to_node": "preview",
"to_socket": 0
},
]
}
Audio outputs
The audio block of the configuration file defines the properties of the audio mixer.
The JSON object contains a list called outputs which lists the outputs of the audio mixer and the configuration of
each output.
Each output has these parameters:
name- The unique name of this audio output, used to refer to if from theoutput_mappingblockchannels- The number of audio channels of this output
The input routing and configuration of the strips is made via the control command API.
Combine outputs
The output_mapping block is used to define outputs of the entire Rendering Engine, by combining outputs from the video
and audio mixers and configuring where those should be sent.
The output mapping is an array of output mappings. Each mapping has the following parameters:
name- The unique name of the output mapping. This will be displayed in the REST API both for sources being streamed and sources with feedback streams that can be included in the multi-viewvideo_output- The name of the video mixer node of typeoutputto get the video stream from. Leave empty, or omit the key to create an audio-only outputaudio_output- The name of the audio output to get the audio stream from. Leave empty, or omit the key to create a video-only outputfeedback_input_slotThe input slot to use to feed this output back to the multi-view. The REST API may then refer to this input slot to include this output in a multi-view view and the video mixer might refer to this input slot to use the output as an input to another part of the video mixer graph (as long as this does not create an reference loop in the video mixer graph, in which case the input node making the reference that creates the loop will return an black frame). Note that these are the same input slots that ingested sources, media players and HTML browsers use. Use 0, or omit the key to disable feedback of this stream.stream- Boolean value to tell if the output should be streamable and visible as an output in the REST API. If set to false the output will not turn up as anPipeline Outputin the REST API.
The following is a graphical visualisation of the output mappings in the JSON example configuration file above:

The default Rendering Engine config
If no Rendering Engine configuration file has been supplied by the user, a default configuration will be used. The following is the video node graph in the default configuration:
The full JSON for this default configuration is:
{
"version": "1.0",
"video" : {
"nodes":{
"transition": {"type":"transition"},
"alpha_combine": {"type":"alpha_combine"},
"chroma_key_select": {"type":"select"},
"chroma_key": {"type":"chroma_key"},
"chroma_key_transform": {"type":"transform"},
"pip1_select": {"type":"select"},
"pip1_transform": {"type":"transform"},
"pip2_select": {"type":"select"},
"pip2_transform": {"type":"transform"},
"html_select": {"type":"select"},
"alpha_over": {"type":"alpha_over"},
"chroma_key_alpha_over": {"type":"alpha_over"},
"pip1_alpha_over": {"type":"alpha_over"},
"pip2_alpha_over": {"type":"alpha_over"},
"html_alpha_over": {"type":"alpha_over"},
"fade_to_black": {"type":"fade_to_black"},
"program": {"type":"output"},
"preview": {"type":"output"}
},
"links":[
{"from_node":"transition", "from_socket":0, "to_node":"alpha_over", "to_socket":1},
{"from_node":"alpha_combine", "from_socket":0, "to_node":"alpha_over", "to_socket":0},
{"from_node":"alpha_over", "from_socket":0, "to_node":"chroma_key_alpha_over", "to_socket":1},
{"from_node":"chroma_key_select", "from_socket":0, "to_node":"chroma_key", "to_socket":0},
{"from_node":"chroma_key", "from_socket":0, "to_node":"chroma_key_transform", "to_socket":0},
{"from_node":"chroma_key_transform", "from_socket":0, "to_node":"chroma_key_alpha_over", "to_socket":0},
{"from_node":"chroma_key_alpha_over", "from_socket":0, "to_node":"pip1_alpha_over", "to_socket":1},
{"from_node":"pip1_select", "from_socket":0, "to_node":"pip1_transform", "to_socket":0},
{"from_node":"pip1_transform", "from_socket":0, "to_node":"pip1_alpha_over", "to_socket":0},
{"from_node":"pip1_alpha_over", "from_socket":0, "to_node":"pip2_alpha_over", "to_socket":1},
{"from_node":"pip2_select", "from_socket":0, "to_node":"pip2_transform", "to_socket":0},
{"from_node":"pip2_transform", "from_socket":0, "to_node":"pip2_alpha_over", "to_socket":0},
{"from_node":"pip2_alpha_over", "from_socket":0, "to_node":"html_alpha_over", "to_socket":1},
{"from_node":"html_select", "from_socket":0, "to_node":"html_alpha_over", "to_socket":0},
{"from_node":"html_alpha_over", "from_socket":0, "to_node":"fade_to_black", "to_socket":0},
{"from_node":"fade_to_black", "from_socket":0, "to_node":"program", "to_socket":0},
{"from_node":"transition", "from_socket":1, "to_node":"preview", "to_socket":0}
]
},
"audio" : {
"outputs": [
{"name": "main", "channels": 2}
]
},
"output_mapping" : [
{"name":"program", "video_output":"program", "audio_output":"main", "feedback_input_slot":1001, "stream":true},
{"name":"preview", "video_output":"preview", "feedback_input_slot":1002, "stream":false}
]
}
6.1.4 - Operational Control API
6.1.4.1 - Overview of JSON protocol
This is a description of the network protocol used to control, monitor and explore the components in a running Ateliere Live production.
The JSON protocol is used when connected to the Websocket Control Panel
(acl-websocketcontrolpanel) and has multi-client support, making it
possible for clients that are connected to the same production to mirror
each other’s controls.

The JSON protocol sits on top of an application-independent platform protocol which transports the JSON payload between the clients and the production.
Control Panel implementation
Note: This section is mainly needed if you plan on implementing a new control panel for the Atelier Live Rendering Engine using the C++ SDK.
Most of the JSON messages described in this document are sent and received by the Websocket Control Panel using the ControlDataSender interface. The interface encapsulates the packing and unpacking of messages to and from the application-agnostic platform protocol. The platform protocol includes the addresses for the sender and receiver(s) of the messages but is unaware of the contents of the packages.
The ControlDataSender interface defines the callbacks that should be used for
handling messages coming from the production.
Response and status messages are received from the production by setting the
mResponseCallback and mStatusMessageCallback, respectively. The data
received in these callbacks are complete JSON messages conforming to the
specification in this document and can be forwarded without changes to the
connected clients. There are however some exceptions to this.
Events
Messages of the type event currently signals that a connection was opened or
closed in the production. Event messages originate in the control panel meaning
that implementing support for this message type is part of making a control
panel using the C++ SDK.
The control panel gets the events from the underlying platform through the
ControlDataSender::Settings::mConnectionEventCallback. By inspecting the
ConnectionEvent provided in the callback, clients connected to the control
panel can be informed about the event. This can be used by other control
panels, implemented using the C++ SDK.
Please see the section about the event message type under “Message types” for
information about the message syntax.
Hop count
Messages of different types need to propagate to different depth of the
production. A hop count in each message determines if it will be relayed
from one Rendering Engine to a possibly chained one behind it.
When receiving a JSON message from a client, the Websocket Control Panel will select a hop count based on the content of the message, before sending the message to the production.
The hop count is marked in the platform layer of the protocol when sending a
message using ControlDataSender::sendRequestToReceivers. It is not visible
in the JSON message.
For each type of message, the hop count used by the Websocket Control Panel is specified in a “Hop count” section within “Message types” below. This hop count should be used when implementing a new C++ control panel.
The state tree
The control API is based around a state tree that makes up the hierarchy of parameters and entities in the Rendering Engine that can be controlled or monitored. The tree is expressed as a JSON structure.
An entity in the tree is addressed by a path consisting of the names of each enclosing object surrounding the entity.
For instance, in the structure below, the path to the g-field of the
rgb_filter would be /video/nodes/rgb_filter/g:
{
"video": {
"nodes": {
"rgb_filter": {
"r": 0.5,
"g": 0.4,
"b": -0.2
}
}
}
}
Message format
JSON syntax is used for all messages. The type and resource fields are
present in all messages and define the type of message and what resource that
is affected by this message.
{
"type": "...",
"resource": "..."
}
Message types
All changes that can be made to a production are available in the JSON API
through messages of type set or command.
A parameter that can be changed immediately, without side effects, and that
will keep its state until the next change can be accessed directly with a
set message. In other cases a command is necessary to initiate the change.
A set message might for instance be used for controlling the layer opacity
in an alpha-over node or the gain for an input to the audio mixer whereas a
command is needed to initiate the loading of a media file or a transition
effect spanning over a period of time.
To get the current state of a resource, a get message can be used. A resource
can also be monitored for changes using a subscribe message. When a
sub-resource is added or removed from the monitored resource, a state-add or
state-remove message is sent to the subscriber. Other changes result in a
state-change message.
Parameters that change continuously without any user input, such as the play
position of a media player or the loudness in an audio output, are referred to
as streaming parameters. Streaming parameters are monitored by sending a
sampling-start message to the resource path of the streaming parameter and
providing a time interval stating how often sampling-update messages should
be sent.
Table of message types
| Message type | Description |
|---|---|
get | Get the value of a resource |
get-response | The response to a get message |
set | Change the value of a resource |
set-response | The response to a set message |
subscribe | Subscribe to state changes within a resource |
subscribe-response | The response to a subscribe message |
unsubscribe | Stop monitoring state changes within a resource |
unsubscribe-response | The response to an unsubscribe message |
command | Execute a command in a resource |
command-response | The response to a command message |
state-change | Describes the new state of a resource |
state-add | A sub-resource was added to a resource |
state-remove | A sub-resource was removed from a resource |
subscription-list | List own subscriptions |
subscription-list-response | The response to a subscription-list-response message |
describe | Get a description of a resource |
describe-response | The response to a describe message |
sampling-start | Start sampling a streaming parameter |
sampling-start-response | The response to a sampling-start message |
sampling-stop | Stop sampling a streaming parameter |
sampling-stop-response | The response to a sampling-stop message |
sampling-list | List own streaming parameter subscriptions |
sampling-list-response | The response to a sampling-list message |
sampling-list-all | List all streaming parameter subscriptions |
sampling-list-all-response | The response to a sampling-list-all message |
sampling-update | Describes the latest sampled state of a streaming parameter |
event | Various information. Only sent to clients of the Websocket Control Panel |
All response messages contain the field timestamp. This is the time when the
request message was handled, i.e. the timestamp of the frame processed on that
time.
Each type of message is described in detail below.
get and get-response
A message of type get is used to retrieve the current state of a given
resource within the production.
Required fields for get messages:
| Parameter | Description |
|---|---|
| type | Must be “get” |
| resource | The path to get the current state from |
For instance:
{
"type": "get",
"resource": "/video/nodes"
}
The response is a get-response. A successful response contains a body
object with the current state of the resource:
{
"type": "get-response",
"resource": "/video/nodes",
"timestamp": 1731073800720000,
"body": {
...
}
}
The body has its root where the resource URI points.
An unsuccessful get has no body and contains an error message, for
instance:
{
"type": "get-response",
"resource": "/video/nodes",
"error": "No such resource: /video/nodes",
"timestamp": 1731073800720000
}
NOTE: Repeatedly calling get is a very inefficient way of monitoring the
state of a production. Please see the subscribe and state-change message
sections for a better way.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
get messages will stop at the first one and the state for that pipeline
will be returned. This is applicable when using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 (one) for get messages.
set and set-response
A message of type set is used to change the state of one or more components
located at a specified resource path in the production. This can for instance
be to change the currently selected video source of a transition node or to
change the gain of an audio strip.
set messages are generally only available for changes which are immediate.
Please see the command message section for details about changes that
occur over a period of time.
Required parameters for set messages:
| Parameter | Description |
|---|---|
| type | Must be “set” |
| resource | The path to apply the changes to |
| body | The set of changes to apply |
The body of a set request contains the new values of the fields to change
within the resource path. The structure of the body does not need to be
complete - only the fields that should be updated need to be included.
Example of a set request that changes program and preview within a
node named my_transition_node:
{
"type": "set",
"resource": "/video/nodes/my_transition_node",
"body": {
"preview": 3,
"program": 8
}
}
The body does not need to be an object when setting a single item, just the
value. Here is an example:
{
"type": "set",
"resource": "/audio/strips/1/filters/gain/value",
"body": 8.6
}
The set-response does not contain a body with the set values - instead changes
in the production need to be monitored by subscribing to the affected
resources.
Please see the subscribe message section for details about subscriptions.
If there is an error, a set-response is returned containing an error
message. In this case none of the parameters in the
body of the set message will be applied. If the set was successful the
response will contain a result ok key/value.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
set messages will propagate all the way to the last pipeline while following
the configured alignment delay of each step. This is applicable when using a
Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to -1 (negative one) for set messages.
command and command-response
Commands are used to initiate events in the production which are not immediate
or that do not have a direct relationship to one specific field of the
production state tree. For instance, when starting playback of a media file
there might be a play command. This will start the actual playback but also
change the player state (e.g. from paused to playing) and also start to
periodically update the current playback position field.
Required parameters for command messages:
| Parameter | Description |
|---|---|
| type | Must be “command” |
| resource | The resource receiving the command |
| body/command | The name of the command to execute |
| body/parameters | The set of parameters to the command. If the command takes no parameters, this can be skipped, or passed empty |
Example of a command that starts a fade command on a transition node:
{
"type": "command",
"resource": "/video/nodes/my_transition_node",
"body": {
"command": "fade",
"parameters": {
"duration_ms": 120
}
}
}
Example of a command that takes no parameters:
{
"type": "command",
"resource": "/video/nodes/my_transition_node",
"body": {
"command": "cut"
}
}
As for set-response messages, the command-response has no body - instead changes in
the production need to be monitored by subscribing to one or more resources.
Please see the subscribe message section for details about subscriptions.
If there is an error, a command-response is returned containing an error
message. If the command was successful the response will contain a result
ok key/value.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
command messages will propagate all the way to the last pipeline while
following the configured alignment delay of each step. This is applicable when
using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to -1 (negative one) for command messages.
subscribe and subscribe-response
Subscriptions are used to monitor changes in the production. This can e.g. be useful in order to mirror the controls of different control surfaces that are connected to the same production, detect when new resources appear, or to otherwise visualize different parts of the system.
Required parameters for subscribe messages:
| Parameter | Description |
|---|---|
| type | Must be “subscribe” |
| resource | The path to monitor for changes |
Example of a subscribe message for tracking changes of the resource
/audio/strips/3/compressor:
{
"type": "subscribe",
"resource": "/audio/strips/3/compressor"
}
The response is a subscribe-response. A successful response contains a body
object with the current state of the resource, for instance:
{
"type": "subscribe-response",
"resource": "/audio/strips/3/compressor",
"body": {
"attack": 30,
"gain": 1,
"knee": 3.5,
"ratio": 3.3,
"release": 2000,
"threshold": -24,
"type": "compressor"
},
"timestamp": 1731073800720000
}
If there is an error, a subscribe-response is returned containing an error
message instead of a body.
Whenever a monitored resource changes, a state-change, state-add or
state-remove message is sent to all subscribers of that resource. Please see
the state-change, state-add and state-remove message sections for details
about this.
Websocket Control Panel
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
subscribe messages will stop at the first one and it is from this pipeline
that state changes will be reported. This is applicable when using a Websocket
Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for subscribe messages.
unsubscribe and unsubscribe-response
To stop receiving updates when a monitored resource changes, an unsubscribe
message can be used.
Required parameters for unsubscribe messages:
| Parameter | Description |
|---|---|
| type | Must be “unsubscribe” |
| resource | The resource path to stop monitor for changes |
If the unsubscribe message is successful, an unsubscribe-response is
returned:
{
"type": "unsubscribe-response",
"resource": "/audio/strips/3/compressor",
"timestamp": 1731073800720000
}
If there is an error, an unsubscribe-response is returned containing an
error message instead of a body.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
unsubscribe messages will stop at the first receiver of the message. This is
applicable when using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for unsubscribe messages.
state-change
A state-change message describes the new state for a number of fields within
a specified resource. state-change messages are sent from the production
side, i.e. they are only received, never sent, by clients.
state-change messages are sent whenever the internal state of the production
changes, for instance when:
- a client has issued a
setmessage - a command that changes the state is being executed
- an automation changes the state over a period of time
- a component, such as a metering device, has new data to report
To avoid loops or unnecessary updates on the client side, the message includes
an actor field stating whether the receiver of the message or some other
entity caused the change to happen.
actor value | Meaning |
|---|---|
| “self” | The receiver of the message caused the change |
| “other” | Another client caused the change |
| “system” | A change from within the system |
Format of the state-change message:
| Parameter | Description |
|---|---|
| type | Must be “state-change” |
| resource | The resource path that has changed |
| body | The fields that have changed within the resource |
| actor | The entity responsible for the change |
Below is an example state-change message where the client receiving the
message also caused the change to happen:
{
"type": "state-change",
"resource": "/audio/strips/3/compressor",
"actor": "self",
"body": {
"gain": 2.5,
"ratio": 4.0
}
}
state-add and state-remove
The state-add and state-remove messages are similar to the state-change
message. The top level resource field is the resource the client subscribes to.
In the body of the message there is another resource field telling what
sub-resource has been added or removed.
Examples:
{
"type": "state-add",
"resource": "/audio",
"actor": "system",
"body": {
"resource": "/strips/2"
}
}
{
"type": "state-remove",
"resource": "/audio",
"actor": "system",
"body": {
"resource": "/strips/2"
}
}
subscription-list and subscription-list-response
The subscription-list message is used to list own subscriptions. The response
message shows the client’s subscriptions, located under a given resource point
in the tree.
Required fields for subscription-list messages:
| Parameter | Description |
|---|---|
| type | Must be “subscription-list” |
| resource | The resource path to start looking for subscriptions from |
For instance:
{
"type": "subscription-list",
"resource": "/video"
}
The response is a subscription-list-response. A successful response contains a
body object with the current state of the resource:
{
"type": "subscription-list-response",
"resource": "/video",
"timestamp": 1731414140040000,
"body": {
"subscriptions": [
"/nodes/alpha_combine",
"/nodes/alpha_over"
]
}
}
The body has its root where the resource URI points.
An unsuccessful request has no body and contains an error message, for
instance:
{
"type": "subscription-list-response",
"resource": "/video/nodes/over",
"timestamp": 1731414382900000,
"error": "Failed to find resource with name 'over'"
}
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
subscription-list messages will stop at the first one, and the subscriptions
for that pipeline will be returned. This is applicable when using a Websocket
Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for subscription-list messages.
describe and describe-response
The purpose of these messages is to get a description of some resource in the state tree, like a node in the video mixer component for example. The descriptions will list all commands and parameters which are valid for the resource.
Required fields for describe messages:
| Parameter | Description |
|---|---|
| type | Must be “describe” |
| resource | The path to resource to describe |
This is the description for /video/nodes/fade_to_black:
{
"type": "describe-response",
"resource": "/video/nodes/fade_to_black",
"timestamp": 1731480819600000,
"body": {
"children": [],
"commands": [
{
"command": "fade_from",
"optional_parameters": [],
"required_parameters": [...],
...
},
...
],
"parameters": [
...
]
}
}
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
describe messages will stop at the first receiver of the message. This is
applicable when using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for describe messages.
sampling-start and sampling-start-response
The sampling-start message is used to start sampling a streaming parameter.
If successful, sampling-update messages will be sent to the subscriber
periodically at the specified time inteval.
Required parameters for sampling-start messages:
| Parameter | Description |
|---|---|
| type | Must be “sampling-start” |
| resource | An expression describing the streaming parameter(s) to start sampling |
| body/interval_ms | The update interval |
An asterisk (*) can be used at any level of the resource expression to
indicate “all components at this level”. If an asterisk is used, no other
characters are allowed at that level of the path.
For instance, "resource": "/audio/mixes/*/input_meter/*" can be used to start
sampling all streaming parameters under input_meter for all audio mixes.
The interval_ms parameter must be greater than or equal to 40.
Example:
{
"type": "sampling-start",
"resource": "/audio/mixes/*/input_meter/*",
"body": {
"interval_ms": 100
}
}
If there is an error, a sampling-start-response is returned containing an
error message. If the sampling-start was successful the response will
contain a result ok key/value.
sampling-stop and sampling-stop-response
The sampling-stop message is used to stop sampling a streaming parameter.
Required parameters for sampling-stop messages:
| Parameter | Description |
|---|---|
| type | Must be “sampling-stop” |
| resource | An expression used to start sampling one or more streaming parameters |
The resource parameter must match one used to start sampling exactly.
Example:
{
"type": "sampling-stop",
"resource": "/audio/mixes/*/input_meter/*"
}
If there is an error, a sampling-stop-response is returned containing an
error message. If the sampling-stop was successful the response will
contain a result ok key/value.
sampling-list and sampling-list-response
The sampling-list message is used to list the streaming parameter
subscriptions that are registered to the client sending the message.
Required parameters for sampling-stop messages:
| Parameter | Description |
|---|---|
| type | Must be “sampling-list” |
| resource | Must be “/” |
Example:
{
"type": "sampling-list",
"resource": "/"
}
If there is an error, a sampling-list-response is returned containing an
error message. If the sampling-stop was successful the response will
contain a list of all the sender’s streaming parameter subscriptions.
Example:
{
"type": "sampling-list-response",
"resource": "/",
"body": {
"samplings": [
"/audio/strips/1/pre_filter_meter/*",
"/audio/mixes/0/input_meter/*"
]
},
"timestamp": 1736860857880000
}
sampling-update
A sampling-update message describes the latest sampled state of one or more
streaming parameters matching a subscription. The message is sent periodically
to clients that have started subscriptions using sampling-start.
The message contains the resource expression used in sampling-start. If
necessary this can be used to identify the subscription in the client.
The body of the message contains the updated state for all of the streaming
parameters matching the subscription. Note that the body starts at the root of
the state tree, which is different from e.g. get responses or subscriptions
for non-streaming parameters.
Example:
{
"type": "sampling-update",
"resource": "/audio/strips/*/pre_filter_meter/*",
"body": {
"audio": {
"strips": {
"1": {
"pre_filter_meter": {
"peak": -0.439775225995602234
}
},
"2": {
"pre_filter_meter": {
"peak": -0.982362873895602837
}
}
}
}
},
"timestamp": 1736861180080000
}
event
When connected to a Websocket Control Panel it will act as a proxy in front of
the Rendering Engine. This introduces a message of type event, which is only
used between the Websocket Control Panel and its clients.
Messages of type event contain an event field specifying the type of event.
All clients connected to the Websocket Control Panel will receive events of type
connect whenever a new connection is established between the Websocket Control
Panel and a Rendering Engine. Such a message might look like:
{
"type": "event",
"connected_node": "<uuid>",
"address": "<uuid>:<uuid>:...",
"event": "connect"
}
where connected_node is the UUID of the newly connected node (Rendering Engine) and
address is a colon separated list of UUIDs, which is the address to the node that
discovered the connection. For connect events this is currently only the Websocket
Control Panel itself, meaning the address is always the Websocket Control Panel’s.
When a connection between a client and a Websocket Control Panel is established,
the client will receive connect events for all Rendering Engines that where
already connected to the Websocket Control Panel, to let the client know it
is connected to a production.
If the connection between the Websocket Control Panel and the Rendering Engine
breaks, whether it is disconnected on purpose or gets disconnected due to a network
outage, the Websocket Control Panel will send an event message to all its clients.
{
"type": "event",
"disconnected_node": "<uuid>",
"address": "<uuid>:<uuid>:...",
"event": "disconnect"
}
A similar message is also sent to the clients in case the connection between two
Rendering Engines/Pipelines is torn down or lost, such as between a Low Delay
and a High Quality Pipeline. In that case the address parameter will be the UUID
of the Websocket Control Panel followed by the UUID of the LD Pipeline and the
disconnected_node is the UUID of the HQ Pipeline.
6.1.4.2 - Rendering Engine components
This page describes the parameters and commands that is used for controlling the video mixer, audio mixer, HTML renderers and media players in the Ateliere Live Rendering Engine. This topic is closely related to this page on how to configure the rendering engine at startup.
Control command protocol
All commands to the Ateliere Live Rendering Engine are sent as human readable JSON objects and are listed below.
Each subsystem of the rendering engine has their own set of parameters and commands, and can be reached using:
/videofor the video mixer/audiofor the audio mixer (if using the built-in mixer)/ndi_audiofor the NDI audio mixer/htmlfor the html renderer instances/mediafor the media playback instances

Video mixer resources
Background
The video mixer is built as a tree graph of processing nodes, please see this page for further information on the video mixer node graph. The names of the nodes defined in the node graph are used as part of the resources: /video/nodes/{node_name} and they all have the parameter type which describes which type of video node it is.
There are 10 different node types.
- The
Transitionnode is used to pick which input slots to use for the program and preview output. The node also supports making transitions between the program and preview. - The
Selectnode simply forwards one of the available sources to its output. - The
Alpha combinenode is used to pick two input slots (or the same input slot) to copy the color from one input and combine it with some information from the other input to form the alpha. The color will just be copied from the color input frame, but there are several modes that can be used to produce the alpha channel in the output frame in different ways. This is known as “key & fill” in broadcasting. - The
Alpha overnode is used to perform an “Alpha Over” operation, that is to put the overlay video stream on top of the background video stream, and let the background be seen through the overlay depending on the alpha of the overlay. The node also features fading the graphics in and out by multiplying the alpha channel by a constant factor. - The
Transformnode takes one input stream and transforms it (scaling and translating) to one output stream. - The
Chroma Keynode takes one input stream, and by setting appropriate parameters for the keying, it will remove areas with the key color from the incoming video stream both affecting the alpha and color channels - The
Fade to blacknode takes one input stream, which it can fade to or from black gradually, and then outputs that stream. - The
Outputnode has one input stream and will output that stream out from the video mixer, back to the Rendering Engine. It has no control commands - The
Cropnode takes one input stream and can crop a video stream to a new size - The
Video delaynode takes one input stream and will hold the frames for a configured amount of time before forwarding the frames, causing a delay of the video output
To reset the runtime configuration of all video nodes to their default state use the reset command of the /video resource.
Transition
The transition node picks a program and a preview video source from the input slots and forward these to other nodes. The node also features auto transitions between the program and the preview sources. Some transition commands last over a duration of time, for example wipes. These can be performed either automatically or manually. The automatic mode works by the operator first selecting the type of transition, for instance a fade, setting the preview to the input slot to fade to and then trigger the transition at the right time with a auto command with the duration for the transition. In manual mode the exact position of the transition is set by the control panel by setting the factor parameter. This is used for implementing T-bars, where the T-bar repeatedly sends the current position of the bar. In the manual mode, the transition type is set before the transition begins, just as in the automatic mode. Note that an automatic transition will be overridden in case the transition position/factor is manually set, by interrupting the automatic transition and jumping to the manually set position.
resource: /video/nodes/{node name} type: transition
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The mix factor between the program and the preview input source, in the range 0.0 to 1.0. For example 0.3 means 30% transition from program to preview. The visible effect is dependent on the transition mode used. |
| mode | string | read-write | fade | The transition mode to use (fade, wipe_left, wipe_right) |
| preview | uint32 | read-write | 0 | The currently used input slot for the preview |
| program | uint32 | read-write | 0 | The currently used input slot for the program |
| type | string | read-only | transition | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0,
"mode": "fade",
"preview": 0,
"program": 0
}
}
Commands
auto
Start an auto transition with the currently selected transition type over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration in milliseconds of the automatic transition |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "auto",
"parameters": {
"duration_ms": <uint32>
}
}
}
cut
Make a cut by swapping the program and preview inputs
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "cut"
}
}
Select
A node to select a video source from the input slots and send it on to the next node.
resource: /video/nodes/{node name} type: select
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| input | uint32 | read-write | 0 | Which input slot the video stream is currently picked from |
| type | string | read-only | select | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"input": 0
}
}
Alpha combine
A node to combine the color channels of one video stream with the alpha from another. This node is useful for video sources where the alpha channel is provided as a separate black and white video source that must be combined with the color source. The node supports multiple modes of obtaining the alpha, either by copying a specific color or alpha channel of some input slot, or by taking the average of the R, G and B channels of the video from some input slot.
resource: /video/nodes/{node name} type: alpha_combine
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| alpha | uint32 | read-write | 0 | The input slot to get the alpha input source from |
| color | uint32 | read-write | 0 | The input slot to get the color input source from |
| mode | string | read-write | average-rgb | The mode to use for combining the color and alpha input sources (copy-r, copy-g, copy-b, copy-a, average-rgb) |
| type | string | read-only | alpha_combine | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"alpha": 0,
"color": 0,
"mode": "average-rgb"
}
}
Alpha over
A node to combine two video streams using alpha over compositing, overlaying the foreground stream on the background stream. The node will keep the transparency of both layers. The overlay stream can be faded in and out of the background stream.
resource: /video/nodes/{node name} type: alpha_over
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The compositing factor. Range 0.0 to 1.0, where 0.0 means that the overlay is not composited on to the background and 1.0 means the overlay is fully visible on top of the background input. |
| type | string | read-only | alpha_over | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade away the overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to fully visible overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
Transform
A node to transform an incoming video stream, by scaling and transposing it. The canvas size of the input will be kept and all surrounding area in case the source video is shrunk, is filled with transparent black.
resource: /video/nodes/{node name} type: transform
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| scale | float | read-write | 1 | The relative scale of the video stream. Use 1.0 for original scale. |
| type | string | read-only | transform | The video node type |
| x | float | read-write | 0 | The X position of the upper left corner of the image as a fraction of the canvas’ width. For example use 0.0 to snap it to the left edge, or 0.5 to the center of the image |
| y | float | read-write | 0 | The Y position of the upper left corner of the image as a fraction of the canvas’ height. For example use 0.0 to snap it to the top edge, or 0.5 to the center of the image |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"scale": 1.0,
"x": 0.0,
"y": 0.0
}
}
Chroma key
A node to perform chroma keying on an incoming video stream. The output video stream will have the alpha and possibly the color channels modified, according to the parameter values in this node. To remove a color from the incoming video stream, first enable the node and then select the key color to remove. The key color can be selected in two ways, either by manually setting the color with the R, G and B channel values, or by using the color picker. When using the color picker, the color picker command will define the position and size of the color picker square to sample the incoming video stream. The R, G and B color parameters will be updated according to the average color of the area when the command was received by the Rendering Engine. The currently selected color can be shown in the upper left hand corner in the output video stream of the node by setting the parameter show_key_color to true. Also, the latest sampled color picker area can be drawn in the node’s output by setting show_color_picker to true. When a suitable color has been chosen, adjust the distance and falloffparameters to get a clear mask. To aid the tweaking of the parameters, set the show_alpha parameter to true. This will make the node output the black and white mask instead of the keyed result, which makes it easier to see which parts are masked away and not. Remember to turn this off before going on air. As a last step, any remaining fringes of the key color around the subject can be desaturated with the color_spill parameter. But remember this will desaturate colors close to the key color even in parts of the frame fully visible.
resource: /video/nodes/{node name} type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| color_spill | float | read-write | 0.1 | Desaturation factor of colors that are close to the key color, without changing the alpha. Range 0.0 to 1.0, where 0.0 keeps the current saturation. |
| distance | float | read-write | 0.1 | The maximum deviation from the selected key color that is also considered part of the color to mask away. Range 0.0 to 1.0, where 0.0 means only the exact key color will be removed and greater values means more colors further away from the key color are removed. |
| enabled | bool | read-write | false | When set to true the node will be enabled, false will just bypass the node. |
| falloff | float | read-write | 0.08 | The falloff factor used to smooth out the edge in the mask between which colors are fully removed and which are fully kept, by making the colors in between semi-transparent. Range 0.0 to 1.0, where 0.0 means sharp edges. |
| show_alpha | bool | read-write | false | Switch on to show the resulting alpha channel as output instead of the keyed result, useful to easier see which parts are masked away and which are not. Make sure to turn this off before going on air. |
| show_color_picker | bool | read-write | false | Controls the visibility of the color picker area in the output video. The marker will show the latest sampled area in the video stream. Make sure to turn this off before going on air. |
| show_key_color | bool | read-write | false | Controls the visibility of the currently used key color as a small square in the upper left corner of the image. Make sure to turn this off before going on air. |
| type | string | read-only | chroma_key | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"color_spill": 0.1,
"distance": 0.1,
"enabled": false,
"falloff": 0.08,
"show_alpha": false,
"show_color_picker": false,
"show_key_color": false
}
}
Commands
pick_color
Given a size and location, pick a color in the current video frame. The picked color will be the average color in the square defined by the parameters.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| size | uint32 | required | Size in pixels of the color picker square |
| x | float | required | X position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
| y | float | required | Y position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "pick_color",
"parameters": {
"size": <uint32>,
"x": <float>,
"y": <float>
}
}
}
Chroma key / Key color
The key color
resource: /video/nodes/{node name}/key_color type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| b | float | read-write | 0 | The blue channel, in range 0.0 to 1.0 |
| g | float | read-write | 0 | The green channel, in range 0.0 to 1.0 |
| r | float | read-write | 0 | The red channel, in range 0.0 to 1.0 |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}/key_color",
"body": {
"b": 0.0,
"g": 0.0,
"r": 0.0
}
}
Fade to black
A node to fade the incoming video stream to and from black.
resource: /video/nodes/{node name} type: fade_to_black
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The factor, where 1.0 means the output will be fully black and 0.0 means the input will be passed through unmodified. |
| type | string | read-only | fade_to_black | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade from a fully black frame to the input video stream over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to a fully black frame over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
Crop
A node to crop the incoming video stream. The node can crop the left, right, top and bottom edge of the incoming video stream. The areas outside of the cropped area will be transparent in the output.
resource: /video/nodes/{node name} type: crop
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| bottom | float | read-write | 1 | Position of the bottom crop edge, in percent of the image’s height |
| left | float | read-write | 0 | Position of the left crop edge, in percent of the image’s width |
| right | float | read-write | 1 | Position of the right crop edge, in percent of the image’s width |
| top | float | read-write | 0 | Position of the top crop edge, in percent of the image’s height |
| type | string | read-only | crop | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"bottom": 1.0,
"left": 0.0,
"right": 1.0,
"top": 0.0
}
}
Video delay
A node to delay the video stream a given number of frames.
resource: /video/nodes/{node name} type: video_delay
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| delay | uint32 | read-write | 0 | The number of frames to delay the video |
| type | string | read-only | video_delay | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"delay": 0
}
}
Audio mixer resources
Overview
The audio mixer has the following data path:

The three main elements of the audio mixer are the Input strips, the Mixes, and the Outputs.
Input strips
Audio enters the audio mixer through the input strips. When a strip has been created, the audio for the strip is selected among the available channels in the Rendering Engine’s input slots.
In the example picture above, three sources are connected to the input slots. The slots have four, two, and six channels respectively. In the illustration we can see that the first strip uses a single channel from the first slot, the second strip uses channel three and four from the second slot and so on. Several input strips may select the same input slot channels.
Each input strip has two stereo output connection points (
), one
before the volume fader (pre fader) and one after the volume fader (post fader). When a mix or
an output is connected to the output of a strip, which of these two locations to take the audio from
can be selected using the origin parameter.
Mixes
Mixes are used to combine the output from input strips, or other mixes, and also allows for further
filtering of the audio signal. When a mix has been created, the input strips and other mixes contributing
to the mix can be controlled in the /inputs/strips and /inputs/mixes sections of the mix.
Just like an input strip a mix has two stereo output connection points
(
) that can be used when connecting the output of the mix to another
mix or an output.
Outputs
Each output corresponds to an audio output in the Rendering Engine configuration. An output takes
audio from a single location, either directly from an input strip or from a mix. In both cases
it can be specified whether to take the audio pre_fader or post_fader.
Note: The audio mixer is completely separate from the video mixer, so switching image in the video mixer will not change the audio mixer in any way.
Audio mixer root
The internal audio mixer consists of input strips (/strips), mixes (/mixes) and output buses (/outputs). The strips are the inputs of the audio mixer, taking audio from the inputs of the Rendering Engine. The mixes mix audio from strips and other mixes. Finally the output buses are the outputs of the audio mixer, taking audio from a single strip or a mix.
resource: /audio
Commands
reset
Reset this audio mixer to its initial state. This will remove all input strips and mixes and reset all outputs.
Command template
{
"type": "command",
"resource": "/audio",
"body": {
"command": "reset"
}
}
To reset the audio mixer to the default state, including removal of all configured input strips, use the reset command of the /audio resource.
Input strips
An input strip in the audio mixer, which takes audio from the input slots of the Rendering Engine (/input). Audio is either taken as a mono channel or as a stereo pair. The audio is sent through a filter chain (/filters). After the filter chain the output loudness of the strip is controlled by a main fader. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, measuring the raw audio input (/input_meter).
resource: /audio/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this input strip. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}",
"body": {
"label": ""
}
}
Input strip input configuration
Input settings for a strip.
resource: /audio/strips/{strip index}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| first_channel | uint32 | read-write | 0 | The index of the first audio channel. This is the left channel for stereo. For mid/side stereo, this is the mid channel. The index refers to the channel index in the referenced input_slot. |
| input_slot | uint32 | read-write | 0 | The input slot of the Rendering Engine that audio is taken from. |
| is_stereo | bool | read-write | false | True if the input audio should be treated as stereo, false for mono. For mono only first_channel will be used. For stereo first_channel will be left and second_channel will be right. |
| second_channel | uint32 | read-write | 1 | The index of the second audio channel. This is the right channel for regular stereo and for mid/side stereo, this is the side channel. The index refers to the channel index in the referenced input_slot. Only used in stereo mode. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/input",
"body": {
"first_channel": 0,
"input_slot": 0,
"is_stereo": false,
"second_channel": 1
}
}
Input loudness meter
Peak loudness meter for incoming audio, measured before the filters of this input strip. This meter will either have one streaming parameter called ‘peak’ in case the strip is in mono mode, else two streaming parameters ‘peak_left’ and ‘peak_right’ will replace the ‘peak’ parameter when in stereo mode.
resource: /audio/strips/{strip index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak | float | The peak loudness for a mono channel |
Mid side stereo
Filter for controlling the mid and side amount of an audio signal. The input can either be Mid-Side (MS) or Left-Right (LR) stereo. Mono input will be passed through unaltered. If the input is LR, it is converted to MS with the mid channel being the average of the input channels and the side channel being half the difference of the channels. With the signal in MS format the mid and the side amount can be controlled using the mid_amount, side_amount, and invert_polarity parameters.
resource: /audio/strips/{strip index}/filters/mid_side
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enabled | bool | read-write | false | Set to true to enable this filter. |
| input_format | string | read-write | lr_stereo | The input signal’s format. The available options are: lr_stereo: Input is left-right (LR) stereo ms_stereo: Input is mid-side (MS) stereo Mono input will always be bypassed. |
| invert_polarity | bool | read-write | true | Phase-invert the side channel when applying it to the right channel of the LR output. If input_format is lr_stereo this is usually the right thing to do. If input_format is ms_stereo it is a matter of taste. |
| mid_amount | float | read-write | 1 | The amount of the mid channel to include in the output. Floating point value from 0.0 to 1.0. |
| side_amount | float | read-write | 1 | The amount of the side channel to include in the output. Floating point value from 0.0 to 1.0. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/mid_side",
"body": {
"enabled": false,
"input_format": "lr_stereo",
"invert_polarity": true,
"mid_amount": 1.0,
"side_amount": 1.0
}
}
Pre-gain
Gain filter
resource: /audio/strips/{strip index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/gain",
"body": {
"value": 0.0
}
}
Parametric equalizer
Equalizer filter
resource: /audio/strips/{strip index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq",
"body": {
"command": "reset"
}
}
Parametric equalizer bands
A filter/band in the equalizer
resource: /audio/strips/{strip index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
Dynamic range compressor
Dynamic range compressor
resource: /audio/strips/{strip index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
Panning
Panning filter
resource: /audio/strips/{strip index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/pan",
"body": {
"value": 0.0
}
}
Pre-fader loudness meter
Peak loudness meter for filtered audio, measured after the filters of this input strip, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Input strip fader
Volume fader controlling the output loudness of this strip
resource: /audio/strips/{strip index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Post-fader loudness meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this input strip. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Mixes
A mix in the audio mixer, which takes audio from selected input strips and possibly other mixes to mix to a single stereo pair. After mixing the inputs (/inputs) of the mix, the audio is sent through a filter chain (/filters), similar to that of an input strip. After the filter chain the output loudness of the mix is controlled by a main fader. The inputs of a mix can either be taken pre- or post-fader from the strips and other mixes included in the mix. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, after the inputs has been mixed down to a single stereo pair (/input_meter).
resource: /audio/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this mix. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}",
"body": {
"label": ""
}
}
Mixes inputs
The inputs to this mix.
resource: /audio/mixes/{mix index}/inputs
Mixes inputs from input strips
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Mixes inputs from other mixes
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Input loudness meter
Peak loudness meter for incoming audio, measured before the filters of this mix. This meter will always have two streaming parameters ‘peak_left’ and ‘peak_right’, since the input to the mix is always stereo.
resource: /audio/mixes/{mix index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Pre-gain
Gain filter
resource: /audio/mixes/{mix index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/gain",
"body": {
"value": 0.0
}
}
Parametric equalizer
Equalizer filter
resource: /audio/mixes/{mix index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq",
"body": {
"command": "reset"
}
}
Parametric equalizer bands
A filter/band in the equalizer
resource: /audio/mixes/{mix index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
Dynamic range compressor
Dynamic range compressor
resource: /audio/mixes/{mix index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
Panning
Panning filter
resource: /audio/mixes/{mix index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/pan",
"body": {
"value": 0.0
}
}
Pre-fader loudness meter
Peak loudness meter for filtered audio, measured after the filters of this mix, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the mix is stereo.
resource: /audio/mixes/{mix index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Mix output fader
Volume fader controlling the output loudness of this mix
resource: /audio/mixes/{mix index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Post-fader loudness meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this mix. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/mixes/{mix index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Output bus
Audio mixer output bus to select which input strip or mix should be sent to the output of the audio mixer. The outputs are populated from the Rendering Engine config. Audio from a strip or a mix can be selected for the output. The selected source of this output can either be taken pre- or post-fader from the referenced strip or mix.This makes it possible for outputs meant for pre-listening to listen to a mix or strip without touching its fader. Such outputs can also jump freely between mixes to listen to what is being output from the mixer or strips to listen to the incoming components to tweak the audio filters. The selected audio is fed through a loudness meter.
resource: /audio/outputs/{output name}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this output bus. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}",
"body": {
"label": ""
}
}
Output bus input
The source of an output bus.
resource: /audio/outputs/{output name}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| index | uint32 | read-write | 0 | The index of the input strip or mix the audio is taken from. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| source | string | read-write | mix | Where the audio is taken from. Can be either ‘strip’ or ‘mix’. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/input",
"body": {
"index": 0,
"origin": "post_fader",
"source": "mix"
}
}
Output bus loudness meter
Loudness meters for the output bus. Used to monitor the loudness of the outgoing audio from the mixer.This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’. When the parameter ’enable_ebu_meters’ is set to true, three additional streaming parameters will be available, called ’ebu_m’, ’ebu_s’ and ’ebu_i’, which measure loudness according to the EBU R 128 standard.
resource: /audio/outputs/{output name}/meters
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enable_ebu_meters | bool | read-write | false | Enable the EBU R 128 Meters. Only enable these for the output where the meters are actually used, as they can be quite resource intensive |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"enable_ebu_meters": false
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| ebu_i | float | EBU R 128 Integrated loudness with gating. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_m | float | EBU R 128 Momentary loudness with 400 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_s | float | EBU R 128 Short-term loudness with 3000 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Commands
reset
Reset all the EBU loudness meters, starting over with measuring loudness
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"command": "reset"
}
}
External audio mixing via NDI
The internal audio mixer can be replaced with an external audio mixer, where NDI is used for communicating with the external mixer. To enable the external NDI audio mixer the Rendering Engine application should be started with the environment variable ACL_AUDIO_MIXER set to external_ndi.
The external NDI audio mixer bridge
resource: /ndi_audio
Sending audio to external mixer
All streams to send to the external audio mixer
resource: /ndi_audio/send_streams
Commands
add_stream
Add a new stream for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
A stream to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI send stream. The name is set when creating the stream using the add_stream command. |
Commands
disable_channel
Disable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to disable |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "disable_channel",
"parameters": {
"index": <uint32>
}
}
}
enable_channel
Enable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to enable |
| input_slot | uint32 | optional | The input slot to send audio from. |
| channel | uint32 | optional | The index of the channel within the input slot to send audio from |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "enable_channel",
"parameters": {
"index": <uint32>,
"input_slot": uint32,
"channel": uint32
}
}
}
List of audio channels to send
resource: /ndi_audio/send_streams/{send stream index}/channels
A channel to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}/channels/{channel index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| channel | uint32 | read-write | 0 | The index of the channel within the input slot to send audio from |
| input_slot | uint32 | read-write | 0 | The input slot to send audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/send_streams/{send stream index}/channels/{channel index}",
"body": {
"channel": 0,
"input_slot": 0
}
}
Receiving audio in return from the external mixer
All streams that returns audio from the external audio mixer
resource: /ndi_audio/return_streams
Commands
add_stream
Add a new stream for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
A stream which returns audio from the external audio mixer
resource: /ndi_audio/return_streams/{return stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI return stream matching the name of an NDI sender on the network. The name is set when creating the stream using the add_stream command. |
Mapping received audio to outputs
All audio outputs from this component
resource: /ndi_audio/outputs
An output from this component consisting of audio from one or more NDI return streams
resource: /ndi_audio/outputs/{output bus}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | main | The name of this output |
The list of channels for one output
resource: /ndi_audio/outputs/{output bus}/channels
An output channel
resource: /ndi_audio/outputs/{output bus}/channels/1
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| return_channel | uint32 | read-write | 0 | The channel to take audio from |
| return_stream | uint32 | read-write | 0 | The return stream to take audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/outputs/{output bus}/channels/1",
"body": {
"return_channel": 0,
"return_stream": 0
}
}
HTML rendering
The Rendering Engine features a built-in HTML renderer which uses the Chromium web browser engine to render HTML pages. This resource can create and close HTML renderers.
resource: /html
Commands
close
Close the HTML renderer instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the HTML browser to close |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new HTML renderer instance with the canvas size of width x height pixels and output the rendered frames to the given input slot, if url is set it will be loaded on startup, otherwise about:blank is loaded.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new browser to, cannot be 0 |
| width | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s width |
| height | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s height |
| url | string | optional | The optional URL to load at creation of the browser |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"width": <uint32>,
"height": <uint32>,
"url": string
}
}
}
reset
Close all open HTML renderers
Command template
{
"type": "command",
"resource": "/html",
"body": {
"command": "reset"
}
}
HTML renderer
This resource controls an HTML renderer instance and allows loading of new URLs and executing JavaScript snippets.
resource: /html/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| height | uint32 | read-only | 1080 | The height in pixels of this HTML renderer canvas |
| url | string | read-only | Currently loaded URL | |
| width | uint32 | read-only | 1920 | The width in pixels of this HTML renderer canvas |
Commands
execute
Execute JavaScript in this HTML renderer. The JavaScript snippet might span over multiple lines and may contain spaces.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| javascript | string | required | The JavaScript snippet to execute in this browser. The snippet might span over multiple lines. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "execute",
"parameters": {
"javascript": <string>
}
}
}
load
Load a new URL in this HTML renderer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| url | string | required | The new URL to load in this browser |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "load",
"parameters": {
"url": <string>
}
}
}
Media players
The Rendering Engine can create media player instances to play video and audio files from the hard drive of the machine running the Rendering Engine. It is up to the user of the API to ensure the files are uploaded to the machines running the Rendering Engine(s) before trying to run them. The media players use the FFmpeg library to demux and decode the media files, so most files supported by FFmpeg should work. This resource can create and close media players.
resource: /media
Commands
close
Close the media player instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the media player to close. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new media player instance and output the rendered frames to the given input slot. If the path is set, it will be loaded at startup
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new media player to, cannot be 0 |
| path | string | optional | The path of the media file to load into this media player |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"path": string
}
}
}
reset
Close all media players
Command template
{
"type": "command",
"resource": "/media",
"body": {
"command": "reset"
}
}
Media player
This resource controls a media player instance. The media players have three parameters that can be set to control if only a portion of the file should be played, and if the playback should loop once it reaches the end. See the section_start_ms, section_duration_ms and loop parameters below.
resource: /media/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| is_playing | bool | read-only | false | Playback state of this media player |
| loop | bool | read-write | false | Controls the looping behavior of the media player. Set to true to loop from the section start once the media playback reaches the end of the section or the end of the file |
| media_duration_ms | int32 | read-only | -1 | The total duration of the currently loaded media file in milliseconds |
| path | string | read-only | The path to the currently loaded media file | |
| section_duration_ms | uint32 | read-write | 4294967295 | Duration in milliseconds of section window, counted from the section start time |
| section_start_ms | uint32 | read-write | 0 | Start time in milliseconds of section window, counted from the beginning of the media file |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/media/{input slot}",
"body": {
"loop": false,
"section_duration_ms": 4294967295,
"section_start_ms": 0
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| current_time_ms | int32 | Current play time in milliseconds |
| time_left_ms | int32 | Time left in milliseconds |
Commands
load
Load a media file into this media player and pause playback on the first frame. This will also reset the start, duration, section and looping parameters of this media player.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| path | string | required | The path to the new media file to load |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "load",
"parameters": {
"path": <string>
}
}
}
pause
Pause the playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "pause"
}
}
play
Start/resume playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "play"
}
}
seek
Seek to a given time point, in milliseconds, from the start of the media file and pause the playback.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| time_ms | int32 | required | The time in milliseconds from the beginning of the file to seek to |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "seek",
"parameters": {
"time_ms": <int32>
}
}
}
6.1.4.3 - Control API reference
All available controllable resources have a unique resource path and are listed below. The resources may contain some or all of the following sections:
- Parameters
- Streaming parameters
- Commands
/
The root resource of the Rendering Engine
resource: /
Commands
reset
Reset the state of the Rendering Engine, will call reset on all its child components
Command template
{
"type": "command",
"resource": "/",
"body": {
"command": "reset"
}
}
/audio
The internal audio mixer consists of input strips (/strips), mixes (/mixes) and output buses (/outputs). The strips are the inputs of the audio mixer, taking audio from the inputs of the Rendering Engine. The mixes mix audio from strips and other mixes. Finally the output buses are the outputs of the audio mixer, taking audio from a single strip or a mix.
resource: /audio
Commands
reset
Reset this audio mixer to its initial state. This will remove all input strips and mixes and reset all outputs.
Command template
{
"type": "command",
"resource": "/audio",
"body": {
"command": "reset"
}
}
/audio/mixes
List of audio mixer mixes.
resource: /audio/mixes
Commands
add_mix
Add a mix to this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the mix to add |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes",
"body": {
"command": "add_mix",
"parameters": {
"index": <uint32>
}
}
}
remove_mix
Remove a mix from this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the mix to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes",
"body": {
"command": "remove_mix",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}
A mix in the audio mixer, which takes audio from selected input strips and possibly other mixes to mix to a single stereo pair. After mixing the inputs (/inputs) of the mix, the audio is sent through a filter chain (/filters), similar to that of an input strip. After the filter chain the output loudness of the mix is controlled by a main fader. The inputs of a mix can either be taken pre- or post-fader from the strips and other mixes included in the mix. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, after the inputs has been mixed down to a single stereo pair (/input_meter).
resource: /audio/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this mix. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}",
"body": {
"label": ""
}
}
/audio/mixes/{mix index}/fader
Volume fader controlling the output loudness of this mix
resource: /audio/mixes/{mix index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/mixes/{mix index}/filters
Chain of audio filters.
resource: /audio/mixes/{mix index}/filters
/audio/mixes/{mix index}/filters/compressor
Dynamic range compressor
resource: /audio/mixes/{mix index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
/audio/mixes/{mix index}/filters/eq
Equalizer filter
resource: /audio/mixes/{mix index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq",
"body": {
"command": "reset"
}
}
/audio/mixes/{mix index}/filters/eq/bands
Equalizer filter list
resource: /audio/mixes/{mix index}/filters/eq/bands
Commands
add_band
Add a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to add. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq/bands",
"body": {
"command": "add_band",
"parameters": {
"index": <uint32>
}
}
}
remove_band
Remove a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to remove. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq/bands",
"body": {
"command": "remove_band",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}/filters/eq/bands/{band index}
A filter/band in the equalizer
resource: /audio/mixes/{mix index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
/audio/mixes/{mix index}/filters/gain
Gain filter
resource: /audio/mixes/{mix index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/gain",
"body": {
"value": 0.0
}
}
/audio/mixes/{mix index}/filters/pan
Panning filter
resource: /audio/mixes/{mix index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/pan",
"body": {
"value": 0.0
}
}
/audio/mixes/{mix index}/input_meter
Peak loudness meter for incoming audio, measured before the filters of this mix. This meter will always have two streaming parameters ‘peak_left’ and ‘peak_right’, since the input to the mix is always stereo.
resource: /audio/mixes/{mix index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/mixes/{mix index}/inputs
The inputs to this mix.
resource: /audio/mixes/{mix index}/inputs
/audio/mixes/{mix index}/inputs/mixes
List of audio volume faders for the result of the other mixes included in this mix.
resource: /audio/mixes/{mix index}/inputs/mixes
Commands
add_mix
Add the result of another mix to this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of another mix to add to this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes",
"body": {
"command": "add_mix",
"parameters": {
"index": <uint32>
}
}
}
remove_mix
Remove the result of another mix from this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the other mix to remove from this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes",
"body": {
"command": "remove_mix",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}/inputs/mixes/{mix index}
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/mixes/{mix index}/inputs/strips
List of audio volume faders for the input strips included in this mix.
resource: /audio/mixes/{mix index}/inputs/strips
Commands
add_strip
Add an input strip to this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to add to this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips",
"body": {
"command": "add_strip",
"parameters": {
"index": <uint32>
}
}
}
remove_strip
Remove an input strip from this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to remove from this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips",
"body": {
"command": "remove_strip",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}/inputs/strips/{strip index}
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/mixes/{mix index}/post_fader_meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this mix. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/mixes/{mix index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/mixes/{mix index}/pre_fader_meter
Peak loudness meter for filtered audio, measured after the filters of this mix, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the mix is stereo.
resource: /audio/mixes/{mix index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/outputs
List of audio output buses. The output buses are the outputs of the audio mixer. An output bus can output audio from a strip or from a mix and take the audio pre- or post-fader of that strip or mix.
resource: /audio/outputs
/audio/outputs/{output name}
Audio mixer output bus to select which input strip or mix should be sent to the output of the audio mixer. The outputs are populated from the Rendering Engine config. Audio from a strip or a mix can be selected for the output. The selected source of this output can either be taken pre- or post-fader from the referenced strip or mix.This makes it possible for outputs meant for pre-listening to listen to a mix or strip without touching its fader. Such outputs can also jump freely between mixes to listen to what is being output from the mixer or strips to listen to the incoming components to tweak the audio filters. The selected audio is fed through a loudness meter.
resource: /audio/outputs/{output name}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this output bus. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}",
"body": {
"label": ""
}
}
/audio/outputs/{output name}/input
The source of an output bus.
resource: /audio/outputs/{output name}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| index | uint32 | read-write | 0 | The index of the input strip or mix the audio is taken from. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| source | string | read-write | mix | Where the audio is taken from. Can be either ‘strip’ or ‘mix’. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/input",
"body": {
"index": 0,
"origin": "post_fader",
"source": "mix"
}
}
/audio/outputs/{output name}/meters
Loudness meters for the output bus. Used to monitor the loudness of the outgoing audio from the mixer.This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’. When the parameter ’enable_ebu_meters’ is set to true, three additional streaming parameters will be available, called ’ebu_m’, ’ebu_s’ and ’ebu_i’, which measure loudness according to the EBU R 128 standard.
resource: /audio/outputs/{output name}/meters
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enable_ebu_meters | bool | read-write | false | Enable the EBU R 128 Meters. Only enable these for the output where the meters are actually used, as they can be quite resource intensive |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"enable_ebu_meters": false
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| ebu_i | float | EBU R 128 Integrated loudness with gating. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_m | float | EBU R 128 Momentary loudness with 400 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_s | float | EBU R 128 Short-term loudness with 3000 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Commands
reset
Reset all the EBU loudness meters, starting over with measuring loudness
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"command": "reset"
}
}
/audio/strips
List of audio mixer input strips.
resource: /audio/strips
Commands
add_strip
Add an input strip to this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to add. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips",
"body": {
"command": "add_strip",
"parameters": {
"index": <uint32>
}
}
}
remove_strip
Remove an input strip from this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to remove. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips",
"body": {
"command": "remove_strip",
"parameters": {
"index": <uint32>
}
}
}
/audio/strips/{strip index}
An input strip in the audio mixer, which takes audio from the input slots of the Rendering Engine (/input). Audio is either taken as a mono channel or as a stereo pair. The audio is sent through a filter chain (/filters). After the filter chain the output loudness of the strip is controlled by a main fader. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, measuring the raw audio input (/input_meter).
resource: /audio/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this input strip. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}",
"body": {
"label": ""
}
}
/audio/strips/{strip index}/fader
Volume fader controlling the output loudness of this strip
resource: /audio/strips/{strip index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/strips/{strip index}/filters
Chain of audio filters.
resource: /audio/strips/{strip index}/filters
/audio/strips/{strip index}/filters/compressor
Dynamic range compressor
resource: /audio/strips/{strip index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
/audio/strips/{strip index}/filters/eq
Equalizer filter
resource: /audio/strips/{strip index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq",
"body": {
"command": "reset"
}
}
/audio/strips/{strip index}/filters/eq/bands
Equalizer filter list
resource: /audio/strips/{strip index}/filters/eq/bands
Commands
add_band
Add a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to add. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq/bands",
"body": {
"command": "add_band",
"parameters": {
"index": <uint32>
}
}
}
remove_band
Remove a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to remove. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq/bands",
"body": {
"command": "remove_band",
"parameters": {
"index": <uint32>
}
}
}
/audio/strips/{strip index}/filters/eq/bands/{band index}
A filter/band in the equalizer
resource: /audio/strips/{strip index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
/audio/strips/{strip index}/filters/gain
Gain filter
resource: /audio/strips/{strip index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/gain",
"body": {
"value": 0.0
}
}
/audio/strips/{strip index}/filters/mid_side
Filter for controlling the mid and side amount of an audio signal. The input can either be Mid-Side (MS) or Left-Right (LR) stereo. Mono input will be passed through unaltered. If the input is LR, it is converted to MS with the mid channel being the average of the input channels and the side channel being half the difference of the channels. With the signal in MS format the mid and the side amount can be controlled using the mid_amount, side_amount, and invert_polarity parameters.
resource: /audio/strips/{strip index}/filters/mid_side
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enabled | bool | read-write | false | Set to true to enable this filter. |
| input_format | string | read-write | lr_stereo | The input signal’s format. The available options are: lr_stereo: Input is left-right (LR) stereo ms_stereo: Input is mid-side (MS) stereo Mono input will always be bypassed. |
| invert_polarity | bool | read-write | true | Phase-invert the side channel when applying it to the right channel of the LR output. If input_format is lr_stereo this is usually the right thing to do. If input_format is ms_stereo it is a matter of taste. |
| mid_amount | float | read-write | 1 | The amount of the mid channel to include in the output. Floating point value from 0.0 to 1.0. |
| side_amount | float | read-write | 1 | The amount of the side channel to include in the output. Floating point value from 0.0 to 1.0. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/mid_side",
"body": {
"enabled": false,
"input_format": "lr_stereo",
"invert_polarity": true,
"mid_amount": 1.0,
"side_amount": 1.0
}
}
/audio/strips/{strip index}/filters/pan
Panning filter
resource: /audio/strips/{strip index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/pan",
"body": {
"value": 0.0
}
}
/audio/strips/{strip index}/input
Input settings for a strip.
resource: /audio/strips/{strip index}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| first_channel | uint32 | read-write | 0 | The index of the first audio channel. This is the left channel for stereo. For mid/side stereo, this is the mid channel. The index refers to the channel index in the referenced input_slot. |
| input_slot | uint32 | read-write | 0 | The input slot of the Rendering Engine that audio is taken from. |
| is_stereo | bool | read-write | false | True if the input audio should be treated as stereo, false for mono. For mono only first_channel will be used. For stereo first_channel will be left and second_channel will be right. |
| second_channel | uint32 | read-write | 1 | The index of the second audio channel. This is the right channel for regular stereo and for mid/side stereo, this is the side channel. The index refers to the channel index in the referenced input_slot. Only used in stereo mode. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/input",
"body": {
"first_channel": 0,
"input_slot": 0,
"is_stereo": false,
"second_channel": 1
}
}
/audio/strips/{strip index}/input_meter
Peak loudness meter for incoming audio, measured before the filters of this input strip. This meter will either have one streaming parameter called ‘peak’ in case the strip is in mono mode, else two streaming parameters ‘peak_left’ and ‘peak_right’ will replace the ‘peak’ parameter when in stereo mode.
resource: /audio/strips/{strip index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak | float | The peak loudness for a mono channel |
/audio/strips/{strip index}/post_fader_meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this input strip. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/strips/{strip index}/pre_fader_meter
Peak loudness meter for filtered audio, measured after the filters of this input strip, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/html
The Rendering Engine features a built-in HTML renderer which uses the Chromium web browser engine to render HTML pages. This resource can create and close HTML renderers.
resource: /html
Commands
close
Close the HTML renderer instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the HTML browser to close |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new HTML renderer instance with the canvas size of width x height pixels and output the rendered frames to the given input slot, if url is set it will be loaded on startup, otherwise about:blank is loaded.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new browser to, cannot be 0 |
| width | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s width |
| height | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s height |
| url | string | optional | The optional URL to load at creation of the browser |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"width": <uint32>,
"height": <uint32>,
"url": string
}
}
}
reset
Close all open HTML renderers
Command template
{
"type": "command",
"resource": "/html",
"body": {
"command": "reset"
}
}
/html/{input slot}
This resource controls an HTML renderer instance and allows loading of new URLs and executing JavaScript snippets.
resource: /html/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| height | uint32 | read-only | 1080 | The height in pixels of this HTML renderer canvas |
| url | string | read-only | Currently loaded URL | |
| width | uint32 | read-only | 1920 | The width in pixels of this HTML renderer canvas |
Commands
execute
Execute JavaScript in this HTML renderer. The JavaScript snippet might span over multiple lines and may contain spaces.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| javascript | string | required | The JavaScript snippet to execute in this browser. The snippet might span over multiple lines. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "execute",
"parameters": {
"javascript": <string>
}
}
}
load
Load a new URL in this HTML renderer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| url | string | required | The new URL to load in this browser |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "load",
"parameters": {
"url": <string>
}
}
}
/media
The Rendering Engine can create media player instances to play video and audio files from the hard drive of the machine running the Rendering Engine. It is up to the user of the API to ensure the files are uploaded to the machines running the Rendering Engine(s) before trying to run them. The media players use the FFmpeg library to demux and decode the media files, so most files supported by FFmpeg should work. This resource can create and close media players.
resource: /media
Commands
close
Close the media player instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the media player to close. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new media player instance and output the rendered frames to the given input slot. If the path is set, it will be loaded at startup
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new media player to, cannot be 0 |
| path | string | optional | The path of the media file to load into this media player |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"path": string
}
}
}
reset
Close all media players
Command template
{
"type": "command",
"resource": "/media",
"body": {
"command": "reset"
}
}
/media/{input slot}
This resource controls a media player instance. The media players have three parameters that can be set to control if only a portion of the file should be played, and if the playback should loop once it reaches the end. See the section_start_ms, section_duration_ms and loop parameters below.
resource: /media/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| is_playing | bool | read-only | false | Playback state of this media player |
| loop | bool | read-write | false | Controls the looping behavior of the media player. Set to true to loop from the section start once the media playback reaches the end of the section or the end of the file |
| media_duration_ms | int32 | read-only | -1 | The total duration of the currently loaded media file in milliseconds |
| path | string | read-only | The path to the currently loaded media file | |
| section_duration_ms | uint32 | read-write | 4294967295 | Duration in milliseconds of section window, counted from the section start time |
| section_start_ms | uint32 | read-write | 0 | Start time in milliseconds of section window, counted from the beginning of the media file |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/media/{input slot}",
"body": {
"loop": false,
"section_duration_ms": 4294967295,
"section_start_ms": 0
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| current_time_ms | int32 | Current play time in milliseconds |
| time_left_ms | int32 | Time left in milliseconds |
Commands
load
Load a media file into this media player and pause playback on the first frame. This will also reset the start, duration, section and looping parameters of this media player.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| path | string | required | The path to the new media file to load |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "load",
"parameters": {
"path": <string>
}
}
}
pause
Pause the playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "pause"
}
}
play
Start/resume playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "play"
}
}
seek
Seek to a given time point, in milliseconds, from the start of the media file and pause the playback.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| time_ms | int32 | required | The time in milliseconds from the beginning of the file to seek to |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "seek",
"parameters": {
"time_ms": <int32>
}
}
}
/ndi_audio
The external NDI audio mixer bridge
resource: /ndi_audio
/ndi_audio/outputs
All audio outputs from this component
resource: /ndi_audio/outputs
/ndi_audio/outputs/{output bus}
An output from this component consisting of audio from one or more NDI return streams
resource: /ndi_audio/outputs/{output bus}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | main | The name of this output |
/ndi_audio/outputs/{output bus}/channels
The list of channels for one output
resource: /ndi_audio/outputs/{output bus}/channels
/ndi_audio/outputs/{output bus}/channels/0
An output channel
resource: /ndi_audio/outputs/{output bus}/channels/0
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| return_channel | uint32 | read-write | 0 | The channel to take audio from |
| return_stream | uint32 | read-write | 0 | The return stream to take audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/outputs/{output bus}/channels/0",
"body": {
"return_channel": 0,
"return_stream": 0
}
}
/ndi_audio/outputs/{output bus}/channels/1
An output channel
resource: /ndi_audio/outputs/{output bus}/channels/1
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| return_channel | uint32 | read-write | 0 | The channel to take audio from |
| return_stream | uint32 | read-write | 0 | The return stream to take audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/outputs/{output bus}/channels/1",
"body": {
"return_channel": 0,
"return_stream": 0
}
}
/ndi_audio/return_streams
All streams that returns audio from the external audio mixer
resource: /ndi_audio/return_streams
Commands
add_stream
Add a new stream for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
/ndi_audio/return_streams/{return stream index}
A stream which returns audio from the external audio mixer
resource: /ndi_audio/return_streams/{return stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI return stream matching the name of an NDI sender on the network. The name is set when creating the stream using the add_stream command. |
/ndi_audio/send_streams
All streams to send to the external audio mixer
resource: /ndi_audio/send_streams
Commands
add_stream
Add a new stream for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
/ndi_audio/send_streams/{send stream index}
A stream to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI send stream. The name is set when creating the stream using the add_stream command. |
Commands
disable_channel
Disable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to disable |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "disable_channel",
"parameters": {
"index": <uint32>
}
}
}
enable_channel
Enable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to enable |
| input_slot | uint32 | optional | The input slot to send audio from. |
| channel | uint32 | optional | The index of the channel within the input slot to send audio from |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "enable_channel",
"parameters": {
"index": <uint32>,
"input_slot": uint32,
"channel": uint32
}
}
}
/ndi_audio/send_streams/{send stream index}/channels
List of audio channels to send
resource: /ndi_audio/send_streams/{send stream index}/channels
/ndi_audio/send_streams/{send stream index}/channels/{channel index}
A channel to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}/channels/{channel index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| channel | uint32 | read-write | 0 | The index of the channel within the input slot to send audio from |
| input_slot | uint32 | read-write | 0 | The input slot to send audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/send_streams/{send stream index}/channels/{channel index}",
"body": {
"channel": 0,
"input_slot": 0
}
}
/video
The root resource of the video mixer
resource: /video
Commands
reset
Reset the runtime state of all the nodes in the video mixer back to their default configuration.
Command template
{
"type": "command",
"resource": "/video",
"body": {
"command": "reset"
}
}
/video/nodes
The nodes of the video mixer
resource: /video/nodes
/video/nodes/{node name} type: alpha_combine
A node to combine the color channels of one video stream with the alpha from another. This node is useful for video sources where the alpha channel is provided as a separate black and white video source that must be combined with the color source. The node supports multiple modes of obtaining the alpha, either by copying a specific color or alpha channel of some input slot, or by taking the average of the R, G and B channels of the video from some input slot.
resource: /video/nodes/{node name} type: alpha_combine
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| alpha | uint32 | read-write | 0 | The input slot to get the alpha input source from |
| color | uint32 | read-write | 0 | The input slot to get the color input source from |
| mode | string | read-write | average-rgb | The mode to use for combining the color and alpha input sources (copy-r, copy-g, copy-b, copy-a, average-rgb) |
| type | string | read-only | alpha_combine | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"alpha": 0,
"color": 0,
"mode": "average-rgb"
}
}
/video/nodes/{node name} type: alpha_over
A node to combine two video streams using alpha over compositing, overlaying the foreground stream on the background stream. The node will keep the transparency of both layers. The overlay stream can be faded in and out of the background stream.
resource: /video/nodes/{node name} type: alpha_over
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The compositing factor. Range 0.0 to 1.0, where 0.0 means that the overlay is not composited on to the background and 1.0 means the overlay is fully visible on top of the background input. |
| type | string | read-only | alpha_over | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade away the overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to fully visible overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
/video/nodes/{node name} type: chroma_key
A node to perform chroma keying on an incoming video stream. The output video stream will have the alpha and possibly the color channels modified, according to the parameter values in this node. To remove a color from the incoming video stream, first enable the node and then select the key color to remove. The key color can be selected in two ways, either by manually setting the color with the R, G and B channel values, or by using the color picker. When using the color picker, the color picker command will define the position and size of the color picker square to sample the incoming video stream. The R, G and B color parameters will be updated according to the average color of the area when the command was received by the Rendering Engine. The currently selected color can be shown in the upper left hand corner in the output video stream of the node by setting the parameter show_key_color to true. Also, the latest sampled color picker area can be drawn in the node’s output by setting show_color_picker to true. When a suitable color has been chosen, adjust the distance and falloffparameters to get a clear mask. To aid the tweaking of the parameters, set the show_alpha parameter to true. This will make the node output the black and white mask instead of the keyed result, which makes it easier to see which parts are masked away and not. Remember to turn this off before going on air. As a last step, any remaining fringes of the key color around the subject can be desaturated with the color_spill parameter. But remember this will desaturate colors close to the key color even in parts of the frame fully visible.
resource: /video/nodes/{node name} type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| color_spill | float | read-write | 0.1 | Desaturation factor of colors that are close to the key color, without changing the alpha. Range 0.0 to 1.0, where 0.0 keeps the current saturation. |
| distance | float | read-write | 0.1 | The maximum deviation from the selected key color that is also considered part of the color to mask away. Range 0.0 to 1.0, where 0.0 means only the exact key color will be removed and greater values means more colors further away from the key color are removed. |
| enabled | bool | read-write | false | When set to true the node will be enabled, false will just bypass the node. |
| falloff | float | read-write | 0.08 | The falloff factor used to smooth out the edge in the mask between which colors are fully removed and which are fully kept, by making the colors in between semi-transparent. Range 0.0 to 1.0, where 0.0 means sharp edges. |
| show_alpha | bool | read-write | false | Switch on to show the resulting alpha channel as output instead of the keyed result, useful to easier see which parts are masked away and which are not. Make sure to turn this off before going on air. |
| show_color_picker | bool | read-write | false | Controls the visibility of the color picker area in the output video. The marker will show the latest sampled area in the video stream. Make sure to turn this off before going on air. |
| show_key_color | bool | read-write | false | Controls the visibility of the currently used key color as a small square in the upper left corner of the image. Make sure to turn this off before going on air. |
| type | string | read-only | chroma_key | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"color_spill": 0.1,
"distance": 0.1,
"enabled": false,
"falloff": 0.08,
"show_alpha": false,
"show_color_picker": false,
"show_key_color": false
}
}
Commands
pick_color
Given a size and location, pick a color in the current video frame. The picked color will be the average color in the square defined by the parameters.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| size | uint32 | required | Size in pixels of the color picker square |
| x | float | required | X position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
| y | float | required | Y position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "pick_color",
"parameters": {
"size": <uint32>,
"x": <float>,
"y": <float>
}
}
}
/video/nodes/{node name}/key_color type: chroma_key
The key color
resource: /video/nodes/{node name}/key_color type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| b | float | read-write | 0 | The blue channel, in range 0.0 to 1.0 |
| g | float | read-write | 0 | The green channel, in range 0.0 to 1.0 |
| r | float | read-write | 0 | The red channel, in range 0.0 to 1.0 |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}/key_color",
"body": {
"b": 0.0,
"g": 0.0,
"r": 0.0
}
}
/video/nodes/{node name} type: crop
A node to crop the incoming video stream. The node can crop the left, right, top and bottom edge of the incoming video stream. The areas outside of the cropped area will be transparent in the output.
resource: /video/nodes/{node name} type: crop
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| bottom | float | read-write | 1 | Position of the bottom crop edge, in percent of the image’s height |
| left | float | read-write | 0 | Position of the left crop edge, in percent of the image’s width |
| right | float | read-write | 1 | Position of the right crop edge, in percent of the image’s width |
| top | float | read-write | 0 | Position of the top crop edge, in percent of the image’s height |
| type | string | read-only | crop | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"bottom": 1.0,
"left": 0.0,
"right": 1.0,
"top": 0.0
}
}
/video/nodes/{node name} type: fade_to_black
A node to fade the incoming video stream to and from black.
resource: /video/nodes/{node name} type: fade_to_black
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The factor, where 1.0 means the output will be fully black and 0.0 means the input will be passed through unmodified. |
| type | string | read-only | fade_to_black | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade from a fully black frame to the input video stream over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to a fully black frame over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
/video/nodes/{node name} type: output
A node to mark an output point from the video mixer.
resource: /video/nodes/{node name} type: output
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| type | string | read-only | output | The video node type |
/video/nodes/{node name} type: select
A node to select a video source from the input slots and send it on to the next node.
resource: /video/nodes/{node name} type: select
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| input | uint32 | read-write | 0 | Which input slot the video stream is currently picked from |
| type | string | read-only | select | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"input": 0
}
}
/video/nodes/{node name} type: transform
A node to transform an incoming video stream, by scaling and transposing it. The canvas size of the input will be kept and all surrounding area in case the source video is shrunk, is filled with transparent black.
resource: /video/nodes/{node name} type: transform
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| scale | float | read-write | 1 | The relative scale of the video stream. Use 1.0 for original scale. |
| type | string | read-only | transform | The video node type |
| x | float | read-write | 0 | The X position of the upper left corner of the image as a fraction of the canvas’ width. For example use 0.0 to snap it to the left edge, or 0.5 to the center of the image |
| y | float | read-write | 0 | The Y position of the upper left corner of the image as a fraction of the canvas’ height. For example use 0.0 to snap it to the top edge, or 0.5 to the center of the image |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"scale": 1.0,
"x": 0.0,
"y": 0.0
}
}
/video/nodes/{node name} type: transition
The transition node picks a program and a preview video source from the input slots and forward these to other nodes. The node also features auto transitions between the program and the preview sources. Some transition commands last over a duration of time, for example wipes. These can be performed either automatically or manually. The automatic mode works by the operator first selecting the type of transition, for instance a fade, setting the preview to the input slot to fade to and then trigger the transition at the right time with a auto command with the duration for the transition. In manual mode the exact position of the transition is set by the control panel by setting the factor parameter. This is used for implementing T-bars, where the T-bar repeatedly sends the current position of the bar. In the manual mode, the transition type is set before the transition begins, just as in the automatic mode. Note that an automatic transition will be overridden in case the transition position/factor is manually set, by interrupting the automatic transition and jumping to the manually set position.
resource: /video/nodes/{node name} type: transition
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The mix factor between the program and the preview input source, in the range 0.0 to 1.0. For example 0.3 means 30% transition from program to preview. The visible effect is dependent on the transition mode used. |
| mode | string | read-write | fade | The transition mode to use (fade, wipe_left, wipe_right) |
| preview | uint32 | read-write | 0 | The currently used input slot for the preview |
| program | uint32 | read-write | 0 | The currently used input slot for the program |
| type | string | read-only | transition | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0,
"mode": "fade",
"preview": 0,
"program": 0
}
}
Commands
auto
Start an auto transition with the currently selected transition type over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration in milliseconds of the automatic transition |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "auto",
"parameters": {
"duration_ms": <uint32>
}
}
}
cut
Make a cut by swapping the program and preview inputs
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "cut"
}
}
/video/nodes/{node name} type: video_delay
A node to delay the video stream a given number of frames.
resource: /video/nodes/{node name} type: video_delay
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| delay | uint32 | read-write | 0 | The number of frames to delay the video |
| type | string | read-only | video_delay | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"delay": 0
}
}
6.1.5 - C++ SDK
Ateliere Live C++ SDK reference.
6.1.5.1 - Classes
- namespace Acl
- namespace AclLog
A namespace for logging utilities.- class FileLocationFormatterFlag
A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. - class ThreadNameFormatterFlag
- class FileLocationFormatterFlag
- class ControlDataAddress
A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start. - namespace ControlDataCommon
- struct ConnectionEvent
A connection related event. - struct Response
A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. - struct StatusMessage
A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from.
- struct ConnectionEvent
- class ControlDataSender
A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers.- struct Settings
Settings for a ControlDataSender.
- struct Settings
- class ISystemControllerInterface
An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. - class SystemControllerConnection
An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket.- struct Settings
Settings for a SystemControllerConnection.
- struct Settings
- class UUID
A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard.
- namespace AclLog
- namespace fmt
- namespace spdlog
6.1.5.1.1 - Acl::AclLog::FileLocationFormatterFlag
Acl::AclLog::FileLocationFormatterFlag Class Reference
A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call.
#include <AclLog.h>
Inherits from spdlog::custom_flag_formatter
Public Functions
| Name | |
|---|---|
| void | format(const spdlog::details::log_msg & msg, const std::tm & , spdlog::memory_buf_t & dest) override |
| std::unique_ptr< custom_flag_formatter > | clone() const override |
Public Functions Documentation
function format
inline void format(
const spdlog::details::log_msg & msg,
const std::tm & ,
spdlog::memory_buf_t & dest
) override
function clone
inline std::unique_ptr< custom_flag_formatter > clone() const override
6.1.5.1.2 - Acl::AclLog::ThreadNameFormatterFlag
Acl::AclLog::ThreadNameFormatterFlag Class Reference
Inherits from spdlog::custom_flag_formatter
Public Functions
| Name | |
|---|---|
| void | format(const spdlog::details::log_msg & , const std::tm & , spdlog::memory_buf_t & dest) override |
| std::unique_ptr< custom_flag_formatter > | clone() const override |
Public Functions Documentation
function format
inline void format(
const spdlog::details::log_msg & ,
const std::tm & ,
spdlog::memory_buf_t & dest
) override
function clone
inline std::unique_ptr< custom_flag_formatter > clone() const override
6.1.5.1.3 - Acl::ControlDataAddress
Acl::ControlDataAddress Class Reference
A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start.
#include <ControlDataAddress.h>
Public Functions
| Name | |
|---|---|
| ControlDataAddress() =default Default constructor for an empty address. | |
| ControlDataAddress(const UUID & destinationUUID) Constructor which creates an address with the final destination UUID. | |
| size_t | size() const Returns the number of parts of the address that is currently stored. |
| bool | empty() const Check if address is empty or contains any parts. |
| bool | extend(const UUID & uuid) Extend the address with a new UUID that must be passed to get to the next UUID in the address. |
| bool | extend(const ControlDataAddress & address) Extend the address with all UUIDs in another ControlDataAddress. The UUIDs will be added in the same order as in the other ControlDataAddress to the beginning of this ControlDataAddress (i.e. the UUIDs in the other ControlDataAddress must be passed before the UUIDs in this ControlDataAddress to reach the final destination) |
| bool | hasWildcard() const |
| bool | currentUuidIsWildcard() const |
| bool | currentUuidMatch(const UUID & uuid) const Check if the uuid match the first UUID of the address. |
| bool | fullAddressMatch(const ControlDataAddress & other) const Check if another address matches this address. This check might pass in two ways: |
| std::optional< UUID > | getCurrentUuid() const |
| std::optional< UUID > | moveToAndGetNextUuid() Move to the next UUID in the address, by removing the current one, and return the next UUID of the address. In case there was at least one UUID in the address, the size of the address will be decreased by one. |
| std::vector< uint8_t > | pack() const Pack a ControlDataAddress into a byte vector. |
| std::string | toString() const |
| bool | operator==(const ControlDataAddress & other) const Compare this ControlDataAddress for equality to another ControlDataAddress. |
| bool | operator!=(const ControlDataAddress & other) const Compare this ControlDataAddress for non-equality to another ControlDataAddress. |
| std::optional< ControlDataAddress > | unpack(const std::vector< uint8_t >::const_iterator & packedBegin, const std::vector< uint8_t >::const_iterator & packedEnd) Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything. |
| std::optional< ControlDataAddress > | unpack(const uint8_t * packedBegin, const uint8_t * packedEnd) Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything. |
Friends
| Name | |
|---|---|
| std::ostream & | operator«(std::ostream & stream, const ControlDataAddress & address) Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’. |
Public Functions Documentation
function ControlDataAddress
ControlDataAddress() =default
Default constructor for an empty address.
function ControlDataAddress
explicit ControlDataAddress(
const UUID & destinationUUID
)
Constructor which creates an address with the final destination UUID.
Parameters:
- destinationUUID The destination UUID of the address
function size
size_t size() const
Returns the number of parts of the address that is currently stored.
Return: The number of parts of the address that is currently stored
function empty
bool empty() const
Check if address is empty or contains any parts.
Return: True if there are no parts left in the address, false otherwise.
function extend
bool extend(
const UUID & uuid
)
Extend the address with a new UUID that must be passed to get to the next UUID in the address.
Parameters:
- uuid The new UUID to add to the address.
Return: False in case an omni UUID is passed to a non-empty ControlDataAddress
function extend
bool extend(
const ControlDataAddress & address
)
Extend the address with all UUIDs in another ControlDataAddress. The UUIDs will be added in the same order as in the other ControlDataAddress to the beginning of this ControlDataAddress (i.e. the UUIDs in the other ControlDataAddress must be passed before the UUIDs in this ControlDataAddress to reach the final destination)
Parameters:
- address The ControlDataAddress with UUIDs to add to this address.
Return: False in case @address contains an omni UUID
function hasWildcard
bool hasWildcard() const
Return: True if the address ends with a wildcard UUID (the special omni UUID), false otherwise.
function currentUuidIsWildcard
bool currentUuidIsWildcard() const
Return: True if the first UUID in the address is a wildcard UUID (the special omni UUID), false otherwise.
function currentUuidMatch
bool currentUuidMatch(
const UUID & uuid
) const
Check if the uuid match the first UUID of the address.
Parameters:
- uuid The UUID to match against
Return: True if the UUID is the same as the first UUID in the address, or in case the first UUID of the address is a wildcard UUID, false otherwise.
function fullAddressMatch
bool fullAddressMatch(
const ControlDataAddress & other
) const
Check if another address matches this address. This check might pass in two ways:
- Both addresses are identical
- At least one of the addresses includes a wildcard, and the other address is identical up to that wildcard otherThe address to match against.
True if the addresses match either because they are equal, or in case they are equal up to a wildcard in either address, false otherwise.
function getCurrentUuid
std::optional< UUID > getCurrentUuid() const
Return: The first UUID of the address, or an empty optional in case there are no more UUIDs in the address.
function moveToAndGetNextUuid
std::optional< UUID > moveToAndGetNextUuid()
Move to the next UUID in the address, by removing the current one, and return the next UUID of the address. In case there was at least one UUID in the address, the size of the address will be decreased by one.
Return: The next UUID of the address, or an empty optional in case there are no more UUIDs in the address.
function pack
std::vector< uint8_t > pack() const
Pack a ControlDataAddress into a byte vector.
Return: A vector with the packed message address.
function toString
std::string toString() const
Return: A string representation of the ControlDataAddress with ‘:’ separated UUIDs.
function operator==
bool operator==(
const ControlDataAddress & other
) const
Compare this ControlDataAddress for equality to another ControlDataAddress.
Parameters:
- other The other ControlDataAddress to compare this ControlDataAddress to
Return: True if the ControlDataAddresses are identical, false otherwise
function operator!=
bool operator!=(
const ControlDataAddress & other
) const
Compare this ControlDataAddress for non-equality to another ControlDataAddress.
Parameters:
- other The other ControlDataAddress to compare this ControlDataAddress to
Return: False if the ControlDataAddresses are identical, true otherwise
function unpack
static std::optional< ControlDataAddress > unpack(
const std::vector< uint8_t >::const_iterator & packedBegin,
const std::vector< uint8_t >::const_iterator & packedEnd
)
Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything.
Parameters:
- packedBegin Iterator to the start of the vector to unpack.
- packedEnd Iterator to the end of the vector to unpack.
Return: A ControlDataAddress if unpack was successful, std::nullopt if it failed.
function unpack
static std::optional< ControlDataAddress > unpack(
const uint8_t * packedBegin,
const uint8_t * packedEnd
)
Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything.
Parameters:
- packedBegin Pointer to the first byte of the address to unpack
- packedEnd Pointer to the last byte of the address to unpack
Return: A ControlDataAddress if unpack was successful, std::nullopt if it failed.
Friends
friend operator«
friend std::ostream & operator<<(
std::ostream & stream,
const ControlDataAddress & address
);
Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’.
Parameters:
- stream The stream to print to
- address The address to print
Return: Reference to the output stream
6.1.5.1.4 - Acl::ControlDataCommon::ConnectionEvent
Acl::ControlDataCommon::ConnectionEvent Struct Reference
A connection related event.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| EventType | mEventType |
| ControlDataAddress | mAddress The type of event that occurred. |
| UUID | mEventNode The address of the node that detected the event. |
Public Attributes Documentation
variable mEventType
EventType mEventType = EventType::kDisconnect;
variable mAddress
ControlDataAddress mAddress;
The type of event that occurred.
variable mEventNode
UUID mEventNode;
The address of the node that detected the event.
6.1.5.1.5 - Acl::ControlDataCommon::Response
Acl::ControlDataCommon::Response Struct Reference
A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| std::string | mMessage |
| uint64_t | mRequestId The actual message. |
| UUID | mFromUUID The ID of the request this is a response to. |
| ControlDataAddress | mRecipient The UUID of the responder. |
Public Attributes Documentation
variable mMessage
std::string mMessage;
variable mRequestId
uint64_t mRequestId = 0;
The actual message.
variable mFromUUID
UUID mFromUUID;
The ID of the request this is a response to.
variable mRecipient
ControlDataAddress mRecipient;
The UUID of the responder.
6.1.5.1.6 - Acl::ControlDataCommon::StatusMessage
Acl::ControlDataCommon::StatusMessage Struct Reference
A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| std::string | mMessage |
| UUID | mFromUUID The actual message. |
| ControlDataAddress | mRecipient The UUID of the sender. |
Public Attributes Documentation
variable mMessage
std::string mMessage;
variable mFromUUID
UUID mFromUUID;
The actual message.
variable mRecipient
ControlDataAddress mRecipient;
The UUID of the sender.
6.1.5.1.7 - Acl::ControlDataSender
Acl::ControlDataSender Class Reference
A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers.
#include <ControlDataSender.h>
Public Classes
| Name | |
|---|---|
| struct | Settings Settings for a ControlDataSender. |
Public Types
| Name | |
|---|---|
| enum class | SendRequestStatus { kSuccess, kFailed, kSendFailedForSome, kSenderNotConfigured, kNoConnectedReceiver, kInternalError} |
Public Functions
| Name | |
|---|---|
| ControlDataSender() Default constructor, creates an empty object. | |
| ~ControlDataSender() Destructor. Will disconnect from the connected receivers and close the System controller connection. | |
| bool | configure(const std::shared_ptr< ISystemControllerInterface > & controllerInterface, const Settings & settings) const Configure this ControlDataSender and connect it to the System Controller. This method will fail in case the ISystemControllerInterface has already been connected to the controller by another component, as such interface can only be used by one component. |
| SendRequestStatus | sendRequestToReceivers(std::string_view request, uint64_t & requestId, const UUID & requester =UUID::kNilUUID, int8_t hops =-1) const Send a request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback. |
| std::vector< UUID > | getDirectlyConnectedReceivers() const Get a list of the UUIDs of all receivers that are directly connected to this ControlDataSender. Useful for checking if this ControlDataSender is connected to something that will receive the control commands sent. |
| ControlDataSender(ControlDataSender const & ) =delete | |
| ControlDataSender & | operator=(ControlDataSender const & ) =delete |
| std::string | getVersion() Get application version. |
Public Types Documentation
enum SendRequestStatus
| Enumerator | Value | Description |
|---|---|---|
| kSuccess | Request was successfully sent. | |
| kFailed | Failed to send the request to any connected receivers. | |
| kSendFailedForSome | Multiple receivers are connected but not all received the message. | |
| kSenderNotConfigured | Cannot send messages before sender is configured. | |
| kNoConnectedReceiver | There is no connected receiver. | |
| kInternalError | Check the logs for error. |
Public Functions Documentation
function ControlDataSender
ControlDataSender()
Default constructor, creates an empty object.
function ~ControlDataSender
~ControlDataSender()
Destructor. Will disconnect from the connected receivers and close the System controller connection.
function configure
bool configure(
const std::shared_ptr< ISystemControllerInterface > & controllerInterface,
const Settings & settings
) const
Configure this ControlDataSender and connect it to the System Controller. This method will fail in case the ISystemControllerInterface has already been connected to the controller by another component, as such interface can only be used by one component.
Parameters:
- controllerInterface The interface to the System controller, used for communicating with this ControlDataSender
- settings The Settings to use for this ControlDataSender
Return: True on success, false otherwise
function sendRequestToReceivers
SendRequestStatus sendRequestToReceivers(
std::string_view request,
uint64_t & requestId,
const UUID & requester =UUID::kNilUUID,
int8_t hops =-1
) const
Send a request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback.
Parameters:
- request The request message
- requestId The unique identifier of this request. Used to identify the async responses.
- requester UUID that identifies the entity that sent the request, can be used if the ControlDataSender serves multiple clients and need to distinguish between them when receiving responses. A value of the nil UUID indicates that the requester field will not be used.
- hops The number of hops the message should be delivered/forwarded. A value of 1 means to all connected receivers, but not further. A value of 2 means all connected receivers to this sender, and all connected receivers to those, but not further, and so on. A value of -1 means infinity.
Return: True if the request was successfully sent, false otherwise
function getDirectlyConnectedReceivers
std::vector< UUID > getDirectlyConnectedReceivers() const
Get a list of the UUIDs of all receivers that are directly connected to this ControlDataSender. Useful for checking if this ControlDataSender is connected to something that will receive the control commands sent.
Return: A list of all receivers that are connected directly to this ControlDataSender
function ControlDataSender
ControlDataSender(
ControlDataSender const &
) =delete
function operator=
ControlDataSender & operator=(
ControlDataSender const &
) =delete
function getVersion
static std::string getVersion()
Get application version.
Return: a string with the current version, e.g. “6.0.0-39-g60a35937”
6.1.5.1.8 - Acl::ControlDataSender::Settings
Acl::ControlDataSender::Settings Struct Reference
Settings for a ControlDataSender.
#include <ControlDataSender.h>
Public Attributes
| Name | |
|---|---|
| std::function< void(const ControlDataCommon::Response &)> | mResponseCallback |
| std::function< void(const ControlDataCommon::StatusMessage &)> | mStatusMessageCallback |
| std::function< void(const ControlDataCommon::ConnectionEvent &)> | mConnectionEventCallback |
Public Attributes Documentation
variable mResponseCallback
std::function< void(const ControlDataCommon::Response &)> mResponseCallback;
variable mStatusMessageCallback
std::function< void(const ControlDataCommon::StatusMessage &)> mStatusMessageCallback;
variable mConnectionEventCallback
std::function< void(const ControlDataCommon::ConnectionEvent &)> mConnectionEventCallback;
6.1.5.1.9 - Acl::ISystemControllerInterface
Acl::ISystemControllerInterface Class Reference
An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server.
#include <ISystemControllerInterface.h>
Inherited by Acl::SystemControllerConnection
Public Classes
| Name | |
|---|---|
| struct | Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | StatusCode { SUCCESS = 3001, TOO_MANY_REQUESTS = 3101, UUID_ALREADY_REGISTERED = 3201, FORMAT_ERROR = 3202, ALREADY_CONFIGURED = 3203, OUT_OF_RESOURCES = 3204, NOT_FOUND = 3205, INTERNAL_ERROR = 3206, CONNECTION_FAILED = 3207, TIMEOUT_EXCEEDED = 3208, KEY_MISMATCH = 3209, UNKNOWN_REQUEST = 3210, MALFORMED_REQUEST = 3211, ALREADY_IN_USE = 3212, VERSION_MISMATCH = 3213} Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1. |
Public Functions
| Name | |
|---|---|
| virtual | ~ISystemControllerInterface() =default Virtual destructor. |
| virtual std::optional< std::string > | sendMessage(const std::string & messageTitle, const nlohmann::json & parameters) =0 Send a message containing a JSON object to the controller. |
| virtual bool | registerRequestCallback(const Callbacks & callbacks) =0 Register the callbacks to call for events in this class. |
| virtual bool | connect() =0 Connect to the System controller. |
| virtual bool | disconnect() =0 Disconnect from the System controller. |
| virtual bool | isConnected() const =0 |
| virtual UUID | getUUID() const =0 |
Public Types Documentation
enum StatusCode
| Enumerator | Value | Description |
|---|---|---|
| SUCCESS | 3001 | 3000-3099 Info/Notifications |
| TOO_MANY_REQUESTS | 3101 | 3100-3199 Warnings |
| UUID_ALREADY_REGISTERED | 3201 | 3200-3299 Error |
| FORMAT_ERROR | 3202 | |
| ALREADY_CONFIGURED | 3203 | |
| OUT_OF_RESOURCES | 3204 | |
| NOT_FOUND | 3205 | |
| INTERNAL_ERROR | 3206 | |
| CONNECTION_FAILED | 3207 | |
| TIMEOUT_EXCEEDED | 3208 | |
| KEY_MISMATCH | 3209 | |
| UNKNOWN_REQUEST | 3210 | |
| MALFORMED_REQUEST | 3211 | |
| ALREADY_IN_USE | 3212 | |
| VERSION_MISMATCH | 3213 |
Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1.
Public Functions Documentation
function ~ISystemControllerInterface
virtual ~ISystemControllerInterface() =default
Virtual destructor.
function sendMessage
virtual std::optional< std::string > sendMessage(
const std::string & messageTitle,
const nlohmann::json & parameters
) =0
Send a message containing a JSON object to the controller.
Parameters:
- messageTitle The title of the status type or request
- parameters The parameters part of the JSON message
Return: Optional containing an error message on error, else nullopt in case the message was successfully sent
Reimplemented by: Acl::SystemControllerConnection::sendMessage
function registerRequestCallback
virtual bool registerRequestCallback(
const Callbacks & callbacks
) =0
Register the callbacks to call for events in this class.
Parameters:
- callbacks The callbacks to use when events in this class happen
Return: True on successful registration, false if some callback is not set or if already connected
Reimplemented by: Acl::SystemControllerConnection::registerRequestCallback
function connect
virtual bool connect() =0
Connect to the System controller.
Return: True on successful connection, false on error or if already connected
Reimplemented by: Acl::SystemControllerConnection::connect
function disconnect
virtual bool disconnect() =0
Disconnect from the System controller.
Return: True on successful disconnection, false on error or if not connected
Reimplemented by: Acl::SystemControllerConnection::disconnect
function isConnected
virtual bool isConnected() const =0
Return: True if connected to the System controller, false otherwise
Reimplemented by: Acl::SystemControllerConnection::isConnected
function getUUID
virtual UUID getUUID() const =0
Return: The UUID of this interface to the System controller
Reimplemented by: Acl::SystemControllerConnection::getUUID
6.1.5.1.10 - Acl::ISystemControllerInterface::Callbacks
Acl::ISystemControllerInterface::Callbacks Struct Reference
A struct containing the callbacks that needs to be registered by the component using this interface.
#include <ISystemControllerInterface.h>
Public Attributes
| Name | |
|---|---|
| std::function< Response(const std::string &, const nlohmann::json &)> | mRequestCallback |
| std::function< void(uint32_t, const std::string &, const std::error_code &)> | mConnectionClosedCallback |
Public Attributes Documentation
variable mRequestCallback
std::function< Response(const std::string &, const nlohmann::json &)> mRequestCallback;
variable mConnectionClosedCallback
std::function< void(uint32_t, const std::string &, const std::error_code &)> mConnectionClosedCallback;
6.1.5.1.11 - Acl::ISystemControllerInterface::Response
Acl::ISystemControllerInterface::Response Struct Reference
A response to a request, consists of a status code and an (optional) parameters JSON object.
#include <ISystemControllerInterface.h>
Public Attributes
| Name | |
|---|---|
| StatusCode | mCode |
| nlohmann::json | mParameters |
Public Attributes Documentation
variable mCode
StatusCode mCode;
variable mParameters
nlohmann::json mParameters;
6.1.5.1.12 - Acl::SystemControllerConnection
Acl::SystemControllerConnection Class Reference
An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket.
#include <SystemControllerConnection.h>
Inherits from Acl::ISystemControllerInterface
Public Classes
| Name | |
|---|---|
| struct | Settings Settings for a SystemControllerConnection. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | ComponentType { kIngest, kPipeline, kControlPanel} Enumeration of component types the component using this SystemControllerConnection can tell the System Controller to be seen as. |
Public Functions
| Name | |
|---|---|
| SystemControllerConnection() | |
| ~SystemControllerConnection() override | |
| bool | configure(const Settings & settings) Configure this connection. This method should be called before calling. |
| virtual bool | connect() override Connect to the server using the settings set with the. |
| virtual bool | isConnected() const override |
| virtual UUID | getUUID() const override |
| virtual std::optional< std::string > | sendMessage(const std::string & messageTitle, const nlohmann::json & parameters) override Send a message containing a JSON object to the system controller server. |
| virtual bool | disconnect() override Disconnect from the server. |
| virtual bool | registerRequestCallback(const Callbacks & callbacks) override Register callbacks to call when getting requests from the server or the server connection is lost. |
| SystemControllerConnection(SystemControllerConnection const & ) =delete | |
| SystemControllerConnection(SystemControllerConnection && ) =delete | |
| SystemControllerConnection & | operator=(SystemControllerConnection const & ) =delete |
| SystemControllerConnection & | operator=(SystemControllerConnection && ) =delete |
Additional inherited members
Public Classes inherited from Acl::ISystemControllerInterface
| Name | |
|---|---|
| struct | Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
Public Types inherited from Acl::ISystemControllerInterface
| Name | |
|---|---|
| enum class uint32_t | StatusCode { SUCCESS, TOO_MANY_REQUESTS, UUID_ALREADY_REGISTERED, FORMAT_ERROR, ALREADY_CONFIGURED, OUT_OF_RESOURCES, NOT_FOUND, INTERNAL_ERROR, CONNECTION_FAILED, TIMEOUT_EXCEEDED, KEY_MISMATCH, UNKNOWN_REQUEST, MALFORMED_REQUEST, ALREADY_IN_USE, VERSION_MISMATCH} Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1. |
Public Functions inherited from Acl::ISystemControllerInterface
| Name | |
|---|---|
| virtual | ~ISystemControllerInterface() =default Virtual destructor. |
Public Types Documentation
enum ComponentType
| Enumerator | Value | Description |
|---|---|---|
| kIngest | ||
| kPipeline | ||
| kControlPanel |
Enumeration of component types the component using this SystemControllerConnection can tell the System Controller to be seen as.
Public Functions Documentation
function SystemControllerConnection
SystemControllerConnection()
function ~SystemControllerConnection
~SystemControllerConnection() override
function configure
bool configure(
const Settings & settings
)
Configure this connection. This method should be called before calling.
Parameters:
- settings The settings to use when connecting to the server
See: connect.
Return: True if successfully configured, false otherwise
function connect
virtual bool connect() override
Connect to the server using the settings set with the.
See: configure method.
Return: True if connection was successful, false otherwise
Reimplements: Acl::ISystemControllerInterface::connect
function isConnected
virtual bool isConnected() const override
Return: True if this class is connected to the server, false otherwise
Reimplements: Acl::ISystemControllerInterface::isConnected
function getUUID
virtual UUID getUUID() const override
Return: The UUID of this interface to the System controller
Reimplements: Acl::ISystemControllerInterface::getUUID
function sendMessage
virtual std::optional< std::string > sendMessage(
const std::string & messageTitle,
const nlohmann::json & parameters
) override
Send a message containing a JSON object to the system controller server.
Parameters:
- messageTitle The title of the status type or request
- parameters The parameters part of the JSON message
Return: Optional containing an error message on error, else nullopt in case the message was successfully sent
Reimplements: Acl::ISystemControllerInterface::sendMessage
function disconnect
virtual bool disconnect() override
Disconnect from the server.
Return: True if successfully disconnected, false on internal error
Reimplements: Acl::ISystemControllerInterface::disconnect
function registerRequestCallback
virtual bool registerRequestCallback(
const Callbacks & callbacks
) override
Register callbacks to call when getting requests from the server or the server connection is lost.
Parameters:
- callbacks The callbacks to set
Return: True if successfully registered, false if a callback is not set, or if already connected to the server
Reimplements: Acl::ISystemControllerInterface::registerRequestCallback
function SystemControllerConnection
SystemControllerConnection(
SystemControllerConnection const &
) =delete
function SystemControllerConnection
SystemControllerConnection(
SystemControllerConnection &&
) =delete
function operator=
SystemControllerConnection & operator=(
SystemControllerConnection const &
) =delete
function operator=
SystemControllerConnection & operator=(
SystemControllerConnection &&
) =delete
6.1.5.1.13 - Acl::SystemControllerConnection::Settings
Acl::SystemControllerConnection::Settings Struct Reference
Settings for a SystemControllerConnection.
#include <SystemControllerConnection.h>
Public Attributes
| Name | |
|---|---|
| std::string | mSystemControllerIP |
| uint16_t | mSystemControllerPort |
| std::string | mSystemControllerPostfix |
| std::string | mPSK |
| UUID | mUUID |
| ComponentType | mType |
| std::string | mName |
| std::string | mMyIP |
| std::chrono::milliseconds | mConnectTimeout |
| bool | mEnableHTTPS |
| bool | mInsecureHTTPS |
| std::string | mCustomCaCertFile |
Public Attributes Documentation
variable mSystemControllerIP
std::string mSystemControllerIP;
variable mSystemControllerPort
uint16_t mSystemControllerPort;
variable mSystemControllerPostfix
std::string mSystemControllerPostfix;
variable mPSK
std::string mPSK;
variable mUUID
UUID mUUID;
variable mType
ComponentType mType;
variable mName
std::string mName;
variable mMyIP
std::string mMyIP;
variable mConnectTimeout
std::chrono::milliseconds mConnectTimeout {
3000};
variable mEnableHTTPS
bool mEnableHTTPS;
variable mInsecureHTTPS
bool mInsecureHTTPS;
variable mCustomCaCertFile
std::string mCustomCaCertFile;
6.1.5.1.14 - Acl::UUID
Acl::UUID Class Reference
A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard.
#include <UUID.h>
Public Functions
| Name | |
|---|---|
| UUID() Default constructor, returns a nil UUID. | |
| constexpr | UUID(const std::array< uint8_t, kUUIDSize > & bytes) Construct a UUID from a sequence of bytes. |
| std::string | toString() const |
| std::string | toBitString() const |
| bool | operator==(const UUID & other) const Compare this UUID to another UUID. |
| bool | operator!=(const UUID & other) const Compare this UUID to another UUID for inequality. |
| bool | operator<(const UUID & other) const Less than operator implementation. |
| std::array< uint8_t, kUUIDSize >::const_iterator | begin() const |
| std::array< uint8_t, kUUIDSize >::const_iterator | end() const |
| constexpr size_t | size() const |
| UUID | generateRandom() Create a new, randomly generated UUID. |
| std::optional< UUID > | fromString(const std::string & uuid) Parse a UUID from a string. |
| std::optional< UUID > | fromVector(const std::vector< uint8_t >::const_iterator & start, const std::vector< uint8_t >::const_iterator & end) Read a UUID from a vector of uint8s. |
| std::optional< UUID > | fromPointer(const uint8_t * start, const uint8_t * end) Read a UUID from a pointer. |
Public Attributes
| Name | |
|---|---|
| constexpr size_t | kUUIDSize |
| const UUID | kNilUUID |
| const UUID | kOmniUUID |
Public Functions Documentation
function UUID
UUID()
Default constructor, returns a nil UUID.
function UUID
inline explicit constexpr UUID(
const std::array< uint8_t, kUUIDSize > & bytes
)
Construct a UUID from a sequence of bytes.
Note: This will accept UUIDs that are not valid version 4 UUIDs.
function toString
std::string toString() const
Return: A string representation of the UUID formatted as hex values
function toBitString
std::string toBitString() const
Return: A string representation of the UUID formatted as bits
function operator==
bool operator==(
const UUID & other
) const
Compare this UUID to another UUID.
Parameters:
Return: True if the UUIDs are identical, false otherwise
function operator!=
bool operator!=(
const UUID & other
) const
Compare this UUID to another UUID for inequality.
Parameters:
Return: True if the UUIDs are not equal, false in case they are identical
function operator<
bool operator<(
const UUID & other
) const
Less than operator implementation.
Parameters:
Return: True if this UUID should be sorted before the other UUID
function begin
std::array< uint8_t, kUUIDSize >::const_iterator begin() const
Return: Begin iterator for the UUID byte sequence
function end
std::array< uint8_t, kUUIDSize >::const_iterator end() const
Return: End iterator for the UUID byte sequence
function size
inline constexpr size_t size() const
Return: The size in bytes of the UUID. Will always return 16
function generateRandom
static UUID generateRandom()
Create a new, randomly generated UUID.
Return: A new, randomly generated UUID
function fromString
static std::optional< UUID > fromString(
const std::string & uuid
)
Parse a UUID from a string.
Parameters:
- uuid The string representation of the UUID
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromVector
static std::optional< UUID > fromVector(
const std::vector< uint8_t >::const_iterator & start,
const std::vector< uint8_t >::const_iterator & end
)
Read a UUID from a vector of uint8s.
Parameters:
- start Start iterator to read the UUID from
- end End iterator to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromPointer
static std::optional< UUID > fromPointer(
const uint8_t * start,
const uint8_t * end
)
Read a UUID from a pointer.
Parameters:
- start Start pointer to read the UUID from
- end End pointer to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
Public Attributes Documentation
variable kUUIDSize
static constexpr size_t kUUIDSize = 16;
variable kNilUUID
static const UUID kNilUUID;
variable kOmniUUID
static const UUID kOmniUUID;
6.1.5.1.15 - fmt::formatter< Acl::ControlDataAddress >
fmt::formatter< Acl::ControlDataAddress > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::ControlDataAddress & address, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::ControlDataAddress & address,
FormatContext & ctx
)
6.1.5.1.16 - fmt::formatter< Acl::ControlDataCommon::EventType >
fmt::formatter< Acl::ControlDataCommon::EventType > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::ControlDataCommon::EventType type, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::ControlDataCommon::EventType type,
FormatContext & ctx
)
6.1.5.1.17 - fmt::formatter< Acl::ISystemControllerInterface::StatusCode >
fmt::formatter< Acl::ISystemControllerInterface::StatusCode > Struct Reference
Inherits from formatter< std::uint32_t >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(Acl::ISystemControllerInterface::StatusCode code, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
Acl::ISystemControllerInterface::StatusCode code,
FormatContext & ctx
)
6.1.5.1.18 - fmt::formatter< Acl::SystemControllerConnection::ComponentType >
fmt::formatter< Acl::SystemControllerConnection::ComponentType > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(Acl::SystemControllerConnection::ComponentType type, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
Acl::SystemControllerConnection::ComponentType type,
FormatContext & ctx
)
6.1.5.1.19 - fmt::formatter< Acl::UUID >
fmt::formatter< Acl::UUID > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::UUID & uuid, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::UUID & uuid,
FormatContext & ctx
)
6.1.5.2 - Files
6.1.5.2.1 - include/AclLog.h
include/AclLog.h File Reference
Namespaces
| Name |
|---|
| Acl |
| Acl::AclLog A namespace for logging utilities. |
Classes
| Name | |
|---|---|
| class | Acl::AclLog::ThreadNameFormatterFlag |
| class | Acl::AclLog::FileLocationFormatterFlag A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <filesystem>
#include <string>
#include <spdlog/details/log_msg.h>
#include <spdlog/fmt/fmt.h>
#include <spdlog/formatter.h>
#include <spdlog/pattern_formatter.h>
#include <sys/prctl.h>
namespace Acl {
namespace AclLog {
enum class Level {
kTrace, // Detailed diagnostics (for development only)
kDebug, // Messages intended for debugging only
kInfo, // Messages about normal behavior (default log level)
kWarning, // Warnings (functionality intact)
kError, // Recoverable errors (functionality impaired)
kCritical, // Unrecoverable errors (application must stop)
kOff // Turns off all logging
};
void init(const std::string& name);
void initControlMessagesLog(const std::string& name);
void setLevel(Level level);
void logControlMessage(const std::string& origin, const std::string& controlMessage);
AclLog::Level getLogLevel();
size_t getMaxFileSize();
size_t getMaxLogRotations();
std::filesystem::path getLogFileFullPath(const std::string& name);
inline std::string getThreadName() {
static const size_t RECOMMENDED_BUFFER_SIZE = 20;
static thread_local std::string name;
if (name.empty()) {
char buffer[RECOMMENDED_BUFFER_SIZE];
int retval = prctl(PR_GET_NAME, buffer);
if (retval == -1) {
throw spdlog::spdlog_ex("Failed to get thread name: ", errno);
}
name = std::string(buffer);
}
return name;
}
class ThreadNameFormatterFlag : public spdlog::custom_flag_formatter {
public:
void format(const spdlog::details::log_msg&, const std::tm&, spdlog::memory_buf_t& dest) override {
std::string threadName = getThreadName();
dest.append(threadName.data(), threadName.data() + threadName.size());
}
[[nodiscard]] std::unique_ptr<custom_flag_formatter> clone() const override {
return spdlog::details::make_unique<ThreadNameFormatterFlag>();
}
};
class FileLocationFormatterFlag : public spdlog::custom_flag_formatter {
public:
void format(const spdlog::details::log_msg& msg, const std::tm&, spdlog::memory_buf_t& dest) override {
if (!msg.source.empty()) {
using namespace spdlog::details;
dest.push_back('[');
const char* filename = short_filename_formatter<null_scoped_padder>::basename(msg.source.filename);
fmt_helper::append_string_view(filename, dest);
dest.push_back(':');
fmt_helper::append_int(msg.source.line, dest);
dest.push_back(']');
}
}
[[nodiscard]] std::unique_ptr<custom_flag_formatter> clone() const override {
return spdlog::details::make_unique<FileLocationFormatterFlag>();
}
};
} // namespace AclLog
} // namespace Acl
6.1.5.2.2 - include/ControlDataAddress.h
include/ControlDataAddress.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::ControlDataAddress A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start. |
| struct | fmt::formatter< Acl::ControlDataAddress > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <cstdint>
#include <sstream>
#include <string>
#include <vector>
#include <fmt/format.h>
#include "UUID.h"
namespace Acl {
class ControlDataAddress final {
public:
ControlDataAddress() = default;
explicit ControlDataAddress(const UUID& destinationUUID);
[[nodiscard]] size_t size() const;
[[nodiscard]] bool empty() const;
bool extend(const UUID& uuid);
bool extend(const ControlDataAddress& address);
[[nodiscard]] bool hasWildcard() const;
[[nodiscard]] bool currentUuidIsWildcard() const;
[[nodiscard]] bool currentUuidMatch(const UUID& uuid) const;
[[nodiscard]] bool fullAddressMatch(const ControlDataAddress& other) const;
[[nodiscard]] std::optional<UUID> getCurrentUuid() const;
std::optional<UUID> moveToAndGetNextUuid();
[[nodiscard]] std::vector<uint8_t> pack() const;
static std::optional<ControlDataAddress> unpack(const std::vector<uint8_t>::const_iterator& packedBegin,
const std::vector<uint8_t>::const_iterator& packedEnd);
static std::optional<ControlDataAddress> unpack(const uint8_t* packedBegin, const uint8_t* packedEnd);
[[nodiscard]] std::string toString() const;
bool operator==(const ControlDataAddress& other) const;
bool operator!=(const ControlDataAddress& other) const;
friend std::ostream& operator<<(std::ostream& stream, const ControlDataAddress& address);
private:
std::vector<UUID> mAddress;
};
std::ostream& operator<<(std::ostream& stream, const ControlDataAddress& address);
} // namespace Acl
template <> struct fmt::formatter<Acl::ControlDataAddress> : formatter<std::string> {
template <typename FormatContext> auto format(const Acl::ControlDataAddress& address, FormatContext& ctx) {
return formatter<std::string>::format(address.toString(), ctx);
}
};
6.1.5.2.3 - include/ControlDataCommon.h
include/ControlDataCommon.h File Reference
Namespaces
| Name |
|---|
| Acl |
| Acl::ControlDataCommon |
Classes
| Name | |
|---|---|
| struct | Acl::ControlDataCommon::Response A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. |
| struct | Acl::ControlDataCommon::StatusMessage A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from. |
| struct | Acl::ControlDataCommon::ConnectionEvent A connection related event. |
| struct | fmt::formatter< Acl::ControlDataCommon::EventType > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <cstdint>
#include <string>
#include <vector>
#include "ControlDataAddress.h"
#include "UUID.h"
namespace Acl::ControlDataCommon {
struct Response {
std::string mMessage;
uint64_t mRequestId = 0;
UUID mFromUUID;
ControlDataAddress mRecipient;
};
struct StatusMessage {
std::string mMessage;
UUID mFromUUID;
ControlDataAddress mRecipient;
};
enum class EventType : uint8_t {
kDisconnect,
kConnect
};
struct ConnectionEvent {
EventType mEventType = EventType::kDisconnect;
ControlDataAddress mAddress;
UUID mEventNode;
};
} // namespace Acl::ControlDataCommon
template <> struct fmt::formatter<Acl::ControlDataCommon::EventType> : formatter<std::string> {
template <typename FormatContext> auto format(const Acl::ControlDataCommon::EventType type, FormatContext& ctx) {
std::string value;
switch (type) {
case Acl::ControlDataCommon::EventType::kDisconnect:
value = "disconnect";
break;
case Acl::ControlDataCommon::EventType::kConnect:
value = "connect";
break;
}
return formatter<std::string>::format(value, ctx);
}
};
6.1.5.2.4 - include/ControlDataSender.h
include/ControlDataSender.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::ControlDataSender A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers. |
| struct | Acl::ControlDataSender::Settings Settings for a ControlDataSender. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <functional>
#include <memory>
#include <vector>
#include <ISystemControllerInterface.h>
#include "ControlDataCommon.h"
namespace Acl {
class ControlDataSender final {
public:
enum class SendRequestStatus {
kSuccess,
kFailed,
kSendFailedForSome,
kSenderNotConfigured,
kNoConnectedReceiver,
kInternalError
};
struct Settings {
std::function<void(const ControlDataCommon::Response&)>
mResponseCallback; // Callback for response messages from receivers
std::function<void(const ControlDataCommon::StatusMessage&)>
mStatusMessageCallback; // Callback for status messages from receivers
std::function<void(const ControlDataCommon::ConnectionEvent&)>
mConnectionEventCallback; // Callback for connection events that has been detected by the sender, or passed
// to it from a connected receiver
};
ControlDataSender();
~ControlDataSender();
[[nodiscard]] bool configure(const std::shared_ptr<ISystemControllerInterface>& controllerInterface,
const Settings& settings) const;
SendRequestStatus sendRequestToReceivers(std::string_view request,
uint64_t& requestId,
const UUID& requester = UUID::kNilUUID,
int8_t hops = -1) const;
[[nodiscard]] std::vector<UUID> getDirectlyConnectedReceivers() const;
static std::string getVersion();
// ControlDataSender is not copyable
ControlDataSender(ControlDataSender const&) = delete; // Copy construct
ControlDataSender& operator=(ControlDataSender const&) = delete; // Copy assign
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
} // namespace Acl
6.1.5.2.5 - include/ISystemControllerInterface.h
include/ISystemControllerInterface.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::ISystemControllerInterface An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. |
| struct | Acl::ISystemControllerInterface::Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
| struct | Acl::ISystemControllerInterface::Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | fmt::formatter< Acl::ISystemControllerInterface::StatusCode > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <functional>
#include <json.hpp>
#include <optional>
#include <string>
#include <fmt/format.h>
#include "UUID.h"
namespace Acl {
class ISystemControllerInterface {
public:
enum class StatusCode : uint32_t {
SUCCESS = 3001, // Accept / Success
TOO_MANY_REQUESTS = 3101, // Too many requests, try again later
UUID_ALREADY_REGISTERED = 3201, // UUID is already registered
FORMAT_ERROR = 3202, // Message formatting error
ALREADY_CONFIGURED = 3203, // The requested thing to configure is already configured
OUT_OF_RESOURCES = 3204, // Out of resources (CPU/GPU close to max utilization, all available slots used, etc.)
NOT_FOUND = 3205, // The requested thing was not found
INTERNAL_ERROR = 3206, // Internal error when trying to serve the request
CONNECTION_FAILED = 3207, // Connection failure
TIMEOUT_EXCEEDED = 3208, // Timeout exceeded
KEY_MISMATCH = 3209, // Key mismatch (might be a timeout, 3007 in the future)
UNKNOWN_REQUEST = 3210, // The name of the request was not known
MALFORMED_REQUEST = 3211, // The request is not correctly formatted
ALREADY_IN_USE = 3212, // The requested resource is already in use
VERSION_MISMATCH = 3213, // The version of the request is not supported
// None, yet
};
struct Response {
StatusCode mCode;
nlohmann::json mParameters; // Can be empty
};
struct Callbacks {
std::function<Response(const std::string&, const nlohmann::json&)>
mRequestCallback; // Callback called when then controller has sent a request
std::function<void(uint32_t, const std::string&, const std::error_code&)>
mConnectionClosedCallback; // Callback called when the connection to the controller is closed
};
virtual ~ISystemControllerInterface() = default;
virtual std::optional<std::string> sendMessage(const std::string& messageTitle,
const nlohmann::json& parameters) = 0;
virtual bool registerRequestCallback(const Callbacks& callbacks) = 0;
virtual bool connect() = 0;
virtual bool disconnect() = 0;
[[nodiscard]] virtual bool isConnected() const = 0;
[[nodiscard]] virtual UUID getUUID() const = 0;
};
} // namespace Acl
template <> struct fmt::formatter<Acl::ISystemControllerInterface::StatusCode> : formatter<std::uint32_t> {
template <typename FormatContext>
auto format(Acl::ISystemControllerInterface::StatusCode code, FormatContext& ctx) {
return formatter<std::uint32_t>::format(static_cast<uint32_t>(code), ctx);
}
};
6.1.5.2.6 - include/SystemControllerConnection.h
include/SystemControllerConnection.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::SystemControllerConnection An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket. |
| struct | Acl::SystemControllerConnection::Settings Settings for a SystemControllerConnection. |
| struct | fmt::formatter< Acl::SystemControllerConnection::ComponentType > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <chrono>
#include "ISystemControllerInterface.h"
#include "json.hpp"
namespace Acl {
class SystemControllerConnection final : public ISystemControllerInterface {
public:
enum class ComponentType : uint32_t {
kIngest,
kPipeline,
kControlPanel,
};
struct Settings {
std::string mSystemControllerIP; // IP of the server
uint16_t mSystemControllerPort; // Port of the server
std::string mSystemControllerPostfix; // Postfix of the address that the backend uses if any
std::string mPSK; // The pre shared key used for authorization with the system controller server
UUID mUUID; // The UUID of the device using this library
ComponentType mType; // The component type of the component using this SystemControllerConnection
std::string mName; // The component name (optional)
std::string mMyIP; // The external IP of the system the component is running on. Will be sent to the system
// controller server in the announce message (optional)
std::chrono::milliseconds mConnectTimeout{
3000}; // Max time to wait on an announcement response from the server during connection
bool mEnableHTTPS; // Enable the communication between the system controller and a component encrypted
bool mInsecureHTTPS; // Disable the verification of the TLS certificate if requested.
std::string mCustomCaCertFile; // Custom CA certificate
};
SystemControllerConnection();
~SystemControllerConnection() override;
bool configure(const Settings& settings);
bool connect() override;
[[nodiscard]] bool isConnected() const override;
[[nodiscard]] UUID getUUID() const override;
std::optional<std::string> sendMessage(const std::string& messageTitle, const nlohmann::json& parameters) override;
bool disconnect() override;
bool registerRequestCallback(const Callbacks& callbacks) override;
SystemControllerConnection(SystemControllerConnection const&) = delete; // Copy construct
SystemControllerConnection(SystemControllerConnection&&) = delete; // Move construct
SystemControllerConnection& operator=(SystemControllerConnection const&) = delete; // Copy assign
SystemControllerConnection& operator=(SystemControllerConnection&&) = delete; // Move assign
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
} // namespace Acl
template <> struct fmt::formatter<Acl::SystemControllerConnection::ComponentType> : formatter<std::string> {
template <typename FormatContext>
auto format(Acl::SystemControllerConnection::ComponentType type, FormatContext& ctx) {
std::string value;
switch (type) {
case Acl::SystemControllerConnection::ComponentType::kIngest:
value = "ingest";
break;
case Acl::SystemControllerConnection::ComponentType::kPipeline:
value = "pipeline";
break;
case Acl::SystemControllerConnection::ComponentType::kControlPanel:
value = "controlpanel";
break;
}
return formatter<std::string>::format(value, ctx);
}
};
6.1.5.2.7 - include/UUID.h
include/UUID.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::UUID A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard. |
| struct | fmt::formatter< Acl::UUID > |
Functions
| Name | |
|---|---|
| UUID() Default constructor, returns a nil UUID. | |
| constexpr | UUID(const std::array< uint8_t, kUUIDSize > & bytes) Construct a UUID from a sequence of bytes. |
| UUID | generateRandom() Create a new, randomly generated UUID. |
| std::optional< UUID > | fromString(const std::string & uuid) Parse a UUID from a string. |
| std::optional< UUID > | fromVector(const std::vector< uint8_t >::const_iterator & start, const std::vector< uint8_t >::const_iterator & end) Read a UUID from a vector of uint8s. |
| std::optional< UUID > | fromPointer(const uint8_t * start, const uint8_t * end) Read a UUID from a pointer. |
| std::string | toString() const |
| std::string | toBitString() const |
| bool | operator==(const UUID & other) const Compare this UUID to another UUID. |
| bool | operator!=(const UUID & other) const Compare this UUID to another UUID for inequality. |
| bool | operator<(const UUID & other) const Less than operator implementation. |
| std::array< uint8_t, kUUIDSize >::const_iterator | begin() const |
| std::array< uint8_t, kUUIDSize >::const_iterator | end() const |
| constexpr size_t | size() const |
Attributes
| Name | |
|---|---|
| constexpr size_t | kUUIDSize |
| const UUID | kNilUUID |
| const UUID | kOmniUUID |
Functions Documentation
function UUID
UUID()
Default constructor, returns a nil UUID.
function UUID
explicit constexpr UUID(
const std::array< uint8_t, kUUIDSize > & bytes
)
Construct a UUID from a sequence of bytes.
Note: This will accept UUIDs that are not valid version 4 UUIDs.
function generateRandom
static UUID generateRandom()
Create a new, randomly generated UUID.
Return: A new, randomly generated UUID
function fromString
static std::optional< UUID > fromString(
const std::string & uuid
)
Parse a UUID from a string.
Parameters:
- uuid The string representation of the UUID
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromVector
static std::optional< UUID > fromVector(
const std::vector< uint8_t >::const_iterator & start,
const std::vector< uint8_t >::const_iterator & end
)
Read a UUID from a vector of uint8s.
Parameters:
- start Start iterator to read the UUID from
- end End iterator to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromPointer
static std::optional< UUID > fromPointer(
const uint8_t * start,
const uint8_t * end
)
Read a UUID from a pointer.
Parameters:
- start Start pointer to read the UUID from
- end End pointer to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function toString
std::string toString() const
Return: A string representation of the UUID formatted as hex values
function toBitString
std::string toBitString() const
Return: A string representation of the UUID formatted as bits
function operator==
bool operator==(
const UUID & other
) const
Compare this UUID to another UUID.
Parameters:
- other The other UUID to compare this UUID to
Return: True if the UUIDs are identical, false otherwise
function operator!=
bool operator!=(
const UUID & other
) const
Compare this UUID to another UUID for inequality.
Parameters:
- other The other UUID to compare this UUID to
Return: True if the UUIDs are not equal, false in case they are identical
function operator<
bool operator<(
const UUID & other
) const
Less than operator implementation.
Parameters:
- other The other UUID to compare this UUID to
Return: True if this UUID should be sorted before the other UUID
function begin
std::array< uint8_t, kUUIDSize >::const_iterator begin() const
Return: Begin iterator for the UUID byte sequence
function end
std::array< uint8_t, kUUIDSize >::const_iterator end() const
Return: End iterator for the UUID byte sequence
function size
constexpr size_t size() const
Return: The size in bytes of the UUID. Will always return 16
Attributes Documentation
variable kUUIDSize
static constexpr size_t kUUIDSize = 16;
variable kNilUUID
static const UUID kNilUUID;
variable kOmniUUID
static const UUID kOmniUUID;
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <array>
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
#include <fmt/format.h>
namespace Acl {
class UUID {
public:
static constexpr size_t kUUIDSize = 16;
// Predefined UUID values
static const UUID kNilUUID;
static const UUID kOmniUUID;
UUID();
constexpr explicit UUID(const std::array<uint8_t, kUUIDSize>& bytes)
: mUUID{bytes} {
}
static UUID generateRandom();
static std::optional<UUID> fromString(const std::string& uuid);
static std::optional<UUID> fromVector(const std::vector<uint8_t>::const_iterator& start,
const std::vector<uint8_t>::const_iterator& end);
static std::optional<UUID> fromPointer(const uint8_t* start, const uint8_t* end);
[[nodiscard]] std::string toString() const;
[[nodiscard]] std::string toBitString() const;
bool operator==(const UUID& other) const;
bool operator!=(const UUID& other) const;
bool operator<(const UUID& other) const;
[[nodiscard]] std::array<uint8_t, kUUIDSize>::const_iterator begin() const;
[[nodiscard]] std::array<uint8_t, kUUIDSize>::const_iterator end() const;
[[nodiscard]] constexpr size_t size() const {
return mUUID.size();
}
private:
std::array<uint8_t, kUUIDSize> mUUID{};
} __attribute__((packed));
static_assert(sizeof(UUID) == 16, "UUID has unexpected size");
std::ostream& operator<<(std::ostream& stream, const UUID& uuid);
} // namespace Acl
template <> struct fmt::formatter<Acl::UUID> : formatter<std::string> {
template <typename FormatContext> auto format(const Acl::UUID& uuid, FormatContext& ctx) {
return formatter<std::string>::format(uuid.toString(), ctx);
}
};
6.1.5.3 - Namespaces
- namespace Acl
- namespace AclLog
A namespace for logging utilities. - namespace ControlDataCommon
- namespace AclLog
- namespace fmt
- namespace spdlog
6.1.5.3.1 - Acl
Acl Namespace Reference
Namespaces
| Name |
|---|
| Acl::AclLog A namespace for logging utilities. |
| Acl::ControlDataCommon |
Classes
| Name | |
|---|---|
| class | Acl::ControlDataAddress A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start. |
| class | Acl::ControlDataSender A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers. |
| class | Acl::ISystemControllerInterface An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. |
| class | Acl::SystemControllerConnection An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket. |
| class | Acl::UUID A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard. |
Functions
| Name | |
|---|---|
| std::ostream & | operator«(std::ostream & stream, const ControlDataAddress & address) Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’. |
| std::ostream & | operator«(std::ostream & stream, const UUID & uuid) Print this UUID to an output stream. |
Functions Documentation
function operator«
std::ostream & operator<<(
std::ostream & stream,
const ControlDataAddress & address
)
Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’.
Parameters:
- stream The stream to print to
- address The address to print
Return: Reference to the output stream
function operator«
std::ostream & operator<<(
std::ostream & stream,
const UUID & uuid
)
Print this UUID to an output stream.
Parameters:
- stream The stream to print to
Return: Reference to the output stream
6.1.5.3.2 - Acl::AclLog
Acl::AclLog Namespace Reference A namespace for logging utilities.
Classes
| Name | |
|---|---|
| class | Acl::AclLog::ThreadNameFormatterFlag |
| class | Acl::AclLog::FileLocationFormatterFlag A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. |
Types
| Name | |
|---|---|
| enum class | Level { kTrace, kDebug, kInfo, kWarning, kError, kCritical, kOff} Log levels. |
Functions
| Name | |
|---|---|
| void | init(const std::string & name) Initialize logging. |
| void | initControlMessagesLog(const std::string & name) Init the Rendering Engine control messages log. |
| void | setLevel(Level level) Set global logging level. |
| void | logControlMessage(const std::string & origin, const std::string & controlMessage) Write to the control messages log. |
| AclLog::Level | getLogLevel() Internal helper function for getting the setting for the log level. |
| size_t | getMaxFileSize() Internal helper function for getting the setting for the maximum size for a log file. |
| size_t | getMaxLogRotations() Internal helper function for getting the setting for the maximum number of rotated log files. |
| std::filesystem::path | getLogFileFullPath(const std::string & name) Internal helper function for constructing the full path name for the log file. |
| std::string | getThreadName() |
Types Documentation
enum Level
| Enumerator | Value | Description |
|---|---|---|
| kTrace | ||
| kDebug | ||
| kInfo | ||
| kWarning | ||
| kError | ||
| kCritical | ||
| kOff |
Log levels.
Functions Documentation
function init
void init(
const std::string & name
)
Initialize logging.
Parameters:
- name The name of the component (used for log prefix and filename)
By default two sinks are created. The first sink writes messages to the console. The second sink attempts to create a log file in the path set by the environment variable ACL_LOG_PATH (’/tmp’ if unset). The name of the log file is ’name-
function initControlMessagesLog
void initControlMessagesLog(
const std::string & name
)
Init the Rendering Engine control messages log.
Parameters:
- name The name of the Rendering Engine (used for filename)
function setLevel
void setLevel(
Level level
)
Set global logging level.
Parameters:
- level Logging level to set
function logControlMessage
void logControlMessage(
const std::string & origin,
const std::string & controlMessage
)
Write to the control messages log.
Parameters:
- origin The origin of the message to log, usually the UUID of the control panel sending the message
- controlMessage The controlMessage to log
function getLogLevel
AclLog::Level getLogLevel()
Internal helper function for getting the setting for the log level.
Return: The wanted log level fetched from an environment variable if set, or else a default value
function getMaxFileSize
size_t getMaxFileSize()
Internal helper function for getting the setting for the maximum size for a log file.
Return: The wanted maximum size of the log file fetched from an environment variable if set, or else a default value
function getMaxLogRotations
size_t getMaxLogRotations()
Internal helper function for getting the setting for the maximum number of rotated log files.
Return: The wanted number of log files to rotate fetched from an environment variable if set, or else a default value
function getLogFileFullPath
std::filesystem::path getLogFileFullPath(
const std::string & name
)
Internal helper function for constructing the full path name for the log file.
Parameters:
- name The name of the component
Return: The full path to the log file
function getThreadName
inline std::string getThreadName()
6.1.5.3.3 - Acl::ControlDataCommon
Acl::ControlDataCommon Namespace Reference
Classes
| Name | |
|---|---|
| struct | Acl::ControlDataCommon::Response A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. |
| struct | Acl::ControlDataCommon::StatusMessage A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from. |
| struct | Acl::ControlDataCommon::ConnectionEvent A connection related event. |
Types
| Name | |
|---|---|
| enum class uint8_t | EventType { kDisconnect, kConnect} Enum with all supported event types. |
Types Documentation
enum EventType
| Enumerator | Value | Description |
|---|---|---|
| kDisconnect | ||
| kConnect | A node has disconnected. A node has connected |
Enum with all supported event types.
6.1.5.3.4 - fmt
fmt Namespace Reference
Classes
6.1.5.3.5 - spdlog
spdlog Namespace Reference
6.2 - Ateliere Live 8.0.0 developer reference
6.2.1 - System controller config
This page describes the configuration settings possible to set via the acl_sc_settings.json file.
| Expanded Config name | Config name | Description | Default value |
|---|---|---|---|
| psk | psk | The Pre-shared key used to authorize components to connect to the System Controller. Must be 32 characters long | "" |
| client_auth.enabled | enabled | Switch to enable basic authentication for clients in the REST API | true |
| client_auth.username | username | The username that will grant access to the REST API | “admin” |
| client_auth.password | password | Password that will grant access to the REST API | “changeme” |
| https.enabled | enabled | Switch to enable encryption of the REST API as well as the connections between the System Controller and the connected components | true |
| https.certificate_file | certificate_file | Path to the certificate file. In pem format | "" |
| https.private_key_file | private_key_file | Path to the private key file. In pem format | "" |
| logger.level | level | The level that the logging will produce output, available in ascending order: debug, info, warn, error | info |
| logger.file_name_prefix | file_name_prefix | The prefix of the log filename. A unique timecode and “.log” will automatically be appended to this prefix. The prefix can contain both the path and the prefix of the log file. | "" |
| site.port | port | Port on which the service is accessible | 8080 |
| site.host | host | Hostname on which the service is accessible | localhost |
| rate_limit.requests_per_sec | RateLimit.RequestsPerSec | The average number of requests that are handled per second, before requests are queued up. (Number of tokens added to the token bucket per second 1) | 300 |
| rate_limit.burst_limit | RateLimit.BurstLimit | The number of requests that can be handled in a short burst before rate limiting kicks in (Maximum number of tokens in the token bucket 1). | 10 |
| response_timeout | response_timeout | The maximum time of a request between the System Controller and a component before the request is timed out | 5000ms |
| cors.allowed_origins | allowed_origins | Comma-separated list of origin addresses that are allowed | ["*"] |
| cors.allowed_methods | allowed_methods | Comma-separated list of HTTP methods that the service accepts | [“GET”, “POST”, “PUT”, “PATCH”, “DELETE”] |
| cors.allowed_headers | allowed_headers | Comma-separated list of headers that are allowed | ["*"] |
| cors.exposed_headers | exposed_headers | Comma-separated list of headers that are allowed for exposure | [""] |
| cors.allow_credentials | allow_credentials | Allow the xKHR to set credentials cookies | false |
| cors.max_age | max_age | How long the preflight cache is stored before a new must be made | 300 |
| custom_headers.[N].key | key | Custom headers, the key of the header, e.g.: Cache-Control | None |
| custom_headers.[N].value | value | Custom headers, the value to the key of the header, e.g.: no-cache | None |
| allow_any_version | allow_any_version | Allow components of any version to connect. When set to false, components with another major version than the System Controller will be rejected | false |
6.2.2 - REST API v3
The following is a rendering of the OpenAPI for the Ateliere Live System Controller using Swagger. It does not have a backend server, so it cannot be run interactively.
This API is available from the server at the base URL /api/v3.
6.2.3 - Rendering Engine config
This page describes how to configure the Rendering Engine. This topic is closely related to this page on the control command protocol for the video and audio mixers.
Rendering Engine components
The Rendering Engine is an application that uses the Production Pipeline library in the base platform for transport, and adds to that media file playback, HTML rendering, a full video mixer and an audio mixer. The figure below shows a schematic of the different components and an example of how streams may transition through it.

HTML Renderers
Multiple HTML renderers can be instantiated in runtime by control panels, and in each an HTML page can be opened. Each HTML renderer produces a video stream, but no audio.
Media Players
Multiple media players can be instantiated in runtime by control panels, and in each a media file can be opened. Each media player produces a stream containing a video stream and all audio streams from the file.
Video Mixer
The Video mixer receives all video inputs into the system, i.e. streams from ingests, from HTML renderers and from media players. It outputs one or more named video output streams. The internal structure of the video mixer is defined at startup (as decribed in detail below), and controlling the video mixer is done in runtime by control panels.
Audio Mixer
Note
The audio mixer can be either our internal audio mixer or an integration towards an external third party audio mixer. The rest of the documentation here is valid for the internal audio mixer.The audio mixer takes a number of mono or stereo pair streams as inputs that we call input strips. It outputs a number of named output streams in stereo. The outputs of the audio mixer are defined at startup, and the audio mixer is controlled in runtime by control panels.
Combine outputs
The combination of video and audio outputs into full output streams from the rendering engine is configured at startup.
Configuring the Rendering Engine
Some aspects of the rendering engine can be configured statically at startup through the use of a configuration file in JSON format. Specifically, the video mixer node graph, the audio mixer outputs and the combination of video and audio outputs can be configured. Exactly how the configuration file is specified at startup is covered in this guide.
As an example, here is the contents of such a JSON configuration file that we will refer to throughout this guide:
{
"version": "1.0",
"video": {
"nodes": {
"transition": {
"type": "transition"
},
"chroma_key_select": {
"type": "select"
},
"chroma_key": {
"type": "chroma_key"
},
"chroma_key_alpha_over": {
"type": "alpha_over"
},
"fade_to_black": {
"type": "fade_to_black"
},
"program": {
"type": "output"
},
"chroma_key_preview": {
"type": "output"
},
"preview": {
"type": "output"
}
},
"links": [
{
"from_node": "transition",
"from_socket": 0,
"to_node": "chroma_key_alpha_over",
"to_socket": 1
},
{
"from_node": "transition",
"from_socket": 1,
"to_node": "preview",
"to_socket": 0
},
{
"from_node": "chroma_key_select",
"from_socket": 0,
"to_node": "chroma_key",
"to_socket": 0
},
{
"from_node": "chroma_key",
"from_socket": 0,
"to_node": "chroma_key_alpha_over",
"to_socket": 0
},
{
"from_node": "chroma_key_alpha_over",
"from_socket": 0,
"to_node": "fade_to_black",
"to_socket": 0
},
{
"from_node": "fade_to_black",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
},
{
"from_node": "chroma_key",
"from_socket": 0,
"to_node": "chroma_key_preview",
"to_socket": 0
}
]
},
"audio": {
"outputs": [
{
"name": "main",
"channels": 2
},
{
"name": "aux1",
"channels": 2
},
{
"name": "aux2",
"channels": 2
}
]
},
"output_mapping": [
{
"name": "program",
"video_output": "program",
"audio_output": "main",
"feedback_input_slot": 1001,
"stream": true
},
{
"name": "preview",
"video_output": "preview",
"audio_output": "",
"feedback_input_slot": 1002,
"stream": false
},
{
"name": "aux1",
"video_output": "program",
"audio_output": "aux1",
"feedback_input_slot": 0,
"stream": true
},
{
"name": "chroma_key_preview",
"video_output": "chroma_key_preview",
"audio_output": "aux2",
"feedback_input_slot": 100,
"stream": true
}
]
}
Video Mixer node graph
The video mixer is defined as a tree graph of nodes that work together in sequence to produce one or several video outputs. Each node performs a specific action, and has zero or more input sockets and zero or more output sockets. Links connect output sockets on one node to input sockets on other nodes. Each node is named and the name is used to control the node in runtime. The node tree configuration is specified in the video section of the JSON file, which contains two parts: the list of nodes and the list of links connecting the nodes.
The following is a graphical representation of the video mixer node graph configuration in the JSON example file above, with two input nodes, three processing nodes and three output nodes, and links in between:

Video nodes block
The nodes object of the video block is a JSON object where the names/keys in the object is the unique name of the
node. The name is used to refer to the node when operating the mixer later on, so names that are easy to
understand what they are supposed to be used for in the production is recommended.
The name can only contain lower case letters, digits, _ and -. Space or other special characters are not allowed.
Each node is an JSON object with parameters defining the node properties.
Here the parameter type defines which type of node it is.
The supported types are listed below. They can be divided into three groups depending on if they provide input to the
graph, output from the graph or is a processing node, placed in the middle of the graph.
Input nodes
The input nodes take their input from the input slots of the Rendering Engine, which contains the latest frame for all connected sources (this includes connected cameras, HTML graphics, media players etc.) The nodes in this group does not have any input sockets, as they take the input frames from the input slots of the Rendering Engine. Which slot to take the frames from is dynamically controlled during runtime.
Alpha combine node (alpha_combine)
Input sockets: 0 (Sources are taken from the input slots of the mixer)
Output sockets: 1
The alpha combine node takes two inputs and combines the color from one of them with the alpha from the other one. The
node features multiple modes that can be set during runtime to either pick the alpha channel of the second video input,
or to take any of the other R, G and B channels, or to average the RGB channels and use as alpha for the output.
This node is useful in case videos with alpha is provided from SDI sources, where the alpha must be sent as a separate
video feed and then combined with the fill/color source in the mixer.
Select node (select)
Input sockets: 0 (Source is taken from the input slots of the mixer)
Output sockets: 1
The select node simply selects an input slot from the Rendering Engine and forwards that video stream.
Which input slot to forward is set during runtime.
The node is a variant of the transition node, but does not support the transitions supported by the transition node.
Transition node (transition)
Input sockets: 0 (Sources are taken from the input slots of the mixer)
Output sockets: 2 (One with the program output and one with the preview output)
The transition node takes two video streams from the Rendering Engine’s input slots, one to use as the program and one
as the preview output stream.
These are output through the two output sockets.
During runtime this node can be used to make transitions such as wipes and fades between the selected program and
preview.
Output nodes
This group only contains a single node, used to mark a point where processed video can exit the graph and be used in output mappings.
Output node (output)
Input sockets: 1
Output sockets: 0 (Output is sent out of the video mixer)
The output node marks an output point in the video mixer’s graph, where the video stream can be used by the output
mapping to be included in the Rendering Engine’s Output streams, or as streams to view in the multi-viewer.
The node takes a single input and makes it possible to use that video feed outside the video mixer.
Output nodes can be used both to output the program and preview feeds of a video mixer, but also to mark auxiliary
outputs, as in the example above, where chroma_key_preview is output to be included in the graph to be able to view
the result of the chroma keying, without the effect being keyed on to the program output.
Processing nodes
The processing nodes take their input from another node’s output and outputs a result that is sent to another node’s input. They are therefore placed in the middle of the graph, after nodes from the input group and before output nodes.
Alpha over node (alpha_over)
Input sockets: 2 (Index 0 for overlay video and index 1 for background video)
Output sockets: 1
The alpha over node composites the overlay video input on top of the background video input. The alpha of the overlay
video input is taken into consideration. During runtime, this node can be controlled to show or not to show the overlay,
and to fade the overlay in or out. This node is useful to composite things such as graphics or chroma keyed video onto a
background video.
Chroma key node (chroma_key)
Input sockets: 1
Output sockets: 1
The chroma key node takes an input video stream and performs chroma keying on it based on parameters set during runtime.
The video output will have the alpha channel (and in some cases also the color channels) altered. The result of this
node can then be composited on top of a background using an Alpha over node.
Crop node (crop)
Input sockets: 1
Output sockets: 1
The crop node takes an input video stream and crops the video based on parameters set during runtime. The parts of the video outside of the cropped area will be fully transparent.
Fade to black node (fade_to_black)
Input sockets: 1
Output sockets: 1
The fade to black node takes a single input video stream and can fade that video stream to and from black.
This node is normally used as the last node before the main program output node, to be able to fade to and from black at
the beginning and end of the broadcast.
Transform node (transform)
Input sockets: 1
Output sockets: 1
The transform node takes an input video stream and transform the result inside the visible canvas. This node can be
configured during runtime to scale and move the input video. This node is useful for picture-in-picture effects, or to
move a chroma key node output to the lower corner of the frame.
Video delay node (video_delay)
Input sockets: 1
Output sockets: 1
The video delay node is used to delay the video by a given number of frames. The number of frames to delay is controlled
during runtime. This node is useful whenever the need for dynamically delay a video stream arises, for example in
case an external audio mixer is used, which comes with a delay of some frames.
Video links block
The links array in the video block is a list of links between video nodes. The video frames are fed in one direction
from node to node via these links.
An input socket on a node can only have one connected link.
The output sockets on a node can have multiple connected links.
Each block contains the following keys:
from_node- The name of the node in thenodesobject, from which the link is receiving frames fromfrom_socket- The index of the output socket in the node from which this link originatesto_node- The name of the node in thenodesobject, to which the link is sending frames toto_socket- The index of the input socket in the node to which this link connects
Some examples
The simplest video mixer node graph imaginable would be a select node feeding an output node. This mixer would only be able to select one of the inputs and output it unaltered, like a video router would do:
The JSON file section for this is:
"video": {
"nodes": {
"input_select": {
"type": "select"
},
"program": {
"type": "output"
}
},
"links": [
{
"from_node": "input_select",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
}
]
}
A slightly more advanced node graph would be to use a transition node and two outputs, one for the program out and one for the preview:
The JSON file section for this is:
"video": {
"nodes": {
"transition": {
"type": "transition"
},
"program": {
"type": "output"
},
"preview": {
"type": "output"
}
},
"links": [
{
"from_node": "transition",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
},
{
"from_node": "transition",
"from_socket": 1,
"to_node": "preview",
"to_socket": 0
},
]
}
Audio outputs
The audio block of the configuration file defines the properties of the audio mixer.
The JSON object contains a list called outputs which lists the outputs of the audio mixer and the configuration of
each output.
Each output has these parameters:
name- The unique name of this audio output, used to refer to if from theoutput_mappingblockchannels- The number of audio channels of this output
The input routing and configuration of the strips is made via the control command API.
Combine outputs
The output_mapping block is used to define outputs of the entire Rendering Engine, by combining outputs from the video
and audio mixers and configuring where those should be sent.
The output mapping is an array of output mappings. Each mapping has the following parameters:
name- The unique name of the output mapping. This will be displayed in the REST API both for sources being streamed and sources with feedback streams that can be included in the multi-viewvideo_output- The name of the video mixer node of typeoutputto get the video stream from. Leave empty, or omit the key to create an audio-only outputaudio_output- The name of the audio output to get the audio stream from. Leave empty, or omit the key to create a video-only outputfeedback_input_slot- The input slot to use to feed this output back to the multi-view. The REST API may then refer to this input slot to include this output in a multi-view view. Value must be >= 100 as input slots up to 99 are reserved for “regular” sources. Use 0 to disable feedback of this stream.stream- Boolean value to tell if the output should be streamable and visible as an output in the REST API. If set to false the output will not turn up as anPipeline Outputin the REST API.
The following is a graphical visualisation of the output mappings in the JSON example configuration file above:

The default Rendering Engine config
If no Rendering Engine configuration file has been supplied by the user, a default configuration will be used. The following is the video node graph in the default configuration:
The full JSON for this default configuration is:
{
"version": "1.0",
"video" : {
"nodes":{
"transition": {"type":"transition"},
"alpha_combine": {"type":"alpha_combine"},
"chroma_key_select": {"type":"select"},
"chroma_key": {"type":"chroma_key"},
"chroma_key_transform": {"type":"transform"},
"pip1_select": {"type":"select"},
"pip1_transform": {"type":"transform"},
"pip2_select": {"type":"select"},
"pip2_transform": {"type":"transform"},
"html_select": {"type":"select"},
"alpha_over": {"type":"alpha_over"},
"chroma_key_alpha_over": {"type":"alpha_over"},
"pip1_alpha_over": {"type":"alpha_over"},
"pip2_alpha_over": {"type":"alpha_over"},
"html_alpha_over": {"type":"alpha_over"},
"fade_to_black": {"type":"fade_to_black"},
"program": {"type":"output"},
"preview": {"type":"output"}
},
"links":[
{"from_node":"transition", "from_socket":0, "to_node":"alpha_over", "to_socket":1},
{"from_node":"alpha_combine", "from_socket":0, "to_node":"alpha_over", "to_socket":0},
{"from_node":"alpha_over", "from_socket":0, "to_node":"chroma_key_alpha_over", "to_socket":1},
{"from_node":"chroma_key_select", "from_socket":0, "to_node":"chroma_key", "to_socket":0},
{"from_node":"chroma_key", "from_socket":0, "to_node":"chroma_key_transform", "to_socket":0},
{"from_node":"chroma_key_transform", "from_socket":0, "to_node":"chroma_key_alpha_over", "to_socket":0},
{"from_node":"chroma_key_alpha_over", "from_socket":0, "to_node":"pip1_alpha_over", "to_socket":1},
{"from_node":"pip1_select", "from_socket":0, "to_node":"pip1_transform", "to_socket":0},
{"from_node":"pip1_transform", "from_socket":0, "to_node":"pip1_alpha_over", "to_socket":0},
{"from_node":"pip1_alpha_over", "from_socket":0, "to_node":"pip2_alpha_over", "to_socket":1},
{"from_node":"pip2_select", "from_socket":0, "to_node":"pip2_transform", "to_socket":0},
{"from_node":"pip2_transform", "from_socket":0, "to_node":"pip2_alpha_over", "to_socket":0},
{"from_node":"pip2_alpha_over", "from_socket":0, "to_node":"html_alpha_over", "to_socket":1},
{"from_node":"html_select", "from_socket":0, "to_node":"html_alpha_over", "to_socket":0},
{"from_node":"html_alpha_over", "from_socket":0, "to_node":"fade_to_black", "to_socket":0},
{"from_node":"fade_to_black", "from_socket":0, "to_node":"program", "to_socket":0},
{"from_node":"transition", "from_socket":1, "to_node":"preview", "to_socket":0}
]
},
"audio" : {
"outputs": [
{"name": "main", "channels": 2}
]
},
"output_mapping" : [
{"name":"program", "video_output":"program", "audio_output":"main", "feedback_input_slot":1001, "stream":true},
{"name":"preview", "video_output":"preview", "feedback_input_slot":1002, "stream":false}
]
}
6.2.4 - Operational Control API
Ateliere Live Control API.
6.2.4.1 - Overview of JSON protocol
This is a description of the network protocol used to control, monitor and explore the components in a running Ateliere Live production.
The JSON protocol is used when connected to the Websocket Control Panel
(acl-websocketcontrolpanel) and has multi-client support, making it
possible for clients that are connected to the same production to mirror
each other’s controls.

The JSON protocol sits on top of an application-independent platform protocol which transports the JSON payload between the clients and the production.
Control Panel implementation
Note: This section is mainly needed if you plan on implementing a new control panel for the Atelier Live Rendering Engine using the C++ SDK.
Most of the JSON messages described in this document are sent and received by the Websocket Control Panel using the ControlDataSender interface. The interface encapsulates the packing and unpacking of messages to and from the application-agnostic platform protocol. The platform protocol includes the addresses for the sender and receiver(s) of the messages but is unaware of the contents of the packages.
The ControlDataSender interface defines the callbacks that should be used for
handling messages coming from the production.
Response and status messages are received from the production by setting the
mResponseCallback and mStatusMessageCallback, respectively. The data
received in these callbacks are complete JSON messages conforming to the
specification in this document and can be forwarded without changes to the
connected clients. There are however some exceptions to this.
Events
Messages of the type event currently signals that a connection was opened or
closed in the production. Event messages originate in the control panel meaning
that implementing support for this message type is part of making a control
panel using the C++ SDK.
The control panel gets the events from the underlying platform through the
ControlDataSender::Settings::mConnectionEventCallback. By inspecting the
ConnectionEvent provided in the callback, clients connected to the control
panel can be informed about the event. This can be used by other control
panels, implemented using the C++ SDK.
Please see the section about the event message type under “Message types” for
information about the message syntax.
Hop count
Messages of different types need to propagate to different depth of the
production. A hop count in each message determines if it will be relayed
from one Rendering Engine to a possibly chained one behind it.
When receiving a JSON message from a client, the Websocket Control Panel will select a hop count based on the content of the message, before sending the message to the production.
The hop count is marked in the platform layer of the protocol when sending a
message using ControlDataSender::sendRequestToReceivers. It is not visible
in the JSON message.
For each type of message, the hop count used by the Websocket Control Panel is specified in a “Hop count” section within “Message types” below. This hop count should be used when implementing a new C++ control panel.
The state tree
The control API is based around a state tree that makes up the hierarchy of parameters and entities in the Rendering Engine that can be controlled or monitored. The tree is expressed as a JSON structure.
An entity in the tree is addressed by a path consisting of the names of each enclosing object surrounding the entity.
For instance, in the structure below, the path to the g-field of the
rgb_filter would be /video/nodes/rgb_filter/g:
{
"video": {
"nodes": {
"rgb_filter": {
"r": 0.5,
"g": 0.4,
"b": -0.2
}
}
}
}
Message format
JSON syntax is used for all messages. The type and resource fields are
present in all messages and define the type of message and what resource that
is affected by this message.
{
"type": "...",
"resource": "..."
}
Message types
All changes that can be made to a production are available in the JSON API
through messages of type set or command.
A parameter that can be changed immediately, without side effects, and that
will keep its state until the next change can be accessed directly with a
set message. In other cases a command is necessary to initiate the change.
A set message might for instance be used for controlling the layer opacity
in an alpha-over node or the gain for an input to the audio mixer whereas a
command is needed to initiate the loading of a media file or a transition
effect spanning over a period of time.
To get the current state of a resource, a get message can be used. A resource
can also be monitored for changes using a subscribe message. When a
sub-resource is added or removed from the monitored resource, a state-add or
state-remove message is sent to the subscriber. Other changes result in a
state-change message.
Parameters that change continuously without any user input, such as the play
position of a media player or the loudness in an audio output, are referred to
as streaming parameters. Streaming parameters are monitored by sending a
sampling-start message to the resource path of the streaming parameter and
providing a time interval stating how often sampling-update messages should
be sent.
Table of message types
| Message type | Description |
|---|---|
get | Get the value of a resource |
get-response | The response to a get message |
set | Change the value of a resource |
set-response | The response to a set message |
subscribe | Subscribe to state changes within a resource |
subscribe-response | The response to a subscribe message |
unsubscribe | Stop monitoring state changes within a resource |
unsubscribe-response | The response to an unsubscribe message |
command | Execute a command in a resource |
command-response | The response to a command message |
state-change | Describes the new state of a resource |
state-add | A sub-resource was added to a resource |
state-remove | A sub-resource was removed from a resource |
subscription-list | List own subscriptions |
subscription-list-response | The response to a subscription-list-response message |
describe | Get a description of a resource |
describe-response | The response to a describe message |
sampling-start | Start sampling a streaming parameter |
sampling-start-response | The response to a sampling-start message |
sampling-stop | Stop sampling a streaming parameter |
sampling-stop-response | The response to a sampling-stop message |
sampling-list | List own streaming parameter subscriptions |
sampling-list-response | The response to a sampling-list message |
sampling-list-all | List all streaming parameter subscriptions |
sampling-list-all-response | The response to a sampling-list-all message |
sampling-update | Describes the latest sampled state of a streaming parameter |
event | Various information. Only sent to clients of the Websocket Control Panel |
All response messages contain the field timestamp. This is the time when the
request message was handled, i.e. the timestamp of the frame processed on that
time.
Each type of message is described in detail below.
get and get-response
A message of type get is used to retrieve the current state of a given
resource within the production.
Required fields for get messages:
| Parameter | Description |
|---|---|
| type | Must be “get” |
| resource | The path to get the current state from |
For instance:
{
"type": "get",
"resource": "/video/nodes"
}
The response is a get-response. A successful response contains a body
object with the current state of the resource:
{
"type": "get-response",
"resource": "/video/nodes",
"timestamp": 1731073800720000,
"body": {
...
}
}
The body has its root where the resource URI points.
An unsuccessful get has no body and contains an error message, for
instance:
{
"type": "get-response",
"resource": "/video/nodes",
"error": "No such resource: /video/nodes",
"timestamp": 1731073800720000
}
NOTE: Repeatedly calling get is a very inefficient way of monitoring the
state of a production. Please see the subscribe and state-change message
sections for a better way.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
get messages will stop at the first one and the state for that pipeline
will be returned. This is applicable when using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 (one) for get messages.
set and set-response
A message of type set is used to change the state of one or more components
located at a specified resource path in the production. This can for instance
be to change the currently selected video source of a transition node or to
change the gain of an audio strip.
set messages are generally only available for changes which are immediate.
Please see the command message section for details about changes that
occur over a period of time.
Required parameters for set messages:
| Parameter | Description |
|---|---|
| type | Must be “set” |
| resource | The path to apply the changes to |
| body | The set of changes to apply |
The body of a set request contains the new values of the fields to change
within the resource path. The structure of the body does not need to be
complete - only the fields that should be updated need to be included.
Example of a set request that changes program and preview within a
node named my_transition_node:
{
"type": "set",
"resource": "/video/nodes/my_transition_node",
"body": {
"preview": 3,
"program": 8
}
}
The body does not need to be an object when setting a single item, just the
value. Here is an example:
{
"type": "set",
"resource": "/audio/strips/1/filters/gain/value",
"body": 8.6
}
The set-response does not contain a body with the set values - instead changes
in the production need to be monitored by subscribing to the affected
resources.
Please see the subscribe message section for details about subscriptions.
If there is an error, a set-response is returned containing an error
message. In this case none of the parameters in the
body of the set message will be applied. If the set was successful the
response will contain a result ok key/value.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
set messages will propagate all the way to the last pipeline while following
the configured alignment delay of each step. This is applicable when using a
Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to -1 (negative one) for set messages.
command and command-response
Commands are used to initiate events in the production which are not immediate
or that do not have a direct relationship to one specific field of the
production state tree. For instance, when starting playback of a media file
there might be a play command. This will start the actual playback but also
change the player state (e.g. from paused to playing) and also start to
periodically update the current playback position field.
Required parameters for command messages:
| Parameter | Description |
|---|---|
| type | Must be “command” |
| resource | The resource receiving the command |
| body/command | The name of the command to execute |
| body/parameters | The set of parameters to the command. If the command takes no parameters, this can be skipped, or passed empty |
Example of a command that starts a fade command on a transition node:
{
"type": "command",
"resource": "/video/nodes/my_transition_node",
"body": {
"command": "fade",
"parameters": {
"duration_ms": 120
}
}
}
Example of a command that takes no parameters:
{
"type": "command",
"resource": "/video/nodes/my_transition_node",
"body": {
"command": "cut"
}
}
As for set-response messages, the command-response has no body - instead changes in
the production need to be monitored by subscribing to one or more resources.
Please see the subscribe message section for details about subscriptions.
If there is an error, a command-response is returned containing an error
message. If the command was successful the response will contain a result
ok key/value.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
command messages will propagate all the way to the last pipeline while
following the configured alignment delay of each step. This is applicable when
using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to -1 (negative one) for command messages.
subscribe and subscribe-response
Subscriptions are used to monitor changes in the production. This can e.g. be useful in order to mirror the controls of different control surfaces that are connected to the same production, detect when new resources appear, or to otherwise visualize different parts of the system.
Required parameters for subscribe messages:
| Parameter | Description |
|---|---|
| type | Must be “subscribe” |
| resource | The path to monitor for changes |
Example of a subscribe message for tracking changes of the resource
/audio/strips/3/compressor:
{
"type": "subscribe",
"resource": "/audio/strips/3/compressor"
}
The response is a subscribe-response. A successful response contains a body
object with the current state of the resource, for instance:
{
"type": "subscribe-response",
"resource": "/audio/strips/3/compressor",
"body": {
"attack": 30,
"gain": 1,
"knee": 3.5,
"ratio": 3.3,
"release": 2000,
"threshold": -24,
"type": "compressor"
},
"timestamp": 1731073800720000
}
If there is an error, a subscribe-response is returned containing an error
message instead of a body.
Whenever a monitored resource changes, a state-change, state-add or
state-remove message is sent to all subscribers of that resource. Please see
the state-change, state-add and state-remove message sections for details
about this.
Websocket Control Panel
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
subscribe messages will stop at the first one and it is from this pipeline
that state changes will be reported. This is applicable when using a Websocket
Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for subscribe messages.
unsubscribe and unsubscribe-response
To stop receiving updates when a monitored resource changes, an unsubscribe
message can be used.
Required parameters for unsubscribe messages:
| Parameter | Description |
|---|---|
| type | Must be “unsubscribe” |
| resource | The resource path to stop monitor for changes |
If the unsubscribe message is successful, an unsubscribe-response is
returned:
{
"type": "unsubscribe-response",
"resource": "/audio/strips/3/compressor",
"timestamp": 1731073800720000
}
If there is an error, an unsubscribe-response is returned containing an
error message instead of a body.
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
unsubscribe messages will stop at the first receiver of the message. This is
applicable when using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for unsubscribe messages.
state-change
A state-change message describes the new state for a number of fields within
a specified resource. state-change messages are sent from the production
side, i.e. they are only received, never sent, by clients.
state-change messages are sent whenever the internal state of the production
changes, for instance when:
- a client has issued a
setmessage - a command that changes the state is being executed
- an automation changes the state over a period of time
- a component, such as a metering device, has new data to report
To avoid loops or unnecessary updates on the client side, the message includes
an actor field stating whether the receiver of the message or some other
entity caused the change to happen.
actor value | Meaning |
|---|---|
| “self” | The receiver of the message caused the change |
| “other” | Another client caused the change |
| “system” | A change from within the system |
Format of the state-change message:
| Parameter | Description |
|---|---|
| type | Must be “state-change” |
| resource | The resource path that has changed |
| body | The fields that have changed within the resource |
| actor | The entity responsible for the change |
Below is an example state-change message where the client receiving the
message also caused the change to happen:
{
"type": "state-change",
"resource": "/audio/strips/3/compressor",
"actor": "self",
"body": {
"gain": 2.5,
"ratio": 4.0
}
}
state-add and state-remove
The state-add and state-remove messages are similar to the state-change
message. The top level resource field is the resource the client subscribes to.
In the body of the message there is another resource field telling what
sub-resource has been added or removed.
Examples:
{
"type": "state-add",
"resource": "/audio",
"actor": "system",
"body": {
"resource": "/strips/2"
}
}
{
"type": "state-remove",
"resource": "/audio",
"actor": "system",
"body": {
"resource": "/strips/2"
}
}
subscription-list and subscription-list-response
The subscription-list message is used to list own subscriptions. The response
message shows the client’s subscriptions, located under a given resource point
in the tree.
Required fields for subscription-list messages:
| Parameter | Description |
|---|---|
| type | Must be “subscription-list” |
| resource | The resource path to start looking for subscriptions from |
For instance:
{
"type": "subscription-list",
"resource": "/video"
}
The response is a subscription-list-response. A successful response contains a
body object with the current state of the resource:
{
"type": "subscription-list-response",
"resource": "/video",
"timestamp": 1731414140040000,
"body": {
"subscriptions": [
"/nodes/alpha_combine",
"/nodes/alpha_over"
]
}
}
The body has its root where the resource URI points.
An unsuccessful request has no body and contains an error message, for
instance:
{
"type": "subscription-list-response",
"resource": "/video/nodes/over",
"timestamp": 1731414382900000,
"error": "Failed to find resource with name 'over'"
}
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
subscription-list messages will stop at the first one, and the subscriptions
for that pipeline will be returned. This is applicable when using a Websocket
Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for subscription-list messages.
describe and describe-response
The purpose of these messages is to get a description of some resource in the state tree, like a node in the video mixer component for example. The descriptions will list all commands and parameters which are valid for the resource.
Required fields for describe messages:
| Parameter | Description |
|---|---|
| type | Must be “describe” |
| resource | The path to resource to describe |
This is the description for /video/nodes/fade_to_black:
{
"type": "describe-response",
"resource": "/video/nodes/fade_to_black",
"timestamp": 1731480819600000,
"body": {
"children": [],
"commands": [
{
"command": "fade_from",
"optional_parameters": [],
"required_parameters": [...],
...
},
...
],
"parameters": [
...
]
}
}
Hop count
In a proxy-editing setup, i.e. when there is one pipeline behind another one,
describe messages will stop at the first receiver of the message. This is
applicable when using a Websocket Control Panel.
When implementing a new control panel using the C++ SDK, set the hop count
to 1 for describe messages.
sampling-start and sampling-start-response
The sampling-start message is used to start sampling a streaming parameter.
If successful, sampling-update messages will be sent to the subscriber
periodically at the specified time inteval.
Required parameters for sampling-start messages:
| Parameter | Description |
|---|---|
| type | Must be “sampling-start” |
| resource | An expression describing the streaming parameter(s) to start sampling |
| body/interval_ms | The update interval |
An asterisk (*) can be used at any level of the resource expression to
indicate “all components at this level”. If an asterisk is used, no other
characters are allowed at that level of the path.
For instance, "resource": "/audio/mixes/*/input_meter/*" can be used to start
sampling all streaming parameters under input_meter for all audio mixes.
The interval_ms parameter must be greater than or equal to 40.
Example:
{
"type": "sampling-start",
"resource": "/audio/mixes/*/input_meter/*",
"body": {
"interval_ms": 100
}
}
If there is an error, a sampling-start-response is returned containing an
error message. If the sampling-start was successful the response will
contain a result ok key/value.
sampling-stop and sampling-stop-response
The sampling-stop message is used to stop sampling a streaming parameter.
Required parameters for sampling-stop messages:
| Parameter | Description |
|---|---|
| type | Must be “sampling-stop” |
| resource | An expression used to start sampling one or more streaming parameters |
The resource parameter must match one used to start sampling exactly.
Example:
{
"type": "sampling-stop",
"resource": "/audio/mixes/*/input_meter/*"
}
If there is an error, a sampling-stop-response is returned containing an
error message. If the sampling-stop was successful the response will
contain a result ok key/value.
sampling-list and sampling-list-response
The sampling-list message is used to list the streaming parameter
subscriptions that are registered to the client sending the message.
Required parameters for sampling-stop messages:
| Parameter | Description |
|---|---|
| type | Must be “sampling-list” |
| resource | Must be “/” |
Example:
{
"type": "sampling-list",
"resource": "/"
}
If there is an error, a sampling-list-response is returned containing an
error message. If the sampling-stop was successful the response will
contain a list of all the sender’s streaming parameter subscriptions.
Example:
{
"type": "sampling-list-response",
"resource": "/",
"body": {
"samplings": [
"/audio/strips/1/pre_filter_meter/*",
"/audio/mixes/0/input_meter/*"
]
},
"timestamp": 1736860857880000
}
sampling-update
A sampling-update message describes the latest sampled state of one or more
streaming parameters matching a subscription. The message is sent periodically
to clients that have started subscriptions using sampling-start.
The message contains the resource expression used in sampling-start. If
necessary this can be used to identify the subscription in the client.
The body of the message contains the updated state for all of the streaming
parameters matching the subscription. Note that the body starts at the root of
the state tree, which is different from e.g. get responses or subscriptions
for non-streaming parameters.
Example:
{
"type": "sampling-update",
"resource": "/audio/strips/*/pre_filter_meter/*",
"body": {
"audio": {
"strips": {
"1": {
"pre_filter_meter": {
"peak": -0.439775225995602234
}
},
"2": {
"pre_filter_meter": {
"peak": -0.982362873895602837
}
}
}
}
},
"timestamp": 1736861180080000
}
event
When connected to a Websocket Control Panel it will act as a proxy in front of
the Rendering Engine. This introduces a message of type event, which is only
used between the Websocket Control Panel and its clients.
Messages of type event contain an event field specifying the type of event.
All clients connected to the Websocket Control Panel will receive events of type
connect whenever a new connection is established between the Websocket Control
Panel and a Rendering Engine. Such a message might look like:
{
"type": "event",
"connected_node": "<uuid>",
"address": "<uuid>:<uuid>:...",
"event": "connect"
}
where connected_node is the UUID of the newly connected node (Rendering Engine) and
address is a colon separated list of UUIDs, which is the address to the node that
discovered the connection. For connect events this is currently only the Websocket
Control Panel itself, meaning the address is always the Websocket Control Panel’s.
When a connection between a client and a Websocket Control Panel is established,
the client will receive connect events for all Rendering Engines that where
already connected to the Websocket Control Panel, to let the client know it
is connected to a production.
If the connection between the Websocket Control Panel and the Rendering Engine
breaks, whether it is disconnected on purpose or gets disconnected due to a network
outage, the Websocket Control Panel will send an event message to all its clients.
{
"type": "event",
"disconnected_node": "<uuid>",
"address": "<uuid>:<uuid>:...",
"event": "disconnect"
}
A similar message is also sent to the clients in case the connection between two
Rendering Engines/Pipelines is torn down or lost, such as between a Low Delay
and a High Quality Pipeline. In that case the address parameter will be the UUID
of the Websocket Control Panel followed by the UUID of the LD Pipeline and the
disconnected_node is the UUID of the HQ Pipeline.
6.2.4.2 - Rendering Engine components
This page describes the parameters and commands that is used for controlling the video mixer, audio mixer, HTML renderers and media players in the Ateliere Live Rendering Engine. This topic is closely related to this page on how to configure the rendering engine at startup.
Control command protocol
All commands to the Ateliere Live Rendering Engine are sent as human readable JSON objects and are listed below.
Each subsystem of the rendering engine has their own set of parameters and commands, and can be reached using:
/videofor the video mixer/audiofor the audio mixer (if using the built-in mixer)/ndi_audiofor the NDI audio mixer/htmlfor the html renderer instances/mediafor the media playback instances

Video mixer resources
Background
The video mixer is built as a tree graph of processing nodes, please see this page for further information on the video mixer node graph. The names of the nodes defined in the node graph are used as part of the resources: /video/nodes/{node_name} and they all have the parameter type which describes which type of video node it is.
There are 10 different node types.
- The
Transitionnode is used to pick which input slots to use for the program and preview output. The node also supports making transitions between the program and preview. - The
Selectnode simply forwards one of the available sources to its output. - The
Alpha combinenode is used to pick two input slots (or the same input slot) to copy the color from one input and combine it with some information from the other input to form the alpha. The color will just be copied from the color input frame, but there are several modes that can be used to produce the alpha channel in the output frame in different ways. This is known as “key & fill” in broadcasting. - The
Alpha overnode is used to perform an “Alpha Over” operation, that is to put the overlay video stream on top of the background video stream, and let the background be seen through the overlay depending on the alpha of the overlay. The node also features fading the graphics in and out by multiplying the alpha channel by a constant factor. - The
Transformnode takes one input stream and transforms it (scaling and translating) to one output stream. - The
Chroma Keynode takes one input stream, and by setting appropriate parameters for the keying, it will remove areas with the key color from the incoming video stream both affecting the alpha and color channels - The
Fade to blacknode takes one input stream, which it can fade to or from black gradually, and then outputs that stream. - The
Outputnode has one input stream and will output that stream out from the video mixer, back to the Rendering Engine. It has no control commands - The
Cropnode takes one input stream and can crop a video stream to a new size - The
Video delaynode takes one input stream and will hold the frames for a configured amount of time before forwarding the frames, causing a delay of the video output
To reset the runtime configuration of all video nodes to their default state use the reset command of the /video resource.
Transition
The transition node picks a program and a preview video source from the input slots and forward these to other nodes. The node also features auto transitions between the program and the preview sources. Some transition commands last over a duration of time, for example wipes. These can be performed either automatically or manually. The automatic mode works by the operator first selecting the type of transition, for instance a fade, setting the preview to the input slot to fade to and then trigger the transition at the right time with a auto command with the duration for the transition. In manual mode the exact position of the transition is set by the control panel by setting the factor parameter. This is used for implementing T-bars, where the T-bar repeatedly sends the current position of the bar. In the manual mode, the transition type is set before the transition begins, just as in the automatic mode. Note that an automatic transition will be overridden in case the transition position/factor is manually set, by interrupting the automatic transition and jumping to the manually set position.
resource: /video/nodes/{node name} type: transition
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The mix factor between the program and the preview input source, in the range 0.0 to 1.0. For example 0.3 means 30% transition from program to preview. The visible effect is dependent on the transition mode used. |
| mode | string | read-write | fade | The transition mode to use (fade, wipe_left, wipe_right) |
| preview | uint32 | read-write | 0 | The currently used input slot for the preview |
| program | uint32 | read-write | 0 | The currently used input slot for the program |
| type | string | read-only | transition | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0,
"mode": "fade",
"preview": 0,
"program": 0
}
}
Commands
auto
Start an auto transition with the currently selected transition type over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration in milliseconds of the automatic transition |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "auto",
"parameters": {
"duration_ms": <uint32>
}
}
}
cut
Make a cut by swapping the program and preview inputs
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "cut"
}
}
Select
A node to select a video source from the input slots and send it on to the next node.
resource: /video/nodes/{node name} type: select
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| input | uint32 | read-write | 0 | Which input slot the video stream is currently picked from |
| type | string | read-only | select | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"input": 0
}
}
Alpha combine
A node to combine the color channels of one video stream with the alpha from another. This node is useful for video sources where the alpha channel is provided as a separate black and white video source that must be combined with the color source. The node supports multiple modes of obtaining the alpha, either by copying a specific color or alpha channel of some input slot, or by taking the average of the R, G and B channels of the video from some input slot.
resource: /video/nodes/{node name} type: alpha_combine
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| alpha | uint32 | read-write | 0 | The input slot to get the alpha input source from |
| color | uint32 | read-write | 0 | The input slot to get the color input source from |
| mode | string | read-write | average-rgb | The mode to use for combining the color and alpha input sources (copy-r, copy-g, copy-b, copy-a, average-rgb) |
| type | string | read-only | alpha_combine | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"alpha": 0,
"color": 0,
"mode": "average-rgb"
}
}
Alpha over
A node to combine two video streams using alpha over compositing, overlaying the foreground stream on the background stream. The node will keep the transparency of both layers. The overlay stream can be faded in and out of the background stream.
resource: /video/nodes/{node name} type: alpha_over
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The compositing factor. Range 0.0 to 1.0, where 0.0 means that the overlay is not composited on to the background and 1.0 means the overlay is fully visible on top of the background input. |
| type | string | read-only | alpha_over | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade away the overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to fully visible overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
Transform
A node to transform an incoming video stream, by scaling and transposing it. The canvas size of the input will be kept and all surrounding area in case the source video is shrunk, is filled with transparent black.
resource: /video/nodes/{node name} type: transform
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| scale | float | read-write | 1 | The relative scale of the video stream. Use 1.0 for original scale. |
| type | string | read-only | transform | The video node type |
| x | float | read-write | 0 | The X position of the upper left corner of the image as a fraction of the canvas’ width. For example use 0.0 to snap it to the left edge, or 0.5 to the center of the image |
| y | float | read-write | 0 | The Y position of the upper left corner of the image as a fraction of the canvas’ height. For example use 0.0 to snap it to the top edge, or 0.5 to the center of the image |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"scale": 1.0,
"x": 0.0,
"y": 0.0
}
}
Chroma key
A node to perform chroma keying on an incoming video stream. The output video stream will have the alpha and possibly the color channels modified, according to the parameter values in this node. To remove a color from the incoming video stream, first enable the node and then select the key color to remove. The key color can be selected in two ways, either by manually setting the color with the R, G and B channel values, or by using the color picker. When using the color picker, the color picker command will define the position and size of the color picker square to sample the incoming video stream. The R, G and B color parameters will be updated according to the average color of the area when the command was received by the Rendering Engine. The currently selected color can be shown in the upper left hand corner in the output video stream of the node by setting the parameter show_key_color to true. Also, the latest sampled color picker area can be drawn in the node’s output by setting show_color_picker to true. When a suitable color has been chosen, adjust the distance and falloffparameters to get a clear mask. To aid the tweaking of the parameters, set the show_alpha parameter to true. This will make the node output the black and white mask instead of the keyed result, which makes it easier to see which parts are masked away and not. Remember to turn this off before going on air. As a last step, any remaining fringes of the key color around the subject can be desaturated with the color_spill parameter. But remember this will desaturate colors close to the key color even in parts of the frame fully visible.
resource: /video/nodes/{node name} type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| color_spill | float | read-write | 0.1 | Desaturation factor of colors that are close to the key color, without changing the alpha. Range 0.0 to 1.0, where 0.0 keeps the current saturation. |
| distance | float | read-write | 0.1 | The maximum deviation from the selected key color that is also considered part of the color to mask away. Range 0.0 to 1.0, where 0.0 means only the exact key color will be removed and greater values means more colors further away from the key color are removed. |
| enabled | bool | read-write | false | When set to true the node will be enabled, false will just bypass the node. |
| falloff | float | read-write | 0.08 | The falloff factor used to smooth out the edge in the mask between which colors are fully removed and which are fully kept, by making the colors in between semi-transparent. Range 0.0 to 1.0, where 0.0 means sharp edges. |
| show_alpha | bool | read-write | false | Switch on to show the resulting alpha channel as output instead of the keyed result, useful to easier see which parts are masked away and which are not. Make sure to turn this off before going on air. |
| show_color_picker | bool | read-write | false | Controls the visibility of the color picker area in the output video. The marker will show the latest sampled area in the video stream. Make sure to turn this off before going on air. |
| show_key_color | bool | read-write | false | Controls the visibility of the currently used key color as a small square in the upper left corner of the image. Make sure to turn this off before going on air. |
| type | string | read-only | chroma_key | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"color_spill": 0.1,
"distance": 0.1,
"enabled": false,
"falloff": 0.08,
"show_alpha": false,
"show_color_picker": false,
"show_key_color": false
}
}
Commands
pick_color
Given a size and location, pick a color in the current video frame. The picked color will be the average color in the square defined by the parameters.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| size | uint32 | required | Size in pixels of the color picker square |
| x | float | required | X position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
| y | float | required | Y position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "pick_color",
"parameters": {
"size": <uint32>,
"x": <float>,
"y": <float>
}
}
}
Chroma key / Key color
The key color
resource: /video/nodes/{node name}/key_color type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| b | float | read-write | 0 | The blue channel, in range 0.0 to 1.0 |
| g | float | read-write | 0 | The green channel, in range 0.0 to 1.0 |
| r | float | read-write | 0 | The red channel, in range 0.0 to 1.0 |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}/key_color",
"body": {
"b": 0.0,
"g": 0.0,
"r": 0.0
}
}
Fade to black
A node to fade the incoming video stream to and from black.
resource: /video/nodes/{node name} type: fade_to_black
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The factor, where 1.0 means the output will be fully black and 0.0 means the input will be passed through unmodified. |
| type | string | read-only | fade_to_black | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade from a fully black frame to the input video stream over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to a fully black frame over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
Crop
A node to crop the incoming video stream. The node can crop the left, right, top and bottom edge of the incoming video stream. The areas outside of the cropped area will be transparent in the output.
resource: /video/nodes/{node name} type: crop
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| bottom | float | read-write | 1 | Position of the bottom crop edge, in percent of the image’s height |
| left | float | read-write | 0 | Position of the left crop edge, in percent of the image’s width |
| right | float | read-write | 1 | Position of the right crop edge, in percent of the image’s width |
| top | float | read-write | 0 | Position of the top crop edge, in percent of the image’s height |
| type | string | read-only | crop | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"bottom": 1.0,
"left": 0.0,
"right": 1.0,
"top": 0.0
}
}
Video delay
A node to delay the video stream a given number of frames.
resource: /video/nodes/{node name} type: video_delay
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| delay | uint32 | read-write | 0 | The number of frames to delay the video |
| type | string | read-only | video_delay | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"delay": 0
}
}
Audio mixer resources
Overview
The audio mixer has the following data path:

The three main elements of the audio mixer are the Input strips, the Mixes, and the Outputs.
Input strips
Audio enters the audio mixer through the input strips. When a strip has been created, the audio for the strip is selected among the available channels in the Rendering Engine’s input slots.
In the example picture above, three sources are connected to the input slots. The slots have four, two, and six channels respectively. In the illustration we can see that the first strip uses a single channel from the first slot, the second strip uses channel three and four from the second slot and so on. Several input strips may select the same input slot channels.
Each input strip has two stereo output connection points (
), one
before the volume fader (pre fader) and one after the volume fader (post fader). When a mix or
an output is connected to the output of a strip, which of these two locations to take the audio from
can be selected using the origin parameter.
Mixes
Mixes are used to combine the output from input strips, or other mixes, and also allows for further
filtering of the audio signal. When a mix has been created, the input strips and other mixes contributing
to the mix can be controlled in the /inputs/strips and /inputs/mixes sections of the mix.
Just like an input strip a mix has two stereo output connection points
(
) that can be used when connecting the output of the mix to another
mix or an output.
Outputs
Each output corresponds to an audio output in the Rendering Engine configuration. An output takes
audio from a single location, either directly from an input strip or from a mix. In both cases
it can be specified whether to take the audio pre_fader or post_fader.
Note: The audio mixer is completely separate from the video mixer, so switching image in the video mixer will not change the audio mixer in any way.
Audio mixer root
The internal audio mixer consists of input strips (/strips), mixes (/mixes) and output buses (/outputs). The strips are the inputs of the audio mixer, taking audio from the inputs of the Rendering Engine. The mixes mix audio from strips and other mixes. Finally the output buses are the outputs of the audio mixer, taking audio from a single strip or a mix.
resource: /audio
Commands
reset
Reset this audio mixer to its initial state. This will remove all input strips and mixes and reset all outputs.
Command template
{
"type": "command",
"resource": "/audio",
"body": {
"command": "reset"
}
}
To reset the audio mixer to the default state, including removal of all configured input strips, use the reset command of the /audio resource.
Input strips
An input strip in the audio mixer, which takes audio from the input slots of the Rendering Engine (/input). Audio is either taken as a mono channel or as a stereo pair. The audio is sent through a filter chain (/filters). After the filter chain the output loudness of the strip is controlled by a main fader. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, measuring the raw audio input (/input_meter).
resource: /audio/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this input strip. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}",
"body": {
"label": ""
}
}
Input strip input configuration
Input settings for a strip.
resource: /audio/strips/{strip index}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| first_channel | uint32 | read-write | 0 | The index of the first audio channel. This is the left channel for stereo. For mid/side stereo, this is the mid channel. The index refers to the channel index in the referenced input_slot. |
| input_slot | uint32 | read-write | 0 | The input slot of the Rendering Engine that audio is taken from. |
| is_stereo | bool | read-write | false | True if the input audio should be treated as stereo, false for mono. For mono only first_channel will be used. For stereo first_channel will be left and second_channel will be right. |
| second_channel | uint32 | read-write | 1 | The index of the second audio channel. This is the right channel for regular stereo and for mid/side stereo, this is the side channel. The index refers to the channel index in the referenced input_slot. Only used in stereo mode. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/input",
"body": {
"first_channel": 0,
"input_slot": 0,
"is_stereo": false,
"second_channel": 1
}
}
Input loudness meter
Peak loudness meter for incoming audio, measured before the filters of this input strip. This meter will either have one streaming parameter called ‘peak’ in case the strip is in mono mode, else two streaming parameters ‘peak_left’ and ‘peak_right’ will replace the ‘peak’ parameter when in stereo mode.
resource: /audio/strips/{strip index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak | float | The peak loudness for a mono channel |
Mid side stereo
Filter for controlling the mid and side amount of an audio signal. The input can either be Mid-Side (MS) or Left-Right (LR) stereo. Mono input will be passed through unaltered. If the input is LR, it is converted to MS with the mid channel being the average of the input channels and the side channel being half the difference of the channels. With the signal in MS format the mid and the side amount can be controlled using the mid_amount, side_amount, and invert_polarity parameters.
resource: /audio/strips/{strip index}/filters/mid_side
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enabled | bool | read-write | false | Set to true to enable this filter. |
| input_format | string | read-write | lr_stereo | The input signal’s format. The available options are: lr_stereo: Input is left-right (LR) stereo ms_stereo: Input is mid-side (MS) stereo Mono input will always be bypassed. |
| invert_polarity | bool | read-write | true | Phase-invert the side channel when applying it to the right channel of the LR output. If input_format is lr_stereo this is usually the right thing to do. If input_format is ms_stereo it is a matter of taste. |
| mid_amount | float | read-write | 1 | The amount of the mid channel to include in the output. Floating point value from 0.0 to 1.0. |
| side_amount | float | read-write | 1 | The amount of the side channel to include in the output. Floating point value from 0.0 to 1.0. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/mid_side",
"body": {
"enabled": false,
"input_format": "lr_stereo",
"invert_polarity": true,
"mid_amount": 1.0,
"side_amount": 1.0
}
}
Pre-gain
Gain filter
resource: /audio/strips/{strip index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/gain",
"body": {
"value": 0.0
}
}
Parametric equalizer
Equalizer filter
resource: /audio/strips/{strip index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq",
"body": {
"command": "reset"
}
}
Parametric equalizer bands
A filter/band in the equalizer
resource: /audio/strips/{strip index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
Dynamic range compressor
Dynamic range compressor
resource: /audio/strips/{strip index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
Panning
Panning filter
resource: /audio/strips/{strip index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/pan",
"body": {
"value": 0.0
}
}
Pre-fader loudness meter
Peak loudness meter for filtered audio, measured after the filters of this input strip, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Input strip fader
Volume fader controlling the output loudness of this strip
resource: /audio/strips/{strip index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Post-fader loudness meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this input strip. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Mixes
A mix in the audio mixer, which takes audio from selected input strips and possibly other mixes to mix to a single stereo pair. After mixing the inputs (/inputs) of the mix, the audio is sent through a filter chain (/filters), similar to that of an input strip. After the filter chain the output loudness of the mix is controlled by a main fader. The inputs of a mix can either be taken pre- or post-fader from the strips and other mixes included in the mix. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, after the inputs has been mixed down to a single stereo pair (/input_meter).
resource: /audio/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this mix. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}",
"body": {
"label": ""
}
}
Mixes inputs
The inputs to this mix.
resource: /audio/mixes/{mix index}/inputs
Mixes inputs from input strips
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Mixes inputs from other mixes
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Input loudness meter
Peak loudness meter for incoming audio, measured before the filters of this mix. This meter will always have two streaming parameters ‘peak_left’ and ‘peak_right’, since the input to the mix is always stereo.
resource: /audio/mixes/{mix index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Pre-gain
Gain filter
resource: /audio/mixes/{mix index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/gain",
"body": {
"value": 0.0
}
}
Parametric equalizer
Equalizer filter
resource: /audio/mixes/{mix index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq",
"body": {
"command": "reset"
}
}
Parametric equalizer bands
A filter/band in the equalizer
resource: /audio/mixes/{mix index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
Dynamic range compressor
Dynamic range compressor
resource: /audio/mixes/{mix index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
Panning
Panning filter
resource: /audio/mixes/{mix index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/pan",
"body": {
"value": 0.0
}
}
Pre-fader loudness meter
Peak loudness meter for filtered audio, measured after the filters of this mix, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the mix is stereo.
resource: /audio/mixes/{mix index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Mix output fader
Volume fader controlling the output loudness of this mix
resource: /audio/mixes/{mix index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
Post-fader loudness meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this mix. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/mixes/{mix index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Output bus
Audio mixer output bus to select which input strip or mix should be sent to the output of the audio mixer. The outputs are populated from the Rendering Engine config. Audio from a strip or a mix can be selected for the output. The selected source of this output can either be taken pre- or post-fader from the referenced strip or mix.This makes it possible for outputs meant for pre-listening to listen to a mix or strip without touching its fader. Such outputs can also jump freely between mixes to listen to what is being output from the mixer or strips to listen to the incoming components to tweak the audio filters. The selected audio is fed through a loudness meter.
resource: /audio/outputs/{output name}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this output bus. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}",
"body": {
"label": ""
}
}
Output bus input
The source of an output bus.
resource: /audio/outputs/{output name}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| index | uint32 | read-write | 0 | The index of the input strip or mix the audio is taken from. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| source | string | read-write | mix | Where the audio is taken from. Can be either ‘strip’ or ‘mix’. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/input",
"body": {
"index": 0,
"origin": "post_fader",
"source": "mix"
}
}
Output bus loudness meter
Loudness meters for the output bus. Used to monitor the loudness of the outgoing audio from the mixer.This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’. When the parameter ’enable_ebu_meters’ is set to true, three additional streaming parameters will be available, called ’ebu_m’, ’ebu_s’ and ’ebu_i’, which measure loudness according to the EBU R 128 standard.
resource: /audio/outputs/{output name}/meters
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enable_ebu_meters | bool | read-write | false | Enable the EBU R 128 Meters. Only enable these for the output where the meters are actually used, as they can be quite resource intensive |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"enable_ebu_meters": false
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| ebu_i | float | EBU R 128 Integrated loudness with gating. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_m | float | EBU R 128 Momentary loudness with 400 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_s | float | EBU R 128 Short-term loudness with 3000 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Commands
reset
Reset all the EBU loudness meters, starting over with measuring loudness
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"command": "reset"
}
}
External audio mixing via NDI
The internal audio mixer can be replaced with an external audio mixer, where NDI is used for communicating with the external mixer. To enable the external NDI audio mixer the Rendering Engine application should be started with the environment variable ACL_AUDIO_MIXER set to external_ndi.
The external NDI audio mixer bridge
resource: /ndi_audio
Sending audio to external mixer
All streams to send to the external audio mixer
resource: /ndi_audio/send_streams
Commands
add_stream
Add a new stream for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
A stream to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI send stream. The name is set when creating the stream using the add_stream command. |
Commands
disable_channel
Disable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to disable |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "disable_channel",
"parameters": {
"index": <uint32>
}
}
}
enable_channel
Enable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to enable |
| input_slot | uint32 | optional | The input slot to send audio from. |
| channel | uint32 | optional | The index of the channel within the input slot to send audio from |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "enable_channel",
"parameters": {
"index": <uint32>,
"input_slot": uint32,
"channel": uint32
}
}
}
List of audio channels to send
resource: /ndi_audio/send_streams/{send stream index}/channels
A channel to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}/channels/{channel index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| channel | uint32 | read-write | 0 | The index of the channel within the input slot to send audio from |
| input_slot | uint32 | read-write | 0 | The input slot to send audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/send_streams/{send stream index}/channels/{channel index}",
"body": {
"channel": 0,
"input_slot": 0
}
}
Receiving audio in return from the external mixer
All streams that returns audio from the external audio mixer
resource: /ndi_audio/return_streams
Commands
add_stream
Add a new stream for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
A stream which returns audio from the external audio mixer
resource: /ndi_audio/return_streams/{return stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI return stream matching the name of an NDI sender on the network. The name is set when creating the stream using the add_stream command. |
Mapping received audio to outputs
All audio outputs from this component
resource: /ndi_audio/outputs
An output from this component consisting of audio from one or more NDI return streams
resource: /ndi_audio/outputs/{output bus}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | main | The name of this output |
The list of channels for one output
resource: /ndi_audio/outputs/{output bus}/channels
An output channel
resource: /ndi_audio/outputs/{output bus}/channels/1
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| return_channel | uint32 | read-write | 0 | The channel to take audio from |
| return_stream | uint32 | read-write | 0 | The return stream to take audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/outputs/{output bus}/channels/1",
"body": {
"return_channel": 0,
"return_stream": 0
}
}
HTML rendering
The Rendering Engine features a built-in HTML renderer which uses the Chromium web browser engine to render HTML pages. This resource can create and close HTML renderers.
resource: /html
Commands
close
Close the HTML renderer instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the HTML browser to close |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new HTML renderer instance with the canvas size of width x height pixels and output the rendered frames to the given input slot, if url is set it will be loaded on startup, otherwise about:blank is loaded.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new browser to, cannot be 0 |
| width | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s width |
| height | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s height |
| url | string | optional | The optional URL to load at creation of the browser |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"width": <uint32>,
"height": <uint32>,
"url": string
}
}
}
reset
Close all open HTML renderers
Command template
{
"type": "command",
"resource": "/html",
"body": {
"command": "reset"
}
}
HTML renderer
This resource controls an HTML renderer instance and allows loading of new URLs and executing JavaScript snippets.
resource: /html/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| height | uint32 | read-only | 1080 | The height in pixels of this HTML renderer canvas |
| url | string | read-only | Currently loaded URL | |
| width | uint32 | read-only | 1920 | The width in pixels of this HTML renderer canvas |
Commands
execute
Execute JavaScript in this HTML renderer. The JavaScript snippet might span over multiple lines and may contain spaces.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| javascript | string | required | The JavaScript snippet to execute in this browser. The snippet might span over multiple lines. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "execute",
"parameters": {
"javascript": <string>
}
}
}
load
Load a new URL in this HTML renderer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| url | string | required | The new URL to load in this browser |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "load",
"parameters": {
"url": <string>
}
}
}
Media players
The Rendering Engine can create media player instances to play video and audio files from the hard drive of the machine running the Rendering Engine. It is up to the user of the API to ensure the files are uploaded to the machines running the Rendering Engine(s) before trying to run them. The media players use the FFmpeg library to demux and decode the media files, so most files supported by FFmpeg should work. This resource can create and close media players.
resource: /media
Commands
close
Close the media player instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the media player to close. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new media player instance and output the rendered frames to the given input slot. If the path is set, it will be loaded at startup
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new media player to, cannot be 0 |
| path | string | optional | The path of the media file to load into this media player |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"path": string
}
}
}
reset
Close all media players
Command template
{
"type": "command",
"resource": "/media",
"body": {
"command": "reset"
}
}
Media player
This resource controls a media player instance. The media players have three parameters that can be set to control if only a portion of the file should be played, and if the playback should loop once it reaches the end. See the section_start_ms, section_duration_ms and loop parameters below.
resource: /media/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| is_playing | bool | read-only | false | Playback state of this media player |
| loop | bool | read-write | false | Controls the looping behavior of the media player. Set to true to loop from the section start once the media playback reaches the end of the section or the end of the file |
| media_duration_ms | int32 | read-only | -1 | The total duration of the currently loaded media file in milliseconds |
| path | string | read-only | The path to the currently loaded media file | |
| section_duration_ms | uint32 | read-write | 4294967295 | Duration in milliseconds of section window, counted from the section start time |
| section_start_ms | uint32 | read-write | 0 | Start time in milliseconds of section window, counted from the beginning of the media file |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/media/{input slot}",
"body": {
"loop": false,
"section_duration_ms": 4294967295,
"section_start_ms": 0
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| current_time_ms | int32 | Current play time in milliseconds |
| time_left_ms | int32 | Time left in milliseconds |
Commands
load
Load a media file into this media player and pause playback on the first frame. This will also reset the start, duration, section and looping parameters of this media player.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| path | string | required | The path to the new media file to load |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "load",
"parameters": {
"path": <string>
}
}
}
pause
Pause the playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "pause"
}
}
play
Start/resume playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "play"
}
}
seek
Seek to a given time point, in milliseconds, from the start of the media file and pause the playback.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| time_ms | int32 | required | The time in milliseconds from the beginning of the file to seek to |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "seek",
"parameters": {
"time_ms": <int32>
}
}
}
6.2.4.3 - Control API reference
All available controllable resources have a unique resource path and are listed below. The resources may contain some or all of the following sections:
- Parameters
- Streaming parameters
- Commands
/
The root resource of the Rendering Engine
resource: /
Commands
reset
Reset the state of the Rendering Engine, will call reset on all its child components
Command template
{
"type": "command",
"resource": "/",
"body": {
"command": "reset"
}
}
/audio
The internal audio mixer consists of input strips (/strips), mixes (/mixes) and output buses (/outputs). The strips are the inputs of the audio mixer, taking audio from the inputs of the Rendering Engine. The mixes mix audio from strips and other mixes. Finally the output buses are the outputs of the audio mixer, taking audio from a single strip or a mix.
resource: /audio
Commands
reset
Reset this audio mixer to its initial state. This will remove all input strips and mixes and reset all outputs.
Command template
{
"type": "command",
"resource": "/audio",
"body": {
"command": "reset"
}
}
/audio/mixes
List of audio mixer mixes.
resource: /audio/mixes
Commands
add_mix
Add a mix to this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the mix to add |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes",
"body": {
"command": "add_mix",
"parameters": {
"index": <uint32>
}
}
}
remove_mix
Remove a mix from this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the mix to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes",
"body": {
"command": "remove_mix",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}
A mix in the audio mixer, which takes audio from selected input strips and possibly other mixes to mix to a single stereo pair. After mixing the inputs (/inputs) of the mix, the audio is sent through a filter chain (/filters), similar to that of an input strip. After the filter chain the output loudness of the mix is controlled by a main fader. The inputs of a mix can either be taken pre- or post-fader from the strips and other mixes included in the mix. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, after the inputs has been mixed down to a single stereo pair (/input_meter).
resource: /audio/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this mix. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}",
"body": {
"label": ""
}
}
/audio/mixes/{mix index}/fader
Volume fader controlling the output loudness of this mix
resource: /audio/mixes/{mix index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/mixes/{mix index}/filters
Chain of audio filters.
resource: /audio/mixes/{mix index}/filters
/audio/mixes/{mix index}/filters/compressor
Dynamic range compressor
resource: /audio/mixes/{mix index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
/audio/mixes/{mix index}/filters/eq
Equalizer filter
resource: /audio/mixes/{mix index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq",
"body": {
"command": "reset"
}
}
/audio/mixes/{mix index}/filters/eq/bands
Equalizer filter list
resource: /audio/mixes/{mix index}/filters/eq/bands
Commands
add_band
Add a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to add. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq/bands",
"body": {
"command": "add_band",
"parameters": {
"index": <uint32>
}
}
}
remove_band
Remove a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to remove. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/filters/eq/bands",
"body": {
"command": "remove_band",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}/filters/eq/bands/{band index}
A filter/band in the equalizer
resource: /audio/mixes/{mix index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
/audio/mixes/{mix index}/filters/gain
Gain filter
resource: /audio/mixes/{mix index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/gain",
"body": {
"value": 0.0
}
}
/audio/mixes/{mix index}/filters/pan
Panning filter
resource: /audio/mixes/{mix index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/filters/pan",
"body": {
"value": 0.0
}
}
/audio/mixes/{mix index}/input_meter
Peak loudness meter for incoming audio, measured before the filters of this mix. This meter will always have two streaming parameters ‘peak_left’ and ‘peak_right’, since the input to the mix is always stereo.
resource: /audio/mixes/{mix index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/mixes/{mix index}/inputs
The inputs to this mix.
resource: /audio/mixes/{mix index}/inputs
/audio/mixes/{mix index}/inputs/mixes
List of audio volume faders for the result of the other mixes included in this mix.
resource: /audio/mixes/{mix index}/inputs/mixes
Commands
add_mix
Add the result of another mix to this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of another mix to add to this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes",
"body": {
"command": "add_mix",
"parameters": {
"index": <uint32>
}
}
}
remove_mix
Remove the result of another mix from this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the other mix to remove from this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes",
"body": {
"command": "remove_mix",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}/inputs/mixes/{mix index}
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/mixes/{mix index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/mixes/{mix index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/mixes/{mix index}/inputs/strips
List of audio volume faders for the input strips included in this mix.
resource: /audio/mixes/{mix index}/inputs/strips
Commands
add_strip
Add an input strip to this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to add to this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips",
"body": {
"command": "add_strip",
"parameters": {
"index": <uint32>
}
}
}
remove_strip
Remove an input strip from this mix.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to remove from this mix. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips",
"body": {
"command": "remove_strip",
"parameters": {
"index": <uint32>
}
}
}
/audio/mixes/{mix index}/inputs/strips/{strip index}
Volume fader for controlling the contribution of the result of the other mix to this mix
resource: /audio/mixes/{mix index}/inputs/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"muted": false,
"origin": "post_fader",
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/mixes/{mix index}/inputs/strips/{strip index}",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/mixes/{mix index}/post_fader_meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this mix. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/mixes/{mix index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/mixes/{mix index}/pre_fader_meter
Peak loudness meter for filtered audio, measured after the filters of this mix, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the mix is stereo.
resource: /audio/mixes/{mix index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/outputs
List of audio output buses. The output buses are the outputs of the audio mixer. An output bus can output audio from a strip or from a mix and take the audio pre- or post-fader of that strip or mix.
resource: /audio/outputs
/audio/outputs/{output name}
Audio mixer output bus to select which input strip or mix should be sent to the output of the audio mixer. The outputs are populated from the Rendering Engine config. Audio from a strip or a mix can be selected for the output. The selected source of this output can either be taken pre- or post-fader from the referenced strip or mix.This makes it possible for outputs meant for pre-listening to listen to a mix or strip without touching its fader. Such outputs can also jump freely between mixes to listen to what is being output from the mixer or strips to listen to the incoming components to tweak the audio filters. The selected audio is fed through a loudness meter.
resource: /audio/outputs/{output name}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this output bus. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}",
"body": {
"label": ""
}
}
/audio/outputs/{output name}/input
The source of an output bus.
resource: /audio/outputs/{output name}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| index | uint32 | read-write | 0 | The index of the input strip or mix the audio is taken from. |
| origin | string | read-write | post_fader | Where in the input strip or the mix the audio is taken from, can be either ‘pre_fader’ or ‘post_fader’. |
| source | string | read-write | mix | Where the audio is taken from. Can be either ‘strip’ or ‘mix’. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/input",
"body": {
"index": 0,
"origin": "post_fader",
"source": "mix"
}
}
/audio/outputs/{output name}/meters
Loudness meters for the output bus. Used to monitor the loudness of the outgoing audio from the mixer.This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’. When the parameter ’enable_ebu_meters’ is set to true, three additional streaming parameters will be available, called ’ebu_m’, ’ebu_s’ and ’ebu_i’, which measure loudness according to the EBU R 128 standard.
resource: /audio/outputs/{output name}/meters
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enable_ebu_meters | bool | read-write | false | Enable the EBU R 128 Meters. Only enable these for the output where the meters are actually used, as they can be quite resource intensive |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"enable_ebu_meters": false
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| ebu_i | float | EBU R 128 Integrated loudness with gating. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_m | float | EBU R 128 Momentary loudness with 400 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| ebu_s | float | EBU R 128 Short-term loudness with 3000 ms sliding window. This streaming parameter is only visible when ’enable_ebu_meters’ is set to true |
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
Commands
reset
Reset all the EBU loudness meters, starting over with measuring loudness
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/outputs/{output name}/meters",
"body": {
"command": "reset"
}
}
/audio/strips
List of audio mixer input strips.
resource: /audio/strips
Commands
add_strip
Add an input strip to this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to add. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips",
"body": {
"command": "add_strip",
"parameters": {
"index": <uint32>
}
}
}
remove_strip
Remove an input strip from this audio mixer.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the strip to remove. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips",
"body": {
"command": "remove_strip",
"parameters": {
"index": <uint32>
}
}
}
/audio/strips/{strip index}
An input strip in the audio mixer, which takes audio from the input slots of the Rendering Engine (/input). Audio is either taken as a mono channel or as a stereo pair. The audio is sent through a filter chain (/filters). After the filter chain the output loudness of the strip is controlled by a main fader. There are peak meters placed before (/pre_fader_meter) and after (/post_fader_meter) the fader, as well as before the filter chain, measuring the raw audio input (/input_meter).
resource: /audio/strips/{strip index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| label | string | read-write | A user defined label describing this input strip. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}",
"body": {
"label": ""
}
}
/audio/strips/{strip index}/fader
Volume fader controlling the output loudness of this strip
resource: /audio/strips/{strip index}/fader
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| muted | bool | read-write | false | Set to true if this fader should be muted. This will not affect the volume parameter. |
| volume | float | read-write | 0 | The volume multiplication factor for this fader. For example 0.0 is silence, 1.0 is original volume, values higher than 1.0 amplifies the audio. This is also the current volume during auto transitions. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"muted": false,
"volume": 0.0
}
}
Commands
fade
Automatically fade the volume to a given target volume over a period of time.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| volume | float | required | The target volume of the fade in a fraction where 0.0 means no volume and 1.0 means original volume. |
| duration_ms | uint32 | required | The duration of the automatic fade in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/fader",
"body": {
"command": "fade",
"parameters": {
"volume": <float>,
"duration_ms": <uint32>
}
}
}
/audio/strips/{strip index}/filters
Chain of audio filters.
resource: /audio/strips/{strip index}/filters
/audio/strips/{strip index}/filters/compressor
Dynamic range compressor
resource: /audio/strips/{strip index}/filters/compressor
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| attack | float | read-write | 50 | The attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. |
| gain | float | read-write | 0 | The make-up gain in decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. |
| knee | float | read-write | 0 | The width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. |
| ratio | float | read-write | 1 | Maximum compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio |
| release | float | read-write | 200 | The release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. |
| threshold | float | read-write | 0 | The threshold for activation of the compressor in decibels. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/compressor",
"body": {
"attack": 50.0,
"gain": 0.0,
"knee": 0.0,
"ratio": 1.0,
"release": 200.0,
"threshold": 0.0
}
}
/audio/strips/{strip index}/filters/eq
Equalizer filter
resource: /audio/strips/{strip index}/filters/eq
Commands
reset
Reset this equalizer to its initial state, disabling all bands.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq",
"body": {
"command": "reset"
}
}
/audio/strips/{strip index}/filters/eq/bands
Equalizer filter list
resource: /audio/strips/{strip index}/filters/eq/bands
Commands
add_band
Add a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to add. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq/bands",
"body": {
"command": "add_band",
"parameters": {
"index": <uint32>
}
}
}
remove_band
Remove a band in this equalizer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the band to remove. In range 0 to 9. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/audio/strips/{strip index}/filters/eq/bands",
"body": {
"command": "remove_band",
"parameters": {
"index": <uint32>
}
}
}
/audio/strips/{strip index}/filters/eq/bands/{band index}
A filter/band in the equalizer
resource: /audio/strips/{strip index}/filters/eq/bands/{band index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| freq | float | read-write | 1000 | The center or corner frequency in Hz. For peak, notch, and band_pass filters this is the center frequency. For low_pass, high_pass, low_shelf, and high_shelf filters this is the corner frequency. |
| gain | float | read-write | 0 | The gain in decibels (dB). The gain parameter only has effect on peaking and shelving filters. |
| q | float | read-write | 0.707 | The Q-factor shaping the falloff of the filter. A higher value means a more pointy curve. |
| type | string | read-write | none | The type of this filter. The available types are: none: Bypass audio without any changes low_pass: Low-pass filter at the current frequency. Gain has no effect. high_pass: High-pass filter at the current frequency. Gain has no effect. band_pass: Band-pass filter at the current frequency. Gain has no effect. low_shelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value. high_shelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value. peak: Peak filter. Frequencies around the currently set value are modified by the current gain value. notch: Notch filter. Frequencies around the currently set value are reduced greatly. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/eq/bands/{band index}",
"body": {
"freq": 1000.0,
"gain": 0.0,
"q": 0.707,
"type": "none"
}
}
/audio/strips/{strip index}/filters/gain
Gain filter
resource: /audio/strips/{strip index}/filters/gain
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | Signal gain in decibels (dB) |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/gain",
"body": {
"value": 0.0
}
}
/audio/strips/{strip index}/filters/mid_side
Filter for controlling the mid and side amount of an audio signal. The input can either be Mid-Side (MS) or Left-Right (LR) stereo. Mono input will be passed through unaltered. If the input is LR, it is converted to MS with the mid channel being the average of the input channels and the side channel being half the difference of the channels. With the signal in MS format the mid and the side amount can be controlled using the mid_amount, side_amount, and invert_polarity parameters.
resource: /audio/strips/{strip index}/filters/mid_side
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| enabled | bool | read-write | false | Set to true to enable this filter. |
| input_format | string | read-write | lr_stereo | The input signal’s format. The available options are: lr_stereo: Input is left-right (LR) stereo ms_stereo: Input is mid-side (MS) stereo Mono input will always be bypassed. |
| invert_polarity | bool | read-write | true | Phase-invert the side channel when applying it to the right channel of the LR output. If input_format is lr_stereo this is usually the right thing to do. If input_format is ms_stereo it is a matter of taste. |
| mid_amount | float | read-write | 1 | The amount of the mid channel to include in the output. Floating point value from 0.0 to 1.0. |
| side_amount | float | read-write | 1 | The amount of the side channel to include in the output. Floating point value from 0.0 to 1.0. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/mid_side",
"body": {
"enabled": false,
"input_format": "lr_stereo",
"invert_polarity": true,
"mid_amount": 1.0,
"side_amount": 1.0
}
}
/audio/strips/{strip index}/filters/pan
Panning filter
resource: /audio/strips/{strip index}/filters/pan
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| value | float | read-write | 0 | The panning value in the range -1.0 to 1.0. For example -1.0 means fully panned left, 0.0 means center panned, 1.0 means fully panned right. |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/filters/pan",
"body": {
"value": 0.0
}
}
/audio/strips/{strip index}/input
Input settings for a strip.
resource: /audio/strips/{strip index}/input
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| first_channel | uint32 | read-write | 0 | The index of the first audio channel. This is the left channel for stereo. For mid/side stereo, this is the mid channel. The index refers to the channel index in the referenced input_slot. |
| input_slot | uint32 | read-write | 0 | The input slot of the Rendering Engine that audio is taken from. |
| is_stereo | bool | read-write | false | True if the input audio should be treated as stereo, false for mono. For mono only first_channel will be used. For stereo first_channel will be left and second_channel will be right. |
| second_channel | uint32 | read-write | 1 | The index of the second audio channel. This is the right channel for regular stereo and for mid/side stereo, this is the side channel. The index refers to the channel index in the referenced input_slot. Only used in stereo mode. |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/audio/strips/{strip index}/input",
"body": {
"first_channel": 0,
"input_slot": 0,
"is_stereo": false,
"second_channel": 1
}
}
/audio/strips/{strip index}/input_meter
Peak loudness meter for incoming audio, measured before the filters of this input strip. This meter will either have one streaming parameter called ‘peak’ in case the strip is in mono mode, else two streaming parameters ‘peak_left’ and ‘peak_right’ will replace the ‘peak’ parameter when in stereo mode.
resource: /audio/strips/{strip index}/input_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak | float | The peak loudness for a mono channel |
/audio/strips/{strip index}/post_fader_meter
Peak loudness meter for filtered audio, measured after the fader and after the filters of this input strip. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/post_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/audio/strips/{strip index}/pre_fader_meter
Peak loudness meter for filtered audio, measured after the filters of this input strip, but before the fader. This meter will always have two streaming parameters called ‘peak_left’ and ‘peak_right’, since the output of the strip is stereo.
resource: /audio/strips/{strip index}/pre_fader_meter
Streaming parameters
| Name | Type | Description |
|---|---|---|
| peak_left | float | The peak loudness for the left stereo channel |
| peak_right | float | The peak loudness for the right stereo channel |
/html
The Rendering Engine features a built-in HTML renderer which uses the Chromium web browser engine to render HTML pages. This resource can create and close HTML renderers.
resource: /html
Commands
close
Close the HTML renderer instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the HTML browser to close |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new HTML renderer instance with the canvas size of width x height pixels and output the rendered frames to the given input slot, if url is set it will be loaded on startup, otherwise about:blank is loaded.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new browser to, cannot be 0 |
| width | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s width |
| height | uint32 | required | The canvas width of the new browser. The output will be automatically scaled to the rendering engine’s height |
| url | string | optional | The optional URL to load at creation of the browser |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"width": <uint32>,
"height": <uint32>,
"url": string
}
}
}
reset
Close all open HTML renderers
Command template
{
"type": "command",
"resource": "/html",
"body": {
"command": "reset"
}
}
/html/{input slot}
This resource controls an HTML renderer instance and allows loading of new URLs and executing JavaScript snippets.
resource: /html/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| height | uint32 | read-only | 1080 | The height in pixels of this HTML renderer canvas |
| url | string | read-only | Currently loaded URL | |
| width | uint32 | read-only | 1920 | The width in pixels of this HTML renderer canvas |
Commands
execute
Execute JavaScript in this HTML renderer. The JavaScript snippet might span over multiple lines and may contain spaces.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| javascript | string | required | The JavaScript snippet to execute in this browser. The snippet might span over multiple lines. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "execute",
"parameters": {
"javascript": <string>
}
}
}
load
Load a new URL in this HTML renderer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| url | string | required | The new URL to load in this browser |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/html/{input slot}",
"body": {
"command": "load",
"parameters": {
"url": <string>
}
}
}
/media
The Rendering Engine can create media player instances to play video and audio files from the hard drive of the machine running the Rendering Engine. It is up to the user of the API to ensure the files are uploaded to the machines running the Rendering Engine(s) before trying to run them. The media players use the FFmpeg library to demux and decode the media files, so most files supported by FFmpeg should work. This resource can create and close media players.
resource: /media
Commands
close
Close the media player instance connected to the given input slot
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot with the media player to close. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "close",
"parameters": {
"input_slot": <uint32>
}
}
}
create
Create a new media player instance and output the rendered frames to the given input slot. If the path is set, it will be loaded at startup
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| input_slot | uint32 | required | The input slot to connect the new media player to, cannot be 0 |
| path | string | optional | The path of the media file to load into this media player |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media",
"body": {
"command": "create",
"parameters": {
"input_slot": <uint32>,
"path": string
}
}
}
reset
Close all media players
Command template
{
"type": "command",
"resource": "/media",
"body": {
"command": "reset"
}
}
/media/{input slot}
This resource controls a media player instance. The media players have three parameters that can be set to control if only a portion of the file should be played, and if the playback should loop once it reaches the end. See the section_start_ms, section_duration_ms and loop parameters below.
resource: /media/{input slot}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| is_playing | bool | read-only | false | Playback state of this media player |
| loop | bool | read-write | false | Controls the looping behavior of the media player. Set to true to loop from the section start once the media playback reaches the end of the section or the end of the file |
| media_duration_ms | int32 | read-only | -1 | The total duration of the currently loaded media file in milliseconds |
| path | string | read-only | The path to the currently loaded media file | |
| section_duration_ms | uint32 | read-write | 4294967295 | Duration in milliseconds of section window, counted from the section start time |
| section_start_ms | uint32 | read-write | 0 | Start time in milliseconds of section window, counted from the beginning of the media file |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/media/{input slot}",
"body": {
"loop": false,
"section_duration_ms": 4294967295,
"section_start_ms": 0
}
}
Streaming parameters
| Name | Type | Description |
|---|---|---|
| current_time_ms | int32 | Current play time in milliseconds |
| time_left_ms | int32 | Time left in milliseconds |
Commands
load
Load a media file into this media player and pause playback on the first frame. This will also reset the start, duration, section and looping parameters of this media player.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| path | string | required | The path to the new media file to load |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "load",
"parameters": {
"path": <string>
}
}
}
pause
Pause the playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "pause"
}
}
play
Start/resume playback in this media player.
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "play"
}
}
seek
Seek to a given time point, in milliseconds, from the start of the media file and pause the playback.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| time_ms | int32 | required | The time in milliseconds from the beginning of the file to seek to |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/media/{input slot}",
"body": {
"command": "seek",
"parameters": {
"time_ms": <int32>
}
}
}
/ndi_audio
The external NDI audio mixer bridge
resource: /ndi_audio
/ndi_audio/outputs
All audio outputs from this component
resource: /ndi_audio/outputs
/ndi_audio/outputs/{output bus}
An output from this component consisting of audio from one or more NDI return streams
resource: /ndi_audio/outputs/{output bus}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | main | The name of this output |
/ndi_audio/outputs/{output bus}/channels
The list of channels for one output
resource: /ndi_audio/outputs/{output bus}/channels
/ndi_audio/outputs/{output bus}/channels/0
An output channel
resource: /ndi_audio/outputs/{output bus}/channels/0
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| return_channel | uint32 | read-write | 0 | The channel to take audio from |
| return_stream | uint32 | read-write | 0 | The return stream to take audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/outputs/{output bus}/channels/0",
"body": {
"return_channel": 0,
"return_stream": 0
}
}
/ndi_audio/outputs/{output bus}/channels/1
An output channel
resource: /ndi_audio/outputs/{output bus}/channels/1
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| return_channel | uint32 | read-write | 0 | The channel to take audio from |
| return_stream | uint32 | read-write | 0 | The return stream to take audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/outputs/{output bus}/channels/1",
"body": {
"return_channel": 0,
"return_stream": 0
}
}
/ndi_audio/return_streams
All streams that returns audio from the external audio mixer
resource: /ndi_audio/return_streams
Commands
add_stream
Add a new stream for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for receiving audio from the external NDI mixer
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/return_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
/ndi_audio/return_streams/{return stream index}
A stream which returns audio from the external audio mixer
resource: /ndi_audio/return_streams/{return stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI return stream matching the name of an NDI sender on the network. The name is set when creating the stream using the add_stream command. |
/ndi_audio/send_streams
All streams to send to the external audio mixer
resource: /ndi_audio/send_streams
Commands
add_stream
Add a new stream for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream on the network. Must be unique. |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "add_stream",
"parameters": {
"name": <string>
}
}
}
remove_stream
Remove a stream used for sending channels to the NDI receiver
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| name | string | required | The name of the NDI stream to remove |
Command template
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams",
"body": {
"command": "remove_stream",
"parameters": {
"name": <string>
}
}
}
/ndi_audio/send_streams/{send stream index}
A stream to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| name | string | read-only | The name of the NDI send stream. The name is set when creating the stream using the add_stream command. |
Commands
disable_channel
Disable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to disable |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "disable_channel",
"parameters": {
"index": <uint32>
}
}
}
enable_channel
Enable a send_channel (0 - 7) for sending audio to the NDI receiver.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| index | uint32 | required | The index of the channel to enable |
| input_slot | uint32 | optional | The input slot to send audio from. |
| channel | uint32 | optional | The index of the channel within the input slot to send audio from |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/ndi_audio/send_streams/{send stream index}",
"body": {
"command": "enable_channel",
"parameters": {
"index": <uint32>,
"input_slot": uint32,
"channel": uint32
}
}
}
/ndi_audio/send_streams/{send stream index}/channels
List of audio channels to send
resource: /ndi_audio/send_streams/{send stream index}/channels
/ndi_audio/send_streams/{send stream index}/channels/{channel index}
A channel to send to the external audio mixer
resource: /ndi_audio/send_streams/{send stream index}/channels/{channel index}
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| channel | uint32 | read-write | 0 | The index of the channel within the input slot to send audio from |
| input_slot | uint32 | read-write | 0 | The input slot to send audio from |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/ndi_audio/send_streams/{send stream index}/channels/{channel index}",
"body": {
"channel": 0,
"input_slot": 0
}
}
/video
The root resource of the video mixer
resource: /video
Commands
reset
Reset the runtime state of all the nodes in the video mixer back to their default configuration.
Command template
{
"type": "command",
"resource": "/video",
"body": {
"command": "reset"
}
}
/video/nodes
The nodes of the video mixer
resource: /video/nodes
/video/nodes/{node name} type: alpha_combine
A node to combine the color channels of one video stream with the alpha from another. This node is useful for video sources where the alpha channel is provided as a separate black and white video source that must be combined with the color source. The node supports multiple modes of obtaining the alpha, either by copying a specific color or alpha channel of some input slot, or by taking the average of the R, G and B channels of the video from some input slot.
resource: /video/nodes/{node name} type: alpha_combine
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| alpha | uint32 | read-write | 0 | The input slot to get the alpha input source from |
| color | uint32 | read-write | 0 | The input slot to get the color input source from |
| mode | string | read-write | average-rgb | The mode to use for combining the color and alpha input sources (copy-r, copy-g, copy-b, copy-a, average-rgb) |
| type | string | read-only | alpha_combine | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"alpha": 0,
"color": 0,
"mode": "average-rgb"
}
}
/video/nodes/{node name} type: alpha_over
A node to combine two video streams using alpha over compositing, overlaying the foreground stream on the background stream. The node will keep the transparency of both layers. The overlay stream can be faded in and out of the background stream.
resource: /video/nodes/{node name} type: alpha_over
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The compositing factor. Range 0.0 to 1.0, where 0.0 means that the overlay is not composited on to the background and 1.0 means the overlay is fully visible on top of the background input. |
| type | string | read-only | alpha_over | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade away the overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to fully visible overlay over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
/video/nodes/{node name} type: chroma_key
A node to perform chroma keying on an incoming video stream. The output video stream will have the alpha and possibly the color channels modified, according to the parameter values in this node. To remove a color from the incoming video stream, first enable the node and then select the key color to remove. The key color can be selected in two ways, either by manually setting the color with the R, G and B channel values, or by using the color picker. When using the color picker, the color picker command will define the position and size of the color picker square to sample the incoming video stream. The R, G and B color parameters will be updated according to the average color of the area when the command was received by the Rendering Engine. The currently selected color can be shown in the upper left hand corner in the output video stream of the node by setting the parameter show_key_color to true. Also, the latest sampled color picker area can be drawn in the node’s output by setting show_color_picker to true. When a suitable color has been chosen, adjust the distance and falloffparameters to get a clear mask. To aid the tweaking of the parameters, set the show_alpha parameter to true. This will make the node output the black and white mask instead of the keyed result, which makes it easier to see which parts are masked away and not. Remember to turn this off before going on air. As a last step, any remaining fringes of the key color around the subject can be desaturated with the color_spill parameter. But remember this will desaturate colors close to the key color even in parts of the frame fully visible.
resource: /video/nodes/{node name} type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| color_spill | float | read-write | 0.1 | Desaturation factor of colors that are close to the key color, without changing the alpha. Range 0.0 to 1.0, where 0.0 keeps the current saturation. |
| distance | float | read-write | 0.1 | The maximum deviation from the selected key color that is also considered part of the color to mask away. Range 0.0 to 1.0, where 0.0 means only the exact key color will be removed and greater values means more colors further away from the key color are removed. |
| enabled | bool | read-write | false | When set to true the node will be enabled, false will just bypass the node. |
| falloff | float | read-write | 0.08 | The falloff factor used to smooth out the edge in the mask between which colors are fully removed and which are fully kept, by making the colors in between semi-transparent. Range 0.0 to 1.0, where 0.0 means sharp edges. |
| show_alpha | bool | read-write | false | Switch on to show the resulting alpha channel as output instead of the keyed result, useful to easier see which parts are masked away and which are not. Make sure to turn this off before going on air. |
| show_color_picker | bool | read-write | false | Controls the visibility of the color picker area in the output video. The marker will show the latest sampled area in the video stream. Make sure to turn this off before going on air. |
| show_key_color | bool | read-write | false | Controls the visibility of the currently used key color as a small square in the upper left corner of the image. Make sure to turn this off before going on air. |
| type | string | read-only | chroma_key | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"color_spill": 0.1,
"distance": 0.1,
"enabled": false,
"falloff": 0.08,
"show_alpha": false,
"show_color_picker": false,
"show_key_color": false
}
}
Commands
pick_color
Given a size and location, pick a color in the current video frame. The picked color will be the average color in the square defined by the parameters.
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| size | uint32 | required | Size in pixels of the color picker square |
| x | float | required | X position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
| y | float | required | Y position of the center of the color picker square as a fraction of the frame’s width. Range 0.0 to 1.0 |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "pick_color",
"parameters": {
"size": <uint32>,
"x": <float>,
"y": <float>
}
}
}
/video/nodes/{node name}/key_color type: chroma_key
The key color
resource: /video/nodes/{node name}/key_color type: chroma_key
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| b | float | read-write | 0 | The blue channel, in range 0.0 to 1.0 |
| g | float | read-write | 0 | The green channel, in range 0.0 to 1.0 |
| r | float | read-write | 0 | The red channel, in range 0.0 to 1.0 |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}/key_color",
"body": {
"b": 0.0,
"g": 0.0,
"r": 0.0
}
}
/video/nodes/{node name} type: crop
A node to crop the incoming video stream. The node can crop the left, right, top and bottom edge of the incoming video stream. The areas outside of the cropped area will be transparent in the output.
resource: /video/nodes/{node name} type: crop
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| bottom | float | read-write | 1 | Position of the bottom crop edge, in percent of the image’s height |
| left | float | read-write | 0 | Position of the left crop edge, in percent of the image’s width |
| right | float | read-write | 1 | Position of the right crop edge, in percent of the image’s width |
| top | float | read-write | 0 | Position of the top crop edge, in percent of the image’s height |
| type | string | read-only | crop | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"bottom": 1.0,
"left": 0.0,
"right": 1.0,
"top": 0.0
}
}
/video/nodes/{node name} type: fade_to_black
A node to fade the incoming video stream to and from black.
resource: /video/nodes/{node name} type: fade_to_black
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The factor, where 1.0 means the output will be fully black and 0.0 means the input will be passed through unmodified. |
| type | string | read-only | fade_to_black | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0
}
}
Commands
fade_from
Fade from a fully black frame to the input video stream over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_from",
"parameters": {
"duration_ms": <uint32>
}
}
}
fade_to
Fade to a fully black frame over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration of the automatic transition in milliseconds. |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "fade_to",
"parameters": {
"duration_ms": <uint32>
}
}
}
/video/nodes/{node name} type: output
A node to mark an output point from the video mixer.
resource: /video/nodes/{node name} type: output
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| type | string | read-only | output | The video node type |
/video/nodes/{node name} type: select
A node to select a video source from the input slots and send it on to the next node.
resource: /video/nodes/{node name} type: select
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| input | uint32 | read-write | 0 | Which input slot the video stream is currently picked from |
| type | string | read-only | select | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"input": 0
}
}
/video/nodes/{node name} type: transform
A node to transform an incoming video stream, by scaling and transposing it. The canvas size of the input will be kept and all surrounding area in case the source video is shrunk, is filled with transparent black.
resource: /video/nodes/{node name} type: transform
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| scale | float | read-write | 1 | The relative scale of the video stream. Use 1.0 for original scale. |
| type | string | read-only | transform | The video node type |
| x | float | read-write | 0 | The X position of the upper left corner of the image as a fraction of the canvas’ width. For example use 0.0 to snap it to the left edge, or 0.5 to the center of the image |
| y | float | read-write | 0 | The Y position of the upper left corner of the image as a fraction of the canvas’ height. For example use 0.0 to snap it to the top edge, or 0.5 to the center of the image |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"scale": 1.0,
"x": 0.0,
"y": 0.0
}
}
/video/nodes/{node name} type: transition
The transition node picks a program and a preview video source from the input slots and forward these to other nodes. The node also features auto transitions between the program and the preview sources. Some transition commands last over a duration of time, for example wipes. These can be performed either automatically or manually. The automatic mode works by the operator first selecting the type of transition, for instance a fade, setting the preview to the input slot to fade to and then trigger the transition at the right time with a auto command with the duration for the transition. In manual mode the exact position of the transition is set by the control panel by setting the factor parameter. This is used for implementing T-bars, where the T-bar repeatedly sends the current position of the bar. In the manual mode, the transition type is set before the transition begins, just as in the automatic mode. Note that an automatic transition will be overridden in case the transition position/factor is manually set, by interrupting the automatic transition and jumping to the manually set position.
resource: /video/nodes/{node name} type: transition
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| factor | float | read-write | 0 | The mix factor between the program and the preview input source, in the range 0.0 to 1.0. For example 0.3 means 30% transition from program to preview. The visible effect is dependent on the transition mode used. |
| mode | string | read-write | fade | The transition mode to use (fade, wipe_left, wipe_right) |
| preview | uint32 | read-write | 0 | The currently used input slot for the preview |
| program | uint32 | read-write | 0 | The currently used input slot for the program |
| type | string | read-only | transition | The video node type |
Example `set` message
Below is a JSON example that includes all writable parameters for this resource. A `set` message may have a subset of these parameters, so exclude the ones you don't need to set.
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"factor": 0.0,
"mode": "fade",
"preview": 0,
"program": 0
}
}
Commands
auto
Start an auto transition with the currently selected transition type over a given time period
Parameters
| Name | Type | Required/optional | Description |
|---|---|---|---|
| duration_ms | uint32 | required | The duration in milliseconds of the automatic transition |
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
Replace parameter values, enclosed by "<>", according to their data type.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "auto",
"parameters": {
"duration_ms": <uint32>
}
}
}
cut
Make a cut by swapping the program and preview inputs
Command template
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "command",
"resource": "/video/nodes/{node name}",
"body": {
"command": "cut"
}
}
/video/nodes/{node name} type: video_delay
A node to delay the video stream a given number of frames.
resource: /video/nodes/{node name} type: video_delay
Parameters
| Name | Type | Access Mode | Default | Description |
|---|---|---|---|---|
| delay | uint32 | read-write | 0 | The number of frames to delay the video |
| type | string | read-only | video_delay | The video node type |
Example `set` message
In the "resource" path, replace sections enclosed by braces "{}" with the name or id of the resource.
{
"type": "set",
"resource": "/video/nodes/{node name}",
"body": {
"delay": 0
}
}
6.2.5 - C++ SDK
Ateliere Live C++ SDK reference.
6.2.5.1 - Classes
- namespace Acl
- namespace AclLog
A namespace for logging utilities.- class FileLocationFormatterFlag
A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. - class ThreadNameFormatterFlag
- class FileLocationFormatterFlag
- struct AlignedAudioFrame
AlignedAudioFrame is a frame of interleaved floating point audio samples with a given number of channels. - struct AlignedFrame
A frame of aligned data that is passed to the rendering engine from the MediaReceiver. A DataFrame contains a time stamped frame of media, which might be video, audio and auxiliary data such as subtitles. A single DataFrame can contain one or multiple types of media. Which media types are included can be probed by nullptr-checking/size checking the data members. The struct has ownership of all data pointers included. The struct includes all logic for freeing the resources held by this struct and the user should therefore just make sure the struct itself is deallocated to ensure all resources are freed. - class ControlDataAddress
A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start. - namespace ControlDataCommon
- struct ConnectionEvent
A connection related event. - struct Response
A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. - struct StatusMessage
A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from.
- struct ConnectionEvent
- class ControlDataSender
A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers.- struct Settings
Settings for a ControlDataSender.
- struct Settings
- class DeviceMemory
RAII class for a CUDA memory buffer. - class IControlDataReceiver
IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has areceivingorlisteningside, as well as asendingside. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests.- class IRequest
Interface for a request that can be responded to. - struct RequestData
An incoming request to this ControlDataReceiver. - struct Settings
Settings for a ControlDataReceiver.
- class IRequest
- class IMediaStreamer
IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to.- struct Configuration
The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface. - struct Settings
Settings used when creating a new MediaStreamer.
- struct Configuration
- class ISystemControllerInterface
An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. - class IngestApplication
- struct Settings
- namespace IngestUtils
- class MediaReceiver
A MediaReceiver contains the logic for receiving, decoding and aligning incoming media sources from the Ingests. The aligned data is then delivered to the Rendering Engine which is also responsible for setting up the MediaReceiver. The MediaReceiver has a builtin multi view generator, which can create output streams containing composited subsets of the incoming video sources. This class is controlled using an ISystemControllerInterface provided when starting it.- struct CustomSystemControllerCallResponse
A struct containing the data returned from the Rendering Engine on a custom System Controller call, with information that will be propagated back to the System Controller and its client. - struct NewStreamParameters
A struct containing information on the format of an incoming stream. - struct Settings
Settings for a MediaReceiver.
- struct CustomSystemControllerCallResponse
- class SystemControllerConnection
An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket.- struct Settings
Settings for a SystemControllerConnection.
- struct Settings
- namespace TimeCommon
- struct TAIStatus
- struct TimeStructure
- class UUID
A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard.
- namespace AclLog
- namespace fmt
- struct formatter< Acl::AudioChannelLayout >
- struct formatter< Acl::ControlDataAddress >
- struct formatter< Acl::ControlDataCommon::EventType >
- struct formatter< Acl::FieldOrder >
- struct formatter< Acl::ISystemControllerInterface::StatusCode >
- struct formatter< Acl::SystemControllerConnection::ComponentType >
- struct formatter< Acl::UUID >
- namespace spdlog
6.2.5.1.1 - Acl::AclLog::FileLocationFormatterFlag
Acl::AclLog::FileLocationFormatterFlag Class Reference
A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call.
#include <AclLog.h>
Inherits from spdlog::custom_flag_formatter
Public Functions
| Name | |
|---|---|
| void | format(const spdlog::details::log_msg & msg, const std::tm & , spdlog::memory_buf_t & dest) override |
| std::unique_ptr< custom_flag_formatter > | clone() const override |
Public Functions Documentation
function format
inline void format(
const spdlog::details::log_msg & msg,
const std::tm & ,
spdlog::memory_buf_t & dest
) override
function clone
inline std::unique_ptr< custom_flag_formatter > clone() const override
6.2.5.1.2 - Acl::AclLog::ThreadNameFormatterFlag
Acl::AclLog::ThreadNameFormatterFlag Class Reference
Inherits from spdlog::custom_flag_formatter
Public Functions
| Name | |
|---|---|
| void | format(const spdlog::details::log_msg & , const std::tm & , spdlog::memory_buf_t & dest) override |
| std::unique_ptr< custom_flag_formatter > | clone() const override |
Public Functions Documentation
function format
inline void format(
const spdlog::details::log_msg & ,
const std::tm & ,
spdlog::memory_buf_t & dest
) override
function clone
inline std::unique_ptr< custom_flag_formatter > clone() const override
6.2.5.1.3 - Acl::AlignedAudioFrame
Acl::AlignedAudioFrame Struct Reference
AlignedAudioFrame is a frame of interleaved floating point audio samples with a given number of channels.
#include <AlignedFrame.h>
Public Attributes
| Name | |
|---|---|
| std::vector< float > | mSamples |
| uint8_t | mNumberOfChannels |
| uint32_t | mNumberOfSamplesPerChannel |
Public Attributes Documentation
variable mSamples
std::vector< float > mSamples;
variable mNumberOfChannels
uint8_t mNumberOfChannels = 0;
variable mNumberOfSamplesPerChannel
uint32_t mNumberOfSamplesPerChannel = 0;
6.2.5.1.4 - Acl::AlignedFrame
Acl::AlignedFrame Struct Reference
A frame of aligned data that is passed to the rendering engine from the MediaReceiver. A DataFrame contains a time stamped frame of media, which might be video, audio and auxiliary data such as subtitles. A single DataFrame can contain one or multiple types of media. Which media types are included can be probed by nullptr-checking/size checking the data members. The struct has ownership of all data pointers included. The struct includes all logic for freeing the resources held by this struct and the user should therefore just make sure the struct itself is deallocated to ensure all resources are freed.
#include <AlignedFrame.h>
Public Functions
| Name | |
|---|---|
| AlignedFrame() =default | |
| ~AlignedFrame() =default | |
| AlignedFrame(AlignedFrame const & ) =delete | |
| AlignedFrame & | operator=(AlignedFrame const & ) =delete |
| std::shared_ptr< AlignedFrame > | makeShallowCopy() const Make a shallow copy of this AlignedFrame (video and audio pointers will point to the same video and audio memory buffers as in the frame copied from) |
Public Attributes
| Name | |
|---|---|
| int64_t | mCaptureTimestamp |
| int64_t | mRenderingTimestamp |
| std::shared_ptr< DeviceMemory > | mVideoFrame |
| PixelFormat | mPixelFormat |
| uint32_t | mFrameRateN |
| uint32_t | mFrameRateD |
| uint32_t | mWidth |
| uint32_t | mHeight |
| AlignedAudioFrameConstPtr | mAudioFrame |
| uint32_t | mAudioSamplingFrequency |
Public Functions Documentation
function AlignedFrame
AlignedFrame() =default
function ~AlignedFrame
~AlignedFrame() =default
function AlignedFrame
AlignedFrame(
AlignedFrame const &
) =delete
function operator=
AlignedFrame & operator=(
AlignedFrame const &
) =delete
function makeShallowCopy
std::shared_ptr< AlignedFrame > makeShallowCopy() const
Make a shallow copy of this AlignedFrame (video and audio pointers will point to the same video and audio memory buffers as in the frame copied from)
Return: A pointer to a new frame, which is a shallow copy of the old one, pointing to the same video and audio memory buffers
Public Attributes Documentation
variable mCaptureTimestamp
int64_t mCaptureTimestamp = 0;
The TAI timestamp in microseconds since the TAI epoch when this frame was captured by the ingest
variable mRenderingTimestamp
int64_t mRenderingTimestamp = 0;
The TAI timestamp in microseconds since the TAI epoch when this frame should be delivered to the rendering engine
variable mVideoFrame
std::shared_ptr< DeviceMemory > mVideoFrame = nullptr;
variable mPixelFormat
PixelFormat mPixelFormat = PixelFormat::kUnknown;
variable mFrameRateN
uint32_t mFrameRateN = 0;
variable mFrameRateD
uint32_t mFrameRateD = 0;
variable mWidth
uint32_t mWidth = 0;
variable mHeight
uint32_t mHeight = 0;
variable mAudioFrame
AlignedAudioFrameConstPtr mAudioFrame = nullptr;
variable mAudioSamplingFrequency
uint32_t mAudioSamplingFrequency = 0;
6.2.5.1.5 - Acl::ControlDataAddress
Acl::ControlDataAddress Class Reference
A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start.
#include <ControlDataAddress.h>
Public Functions
| Name | |
|---|---|
| ControlDataAddress() =default Default constructor for an empty address. | |
| ControlDataAddress(const UUID & destinationUUID) Constructor which creates an address with the final destination UUID. | |
| size_t | size() const Returns the number of parts of the address that is currently stored. |
| bool | empty() const Check if address is empty or contains any parts. |
| bool | extend(const UUID & uuid) Extend the address with a new UUID that must be passed to get to the next UUID in the address. |
| bool | extend(const ControlDataAddress & address) Extend the address with all UUIDs in another ControlDataAddress. The UUIDs will be added in the same order as in the other ControlDataAddress to the beginning of this ControlDataAddress (i.e. the UUIDs in the other ControlDataAddress must be passed before the UUIDs in this ControlDataAddress to reach the final destination) |
| bool | hasWildcard() const |
| bool | currentUuidIsWildcard() const |
| bool | currentUuidMatch(const UUID & uuid) const Check if the uuid match the first UUID of the address. |
| bool | fullAddressMatch(const ControlDataAddress & other) const Check if another address matches this address. This check might pass in two ways: |
| std::optional< UUID > | getCurrentUuid() const |
| std::optional< UUID > | moveToAndGetNextUuid() Move to the next UUID in the address, by removing the current one, and return the next UUID of the address. In case there was at least one UUID in the address, the size of the address will be decreased by one. |
| std::vector< uint8_t > | pack() const Pack a ControlDataAddress into a byte vector. |
| std::string | toString() const |
| bool | operator==(const ControlDataAddress & other) const Compare this ControlDataAddress for equality to another ControlDataAddress. |
| bool | operator!=(const ControlDataAddress & other) const Compare this ControlDataAddress for non-equality to another ControlDataAddress. |
| std::optional< ControlDataAddress > | unpack(const std::vector< uint8_t >::const_iterator & packedBegin, const std::vector< uint8_t >::const_iterator & packedEnd) Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything. |
| std::optional< ControlDataAddress > | unpack(const uint8_t * packedBegin, const uint8_t * packedEnd) Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything. |
Friends
| Name | |
|---|---|
| std::ostream & | operator«(std::ostream & stream, const ControlDataAddress & address) Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’. |
Public Functions Documentation
function ControlDataAddress
ControlDataAddress() =default
Default constructor for an empty address.
function ControlDataAddress
explicit ControlDataAddress(
const UUID & destinationUUID
)
Constructor which creates an address with the final destination UUID.
Parameters:
- destinationUUID The destination UUID of the address
function size
size_t size() const
Returns the number of parts of the address that is currently stored.
Return: The number of parts of the address that is currently stored
function empty
bool empty() const
Check if address is empty or contains any parts.
Return: True if there are no parts left in the address, false otherwise.
function extend
bool extend(
const UUID & uuid
)
Extend the address with a new UUID that must be passed to get to the next UUID in the address.
Parameters:
- uuid The new UUID to add to the address.
Return: False in case an omni UUID is passed to a non-empty ControlDataAddress
function extend
bool extend(
const ControlDataAddress & address
)
Extend the address with all UUIDs in another ControlDataAddress. The UUIDs will be added in the same order as in the other ControlDataAddress to the beginning of this ControlDataAddress (i.e. the UUIDs in the other ControlDataAddress must be passed before the UUIDs in this ControlDataAddress to reach the final destination)
Parameters:
- address The ControlDataAddress with UUIDs to add to this address.
Return: False in case @address contains an omni UUID
function hasWildcard
bool hasWildcard() const
Return: True if the address ends with a wildcard UUID (the special omni UUID), false otherwise.
function currentUuidIsWildcard
bool currentUuidIsWildcard() const
Return: True if the first UUID in the address is a wildcard UUID (the special omni UUID), false otherwise.
function currentUuidMatch
bool currentUuidMatch(
const UUID & uuid
) const
Check if the uuid match the first UUID of the address.
Parameters:
- uuid The UUID to match against
Return: True if the UUID is the same as the first UUID in the address, or in case the first UUID of the address is a wildcard UUID, false otherwise.
function fullAddressMatch
bool fullAddressMatch(
const ControlDataAddress & other
) const
Check if another address matches this address. This check might pass in two ways:
- Both addresses are identical
- At least one of the addresses includes a wildcard, and the other address is identical up to that wildcard otherThe address to match against.
True if the addresses match either because they are equal, or in case they are equal up to a wildcard in either address, false otherwise.
function getCurrentUuid
std::optional< UUID > getCurrentUuid() const
Return: The first UUID of the address, or an empty optional in case there are no more UUIDs in the address.
function moveToAndGetNextUuid
std::optional< UUID > moveToAndGetNextUuid()
Move to the next UUID in the address, by removing the current one, and return the next UUID of the address. In case there was at least one UUID in the address, the size of the address will be decreased by one.
Return: The next UUID of the address, or an empty optional in case there are no more UUIDs in the address.
function pack
std::vector< uint8_t > pack() const
Pack a ControlDataAddress into a byte vector.
Return: A vector with the packed message address.
function toString
std::string toString() const
Return: A string representation of the ControlDataAddress with ‘:’ separated UUIDs.
function operator==
bool operator==(
const ControlDataAddress & other
) const
Compare this ControlDataAddress for equality to another ControlDataAddress.
Parameters:
- other The other ControlDataAddress to compare this ControlDataAddress to
Return: True if the ControlDataAddresses are identical, false otherwise
function operator!=
bool operator!=(
const ControlDataAddress & other
) const
Compare this ControlDataAddress for non-equality to another ControlDataAddress.
Parameters:
- other The other ControlDataAddress to compare this ControlDataAddress to
Return: False if the ControlDataAddresses are identical, true otherwise
function unpack
static std::optional< ControlDataAddress > unpack(
const std::vector< uint8_t >::const_iterator & packedBegin,
const std::vector< uint8_t >::const_iterator & packedEnd
)
Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything.
Parameters:
- packedBegin Iterator to the start of the vector to unpack.
- packedEnd Iterator to the end of the vector to unpack.
Return: A ControlDataAddress if unpack was successful, std::nullopt if it failed.
function unpack
static std::optional< ControlDataAddress > unpack(
const uint8_t * packedBegin,
const uint8_t * packedEnd
)
Unpack a packed ControlDataAddress, the size of packedEnd - packedBegin must be a multiple of UUID::kUUIDSize to be able to unpack anything.
Parameters:
- packedBegin Pointer to the first byte of the address to unpack
- packedEnd Pointer to the last byte of the address to unpack
Return: A ControlDataAddress if unpack was successful, std::nullopt if it failed.
Friends
friend operator«
friend std::ostream & operator<<(
std::ostream & stream,
const ControlDataAddress & address
);
Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’.
Parameters:
- stream The stream to print to
- address The address to print
Return: Reference to the output stream
6.2.5.1.6 - Acl::ControlDataCommon::ConnectionEvent
Acl::ControlDataCommon::ConnectionEvent Struct Reference
A connection related event.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| EventType | mEventType |
| ControlDataAddress | mAddress The type of event that occurred. |
| UUID | mEventNode The address of the node that detected the event. |
Public Attributes Documentation
variable mEventType
EventType mEventType = EventType::kDisconnect;
variable mAddress
ControlDataAddress mAddress;
The type of event that occurred.
variable mEventNode
UUID mEventNode;
The address of the node that detected the event.
6.2.5.1.7 - Acl::ControlDataCommon::Response
Acl::ControlDataCommon::Response Struct Reference
A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| std::string | mMessage |
| uint64_t | mRequestId The actual message. |
| UUID | mFromUUID The ID of the request this is a response to. |
| ControlDataAddress | mRecipient The UUID of the responder. |
Public Attributes Documentation
variable mMessage
std::string mMessage;
variable mRequestId
uint64_t mRequestId = 0;
The actual message.
variable mFromUUID
UUID mFromUUID;
The ID of the request this is a response to.
variable mRecipient
ControlDataAddress mRecipient;
The UUID of the responder.
6.2.5.1.8 - Acl::ControlDataCommon::StatusMessage
Acl::ControlDataCommon::StatusMessage Struct Reference
A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| std::string | mMessage |
| UUID | mFromUUID The actual message. |
| ControlDataAddress | mRecipient The UUID of the sender. |
Public Attributes Documentation
variable mMessage
std::string mMessage;
variable mFromUUID
UUID mFromUUID;
The actual message.
variable mRecipient
ControlDataAddress mRecipient;
The UUID of the sender.
6.2.5.1.9 - Acl::ControlDataSender
Acl::ControlDataSender Class Reference
A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers.
#include <ControlDataSender.h>
Public Classes
| Name | |
|---|---|
| struct | Settings Settings for a ControlDataSender. |
Public Types
| Name | |
|---|---|
| enum class | SendRequestStatus { kSuccess, kFailed, kSendFailedForSome, kSenderNotConfigured, kNoConnectedReceiver, kInternalError} |
Public Functions
| Name | |
|---|---|
| ControlDataSender() Default constructor, creates an empty object. | |
| ~ControlDataSender() Destructor. Will disconnect from the connected receivers and close the System controller connection. | |
| bool | configure(const std::shared_ptr< ISystemControllerInterface > & controllerInterface, const Settings & settings) Configure this ControlDataSender and connect it to the System Controller. This method will fail in case the ISystemControllerInterface has already been connected to the controller by another component, as such interface can only be used by one component. |
| SendRequestStatus | sendRequestToReceivers(const std::string & request, uint64_t & requestId, const UUID & requester =UUID::kNilUUID, int8_t hops =-1) Send a request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback. |
| std::vector< UUID > | getDirectlyConnectedReceivers() const Get a list of the UUIDs of all receivers that are directly connected to this ControlDataSender. Useful for checking if this ControlDataSender is connected to something that will receive the control commands sent. |
| ControlDataSender(ControlDataSender const & ) =delete | |
| ControlDataSender & | operator=(ControlDataSender const & ) =delete |
| std::string | getVersion() Get application version. |
Public Types Documentation
enum SendRequestStatus
| Enumerator | Value | Description |
|---|---|---|
| kSuccess | Request was successfully sent. | |
| kFailed | Failed to send the request to any connected receivers. | |
| kSendFailedForSome | Multiple receivers are connected but not all received the message. | |
| kSenderNotConfigured | Cannot send messages before sender is configured. | |
| kNoConnectedReceiver | There is no connected receiver. | |
| kInternalError | Check the logs for error. |
Public Functions Documentation
function ControlDataSender
ControlDataSender()
Default constructor, creates an empty object.
function ~ControlDataSender
~ControlDataSender()
Destructor. Will disconnect from the connected receivers and close the System controller connection.
function configure
bool configure(
const std::shared_ptr< ISystemControllerInterface > & controllerInterface,
const Settings & settings
)
Configure this ControlDataSender and connect it to the System Controller. This method will fail in case the ISystemControllerInterface has already been connected to the controller by another component, as such interface can only be used by one component.
Parameters:
- controllerInterface The interface to the System controller, used for communicating with this ControlDataSender
- settings The Settings to use for this ControlDataSender
Return: True on success, false otherwise
function sendRequestToReceivers
SendRequestStatus sendRequestToReceivers(
const std::string & request,
uint64_t & requestId,
const UUID & requester =UUID::kNilUUID,
int8_t hops =-1
)
Send a request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback.
Parameters:
- request The request message
- requestId The unique identifier of this request. Used to identify the async responses.
- requester UUID that identifies the entity that sent the request, can be used if the ControlDataSender serves multiple clients and need to distinguish between them when receiving responses. A value of the nil UUID indicates that the requester field will not be used.
- hops The number of hops the message should be delivered/forwarded. A value of 1 means to all connected receivers, but not further. A value of 2 means all connected receivers to this sender, and all connected receivers to those, but not further, and so on. A value of -1 means infinity.
Return: True if the request was successfully sent, false otherwise
function getDirectlyConnectedReceivers
std::vector< UUID > getDirectlyConnectedReceivers() const
Get a list of the UUIDs of all receivers that are directly connected to this ControlDataSender. Useful for checking if this ControlDataSender is connected to something that will receive the control commands sent.
Return: A list of all receivers that are connected directly to this ControlDataSender
function ControlDataSender
ControlDataSender(
ControlDataSender const &
) =delete
function operator=
ControlDataSender & operator=(
ControlDataSender const &
) =delete
function getVersion
static std::string getVersion()
Get application version.
Return: a string with the current version, e.g. “6.0.0-39-g60a35937”
6.2.5.1.10 - Acl::ControlDataSender::Settings
Acl::ControlDataSender::Settings Struct Reference
Settings for a ControlDataSender.
#include <ControlDataSender.h>
Public Attributes
| Name | |
|---|---|
| std::function< void(const ControlDataCommon::Response &)> | mResponseCallback |
| std::function< void(const ControlDataCommon::StatusMessage &)> | mStatusMessageCallback |
| std::function< void(const ControlDataCommon::ConnectionEvent &)> | mConnectionEventCallback |
Public Attributes Documentation
variable mResponseCallback
std::function< void(const ControlDataCommon::Response &)> mResponseCallback;
variable mStatusMessageCallback
std::function< void(const ControlDataCommon::StatusMessage &)> mStatusMessageCallback;
variable mConnectionEventCallback
std::function< void(const ControlDataCommon::ConnectionEvent &)> mConnectionEventCallback;
6.2.5.1.11 - Acl::DeviceMemory
Acl::DeviceMemory Class Reference
RAII class for a CUDA memory buffer.
#include <DeviceMemory.h>
Public Functions
| Name | |
|---|---|
| DeviceMemory() =default Default constructor, creates an empty object, without allocating any memory on the device. | |
| DeviceMemory(size_t numberOfBytes) Constructor allocating the required number of bytes. | |
| DeviceMemory(size_t numberOfBytes, cudaStream_t cudaStream) Constructor allocating the required number of bytes by making an async allocation. The allocation will be put in the given CUDA stream. | |
| DeviceMemory(void * deviceMemory) Constructor taking ownership of an already allocated CUDA memory pointer. This class will free the pointer once it goes out of scope. | |
| bool | allocateMemory(size_t numberOfBytes) Allocates device memory. The memory allocated will automatically be freed by the destructor. |
| bool | allocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream) Allocates device memory. The memory allocated will automatically be freed by the destructor. |
| bool | reallocateMemory(size_t numberOfBytes) Reallocates device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status. |
| bool | reallocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream) Asynchronously reallocate device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status. |
| bool | allocateAndResetMemory(size_t numberOfBytes) Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor. |
| bool | allocateAndResetMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream) Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor. |
| bool | freeMemory() Free the device memory held by this class. Calling this when no memory is allocated is a no-op. |
| bool | freeMemoryAsync(cudaStream_t cudaStream) Deallocate memory asynchronously, in a given CUDA stream. Calling this when no memory is allocated is a no-op. |
| void | setFreeingCudaStream(cudaStream_t cudaStream) Set which CUDA stream to use for freeing this DeviceMemory. In case the DeviceMemory already holds a CUDA stream to use for freeing the memory, this will be overwritten. |
| ~DeviceMemory() Destructor, frees the internal CUDA memory. | |
| template T * | getDevicePointer() const |
| size_t | getSize() const |
| DeviceMemory(DeviceMemory && other) | |
| DeviceMemory & | operator=(DeviceMemory && other) |
| void | swap(DeviceMemory & other) |
| DeviceMemory(DeviceMemory const & ) =delete DeviceMemory is not copyable. | |
| DeviceMemory | operator=(DeviceMemory const & ) =delete |
Public Functions Documentation
function DeviceMemory
DeviceMemory() =default
Default constructor, creates an empty object, without allocating any memory on the device.
function DeviceMemory
explicit DeviceMemory(
size_t numberOfBytes
)
Constructor allocating the required number of bytes.
Parameters:
- numberOfBytes Number of bytes to allocate
Exceptions:
- std::runtime_error In case the allocation failed
function DeviceMemory
explicit DeviceMemory(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Constructor allocating the required number of bytes by making an async allocation. The allocation will be put in the given CUDA stream.
Parameters:
- size Number of bytes to allocate
- cudaStream The CUDA stream to put the async allocation in. A reference to this stream will also be saved internally to be used to asynchronously free them memory when the instance goes out of scope.
Exceptions:
- std::runtime_error In case the async allocation failed to be put in queue.
See: freeMemoryAsync method is not explicitly called, the memory will be freed synchronously when this DeviceMemory instance goes out of scope, meaning that the entire GPU is synchronized, which will impact performance negatively.
Note:
- The method will return as soon as the allocation is put in queue in the CUDA stream, i.e. before the actual allocation is made. Using this DeviceMemory is only valid as long as it is used in the same CUDA stream, or in case another stream is used, only if that stream is synchronized first with respect to
cudaStream. - In case the
function DeviceMemory
explicit DeviceMemory(
void * deviceMemory
)
Constructor taking ownership of an already allocated CUDA memory pointer. This class will free the pointer once it goes out of scope.
Parameters:
- deviceMemory CUDA memory pointer to take ownership over.
function allocateMemory
bool allocateMemory(
size_t numberOfBytes
)
Allocates device memory. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
Return: True on success, false if there is already memory allocated by this instance, or if the CUDA malloc failed.
function allocateMemoryAsync
bool allocateMemoryAsync(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Allocates device memory. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
- cudaStream The CUDA stream to use for the allocation. A reference to this stream will also be saved internally to be used to asynchronously free them memory when the instance goes out of scope.
Return: True on success, false if there is already memory allocated by this instance, or if the CUDA malloc failed.
function reallocateMemory
bool reallocateMemory(
size_t numberOfBytes
)
Reallocates device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status.
Parameters:
- numberOfBytes Number of bytes to allocate in the new allocation
Return: True on success, false if CUDA free or CUDA malloc failed.
function reallocateMemoryAsync
bool reallocateMemoryAsync(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Asynchronously reallocate device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status.
Parameters:
- numberOfBytes Number of bytes to allocate in the new allocation
- cudaStream The CUDA stream to use for the allocation and freeing of memory. A reference to this stream will also be saved internally to be used to asynchronously free them memory when this instance goes out of scope.
Return: True on success, false if CUDA free or CUDA malloc failed.
function allocateAndResetMemory
bool allocateAndResetMemory(
size_t numberOfBytes
)
Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
Return: True on success, false if there is already memory allocated by this instance, or if any of the CUDA operations failed.
function allocateAndResetMemoryAsync
bool allocateAndResetMemoryAsync(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
- cudaStream The CUDA stream to use for the allocation and resetting. A reference to this stream will also be saved internally to be used to asynchronously free them memory when the instance goes out of scope.
Return: True on success, false if there is already memory allocated by this instance, or if any of the CUDA operations failed.
function freeMemory
bool freeMemory()
Free the device memory held by this class. Calling this when no memory is allocated is a no-op.
See: freeMemoryAsync instead.
Return: True in case the memory was successfully freed (or not allocated to begin with), false otherwise.
Note: This method will free the memory in an synchronous fashion, synchronizing the entire CUDA context and ignoring the internally saved CUDA stream reference in case one exist. For async freeing of the memory, use
function freeMemoryAsync
bool freeMemoryAsync(
cudaStream_t cudaStream
)
Deallocate memory asynchronously, in a given CUDA stream. Calling this when no memory is allocated is a no-op.
Parameters:
- cudaStream The CUDA stream to free the memory asynchronously in
Return: True in case the memory deallocation request was successfully put in queue in the CUDA stream.
Note:
- The method will return as soon as the deallocation is put in queue in the CUDA stream, i.e. before the actual deallocation is made.
- It is the programmer’s responsibility to ensure this DeviceMemory is not used in another CUDA stream before this method is called. In case it is used in another CUDA stream, sufficient synchronization must be made before calling this method (and a very good reason given for not freeing the memory in that CUDA stream instead)
function setFreeingCudaStream
void setFreeingCudaStream(
cudaStream_t cudaStream
)
Set which CUDA stream to use for freeing this DeviceMemory. In case the DeviceMemory already holds a CUDA stream to use for freeing the memory, this will be overwritten.
Parameters:
- cudaStream The new CUDA stream to use for freeing the memory when the destructor is called.
Note: It is the programmer’s responsibility to ensure this DeviceMemory is not used in another CUDA stream before this instance is destructed. In case it is used in another CUDA stream, sufficient synchronization must be made before setting this as the new CUDA stream to use when freeing the memory.
function ~DeviceMemory
~DeviceMemory()
Destructor, frees the internal CUDA memory.
function getDevicePointer
template <typename T =uint8_t>
inline T * getDevicePointer() const
Template Parameters:
- T The pointer type to return
Return: the CUDA memory pointer handled by this class. Nullptr in case no memory is allocated.
function getSize
size_t getSize() const
Return: The size of the CUDA memory allocation held by this class.
function DeviceMemory
DeviceMemory(
DeviceMemory && other
)
function operator=
DeviceMemory & operator=(
DeviceMemory && other
)
function swap
void swap(
DeviceMemory & other
)
function DeviceMemory
DeviceMemory(
DeviceMemory const &
) =delete
DeviceMemory is not copyable.
function operator=
DeviceMemory operator=(
DeviceMemory const &
) =delete
6.2.5.1.12 - Acl::IControlDataReceiver
Acl::IControlDataReceiver Class Reference
IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has a receiving or listening side, as well as a sending side. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests. More…
#include <IControlDataReceiver.h>
Public Classes
| Name | |
|---|---|
| class | IRequest Interface for a request that can be responded to. |
| struct | RequestData An incoming request to this ControlDataReceiver. |
| struct | Settings Settings for a ControlDataReceiver. |
Public Types
| Name | |
|---|---|
| using std::shared_ptr< IRequest > | IRequestPtr |
Public Functions
| Name | |
|---|---|
| virtual | ~IControlDataReceiver() =default Destructor. |
| virtual bool | configure(const Settings & settings) =0 Configure this instance. |
| virtual std::vector< IRequestPtr > | getRequests(int64_t timestampUs) =0 Get all requests from the control data receiver that has a delivery time prior to the given timestamp. The user should call this function to receive and execute the requests. Before calling this the next time, all returned requests should be responded to, otherwise the control data receiver will consider them as timed out. |
| virtual bool | sendStatusMessageToSender(std::string && message, const ControlDataAddress & address) =0 Send a status message to the (directly or indirectly) connected ControlDataSender(s) according to the address parameter. In case this ControlDataReceiver has another ControlDataReceiver as sender, that receiver will forward the status message to the sender according to the address. If the address parameter, at any part, is an omni UUID, the message will be sent to all connected senders from that level and downwards. |
| virtual bool | sendRequestToReceivers(const std::string & request, uint64_t & requestId) =0 Send a request to the connected ControlDataReceivers asynchronously. This request will only be sent to ControlDataReceivers on the sending side of this receiver. In case a receiver is located between this ControlDataReceiver and the sender, neither of those will see this request. The response will be sent to the response callback asynchronously. |
| virtual size_t | getNumberOfConnectedSenders() =0 Get number of connected senders. |
| virtual size_t | getNumberOfConnectedReceivers() =0 Get number of connected receivers. |
Detailed Description
class Acl::IControlDataReceiver;
IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has a receiving or listening side, as well as a sending side. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests.
Each ControlDataReceiver can be configured to have a certain message delay. This delay parameter is set when the System controller instructs the ControlDataReceiver to start listening for incoming connections from senders (or sending ControlDataReceiver). Each incoming request will then be delayed and delivered according to the parameter, compared to the send timestamp in the message. In case multiple receivers are chained, like sender->receiver1->receiver2, receiver1 will delay the incoming messages from the sender based on when they were sent from the sender. Furthermore, receiver2 will delay them compared to when they were sent from receiver1.
An IControlDataReceiver can send status messages back to the sender. In case of chained receivers, the message will be forwarded back to the sender. A user of the ControlDataReceiver can register callbacks to receive requests and status messages. There is also an optional “preview” callback that is useful in case the incoming messages are delayed (have a delay > 0). This callback will then be called as soon as the request message arrives, to allow the user to prepare for when the actual delayed request callback is called.
Public Types Documentation
using IRequestPtr
using Acl::IControlDataReceiver::IRequestPtr = std::shared_ptr<IRequest>;
Public Functions Documentation
function ~IControlDataReceiver
virtual ~IControlDataReceiver() =default
Destructor.
function configure
virtual bool configure(
const Settings & settings
) =0
Configure this instance.
Parameters:
- settings The settings to use for this receiver
Return: True on success, false otherwise
function getRequests
virtual std::vector< IRequestPtr > getRequests(
int64_t timestampUs
) =0
Get all requests from the control data receiver that has a delivery time prior to the given timestamp. The user should call this function to receive and execute the requests. Before calling this the next time, all returned requests should be responded to, otherwise the control data receiver will consider them as timed out.
Parameters:
- timestampUs A timestamp in microseconds since the TAI epoch. The function will return all requests that has a delivery timestamp prior to this timestamp.
Return: A vector of all requests that should be executed prior to the given time.
function sendStatusMessageToSender
virtual bool sendStatusMessageToSender(
std::string && message,
const ControlDataAddress & address
) =0
Send a status message to the (directly or indirectly) connected ControlDataSender(s) according to the address parameter. In case this ControlDataReceiver has another ControlDataReceiver as sender, that receiver will forward the status message to the sender according to the address. If the address parameter, at any part, is an omni UUID, the message will be sent to all connected senders from that level and downwards.
Parameters:
- message The status message
- address The address to send the status message to
Return: True in case the message was successfully enqueued for sending, false otherwise.
function sendRequestToReceivers
virtual bool sendRequestToReceivers(
const std::string & request,
uint64_t & requestId
) =0
Send a request to the connected ControlDataReceivers asynchronously. This request will only be sent to ControlDataReceivers on the sending side of this receiver. In case a receiver is located between this ControlDataReceiver and the sender, neither of those will see this request. The response will be sent to the response callback asynchronously.
Parameters:
- request The request message
- requestId The unique identifier of this request. Used to identify the async response.
Return: True if the request was successfully sent, false otherwise
function getNumberOfConnectedSenders
virtual size_t getNumberOfConnectedSenders() =0
Get number of connected senders.
Return: The number of connected senders
function getNumberOfConnectedReceivers
virtual size_t getNumberOfConnectedReceivers() =0
Get number of connected receivers.
Return: The number of connected receivers
6.2.5.1.13 - Acl::IControlDataReceiver::IRequest
Acl::IControlDataReceiver::IRequest Class Reference
Interface for a request that can be responded to.
#include <IControlDataReceiver.h>
Public Functions
| Name | |
|---|---|
| IRequest() =default Default constructor. | |
| virtual | ~IRequest() =default Default destructor. |
| virtual const RequestData & | getRequestData() =0 Get the incoming request. |
| virtual bool | respond(std::string && message) =0 Respond to a request, can only be called once per request. |
Public Functions Documentation
function IRequest
IRequest() =default
Default constructor.
function ~IRequest
virtual ~IRequest() =default
Default destructor.
function getRequestData
virtual const RequestData & getRequestData() =0
Get the incoming request.
Return: A reference to the incoming request object
function respond
virtual bool respond(
std::string && message
) =0
Respond to a request, can only be called once per request.
Parameters:
- message The response message for this request
Return: True if the response was accepted, false in case the request already has a response
6.2.5.1.14 - Acl::IControlDataReceiver::RequestData
Acl::IControlDataReceiver::RequestData Struct Reference
An incoming request to this ControlDataReceiver.
#include <IControlDataReceiver.h>
Public Attributes
| Name | |
|---|---|
| std::string | mMessage |
| UUID | mSenderUUID The actual message. |
| ControlDataAddress | mRequester UUID of the sender/forwarder that sent the request to this ControlDataReceiver. |
| uint64_t | mRequestID The requester’s address. |
| int64_t | mSenderTimestampUs The requester’s unique id of this request. |
| int64_t | mDeliveryTimestampUs The TAI timestamp when this message was sent from the sender/forwarder in micro sec since TAI epoch. |
Public Attributes Documentation
variable mMessage
std::string mMessage;
variable mSenderUUID
UUID mSenderUUID;
The actual message.
variable mRequester
ControlDataAddress mRequester;
UUID of the sender/forwarder that sent the request to this ControlDataReceiver.
variable mRequestID
uint64_t mRequestID = 0;
The requester’s address.
variable mSenderTimestampUs
int64_t mSenderTimestampUs =
0;
The requester’s unique id of this request.
variable mDeliveryTimestampUs
int64_t mDeliveryTimestampUs =
0;
The TAI timestamp when this message was sent from the sender/forwarder in micro sec since TAI epoch.
6.2.5.1.15 - Acl::IControlDataReceiver::Settings
Acl::IControlDataReceiver::Settings Struct Reference
Settings for a ControlDataReceiver.
#include <IControlDataReceiver.h>
Public Attributes
| Name | |
|---|---|
| UUID | mProductionPipelineUUID |
| std::function< void(const ControlDataCommon::Response &)> | mResponseCallback UUID of the Production Pipeline component this Receiver is a part of. |
| std::function< void(const ControlDataCommon::ConnectionEvent &)> | mConnectionEventCallback Callback for responses to requests sent from this receiver. |
Public Attributes Documentation
variable mProductionPipelineUUID
UUID mProductionPipelineUUID;
variable mResponseCallback
std::function< void(const ControlDataCommon::Response &)> mResponseCallback;
UUID of the Production Pipeline component this Receiver is a part of.
variable mConnectionEventCallback
std::function< void(const ControlDataCommon::ConnectionEvent &)> mConnectionEventCallback;
Callback for responses to requests sent from this receiver.
6.2.5.1.16 - Acl::IMediaStreamer
Acl::IMediaStreamer Class Reference
IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to. More…
#include <IMediaStreamer.h>
Public Classes
| Name | |
|---|---|
| struct | Configuration The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface. |
| struct | Settings Settings used when creating a new MediaStreamer. |
Public Functions
| Name | |
|---|---|
| virtual | ~IMediaStreamer() =default Destructor. |
| virtual bool | configure(const UUID & uuid, const Settings & settings, CUcontext cudaContext) =0 Configure this MediaStreamer. This must be called before any call to the. |
| virtual bool | setInputFormatAndStart(const Configuration & configuration) =0 Set the input format of this MediaStreamer and start the streamer. The. |
| virtual bool | stopAndResetFormat() =0 Stop streaming and reset the format. A call to this method will stop any output streams set up by the ISystemControllerInterface and reset the input format set by the. |
| virtual bool | hasFormatAndIsRunning() const =0 |
| virtual bool | hasOpenOutputStream() const =0 |
| virtual bool | outputData(const AlignedFramePtr & frame) =0 Output data through this streamer. The AlignedFrame::mRenderingTimestamp of the frame will be used as PTS when encoding the uncompressed frame. |
Detailed Description
class Acl::IMediaStreamer;
IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to.
See: outputData is made.
Public Functions Documentation
function ~IMediaStreamer
virtual ~IMediaStreamer() =default
Destructor.
function configure
virtual bool configure(
const UUID & uuid,
const Settings & settings,
CUcontext cudaContext
) =0
Configure this MediaStreamer. This must be called before any call to the.
Parameters:
- uuid UUID of this MediaStreamer
- settings Settings for this MediaStreamer
- cudaContext The CUDA context to use for this MediaStreamer. The frames passed to this instance should be valid in this CUDA context. The streamer will use this context for preprocessing and encoding.
See:
Return: True if the streamer was successfully configured
function setInputFormatAndStart
virtual bool setInputFormatAndStart(
const Configuration & configuration
) =0
Set the input format of this MediaStreamer and start the streamer. The.
Parameters:
- configuration The configuration with the format of the frames that will be sent to this MediaReceiver
See:
- configure method must be called before this method is called. This method must be called before any call to
- outputData. If the format should be reset, the
- stopAndResetFormat method should be called first and then this method can be called again to reset the format.
Return: True if the streamer was successfully started, false otherwise
function stopAndResetFormat
virtual bool stopAndResetFormat() =0
Stop streaming and reset the format. A call to this method will stop any output streams set up by the ISystemControllerInterface and reset the input format set by the.
See: setInputFormatAndStart method. The connection to the ISystemControllerInterface will be kept.
Return: True if the stream was successfully stopped and the format reset, or if the format was not set before this method was called, false on error.
function hasFormatAndIsRunning
virtual bool hasFormatAndIsRunning() const =0
Return: True if the input format is set and the OutputStreamer is running, false otherwise
function hasOpenOutputStream
virtual bool hasOpenOutputStream() const =0
See:
- outputData will be discarded without being encoded, as there is no stream to output them to. This method can be used to check if the frame even needs to be produced by the rendering engine. Note however, that the
- outputData method will still log the frames sent to it as received, even if they are not encoded when the output stream is closed.
Return: True if the output stream of the MediaStreamer is currently open and outputting the data, false otherwise. In case this returns false all frames passed to
function outputData
virtual bool outputData(
const AlignedFramePtr & frame
) =0
Output data through this streamer. The AlignedFrame::mRenderingTimestamp of the frame will be used as PTS when encoding the uncompressed frame.
Parameters:
- frame The data frame to output, with video data in CUDA memory
See: setInputFormatAndStart method, or if the format has not been set by a call to that method.
Return: True if the frame was accepted (but not necessarily streamed, in case the output stream has not been set up by the ISystemControllerInterface), false in case the frame did not match the configuration made in the
Note: The DeviceMemory in the AlignedFrame passed to this method must not be in use by any CUDA stream. In case the memory has been used in kernels in another CUDA stream, make sure to first synchronize with the stream, before passing it over to the MediaStreamer.
6.2.5.1.17 - Acl::IMediaStreamer::Configuration
Acl::IMediaStreamer::Configuration Struct Reference
The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface.
#include <IMediaStreamer.h>
Public Attributes
| Name | |
|---|---|
| PixelFormat | mIncomingPixelFormat |
| uint32_t | mWidth |
| uint32_t | mHeight |
| uint32_t | mFrameRateN |
| uint32_t | mFrameRateD |
| uint32_t | mAudioSampleRate |
| uint32_t | mNumAudioChannels |
Public Attributes Documentation
variable mIncomingPixelFormat
PixelFormat mIncomingPixelFormat = PixelFormat::kUnknown;
variable mWidth
uint32_t mWidth = 0;
variable mHeight
uint32_t mHeight = 0;
variable mFrameRateN
uint32_t mFrameRateN = 0;
variable mFrameRateD
uint32_t mFrameRateD = 0;
variable mAudioSampleRate
uint32_t mAudioSampleRate = 0;
variable mNumAudioChannels
uint32_t mNumAudioChannels = 0;
6.2.5.1.18 - Acl::IMediaStreamer::Settings
Acl::IMediaStreamer::Settings Struct Reference
Settings used when creating a new MediaStreamer.
#include <IMediaStreamer.h>
Public Attributes
| Name | |
|---|---|
| std::string | mName |
Public Attributes Documentation
variable mName
std::string mName;
6.2.5.1.19 - Acl::IngestApplication
Acl::IngestApplication Class Reference
Public Classes
| Name | |
|---|---|
| struct | Settings |
Public Functions
| Name | |
|---|---|
| IngestApplication() Constructor, creates an empty IngestApplication without starting it. | |
| ~IngestApplication() Destructor. | |
| bool | start(const std::shared_ptr< ISystemControllerInterface > & controllerInterface, const Settings & settings) Start this IngestApplication given an interface to the System Controller and an UUID. |
| bool | stop() Stop this IngestApplication. |
| std::string | getVersion() Get application version. |
| std::string | getLibraryVersions() Get the versions of the libraries available at runtime, among others, CUDA version, BMD and NDI versions. |
Public Functions Documentation
function IngestApplication
IngestApplication()
Constructor, creates an empty IngestApplication without starting it.
function ~IngestApplication
~IngestApplication()
Destructor.
function start
bool start(
const std::shared_ptr< ISystemControllerInterface > & controllerInterface,
const Settings & settings
)
Start this IngestApplication given an interface to the System Controller and an UUID.
Parameters:
- controllerInterface The interface for communication with the System Controller
- settings The settings for the IngestApplication
Return: True if the IngestApplication was successfully started, false otherwise
function stop
bool stop()
Stop this IngestApplication.
Return: True if the IngestApplication was successfully stopped, false otherwise
function getVersion
static std::string getVersion()
Get application version.
Return: a string with the current version, e.g. “6.0.0-39-g60a35937”
function getLibraryVersions
static std::string getLibraryVersions()
Get the versions of the libraries available at runtime, among others, CUDA version, BMD and NDI versions.
Return: a string with the currently found versions of the libraries used by this application
6.2.5.1.20 - Acl::IngestApplication::Settings
Acl::IngestApplication::Settings Struct Reference
6.2.5.1.21 - Acl::ISystemControllerInterface
Acl::ISystemControllerInterface Class Reference
An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server.
#include <ISystemControllerInterface.h>
Inherited by Acl::SystemControllerConnection
Public Classes
| Name | |
|---|---|
| struct | Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | StatusCode { SUCCESS = 3001, TOO_MANY_REQUESTS = 3101, UUID_ALREADY_REGISTERED = 3201, FORMAT_ERROR = 3202, ALREADY_CONFIGURED = 3203, OUT_OF_RESOURCES = 3204, NOT_FOUND = 3205, INTERNAL_ERROR = 3206, CONNECTION_FAILED = 3207, TIMEOUT_EXCEEDED = 3208, KEY_MISMATCH = 3209, UNKNOWN_REQUEST = 3210, MALFORMED_REQUEST = 3211, ALREADY_IN_USE = 3212, VERSION_MISMATCH = 3213} Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1. |
Public Functions
| Name | |
|---|---|
| virtual | ~ISystemControllerInterface() =default Virtual destructor. |
| virtual std::optional< std::string > | sendMessage(const std::string & messageTitle, const nlohmann::json & parameters) =0 Send a message containing a JSON object to the controller. |
| virtual bool | registerRequestCallback(const Callbacks & callbacks) =0 Register the callbacks to call for events in this class. |
| virtual bool | connect() =0 Connect to the System controller. |
| virtual bool | disconnect() =0 Disconnect from the System controller. |
| virtual bool | isConnected() const =0 |
| virtual UUID | getUUID() const =0 |
Public Types Documentation
enum StatusCode
| Enumerator | Value | Description |
|---|---|---|
| SUCCESS | 3001 | 3000-3099 Info/Notifications |
| TOO_MANY_REQUESTS | 3101 | 3100-3199 Warnings |
| UUID_ALREADY_REGISTERED | 3201 | 3200-3299 Error |
| FORMAT_ERROR | 3202 | |
| ALREADY_CONFIGURED | 3203 | |
| OUT_OF_RESOURCES | 3204 | |
| NOT_FOUND | 3205 | |
| INTERNAL_ERROR | 3206 | |
| CONNECTION_FAILED | 3207 | |
| TIMEOUT_EXCEEDED | 3208 | |
| KEY_MISMATCH | 3209 | |
| UNKNOWN_REQUEST | 3210 | |
| MALFORMED_REQUEST | 3211 | |
| ALREADY_IN_USE | 3212 | |
| VERSION_MISMATCH | 3213 |
Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1.
Public Functions Documentation
function ~ISystemControllerInterface
virtual ~ISystemControllerInterface() =default
Virtual destructor.
function sendMessage
virtual std::optional< std::string > sendMessage(
const std::string & messageTitle,
const nlohmann::json & parameters
) =0
Send a message containing a JSON object to the controller.
Parameters:
- messageTitle The title of the status type or request
- parameters The parameters part of the JSON message
Return: Optional containing an error message on error, else nullopt in case the message was successfully sent
Reimplemented by: Acl::SystemControllerConnection::sendMessage
function registerRequestCallback
virtual bool registerRequestCallback(
const Callbacks & callbacks
) =0
Register the callbacks to call for events in this class.
Parameters:
- callbacks The callbacks to use when events in this class happen
Return: True on successful registration, false if some callback is not set or if already connected
Reimplemented by: Acl::SystemControllerConnection::registerRequestCallback
function connect
virtual bool connect() =0
Connect to the System controller.
Return: True on successful connection, false on error or if already connected
Reimplemented by: Acl::SystemControllerConnection::connect
function disconnect
virtual bool disconnect() =0
Disconnect from the System controller.
Return: True on successful disconnection, false on error or if not connected
Reimplemented by: Acl::SystemControllerConnection::disconnect
function isConnected
virtual bool isConnected() const =0
Return: True if connected to the System controller, false otherwise
Reimplemented by: Acl::SystemControllerConnection::isConnected
function getUUID
virtual UUID getUUID() const =0
Return: The UUID of this interface to the System controller
Reimplemented by: Acl::SystemControllerConnection::getUUID
6.2.5.1.22 - Acl::ISystemControllerInterface::Callbacks
Acl::ISystemControllerInterface::Callbacks Struct Reference
A struct containing the callbacks that needs to be registered by the component using this interface.
#include <ISystemControllerInterface.h>
Public Attributes
| Name | |
|---|---|
| std::function< Response(const std::string &, const nlohmann::json &)> | mRequestCallback |
| std::function< void(uint32_t, const std::string &, const std::error_code &)> | mConnectionClosedCallback |
Public Attributes Documentation
variable mRequestCallback
std::function< Response(const std::string &, const nlohmann::json &)> mRequestCallback;
variable mConnectionClosedCallback
std::function< void(uint32_t, const std::string &, const std::error_code &)> mConnectionClosedCallback;
6.2.5.1.23 - Acl::ISystemControllerInterface::Response
Acl::ISystemControllerInterface::Response Struct Reference
A response to a request, consists of a status code and an (optional) parameters JSON object.
#include <ISystemControllerInterface.h>
Public Attributes
| Name | |
|---|---|
| StatusCode | mCode |
| nlohmann::json | mParameters |
Public Attributes Documentation
variable mCode
StatusCode mCode;
variable mParameters
nlohmann::json mParameters;
6.2.5.1.24 - Acl::MediaReceiver
Acl::MediaReceiver Class Reference
A MediaReceiver contains the logic for receiving, decoding and aligning incoming media sources from the Ingests. The aligned data is then delivered to the Rendering Engine which is also responsible for setting up the MediaReceiver. The MediaReceiver has a builtin multi view generator, which can create output streams containing composited subsets of the incoming video sources. This class is controlled using an ISystemControllerInterface provided when starting it.
#include <MediaReceiver.h>
Public Classes
| Name | |
|---|---|
| struct | CustomSystemControllerCallResponse A struct containing the data returned from the Rendering Engine on a custom System Controller call, with information that will be propagated back to the System Controller and its client. |
| struct | NewStreamParameters A struct containing information on the format of an incoming stream. |
| struct | Settings Settings for a MediaReceiver. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | TallyBorderColor { kNone, kRed, kGreen, kYellow} Available colors for tally border in multi view. |
Public Functions
| Name | |
|---|---|
| MediaReceiver() Default constructor. | |
| ~MediaReceiver() Default destructor. | |
| bool | start(const std::shared_ptr< ISystemControllerInterface > & controllerInterface, CUcontext cudaContext, const Settings & settings, const ControlDataReceiver::Settings & receiverSettings) Start the MediaReceiver. This method will call connect on the System controller interface and set up the callbacks from the interface to call internal methods. |
| void | stop() Stop the MediaReceiver. |
| std::function< void(const AlignedFramePtr &)> | getCustomMultiViewSourceInput(uint32_t inputSlot, bool fixedFramerate, const std::string & name ="") This method allows the Rendering Engine to provide custom input sources to the Multi-view generator to send video streams that can be added to the multi-views. This could for instance be used for adding a “preview” of the video stream the rendering engine is about to cut to. |
| bool | removeCustomMultiViewSourceInput(uint32_t inputSlot) Remove a custom multi-view generator source input earlier registered using the getCustomMultiViewSourceInput method. |
| void | clearCustomMultiViewSourceInputs() Remove all feedback streams and unregister the multi-view generator callbacks for those streams. |
| std::shared_ptr< IMediaStreamer > | createMediaStreamerOutput(const MediaStreamer::Settings & settings) Create a new MediaStreamer instance to output data from this MediaReceiver. |
| bool | removeMediaStreamerOutput(const UUID & uuid) Remove a MediaStreamer created via the. |
| void | clearMediaStreamerOutputs() Remove all MediaStreamers created via the. |
| std::shared_ptr< IControlDataReceiver > | getControlDataReceiver() Get a pointer to the ControlDataReceiver instance of this MediaReceiver. A call to this method will always return the same instance. |
| void | setTallyBorder(uint32_t inputSlot, TallyBorderColor color) Set tally border color in the multi-views for a specific input slot. |
| void | clearTallyBorder(uint32_t inputSlot) Remove tally border in the multi-views for a specific input slot. |
| void | clearAllTallyBorders() Remove all tally borders. |
| MediaReceiver::TallyBorderColor | getTallyBorder(uint32_t inputSlot) const get tally border color for an input slot |
| MediaReceiver(MediaReceiver const & ) =delete MediaReceiver is neither copyable nor movable. | |
| MediaReceiver(MediaReceiver && ) =delete | |
| MediaReceiver & | operator=(MediaReceiver const & ) =delete |
| MediaReceiver & | operator=(MediaReceiver && ) =delete |
| std::string | getVersion() Get application version. |
| std::string | getLibraryVersions() Get versions of the libraries available at runtime, among others, CUDA runtime and driver versions. |
Public Types Documentation
enum TallyBorderColor
| Enumerator | Value | Description |
|---|---|---|
| kNone | ||
| kRed | ||
| kGreen | ||
| kYellow |
Available colors for tally border in multi view.
Public Functions Documentation
function MediaReceiver
MediaReceiver()
Default constructor.
function ~MediaReceiver
~MediaReceiver()
Default destructor.
function start
bool start(
const std::shared_ptr< ISystemControllerInterface > & controllerInterface,
CUcontext cudaContext,
const Settings & settings,
const ControlDataReceiver::Settings & receiverSettings
)
Start the MediaReceiver. This method will call connect on the System controller interface and set up the callbacks from the interface to call internal methods.
Parameters:
- controllerInterface The ISystemControllerInterface to use for this MediaReceiver. The interface should be configured (Such as setting the IP address and port of the System Controller if a server based System Controller is used) but not connected before passed to this method. This method will internally set the callbacks before connecting to the controller. If the controller is already connected or if the controller is not configured, this method will return false. This class will take ownership of the smart pointer.
- cudaContext The CUDA context to use for this MediaReceiver. The frames will delivered as CUDA pointers, valid in this context, and the multi-view generator will use this context for rendering and encoding.
- settings The settings to use for the MediaReceiver.
- receiverSettings The settings to use for the ControlDataReceiver.
Return: True if the MediaReceiver was started successfully, false otherwise.
function stop
void stop()
Stop the MediaReceiver.
function getCustomMultiViewSourceInput
std::function< void(const AlignedFramePtr &)> getCustomMultiViewSourceInput(
uint32_t inputSlot,
bool fixedFramerate,
const std::string & name =""
)
This method allows the Rendering Engine to provide custom input sources to the Multi-view generator to send video streams that can be added to the multi-views. This could for instance be used for adding a “preview” of the video stream the rendering engine is about to cut to.
Parameters:
- inputSlot The input slot this source will be “plugged in” to. The custom input sources share the input slots with the streams connected from Ingests. This means that it is probably a good idea to use higher numbered slots for these custom inputs, such as numbers from 1000, so that the lower numbers, 1 and up, can be used by the connected video cameras, as the input slot number will also be used when cutting.
- fixedFramerate True if the source input delivers frames at a fixed framerate. If set to true, missing frames will trigger the display of a visual warning symbol in the source’s area of the multi-view.
- name Optional human readable name of this stream, to be presented to the System Controller.
See: MediaReceiver::Settings::mDecodedFormat.
Return: A function to where the Rendering Engine should send the frames. In case the requested inputSlot is already used by another custom input source, or a stream from an ingest, the returned function will be nullptr.
Note: Make sure no CUDA stream will write to the DeviceMemory in the AlignedFrame passed to the function. Failing to do so will lead to undefined behavior. In case another CUDA stream has written to the DeviceMemory, make sure to synchronize with the stream before passing the AlignedFrame.
Precondition: The AlignedFrame sent to this function must have the same pixel format as this MediaReceiver is configured to deliver to the Rendering Engine,
function removeCustomMultiViewSourceInput
bool removeCustomMultiViewSourceInput(
uint32_t inputSlot
)
Remove a custom multi-view generator source input earlier registered using the getCustomMultiViewSourceInput method.
Parameters:
- inputSlot The input slot the custom multi-view source input is connected to, that should be removed
Return: True if the custom multi-view source input was successfully removed, false in case there was no custom input registered for the given input slot, or in case of an internal error.
function clearCustomMultiViewSourceInputs
void clearCustomMultiViewSourceInputs()
Remove all feedback streams and unregister the multi-view generator callbacks for those streams.
function createMediaStreamerOutput
std::shared_ptr< IMediaStreamer > createMediaStreamerOutput(
const MediaStreamer::Settings & settings
)
Create a new MediaStreamer instance to output data from this MediaReceiver.
Parameters:
- settings The settings for the new MediaStreamer
Return: A shared pointer to the MediaStreamer instance in case of a successful creation, otherwise nullptr
function removeMediaStreamerOutput
bool removeMediaStreamerOutput(
const UUID & uuid
)
Remove a MediaStreamer created via the.
Parameters:
- uuid The UUID of the MediaStreamer to remove
See: createMediaStreamerOutput method by its UUID.
Return: True if the MediaStreamer was successfully removed, false in case no MediaStreamer with the given UUID was found.
function clearMediaStreamerOutputs
void clearMediaStreamerOutputs()
Remove all MediaStreamers created via the.
See: createMediaStreamerOutput method
function getControlDataReceiver
std::shared_ptr< IControlDataReceiver > getControlDataReceiver()
Get a pointer to the ControlDataReceiver instance of this MediaReceiver. A call to this method will always return the same instance.
See: start.
Return: Pointer to the ControlDataReceiver instance. Nullptr if called before a successful call to
function setTallyBorder
void setTallyBorder(
uint32_t inputSlot,
TallyBorderColor color
)
Set tally border color in the multi-views for a specific input slot.
Parameters:
- inputSlot the input slot for a source
- color the color to set
function clearTallyBorder
void clearTallyBorder(
uint32_t inputSlot
)
Remove tally border in the multi-views for a specific input slot.
Parameters:
- inputSlot the input slot for a source
function clearAllTallyBorders
void clearAllTallyBorders()
Remove all tally borders.
function getTallyBorder
MediaReceiver::TallyBorderColor getTallyBorder(
uint32_t inputSlot
) const
get tally border color for an input slot
Parameters:
- inputSlot the input slot to get color for
Return: the tally border color for the given input slot
function MediaReceiver
MediaReceiver(
MediaReceiver const &
) =delete
MediaReceiver is neither copyable nor movable.
function MediaReceiver
MediaReceiver(
MediaReceiver &&
) =delete
function operator=
MediaReceiver & operator=(
MediaReceiver const &
) =delete
function operator=
MediaReceiver & operator=(
MediaReceiver &&
) =delete
function getVersion
static std::string getVersion()
Get application version.
Return: a string with the current version, e.g. “6.0.0-39-g60a35937”
function getLibraryVersions
static std::string getLibraryVersions()
Get versions of the libraries available at runtime, among others, CUDA runtime and driver versions.
Return: a string with the currently found versions of the libraries used by this application
6.2.5.1.25 - Acl::MediaReceiver::CustomSystemControllerCallResponse
Acl::MediaReceiver::CustomSystemControllerCallResponse Struct Reference
A struct containing the data returned from the Rendering Engine on a custom System Controller call, with information that will be propagated back to the System Controller and its client.
#include <MediaReceiver.h>
Public Attributes
| Name | |
|---|---|
| ISystemControllerInterface::StatusCode | mCode |
| nlohmann::json | mParameters |
| std::string | mErrorMessage |
Public Attributes Documentation
variable mCode
ISystemControllerInterface::StatusCode mCode;
variable mParameters
nlohmann::json mParameters;
variable mErrorMessage
std::string mErrorMessage;
6.2.5.1.26 - Acl::MediaReceiver::NewStreamParameters
Acl::MediaReceiver::NewStreamParameters Struct Reference
A struct containing information on the format of an incoming stream.
#include <MediaReceiver.h>
Public Attributes
| Name | |
|---|---|
| uint32_t | mVideoHeight |
| uint32_t | mVideoWidth |
| uint32_t | mFrameRateN |
| uint32_t | mFrameRateD |
| uint32_t | mAudioSampleRate |
Public Attributes Documentation
variable mVideoHeight
uint32_t mVideoHeight = 0;
variable mVideoWidth
uint32_t mVideoWidth = 0;
variable mFrameRateN
uint32_t mFrameRateN = 0;
variable mFrameRateD
uint32_t mFrameRateD = 1;
variable mAudioSampleRate
uint32_t mAudioSampleRate = 0;
6.2.5.1.27 - Acl::MediaReceiver::Settings
Acl::MediaReceiver::Settings Struct Reference
Settings for a MediaReceiver.
#include <MediaReceiver.h>
Public Attributes
| Name | |
|---|---|
| PixelFormat | mDecodedFormat The pixel format delivered to the rendering engine. |
| std::function< std::function< void(const AlignedFramePtr &)>uint32_t inputSlot, const std::string &streamID, const NewStreamParameters &newStreamParameters)> | mNewConnectionCallback |
| std::function< void(uint32_t inputSlot)> | mClosedConnectionCallback |
| std::function< CustomSystemControllerCallResponse(const std::string &request, const nlohmann::json ¶meters)> | mCustomSystemControllerRequestCallback |
| bool | mUseMultiViewer |
| bool | mDeliverOld Set to true if this MediaReceiver should have a multi-view generator. |
| CUstream | mAlignedFrameFreeStream |
Public Attributes Documentation
variable mDecodedFormat
PixelFormat mDecodedFormat = PixelFormat::kRgba64Le;
The pixel format delivered to the rendering engine.
variable mNewConnectionCallback
std::function< std::function< void(const AlignedFramePtr &)>uint32_t inputSlot, const std::string &streamID, const NewStreamParameters &newStreamParameters)> mNewConnectionCallback;
Parameters:
- inputSlot can be seen as a virtual SDI input on a hardware mixer and should be used by the Rendering engine to identify sources. For example, if a source is connected to input slot 5, the button “Cut to camera 5” on the control panel ought to cut to this stream. The MediaReceiver is responsible for making sure only one stream can be connected to an input slot at a time. This callback might be called multiple times with the same input slot, however, in case the stream has been disconnected and the mClosedConnectionCallback has been called for that input slot earlier.
- streamID is the identification string of the video/audio source on the Ingest. A Rendering engine might have the same StreamID connected multiple times (for instance if two different alignments are used for the same source) so this should not be used as an unique identifier for the stream.
- newStreamParameters contains information on the pending incoming stream to allow the Rendering engine to decide if it can receive it or not.
Note: The internal CUDA stream is synchronized before delivering the AlignedFrames, meaning the DeviceMemory in the AlignedFrame will always contain the written data; no further synchronization is needed before the rendering engine can read the data.
A callback called by the MediaReceiver whenever a new connection from an Ingest is set up. The callback should return a function to which the data will be delivered. In case the Rendering engine does not want to accept the pending incoming stream (due to a format not supported, etc) the Rendering engine can return nullptr.
variable mClosedConnectionCallback
std::function< void(uint32_t inputSlot)> mClosedConnectionCallback;
Parameters:
- inputSlot The input slot that was disconnected
A callback called whenever a connection from an Ingest has been stopped. When receiving this callback, the callback function returned by the mNewConnectionCallback will not be called anymore and can be discarded if required by the application. After this function has been called, the input slot might be reused by another incoming stream after a call to the mNewConnectionCallback.
variable mCustomSystemControllerRequestCallback
std::function< CustomSystemControllerCallResponse(const std::string &request, const nlohmann::json ¶meters)> mCustomSystemControllerRequestCallback;
Parameters:
- request The name of the request
- parameters The JSON object with parameters for the request
Return: A struct with the response from the Rendering Engine with the custom request call
A callback called whenever the System Controller has sent a custom request aimed at the Rendering Engine. The API for this is up to the Rendering Engine implementor.
variable mUseMultiViewer
bool mUseMultiViewer = false;
variable mDeliverOld
bool mDeliverOld = false;
Set to true if this MediaReceiver should have a multi-view generator.
variable mAlignedFrameFreeStream
CUstream mAlignedFrameFreeStream = nullptr;
Set to true if the media frames should be delivered, even if the delivery time has already passed, otherwise they are discarded The CUDA stream to use for asynchronously freeing the AlignedFrames’ DeviceMemory. Set this to the rendering engine’s CUDA stream, to ensure memory is not freed before the rendering engine is done using it asynchronously in its CUDA stream. Note that the MediaReceiver instance and all AlignedFrames delivered from it must be destroyed before the CUDA stream can be destroyed.
6.2.5.1.28 - Acl::SystemControllerConnection
Acl::SystemControllerConnection Class Reference
An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket.
#include <SystemControllerConnection.h>
Inherits from Acl::ISystemControllerInterface
Public Classes
| Name | |
|---|---|
| struct | Settings Settings for a SystemControllerConnection. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | ComponentType { kIngest, kPipeline, kControlPanel} Enumeration of component types the component using this SystemControllerConnection can tell the System Controller to be seen as. |
Public Functions
| Name | |
|---|---|
| SystemControllerConnection() | |
| ~SystemControllerConnection() override | |
| bool | configure(const Settings & settings) Configure this connection. This method should be called before calling. |
| virtual bool | connect() override Connect to the server using the settings set with the. |
| virtual bool | isConnected() const override |
| virtual UUID | getUUID() const override |
| virtual std::optional< std::string > | sendMessage(const std::string & messageTitle, const nlohmann::json & parameters) override Send a message containing a JSON object to the system controller server. |
| virtual bool | disconnect() override Disconnect from the server. |
| virtual bool | registerRequestCallback(const Callbacks & callbacks) override Register callbacks to call when getting requests from the server or the server connection is lost. |
| SystemControllerConnection(SystemControllerConnection const & ) =delete | |
| SystemControllerConnection(SystemControllerConnection && ) =delete | |
| SystemControllerConnection & | operator=(SystemControllerConnection const & ) =delete |
| SystemControllerConnection & | operator=(SystemControllerConnection && ) =delete |
Additional inherited members
Public Classes inherited from Acl::ISystemControllerInterface
| Name | |
|---|---|
| struct | Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
Public Types inherited from Acl::ISystemControllerInterface
| Name | |
|---|---|
| enum class uint32_t | StatusCode { SUCCESS, TOO_MANY_REQUESTS, UUID_ALREADY_REGISTERED, FORMAT_ERROR, ALREADY_CONFIGURED, OUT_OF_RESOURCES, NOT_FOUND, INTERNAL_ERROR, CONNECTION_FAILED, TIMEOUT_EXCEEDED, KEY_MISMATCH, UNKNOWN_REQUEST, MALFORMED_REQUEST, ALREADY_IN_USE, VERSION_MISMATCH} Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1. |
Public Functions inherited from Acl::ISystemControllerInterface
| Name | |
|---|---|
| virtual | ~ISystemControllerInterface() =default Virtual destructor. |
Public Types Documentation
enum ComponentType
| Enumerator | Value | Description |
|---|---|---|
| kIngest | ||
| kPipeline | ||
| kControlPanel |
Enumeration of component types the component using this SystemControllerConnection can tell the System Controller to be seen as.
Public Functions Documentation
function SystemControllerConnection
SystemControllerConnection()
function ~SystemControllerConnection
~SystemControllerConnection() override
function configure
bool configure(
const Settings & settings
)
Configure this connection. This method should be called before calling.
Parameters:
- settings The settings to use when connecting to the server
See: connect.
Return: True if successfully configured, false otherwise
function connect
virtual bool connect() override
Connect to the server using the settings set with the.
See: configure method.
Return: True if connection was successful, false otherwise
Reimplements: Acl::ISystemControllerInterface::connect
function isConnected
virtual bool isConnected() const override
Return: True if this class is connected to the server, false otherwise
Reimplements: Acl::ISystemControllerInterface::isConnected
function getUUID
virtual UUID getUUID() const override
Return: The UUID of this interface to the System controller
Reimplements: Acl::ISystemControllerInterface::getUUID
function sendMessage
virtual std::optional< std::string > sendMessage(
const std::string & messageTitle,
const nlohmann::json & parameters
) override
Send a message containing a JSON object to the system controller server.
Parameters:
- messageTitle The title of the status type or request
- parameters The parameters part of the JSON message
Return: Optional containing an error message on error, else nullopt in case the message was successfully sent
Reimplements: Acl::ISystemControllerInterface::sendMessage
function disconnect
virtual bool disconnect() override
Disconnect from the server.
Return: True if successfully disconnected, false on internal error
Reimplements: Acl::ISystemControllerInterface::disconnect
function registerRequestCallback
virtual bool registerRequestCallback(
const Callbacks & callbacks
) override
Register callbacks to call when getting requests from the server or the server connection is lost.
Parameters:
- callbacks The callbacks to set
Return: True if successfully registered, false if a callback is not set, or if already connected to the server
Reimplements: Acl::ISystemControllerInterface::registerRequestCallback
function SystemControllerConnection
SystemControllerConnection(
SystemControllerConnection const &
) =delete
function SystemControllerConnection
SystemControllerConnection(
SystemControllerConnection &&
) =delete
function operator=
SystemControllerConnection & operator=(
SystemControllerConnection const &
) =delete
function operator=
SystemControllerConnection & operator=(
SystemControllerConnection &&
) =delete
6.2.5.1.29 - Acl::SystemControllerConnection::Settings
Acl::SystemControllerConnection::Settings Struct Reference
Settings for a SystemControllerConnection.
#include <SystemControllerConnection.h>
Public Attributes
| Name | |
|---|---|
| std::string | mSystemControllerIP |
| uint16_t | mSystemControllerPort |
| std::string | mSystemControllerPostfix |
| std::string | mPSK |
| UUID | mUUID |
| ComponentType | mType |
| std::string | mName |
| std::string | mMyIP |
| std::chrono::milliseconds | mConnectTimeout |
| bool | mEnableHTTPS |
| bool | mInsecureHTTPS |
| std::string | mCustomCaCertFile |
Public Attributes Documentation
variable mSystemControllerIP
std::string mSystemControllerIP;
variable mSystemControllerPort
uint16_t mSystemControllerPort;
variable mSystemControllerPostfix
std::string mSystemControllerPostfix;
variable mPSK
std::string mPSK;
variable mUUID
UUID mUUID;
variable mType
ComponentType mType;
variable mName
std::string mName;
variable mMyIP
std::string mMyIP;
variable mConnectTimeout
std::chrono::milliseconds mConnectTimeout {
3000};
variable mEnableHTTPS
bool mEnableHTTPS;
variable mInsecureHTTPS
bool mInsecureHTTPS;
variable mCustomCaCertFile
std::string mCustomCaCertFile;
6.2.5.1.30 - Acl::TimeCommon::TAIStatus
Acl::TimeCommon::TAIStatus Struct Reference
Public Attributes
| Name | |
|---|---|
| StratumLevel | mStratum |
| bool | mHasLock |
| double | mTimeDiffS |
Public Attributes Documentation
variable mStratum
StratumLevel mStratum = StratumLevel::UnknownStratum;
variable mHasLock
bool mHasLock = false;
variable mTimeDiffS
double mTimeDiffS = 0.0;
6.2.5.1.31 - Acl::TimeCommon::TimeStructure
Acl::TimeCommon::TimeStructure Struct Reference
Public Attributes
| Name | |
|---|---|
| uint64_t | t1 |
| uint64_t | t2 |
| uint64_t | t3 |
| uint64_t | t4 |
| uint64_t | token |
| uint64_t | dummy1 |
| uint64_t | dummy2 |
| uint64_t | dummy3 |
Public Attributes Documentation
variable t1
uint64_t t1 = 0;
variable t2
uint64_t t2 = 0;
variable t3
uint64_t t3 = 0;
variable t4
uint64_t t4 = 0;
variable token
uint64_t token = 0;
variable dummy1
uint64_t dummy1 = 0;
variable dummy2
uint64_t dummy2 = 0;
variable dummy3
uint64_t dummy3 = 0;
6.2.5.1.32 - Acl::UUID
Acl::UUID Class Reference
A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard.
#include <UUID.h>
Public Functions
| Name | |
|---|---|
| UUID() Default constructor, returns a nil UUID. | |
| constexpr | UUID(const std::array< uint8_t, kUUIDSize > & bytes) Construct a UUID from a sequence of bytes. |
| std::string | toString() const |
| std::string | toBitString() const |
| bool | operator==(const UUID & other) const Compare this UUID to another UUID. |
| bool | operator!=(const UUID & other) const Compare this UUID to another UUID for inequality. |
| bool | operator<(const UUID & other) const Less than operator implementation. |
| std::array< uint8_t, kUUIDSize >::const_iterator | begin() const |
| std::array< uint8_t, kUUIDSize >::const_iterator | end() const |
| constexpr size_t | size() const |
| UUID | generateRandom() Create a new, randomly generated UUID. |
| std::optional< UUID > | fromString(const std::string & uuid) Parse a UUID from a string. |
| std::optional< UUID > | fromVector(const std::vector< uint8_t >::const_iterator & start, const std::vector< uint8_t >::const_iterator & end) Read a UUID from a vector of uint8s. |
| std::optional< UUID > | fromPointer(const uint8_t * start, const uint8_t * end) Read a UUID from a pointer. |
Public Attributes
| Name | |
|---|---|
| constexpr size_t | kUUIDSize |
| const UUID | kNilUUID |
| const UUID | kOmniUUID |
Public Functions Documentation
function UUID
UUID()
Default constructor, returns a nil UUID.
function UUID
inline explicit constexpr UUID(
const std::array< uint8_t, kUUIDSize > & bytes
)
Construct a UUID from a sequence of bytes.
Note: This will accept UUIDs that are not valid version 4 UUIDs.
function toString
std::string toString() const
Return: A string representation of the UUID formatted as hex values
function toBitString
std::string toBitString() const
Return: A string representation of the UUID formatted as bits
function operator==
bool operator==(
const UUID & other
) const
Compare this UUID to another UUID.
Parameters:
Return: True if the UUIDs are identical, false otherwise
function operator!=
bool operator!=(
const UUID & other
) const
Compare this UUID to another UUID for inequality.
Parameters:
Return: True if the UUIDs are not equal, false in case they are identical
function operator<
bool operator<(
const UUID & other
) const
Less than operator implementation.
Parameters:
Return: True if this UUID should be sorted before the other UUID
function begin
std::array< uint8_t, kUUIDSize >::const_iterator begin() const
Return: Begin iterator for the UUID byte sequence
function end
std::array< uint8_t, kUUIDSize >::const_iterator end() const
Return: End iterator for the UUID byte sequence
function size
inline constexpr size_t size() const
Return: The size in bytes of the UUID. Will always return 16
function generateRandom
static UUID generateRandom()
Create a new, randomly generated UUID.
Return: A new, randomly generated UUID
function fromString
static std::optional< UUID > fromString(
const std::string & uuid
)
Parse a UUID from a string.
Parameters:
- uuid The string representation of the UUID
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromVector
static std::optional< UUID > fromVector(
const std::vector< uint8_t >::const_iterator & start,
const std::vector< uint8_t >::const_iterator & end
)
Read a UUID from a vector of uint8s.
Parameters:
- start Start iterator to read the UUID from
- end End iterator to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromPointer
static std::optional< UUID > fromPointer(
const uint8_t * start,
const uint8_t * end
)
Read a UUID from a pointer.
Parameters:
- start Start pointer to read the UUID from
- end End pointer to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
Public Attributes Documentation
variable kUUIDSize
static constexpr size_t kUUIDSize = 16;
variable kNilUUID
static const UUID kNilUUID;
variable kOmniUUID
static const UUID kOmniUUID;
6.2.5.1.33 - fmt::formatter< Acl::AudioChannelLayout >
fmt::formatter< Acl::AudioChannelLayout > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::AudioChannelLayout audioChannelLayout, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::AudioChannelLayout audioChannelLayout,
FormatContext & ctx
)
6.2.5.1.34 - fmt::formatter< Acl::ControlDataAddress >
fmt::formatter< Acl::ControlDataAddress > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::ControlDataAddress & address, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::ControlDataAddress & address,
FormatContext & ctx
)
6.2.5.1.35 - fmt::formatter< Acl::ControlDataCommon::EventType >
fmt::formatter< Acl::ControlDataCommon::EventType > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::ControlDataCommon::EventType type, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::ControlDataCommon::EventType type,
FormatContext & ctx
)
6.2.5.1.36 - fmt::formatter< Acl::FieldOrder >
fmt::formatter< Acl::FieldOrder > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::FieldOrder fieldOrder, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::FieldOrder fieldOrder,
FormatContext & ctx
)
6.2.5.1.37 - fmt::formatter< Acl::ISystemControllerInterface::StatusCode >
fmt::formatter< Acl::ISystemControllerInterface::StatusCode > Struct Reference
Inherits from formatter< std::uint32_t >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(Acl::ISystemControllerInterface::StatusCode code, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
Acl::ISystemControllerInterface::StatusCode code,
FormatContext & ctx
)
6.2.5.1.38 - fmt::formatter< Acl::SystemControllerConnection::ComponentType >
fmt::formatter< Acl::SystemControllerConnection::ComponentType > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(Acl::SystemControllerConnection::ComponentType type, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
Acl::SystemControllerConnection::ComponentType type,
FormatContext & ctx
)
6.2.5.1.39 - fmt::formatter< Acl::UUID >
fmt::formatter< Acl::UUID > Struct Reference
Inherits from formatter< std::string >
Public Functions
| Name | |
|---|---|
| template <typename FormatContext > auto | format(const Acl::UUID & uuid, FormatContext & ctx) |
Public Functions Documentation
function format
template <typename FormatContext >
inline auto format(
const Acl::UUID & uuid,
FormatContext & ctx
)
6.2.5.2 - Files
- dir build
- dir install
- dir include
- file include/AclLog.h
- file include/AlignedFrame.h
- file include/Base64.h
- file include/ControlDataAddress.h
- file include/ControlDataCommon.h
- file include/ControlDataSender.h
- file include/DeviceMemory.h
- file include/IControlDataReceiver.h
- file include/IMediaStreamer.h
- file include/ISystemControllerInterface.h
- file include/IngestApplication.h
- file include/IngestUtils.h
- file include/MediaEnumerations.h
- file include/MediaReceiver.h
- file include/SystemControllerConnection.h
- file include/TimeCommon.h
- file include/UUID.h
- dir include
- dir install
6.2.5.2.1 - include/AclLog.h
include/AclLog.h File Reference
Namespaces
| Name |
|---|
| Acl |
| Acl::AclLog A namespace for logging utilities. |
Classes
| Name | |
|---|---|
| class | Acl::AclLog::ThreadNameFormatterFlag |
| class | Acl::AclLog::FileLocationFormatterFlag A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <filesystem>
#include <string>
#include <spdlog/details/log_msg.h>
#include <spdlog/fmt/fmt.h>
#include <spdlog/formatter.h>
#include <spdlog/pattern_formatter.h>
#include <sys/prctl.h>
namespace Acl {
namespace AclLog {
enum class Level {
kTrace, // Detailed diagnostics (for development only)
kDebug, // Messages intended for debugging only
kInfo, // Messages about normal behavior (default log level)
kWarning, // Warnings (functionality intact)
kError, // Recoverable errors (functionality impaired)
kCritical, // Unrecoverable errors (application must stop)
kOff // Turns off all logging
};
void init(const std::string& name);
void initControlMessagesLog(const std::string& name);
void setLevel(Level level);
void logControlMessage(const std::string& origin, const std::string& controlMessage);
AclLog::Level getLogLevel();
size_t getMaxFileSize();
size_t getMaxLogRotations();
std::filesystem::path getLogFileFullPath(const std::string& name);
inline std::string getThreadName() {
static const size_t RECOMMENDED_BUFFER_SIZE = 20;
static thread_local std::string name;
if (name.empty()) {
char buffer[RECOMMENDED_BUFFER_SIZE];
int retval = prctl(PR_GET_NAME, buffer);
if (retval == -1) {
throw spdlog::spdlog_ex("Failed to get thread name: ", errno);
}
name = std::string(buffer);
}
return name;
}
class ThreadNameFormatterFlag : public spdlog::custom_flag_formatter {
public:
void format(const spdlog::details::log_msg&, const std::tm&, spdlog::memory_buf_t& dest) override {
std::string threadName = getThreadName();
dest.append(threadName.data(), threadName.data() + threadName.size());
}
[[nodiscard]] std::unique_ptr<custom_flag_formatter> clone() const override {
return spdlog::details::make_unique<ThreadNameFormatterFlag>();
}
};
class FileLocationFormatterFlag : public spdlog::custom_flag_formatter {
public:
void format(const spdlog::details::log_msg& msg, const std::tm&, spdlog::memory_buf_t& dest) override {
if (!msg.source.empty()) {
using namespace spdlog::details;
dest.push_back('[');
const char* filename = short_filename_formatter<null_scoped_padder>::basename(msg.source.filename);
fmt_helper::append_string_view(filename, dest);
dest.push_back(':');
fmt_helper::append_int(msg.source.line, dest);
dest.push_back(']');
}
}
[[nodiscard]] std::unique_ptr<custom_flag_formatter> clone() const override {
return spdlog::details::make_unique<FileLocationFormatterFlag>();
}
};
} // namespace AclLog
} // namespace Acl
6.2.5.2.2 - include/AlignedFrame.h
include/AlignedFrame.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| struct | Acl::AlignedAudioFrame AlignedAudioFrame is a frame of interleaved floating point audio samples with a given number of channels. |
| struct | Acl::AlignedFrame A frame of aligned data that is passed to the rendering engine from the MediaReceiver. A DataFrame contains a time stamped frame of media, which might be video, audio and auxiliary data such as subtitles. A single DataFrame can contain one or multiple types of media. Which media types are included can be probed by nullptr-checking/size checking the data members. The struct has ownership of all data pointers included. The struct includes all logic for freeing the resources held by this struct and the user should therefore just make sure the struct itself is deallocated to ensure all resources are freed. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <array>
#include <iostream>
#include <memory>
#include <vector>
#include <cuda_runtime_api.h>
#include "DeviceMemory.h"
#include "MediaEnumerations.h"
namespace Acl {
struct AlignedAudioFrame {
// The samples interleaved
std::vector<float> mSamples;
uint8_t mNumberOfChannels = 0;
uint32_t mNumberOfSamplesPerChannel = 0;
};
using AlignedAudioFramePtr = std::shared_ptr<AlignedAudioFrame>;
using AlignedAudioFrameConstPtr = std::shared_ptr<const AlignedAudioFrame>;
AlignedAudioFramePtr createAlignedAudioFrame(uint8_t numberOfChannels, uint32_t numberOfSamplesPerChannel);
AlignedAudioFramePtr copyAlignedAudioFrame(AlignedAudioFrameConstPtr audioFrame);
AlignedAudioFramePtr extractChannel(AlignedAudioFrameConstPtr sourceFrame, uint8_t channelIndex);
struct AlignedFrame {
AlignedFrame() = default;
~AlignedFrame() = default;
AlignedFrame(AlignedFrame const&) = delete; // Copy construct
AlignedFrame& operator=(AlignedFrame const&) = delete; // Copy assign
[[nodiscard]] std::shared_ptr<AlignedFrame> makeShallowCopy() const;
int64_t mCaptureTimestamp = 0;
int64_t mRenderingTimestamp = 0;
// Video
std::shared_ptr<DeviceMemory> mVideoFrame = nullptr;
PixelFormat mPixelFormat = PixelFormat::kUnknown;
uint32_t mFrameRateN = 0;
uint32_t mFrameRateD = 0;
uint32_t mWidth = 0;
uint32_t mHeight = 0;
// Audio
AlignedAudioFrameConstPtr mAudioFrame = nullptr;
uint32_t mAudioSamplingFrequency = 0;
};
using AlignedFramePtr = std::shared_ptr<AlignedFrame>;
} // namespace Acl
6.2.5.2.3 - include/Base64.h
include/Base64.h File Reference
Namespaces
| Name |
|---|
| Acl |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <cstdint>
#include <string>
#include <vector>
namespace Acl {
std::string encodeBase64(const uint8_t* data, size_t size);
std::string encodeBase64(const std::vector<uint8_t>& data);
std::vector<uint8_t> decodeBase64(const std::string& data);
} // namespace Acl
6.2.5.2.4 - include/ControlDataAddress.h
include/ControlDataAddress.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::ControlDataAddress A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start. |
| struct | fmt::formatter< Acl::ControlDataAddress > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <cstdint>
#include <sstream>
#include <string>
#include <vector>
#include <fmt/format.h>
#include "UUID.h"
namespace Acl {
class ControlDataAddress final {
public:
ControlDataAddress() = default;
explicit ControlDataAddress(const UUID& destinationUUID);
[[nodiscard]] size_t size() const;
[[nodiscard]] bool empty() const;
bool extend(const UUID& uuid);
bool extend(const ControlDataAddress& address);
[[nodiscard]] bool hasWildcard() const;
[[nodiscard]] bool currentUuidIsWildcard() const;
[[nodiscard]] bool currentUuidMatch(const UUID& uuid) const;
[[nodiscard]] bool fullAddressMatch(const ControlDataAddress& other) const;
[[nodiscard]] std::optional<UUID> getCurrentUuid() const;
std::optional<UUID> moveToAndGetNextUuid();
[[nodiscard]] std::vector<uint8_t> pack() const;
static std::optional<ControlDataAddress> unpack(const std::vector<uint8_t>::const_iterator& packedBegin,
const std::vector<uint8_t>::const_iterator& packedEnd);
static std::optional<ControlDataAddress> unpack(const uint8_t* packedBegin, const uint8_t* packedEnd);
[[nodiscard]] std::string toString() const;
bool operator==(const ControlDataAddress& other) const;
bool operator!=(const ControlDataAddress& other) const;
friend std::ostream& operator<<(std::ostream& stream, const ControlDataAddress& address);
private:
std::vector<UUID> mAddress;
};
std::ostream& operator<<(std::ostream& stream, const ControlDataAddress& address);
} // namespace Acl
template <> struct fmt::formatter<Acl::ControlDataAddress> : formatter<std::string> {
template <typename FormatContext> auto format(const Acl::ControlDataAddress& address, FormatContext& ctx) {
return formatter<std::string>::format(address.toString(), ctx);
}
};
6.2.5.2.5 - include/ControlDataCommon.h
include/ControlDataCommon.h File Reference
Namespaces
| Name |
|---|
| Acl |
| Acl::ControlDataCommon |
Classes
| Name | |
|---|---|
| struct | Acl::ControlDataCommon::Response A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. |
| struct | Acl::ControlDataCommon::StatusMessage A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from. |
| struct | Acl::ControlDataCommon::ConnectionEvent A connection related event. |
| struct | fmt::formatter< Acl::ControlDataCommon::EventType > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <cstdint>
#include <string>
#include <vector>
#include "ControlDataAddress.h"
#include "UUID.h"
namespace Acl::ControlDataCommon {
struct Response {
std::string mMessage;
uint64_t mRequestId = 0;
UUID mFromUUID;
ControlDataAddress mRecipient;
};
struct StatusMessage {
std::string mMessage;
UUID mFromUUID;
ControlDataAddress mRecipient;
};
enum class EventType : uint8_t {
kDisconnect,
kConnect
};
struct ConnectionEvent {
EventType mEventType = EventType::kDisconnect;
ControlDataAddress mAddress;
UUID mEventNode;
};
} // namespace Acl::ControlDataCommon
template <> struct fmt::formatter<Acl::ControlDataCommon::EventType> : formatter<std::string> {
template <typename FormatContext> auto format(const Acl::ControlDataCommon::EventType type, FormatContext& ctx) {
std::string value;
switch (type) {
case Acl::ControlDataCommon::EventType::kDisconnect:
value = "disconnect";
break;
case Acl::ControlDataCommon::EventType::kConnect:
value = "connect";
break;
}
return formatter<std::string>::format(value, ctx);
}
};
6.2.5.2.6 - include/ControlDataSender.h
include/ControlDataSender.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::ControlDataSender A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers. |
| struct | Acl::ControlDataSender::Settings Settings for a ControlDataSender. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <functional>
#include <memory>
#include <vector>
#include <ISystemControllerInterface.h>
#include "ControlDataCommon.h"
namespace Acl {
class ControlDataSender final {
public:
enum class SendRequestStatus {
kSuccess,
kFailed,
kSendFailedForSome,
kSenderNotConfigured,
kNoConnectedReceiver,
kInternalError
};
struct Settings {
std::function<void(const ControlDataCommon::Response&)>
mResponseCallback; // Callback for response messages from receivers
std::function<void(const ControlDataCommon::StatusMessage&)>
mStatusMessageCallback; // Callback for status messages from receivers
std::function<void(const ControlDataCommon::ConnectionEvent&)>
mConnectionEventCallback; // Callback for connection events that has been detected by the sender, or passed
// to it from a connected receiver
};
ControlDataSender();
~ControlDataSender();
bool configure(const std::shared_ptr<ISystemControllerInterface>& controllerInterface, const Settings& settings);
SendRequestStatus sendRequestToReceivers(const std::string& request,
uint64_t& requestId,
const UUID& requester = UUID::kNilUUID,
int8_t hops = -1);
[[nodiscard]] std::vector<UUID> getDirectlyConnectedReceivers() const;
static std::string getVersion();
// ControlDataSender is not copyable
ControlDataSender(ControlDataSender const&) = delete; // Copy construct
ControlDataSender& operator=(ControlDataSender const&) = delete; // Copy assign
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
} // namespace Acl
6.2.5.2.7 - include/DeviceMemory.h
include/DeviceMemory.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::DeviceMemory RAII class for a CUDA memory buffer. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <cstddef>
#include <cstdint>
#include <memory>
#include <cuda_runtime.h>
namespace Acl {
class DeviceMemory {
public:
DeviceMemory() = default;
explicit DeviceMemory(size_t numberOfBytes);
explicit DeviceMemory(size_t numberOfBytes, cudaStream_t cudaStream);
explicit DeviceMemory(void* deviceMemory) noexcept;
bool allocateMemory(size_t numberOfBytes);
bool allocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream);
bool reallocateMemory(size_t numberOfBytes);
bool reallocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream);
bool allocateAndResetMemory(size_t numberOfBytes);
bool allocateAndResetMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream);
bool freeMemory();
bool freeMemoryAsync(cudaStream_t cudaStream);
void setFreeingCudaStream(cudaStream_t cudaStream);
~DeviceMemory();
template <typename T = uint8_t> [[nodiscard]] T* getDevicePointer() const {
return reinterpret_cast<T*>(dMemory);
}
[[nodiscard]] size_t getSize() const;
DeviceMemory(DeviceMemory&& other) noexcept;
DeviceMemory& operator=(DeviceMemory&& other) noexcept;
void swap(DeviceMemory& other) noexcept;
DeviceMemory(DeviceMemory const&) = delete;
DeviceMemory operator=(DeviceMemory const&) = delete;
private:
uint8_t* dMemory = nullptr;
size_t mAllocatedBytes = 0;
cudaStream_t mCudaStream = nullptr; // Stream to use for Async free
};
using DeviceMemoryPtr = std::shared_ptr<DeviceMemory>;
} // namespace Acl
6.2.5.2.8 - include/IControlDataReceiver.h
include/IControlDataReceiver.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::IControlDataReceiver IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has a receiving or listening side, as well as a sending side. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests. |
| struct | Acl::IControlDataReceiver::RequestData An incoming request to this ControlDataReceiver. |
| class | Acl::IControlDataReceiver::IRequest Interface for a request that can be responded to. |
| struct | Acl::IControlDataReceiver::Settings Settings for a ControlDataReceiver. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <memory>
#include <ISystemControllerInterface.h>
#include "ControlDataAddress.h"
#include "ControlDataCommon.h"
namespace Acl {
class IControlDataReceiver {
public:
struct RequestData {
std::string mMessage;
UUID mSenderUUID;
ControlDataAddress mRequester;
uint64_t mRequestID = 0;
int64_t mSenderTimestampUs =
0;
int64_t mDeliveryTimestampUs =
0;
};
class IRequest {
public:
IRequest() = default;
virtual ~IRequest() = default;
virtual const RequestData& getRequestData() = 0;
virtual bool respond(std::string&& message) = 0;
};
using IRequestPtr = std::shared_ptr<IRequest>;
struct Settings {
UUID mProductionPipelineUUID;
std::function<void(const ControlDataCommon::Response&)>
mResponseCallback;
std::function<void(const ControlDataCommon::ConnectionEvent&)>
mConnectionEventCallback;
};
virtual ~IControlDataReceiver() = default;
virtual bool configure(const Settings& settings) = 0;
virtual std::vector<IRequestPtr> getRequests(int64_t timestampUs) = 0;
virtual bool sendStatusMessageToSender(std::string&& message, const ControlDataAddress& address) = 0;
virtual bool sendRequestToReceivers(const std::string& request, uint64_t& requestId) = 0;
virtual size_t getNumberOfConnectedSenders() = 0;
virtual size_t getNumberOfConnectedReceivers() = 0;
};
} // namespace Acl
6.2.5.2.9 - include/IMediaStreamer.h
include/IMediaStreamer.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::IMediaStreamer IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to. |
| struct | Acl::IMediaStreamer::Settings Settings used when creating a new MediaStreamer. |
| struct | Acl::IMediaStreamer::Configuration The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <memory>
#include <ISystemControllerInterface.h>
#include <cuda.h>
#include "AlignedFrame.h"
namespace Acl {
class IMediaStreamer {
public:
struct Settings {
std::string mName; // Human-readable name, presented in the REST API
};
struct Configuration {
// Video
PixelFormat mIncomingPixelFormat = PixelFormat::kUnknown;
uint32_t mWidth = 0; // Width of the incoming video frames in pixels
uint32_t mHeight = 0; // Height of the incoming video frames in pixels
uint32_t mFrameRateN = 0; // Frame rate numerator of the incoming video frames
uint32_t mFrameRateD = 0; // Frame rate denominator of the incoming video frames
// Audio
uint32_t mAudioSampleRate = 0; // Audio sample rate of the incoming frames in Hz
uint32_t mNumAudioChannels = 0; // Number of audio channels in the incoming frames
};
virtual ~IMediaStreamer() = default;
virtual bool configure(const UUID& uuid, const Settings& settings, CUcontext cudaContext) = 0;
virtual bool setInputFormatAndStart(const Configuration& configuration) = 0;
virtual bool stopAndResetFormat() = 0;
[[nodiscard]] virtual bool hasFormatAndIsRunning() const = 0;
[[nodiscard]] virtual bool hasOpenOutputStream() const = 0;
virtual bool outputData(const AlignedFramePtr& frame) = 0;
};
} // namespace Acl
6.2.5.2.10 - include/IngestApplication.h
include/IngestApplication.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::IngestApplication |
| struct | Acl::IngestApplication::Settings |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <memory>
#include "ISystemControllerInterface.h"
namespace Acl {
class IngestApplication {
public:
struct Settings {};
IngestApplication();
~IngestApplication();
bool start(const std::shared_ptr<ISystemControllerInterface>& controllerInterface, const Settings& settings);
bool stop();
static std::string getVersion();
static std::string getLibraryVersions();
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
} // namespace Acl
6.2.5.2.11 - include/IngestUtils.h
include/IngestUtils.h File Reference
Namespaces
| Name |
|---|
| Acl |
| Acl::IngestUtils |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
namespace Acl {
namespace IngestUtils {
bool isRunningWithRootPrivileges();
} // namespace IngestUtils
} // namespace Acl
6.2.5.2.12 - include/ISystemControllerInterface.h
include/ISystemControllerInterface.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::ISystemControllerInterface An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. |
| struct | Acl::ISystemControllerInterface::Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
| struct | Acl::ISystemControllerInterface::Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | fmt::formatter< Acl::ISystemControllerInterface::StatusCode > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <functional>
#include <json.hpp>
#include <optional>
#include <string>
#include <fmt/format.h>
#include "UUID.h"
namespace Acl {
class ISystemControllerInterface {
public:
enum class StatusCode : uint32_t {
SUCCESS = 3001, // Accept / Success
TOO_MANY_REQUESTS = 3101, // Too many requests, try again later
UUID_ALREADY_REGISTERED = 3201, // UUID is already registered
FORMAT_ERROR = 3202, // Message formatting error
ALREADY_CONFIGURED = 3203, // The requested thing to configure is already configured
OUT_OF_RESOURCES = 3204, // Out of resources (CPU/GPU close to max utilization, all available slots used, etc.)
NOT_FOUND = 3205, // The requested thing was not found
INTERNAL_ERROR = 3206, // Internal error when trying to serve the request
CONNECTION_FAILED = 3207, // Connection failure
TIMEOUT_EXCEEDED = 3208, // Timeout exceeded
KEY_MISMATCH = 3209, // Key mismatch (might be a timeout, 3007 in the future)
UNKNOWN_REQUEST = 3210, // The name of the request was not known
MALFORMED_REQUEST = 3211, // The request is not correctly formatted
ALREADY_IN_USE = 3212, // The requested resource is already in use
VERSION_MISMATCH = 3213, // The version of the request is not supported
// None, yet
};
struct Response {
StatusCode mCode;
nlohmann::json mParameters; // Can be empty
};
struct Callbacks {
std::function<Response(const std::string&, const nlohmann::json&)>
mRequestCallback; // Callback called when then controller has sent a request
std::function<void(uint32_t, const std::string&, const std::error_code&)>
mConnectionClosedCallback; // Callback called when the connection to the controller is closed
};
virtual ~ISystemControllerInterface() = default;
virtual std::optional<std::string> sendMessage(const std::string& messageTitle,
const nlohmann::json& parameters) = 0;
virtual bool registerRequestCallback(const Callbacks& callbacks) = 0;
virtual bool connect() = 0;
virtual bool disconnect() = 0;
[[nodiscard]] virtual bool isConnected() const = 0;
[[nodiscard]] virtual UUID getUUID() const = 0;
};
} // namespace Acl
template <> struct fmt::formatter<Acl::ISystemControllerInterface::StatusCode> : formatter<std::uint32_t> {
template <typename FormatContext>
auto format(Acl::ISystemControllerInterface::StatusCode code, FormatContext& ctx) {
return formatter<std::uint32_t>::format(static_cast<uint32_t>(code), ctx);
}
};
6.2.5.2.13 - include/MediaEnumerations.h
include/MediaEnumerations.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| struct | fmt::formatter< Acl::FieldOrder > |
| struct | fmt::formatter< Acl::AudioChannelLayout > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <cstdint>
#include <ostream>
#include <fmt/format.h>
namespace Acl {
constexpr uint32_t makeFourCC(char a, char b, char c, char d) {
return static_cast<uint32_t>(a) + (static_cast<uint32_t>(b) << 8) + (static_cast<uint32_t>(c) << 16) +
(static_cast<uint32_t>(d) << 24);
}
enum PixelFormat : uint32_t {
kUnknown = 0, // Unknown format
kNv12 = Acl::makeFourCC('N', 'V', '1', '2'), // 4:2:0 format with Y plane followed by UVUVUV.. plane
kUyvy = Acl::makeFourCC('U', 'Y', 'V', 'Y'), // 4:2:2 format with packed UYVY macropixels
kP010 = Acl::makeFourCC('P', '0', '1', '0'), // 4:2:0 P016 with data in the 10 MSB
kP016 = Acl::makeFourCC('P', '0', '1', '6'), // 4:2:0 format with 16 bit words, Y plane followed by UVUVUV.. plane
kP210 = Acl::makeFourCC('P', '2', '1', '0'), // 4:2:2 P216 with data in the 10 MSB
kP216 = Acl::makeFourCC('P', '2', '1', '6'), // 4:2:2 format with 16 bit words, Y plane followed by UVUVUV.. plane
kRgba =
Acl::makeFourCC('R', 'G', 'B', 'A'), // 4:4:4:4 RGB format, 8 bit per channel, ordered RGBARGBARG.. in memory
kV210 = Acl::makeFourCC('V', '2', '1', '0'), // 4:2:2 packed format with 10 bit per component
kRgba64Le =
Acl::makeFourCC('R', 'G', 'B', 64) // 16 bit per component, ordered as RGBA in memory with little endian words.
};
std::ostream& operator<<(std::ostream& stream, const PixelFormat& pixelFormat);
enum class FieldOrder : uint8_t {
kProgressive, // No fields, i.e. progressive
kTopFieldFirst, // Interlaced frame with interleaved fields, top field first
kBottomFieldFirst // Interlaced frame with interleaved fields, bottom field first
};
std::ostream& operator<<(std::ostream& stream, const FieldOrder& fieldOrder);
enum class AudioFormat : uint16_t {
kInt16, // 16 bits signed integer per sample
kInt24In32, // 24 bits per sample, stored in the LSB of a 32-bit signed integer
kFloat32 // 32 bit float per sample
};
std::ostream& operator<<(std::ostream& stream, const AudioFormat& audioFormat);
enum class AudioChannelLayout : uint8_t {
kPlanar, // The audio samples of each channel are in separate "planes", first comes all channel 1's samples,
// then channel 2 and so on.
kInterleaved // The audio samples are interleaved, first comes sample one of each channel, then sample two, and
// so on.
};
std::ostream& operator<<(std::ostream& stream, const AudioChannelLayout& audioChannelLayout);
} // namespace Acl
template <> struct fmt::formatter<Acl::FieldOrder> : formatter<std::string> {
template <typename FormatContext> auto format(const Acl::FieldOrder fieldOrder, FormatContext& ctx) {
std::string value;
switch (fieldOrder) {
case Acl::FieldOrder::kProgressive:
value = "progressive";
break;
case Acl::FieldOrder::kTopFieldFirst:
value = "top_field_first";
break;
case Acl::FieldOrder::kBottomFieldFirst:
value = "bottom_field_first";
break;
}
return formatter<std::string>::format(value, ctx);
}
};
template <> struct fmt::formatter<Acl::AudioChannelLayout> : formatter<std::string> {
template <typename FormatContext>
auto format(const Acl::AudioChannelLayout audioChannelLayout, FormatContext& ctx) {
std::string value;
switch (audioChannelLayout) {
case Acl::AudioChannelLayout::kPlanar:
value = "planar";
break;
case Acl::AudioChannelLayout::kInterleaved:
value = "interleaved";
break;
}
return formatter<std::string>::format(value, ctx);
}
};
6.2.5.2.14 - include/MediaReceiver.h
include/MediaReceiver.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::MediaReceiver A MediaReceiver contains the logic for receiving, decoding and aligning incoming media sources from the Ingests. The aligned data is then delivered to the Rendering Engine which is also responsible for setting up the MediaReceiver. The MediaReceiver has a builtin multi view generator, which can create output streams containing composited subsets of the incoming video sources. This class is controlled using an ISystemControllerInterface provided when starting it. |
| struct | Acl::MediaReceiver::NewStreamParameters A struct containing information on the format of an incoming stream. |
| struct | Acl::MediaReceiver::CustomSystemControllerCallResponse A struct containing the data returned from the Rendering Engine on a custom System Controller call, with information that will be propagated back to the System Controller and its client. |
| struct | Acl::MediaReceiver::Settings Settings for a MediaReceiver. |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <memory>
#include <utility>
#include <cuda.h>
#include "AlignedFrame.h"
#include "ControlDataReceiver.h"
#include "ISystemControllerInterface.h"
#include "MediaStreamer.h"
namespace Acl {
class MediaReceiver {
public:
struct NewStreamParameters {
uint32_t mVideoHeight = 0; // Height of the video in pixels. 0 if the stream does not contain any video
uint32_t mVideoWidth = 0; // Width of the video in pixels. 0 if the stream does not contain any video
uint32_t mFrameRateN = 0; // Frame rate numerator
uint32_t mFrameRateD = 1; // Frame rate denominator
uint32_t mAudioSampleRate = 0; // Sample rate of the audio in Hz. 0 if the stream does not contain any audio
};
struct CustomSystemControllerCallResponse {
ISystemControllerInterface::StatusCode mCode;
nlohmann::json mParameters; // Only used if mCode == SUCCESS
std::string mErrorMessage; // Only used if mCode != SUCCESS
};
struct Settings {
PixelFormat mDecodedFormat = PixelFormat::kRgba64Le;
std::function<std::function<void(const AlignedFramePtr&)>(uint32_t inputSlot,
const std::string& streamID,
const NewStreamParameters& newStreamParameters)>
mNewConnectionCallback;
std::function<void(uint32_t inputSlot)> mClosedConnectionCallback;
std::function<CustomSystemControllerCallResponse(const std::string& request, const nlohmann::json& parameters)>
mCustomSystemControllerRequestCallback;
bool mUseMultiViewer = false;
bool mDeliverOld = false;
CUstream mAlignedFrameFreeStream = nullptr;
};
enum class TallyBorderColor : uint32_t { kNone, kRed, kGreen, kYellow };
MediaReceiver();
~MediaReceiver();
bool start(const std::shared_ptr<ISystemControllerInterface>& controllerInterface,
CUcontext cudaContext,
const Settings& settings,
const ControlDataReceiver::Settings& receiverSettings);
void stop();
std::function<void(const AlignedFramePtr&)>
getCustomMultiViewSourceInput(uint32_t inputSlot, bool fixedFramerate, const std::string& name = "");
bool removeCustomMultiViewSourceInput(uint32_t inputSlot);
void clearCustomMultiViewSourceInputs();
std::shared_ptr<IMediaStreamer> createMediaStreamerOutput(const MediaStreamer::Settings& settings);
bool removeMediaStreamerOutput(const UUID& uuid);
void clearMediaStreamerOutputs();
std::shared_ptr<IControlDataReceiver> getControlDataReceiver();
void setTallyBorder(uint32_t inputSlot, TallyBorderColor color);
void clearTallyBorder(uint32_t inputSlot);
void clearAllTallyBorders();
[[nodiscard]] MediaReceiver::TallyBorderColor getTallyBorder(uint32_t inputSlot) const;
MediaReceiver(MediaReceiver const&) = delete; // Copy construct
MediaReceiver(MediaReceiver&&) = delete; // Move construct
MediaReceiver& operator=(MediaReceiver const&) = delete; // Copy assign
MediaReceiver& operator=(MediaReceiver&&) = delete; // Move assign
static std::string getVersion();
static std::string getLibraryVersions();
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
} // namespace Acl
6.2.5.2.15 - include/SystemControllerConnection.h
include/SystemControllerConnection.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::SystemControllerConnection An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket. |
| struct | Acl::SystemControllerConnection::Settings Settings for a SystemControllerConnection. |
| struct | fmt::formatter< Acl::SystemControllerConnection::ComponentType > |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <chrono>
#include "ISystemControllerInterface.h"
#include "json.hpp"
namespace Acl {
class SystemControllerConnection final : public ISystemControllerInterface {
public:
enum class ComponentType : uint32_t {
kIngest,
kPipeline,
kControlPanel,
};
struct Settings {
std::string mSystemControllerIP; // IP of the server
uint16_t mSystemControllerPort; // Port of the server
std::string mSystemControllerPostfix; // Postfix of the address that the backend uses if any
std::string mPSK; // The pre shared key used for authorization with the system controller server
UUID mUUID; // The UUID of the device using this library
ComponentType mType; // The component type of the component using this SystemControllerConnection
std::string mName; // The component name (optional)
std::string mMyIP; // The external IP of the system the component is running on. Will be sent to the system
// controller server in the announce message (optional)
std::chrono::milliseconds mConnectTimeout{
3000}; // Max time to wait on an announcement response from the server during connection
bool mEnableHTTPS; // Enable the communication between the system controller and a component encrypted
bool mInsecureHTTPS; // Disable the verification of the TLS certificate if requested.
std::string mCustomCaCertFile; // Custom CA certificate
};
SystemControllerConnection();
~SystemControllerConnection() override;
bool configure(const Settings& settings);
bool connect() override;
[[nodiscard]] bool isConnected() const override;
[[nodiscard]] UUID getUUID() const override;
std::optional<std::string> sendMessage(const std::string& messageTitle, const nlohmann::json& parameters) override;
bool disconnect() override;
bool registerRequestCallback(const Callbacks& callbacks) override;
SystemControllerConnection(SystemControllerConnection const&) = delete; // Copy construct
SystemControllerConnection(SystemControllerConnection&&) = delete; // Move construct
SystemControllerConnection& operator=(SystemControllerConnection const&) = delete; // Copy assign
SystemControllerConnection& operator=(SystemControllerConnection&&) = delete; // Move assign
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
} // namespace Acl
template <> struct fmt::formatter<Acl::SystemControllerConnection::ComponentType> : formatter<std::string> {
template <typename FormatContext>
auto format(Acl::SystemControllerConnection::ComponentType type, FormatContext& ctx) {
std::string value;
switch (type) {
case Acl::SystemControllerConnection::ComponentType::kIngest:
value = "ingest";
break;
case Acl::SystemControllerConnection::ComponentType::kPipeline:
value = "pipeline";
break;
case Acl::SystemControllerConnection::ComponentType::kControlPanel:
value = "controlpanel";
break;
}
return formatter<std::string>::format(value, ctx);
}
};
6.2.5.2.16 - include/TimeCommon.h
include/TimeCommon.h File Reference
Namespaces
| Name |
|---|
| Acl |
| Acl::TimeCommon |
Classes
| Name | |
|---|---|
| struct | Acl::TimeCommon::TAIStatus |
| struct | Acl::TimeCommon::TimeStructure |
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <chrono>
#include <cstdint>
#include <fstream>
#include <sstream>
#include "expected.hpp"
namespace Acl {
namespace TimeCommon {
enum class StratumLevel {
UnknownStratum,
stratum0,
stratum1,
stratum2,
stratum3,
stratum4,
};
struct TAIStatus {
StratumLevel mStratum = StratumLevel::UnknownStratum;
bool mHasLock = false;
double mTimeDiffS = 0.0; // Time diff vs NTP in seconds, +/- value means slow/faster than NTP time
};
// Little endian
// Minimum size packet is 64 - bytes
struct TimeStructure {
uint64_t t1 = 0; // 8-bytes / Total 8-bytes == Client time T1
uint64_t t2 = 0; // 8-bytes / Total 16-bytes == Server
uint64_t t3 = 0; // 8-bytes / Total 24-bytes
uint64_t t4 = 0; // 8-bytes / Total 32-bytes
uint64_t token = 0; // 8-bytes / Total 40-bytes == t1 ^ key
uint64_t dummy1 = 0; // 8-bytes / Total 48-bytes == for future use
uint64_t dummy2 = 0; // 8-bytes / Total 56-bytes == for future use
uint64_t dummy3 = 0; // 8-bytes / Total 64-bytes == for future use
};
uint64_t getMonotonicClockMicro();
tl::expected<TimeCommon::TAIStatus, std::string> getStatus();
int64_t getTAIMicro();
std::string taiMicroToString(int64_t taiTimestamp);
} // namespace TimeCommon
} // namespace Acl
6.2.5.2.17 - include/UUID.h
include/UUID.h File Reference
Namespaces
| Name |
|---|
| Acl |
Classes
| Name | |
|---|---|
| class | Acl::UUID A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard. |
| struct | fmt::formatter< Acl::UUID > |
Functions
| Name | |
|---|---|
| UUID() Default constructor, returns a nil UUID. | |
| constexpr | UUID(const std::array< uint8_t, kUUIDSize > & bytes) Construct a UUID from a sequence of bytes. |
| UUID | generateRandom() Create a new, randomly generated UUID. |
| std::optional< UUID > | fromString(const std::string & uuid) Parse a UUID from a string. |
| std::optional< UUID > | fromVector(const std::vector< uint8_t >::const_iterator & start, const std::vector< uint8_t >::const_iterator & end) Read a UUID from a vector of uint8s. |
| std::optional< UUID > | fromPointer(const uint8_t * start, const uint8_t * end) Read a UUID from a pointer. |
| std::string | toString() const |
| std::string | toBitString() const |
| bool | operator==(const UUID & other) const Compare this UUID to another UUID. |
| bool | operator!=(const UUID & other) const Compare this UUID to another UUID for inequality. |
| bool | operator<(const UUID & other) const Less than operator implementation. |
| std::array< uint8_t, kUUIDSize >::const_iterator | begin() const |
| std::array< uint8_t, kUUIDSize >::const_iterator | end() const |
| constexpr size_t | size() const |
Attributes
| Name | |
|---|---|
| constexpr size_t | kUUIDSize |
| const UUID | kNilUUID |
| const UUID | kOmniUUID |
Functions Documentation
function UUID
UUID()
Default constructor, returns a nil UUID.
function UUID
explicit constexpr UUID(
const std::array< uint8_t, kUUIDSize > & bytes
)
Construct a UUID from a sequence of bytes.
Note: This will accept UUIDs that are not valid version 4 UUIDs.
function generateRandom
static UUID generateRandom()
Create a new, randomly generated UUID.
Return: A new, randomly generated UUID
function fromString
static std::optional< UUID > fromString(
const std::string & uuid
)
Parse a UUID from a string.
Parameters:
- uuid The string representation of the UUID
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromVector
static std::optional< UUID > fromVector(
const std::vector< uint8_t >::const_iterator & start,
const std::vector< uint8_t >::const_iterator & end
)
Read a UUID from a vector of uint8s.
Parameters:
- start Start iterator to read the UUID from
- end End iterator to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function fromPointer
static std::optional< UUID > fromPointer(
const uint8_t * start,
const uint8_t * end
)
Read a UUID from a pointer.
Parameters:
- start Start pointer to read the UUID from
- end End pointer to read the UUID from, must be 16 bytes after
start
Return: An optional containing the UUID on success, or nullopt in case the parsing failed
function toString
std::string toString() const
Return: A string representation of the UUID formatted as hex values
function toBitString
std::string toBitString() const
Return: A string representation of the UUID formatted as bits
function operator==
bool operator==(
const UUID & other
) const
Compare this UUID to another UUID.
Parameters:
- other The other UUID to compare this UUID to
Return: True if the UUIDs are identical, false otherwise
function operator!=
bool operator!=(
const UUID & other
) const
Compare this UUID to another UUID for inequality.
Parameters:
- other The other UUID to compare this UUID to
Return: True if the UUIDs are not equal, false in case they are identical
function operator<
bool operator<(
const UUID & other
) const
Less than operator implementation.
Parameters:
- other The other UUID to compare this UUID to
Return: True if this UUID should be sorted before the other UUID
function begin
std::array< uint8_t, kUUIDSize >::const_iterator begin() const
Return: Begin iterator for the UUID byte sequence
function end
std::array< uint8_t, kUUIDSize >::const_iterator end() const
Return: End iterator for the UUID byte sequence
function size
constexpr size_t size() const
Return: The size in bytes of the UUID. Will always return 16
Attributes Documentation
variable kUUIDSize
static constexpr size_t kUUIDSize = 16;
variable kNilUUID
static const UUID kNilUUID;
variable kOmniUUID
static const UUID kOmniUUID;
Source code
// Copyright (c) 2024, Ateliere. All rights reserved.
#pragma once
#include <array>
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
#include <fmt/format.h>
namespace Acl {
class UUID {
public:
static constexpr size_t kUUIDSize = 16;
// Predefined UUID values
static const UUID kNilUUID;
static const UUID kOmniUUID;
UUID();
constexpr explicit UUID(const std::array<uint8_t, kUUIDSize>& bytes)
: mUUID{bytes} {
}
static UUID generateRandom();
static std::optional<UUID> fromString(const std::string& uuid);
static std::optional<UUID> fromVector(const std::vector<uint8_t>::const_iterator& start,
const std::vector<uint8_t>::const_iterator& end);
static std::optional<UUID> fromPointer(const uint8_t* start, const uint8_t* end);
[[nodiscard]] std::string toString() const;
[[nodiscard]] std::string toBitString() const;
bool operator==(const UUID& other) const;
bool operator!=(const UUID& other) const;
bool operator<(const UUID& other) const;
[[nodiscard]] std::array<uint8_t, kUUIDSize>::const_iterator begin() const;
[[nodiscard]] std::array<uint8_t, kUUIDSize>::const_iterator end() const;
[[nodiscard]] constexpr size_t size() const {
return mUUID.size();
}
private:
std::array<uint8_t, kUUIDSize> mUUID{};
} __attribute__((packed));
static_assert(sizeof(UUID) == 16, "UUID has unexpected size");
std::ostream& operator<<(std::ostream& stream, const UUID& uuid);
} // namespace Acl
template <> struct fmt::formatter<Acl::UUID> : formatter<std::string> {
template <typename FormatContext> auto format(const Acl::UUID& uuid, FormatContext& ctx) {
return formatter<std::string>::format(uuid.toString(), ctx);
}
};
6.2.5.3 - Namespaces
- namespace Acl
- namespace AclLog
A namespace for logging utilities. - namespace ControlDataCommon
- namespace IngestUtils
- namespace TimeCommon
- namespace AclLog
- namespace fmt
- namespace spdlog
6.2.5.3.1 - Acl
Acl Namespace Reference
Namespaces
| Name |
|---|
| Acl::AclLog A namespace for logging utilities. |
| Acl::ControlDataCommon |
| Acl::IngestUtils |
| Acl::TimeCommon |
Classes
| Name | |
|---|---|
| struct | Acl::AlignedAudioFrame AlignedAudioFrame is a frame of interleaved floating point audio samples with a given number of channels. |
| struct | Acl::AlignedFrame A frame of aligned data that is passed to the rendering engine from the MediaReceiver. A DataFrame contains a time stamped frame of media, which might be video, audio and auxiliary data such as subtitles. A single DataFrame can contain one or multiple types of media. Which media types are included can be probed by nullptr-checking/size checking the data members. The struct has ownership of all data pointers included. The struct includes all logic for freeing the resources held by this struct and the user should therefore just make sure the struct itself is deallocated to ensure all resources are freed. |
| class | Acl::ControlDataAddress A class representing an address within the control protocol. The address consists of an internal list of UUIDs, which all represent a component that needs to be passed to reach the final address. An address might end with a wildcard, which is represented by the omni UUID (i.e. all digits set to 0xF) and will then match all addresses with the same UUID sequence in the start. |
| class | Acl::ControlDataSender A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers. |
| class | Acl::DeviceMemory RAII class for a CUDA memory buffer. |
| class | Acl::IControlDataReceiver IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has a receiving or listening side, as well as a sending side. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests. |
| class | Acl::IMediaStreamer IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to. |
| class | Acl::IngestApplication |
| class | Acl::ISystemControllerInterface An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. |
| class | Acl::MediaReceiver A MediaReceiver contains the logic for receiving, decoding and aligning incoming media sources from the Ingests. The aligned data is then delivered to the Rendering Engine which is also responsible for setting up the MediaReceiver. The MediaReceiver has a builtin multi view generator, which can create output streams containing composited subsets of the incoming video sources. This class is controlled using an ISystemControllerInterface provided when starting it. |
| class | Acl::SystemControllerConnection An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket. |
| class | Acl::UUID A class holding a UUID, stored as a sequence of bytes. This class only supports version 4 variant 1 of the UUID standard. |
Types
| Name | |
|---|---|
| enum uint32_t | PixelFormat { kUnknown = 0, kNv12 = Acl::makeFourCC(‘N’, ‘V’, ‘1’, ‘2’), kUyvy = Acl::makeFourCC(‘U’, ‘Y’, ‘V’, ‘Y’), kP010 = Acl::makeFourCC(‘P’, ‘0’, ‘1’, ‘0’), kP016 = Acl::makeFourCC(‘P’, ‘0’, ‘1’, ‘6’), kP210 = Acl::makeFourCC(‘P’, ‘2’, ‘1’, ‘0’), kP216 = Acl::makeFourCC(‘P’, ‘2’, ‘1’, ‘6’), kRgba = |
| Acl::makeFourCC(‘R’, ‘G’, ‘B’, ‘A’), kV210 = Acl::makeFourCC(‘V’, ‘2’, ‘1’, ‘0’), kRgba64Le = | |
| Acl::makeFourCC(‘R’, ‘G’, ‘B’, 64)} Enumeration of FourCC formats. | |
| enum class uint8_t | FieldOrder { kProgressive, kTopFieldFirst, kBottomFieldFirst} Enumeration of Field orders for interlaced video. |
| enum class uint16_t | AudioFormat { kInt16, kInt24In32, kFloat32} The format of the stored samples. |
| enum class uint8_t | AudioChannelLayout { kPlanar, kInterleaved} Channel layout of the samples. |
| using std::shared_ptr< AlignedAudioFrame > | AlignedAudioFramePtr |
| using std::shared_ptr< const AlignedAudioFrame > | AlignedAudioFrameConstPtr |
| using std::shared_ptr< AlignedFrame > | AlignedFramePtr |
| using std::shared_ptr< DeviceMemory > | DeviceMemoryPtr |
Functions
| Name | |
|---|---|
| AlignedAudioFramePtr | createAlignedAudioFrame(uint8_t numberOfChannels, uint32_t numberOfSamplesPerChannel) Create a new AlignedAudioFrame with a given amount of samples allocated and all samples initialized to 0.0f. |
| AlignedAudioFramePtr | copyAlignedAudioFrame(AlignedAudioFrameConstPtr audioFrame) Copy an AlignedAudioFrame including its samples. |
| AlignedAudioFramePtr | extractChannel(AlignedAudioFrameConstPtr sourceFrame, uint8_t channelIndex) Extract one channel from an AlignedAudioFrame as a new AlignedAudioFrame. The new AlignedAudioFrame will share no data with the original frame, meaning the new frame can be edited without corrupting the old one. |
| std::string | encodeBase64(const uint8_t * data, size_t size) Base64 encode some data. |
| std::string | encodeBase64(const std::vector< uint8_t > & data) Base64 encode some data. |
| std::vector< uint8_t > | decodeBase64(const std::string & data) Decode some Base64 encoded data. |
| std::ostream & | operator«(std::ostream & stream, const ControlDataAddress & address) Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’. |
| constexpr uint32_t | makeFourCC(char a, char b, char c, char d) Helper function to create a FourCC code out of four characters. |
| std::ostream & | operator«(std::ostream & stream, const PixelFormat & pixelFormat) Add the string representation of a PixelFormat to the output stream. |
| std::ostream & | operator«(std::ostream & stream, const FieldOrder & fieldOrder) Add the string representation of a FieldOrder to the output stream. |
| std::ostream & | operator«(std::ostream & stream, const AudioFormat & audioFormat) Add the string representation of an AudioFormat to the output stream. |
| std::ostream & | operator«(std::ostream & stream, const AudioChannelLayout & audioChannelLayout) Add the string representation of an AudioChannelLayout to the output stream. |
| std::ostream & | operator«(std::ostream & stream, const UUID & uuid) Print this UUID to an output stream. |
Types Documentation
enum PixelFormat
| Enumerator | Value | Description |
|---|---|---|
| kUnknown | 0 | |
| kNv12 | Acl::makeFourCC(‘N’, ‘V’, ‘1’, ‘2’) | |
| kUyvy | Acl::makeFourCC(‘U’, ‘Y’, ‘V’, ‘Y’) | |
| kP010 | Acl::makeFourCC(‘P’, ‘0’, ‘1’, ‘0’) | |
| kP016 | Acl::makeFourCC(‘P’, ‘0’, ‘1’, ‘6’) | |
| kP210 | Acl::makeFourCC(‘P’, ‘2’, ‘1’, ‘0’) | |
| kP216 | Acl::makeFourCC(‘P’, ‘2’, ‘1’, ‘6’) | |
| kRgba | = | |
| Acl::makeFourCC(‘R’, ‘G’, ‘B’, ‘A’) | ||
| kV210 | Acl::makeFourCC(‘V’, ‘2’, ‘1’, ‘0’) | |
| kRgba64Le | = | |
| Acl::makeFourCC(‘R’, ‘G’, ‘B’, 64) |
Enumeration of FourCC formats.
enum FieldOrder
| Enumerator | Value | Description |
|---|---|---|
| kProgressive | ||
| kTopFieldFirst | ||
| kBottomFieldFirst |
Enumeration of Field orders for interlaced video.
enum AudioFormat
| Enumerator | Value | Description |
|---|---|---|
| kInt16 | ||
| kInt24In32 | ||
| kFloat32 |
The format of the stored samples.
enum AudioChannelLayout
| Enumerator | Value | Description |
|---|---|---|
| kPlanar | ||
| kInterleaved |
Channel layout of the samples.
using AlignedAudioFramePtr
using Acl::AlignedAudioFramePtr = typedef std::shared_ptr<AlignedAudioFrame>;
using AlignedAudioFrameConstPtr
using Acl::AlignedAudioFrameConstPtr = typedef std::shared_ptr<const AlignedAudioFrame>;
using AlignedFramePtr
using Acl::AlignedFramePtr = typedef std::shared_ptr<AlignedFrame>;
using DeviceMemoryPtr
using Acl::DeviceMemoryPtr = typedef std::shared_ptr<DeviceMemory>;
Functions Documentation
function createAlignedAudioFrame
AlignedAudioFramePtr createAlignedAudioFrame(
uint8_t numberOfChannels,
uint32_t numberOfSamplesPerChannel
)
Create a new AlignedAudioFrame with a given amount of samples allocated and all samples initialized to 0.0f.
Parameters:
- numberOfChannels Number of channels to allocate space for
- numberOfSamplesPerChannel Number of samples per channel to allocate space for
Return: Shared pointer to the new AlignedAudioFrame
function copyAlignedAudioFrame
AlignedAudioFramePtr copyAlignedAudioFrame(
AlignedAudioFrameConstPtr audioFrame
)
Copy an AlignedAudioFrame including its samples.
Parameters:
- audioFrame The AlignedAudioFrame to copy
Return: Shared pointer to the new AlignedAudioFrame
function extractChannel
AlignedAudioFramePtr extractChannel(
AlignedAudioFrameConstPtr sourceFrame,
uint8_t channelIndex
)
Extract one channel from an AlignedAudioFrame as a new AlignedAudioFrame. The new AlignedAudioFrame will share no data with the original frame, meaning the new frame can be edited without corrupting the old one.
Parameters:
- sourceFrame The frame to extract a channel from
- channelIndex The zero-based channel index to extract
Return: Shared pointer to a new mono AlignedAudioFrame, or nullptr if channel is out of bounds
function encodeBase64
std::string encodeBase64(
const uint8_t * data,
size_t size
)
Base64 encode some data.
Parameters:
- data Pointer to the data to encode with Base64
- size The length of the data to encode with Base64
Return: The resulting Base64 encoded string
function encodeBase64
std::string encodeBase64(
const std::vector< uint8_t > & data
)
Base64 encode some data.
Parameters:
- data The data to encode with Base64
Return: The resulting Base64 encoded string
function decodeBase64
std::vector< uint8_t > decodeBase64(
const std::string & data
)
Decode some Base64 encoded data.
Parameters:
- data The Base64 encoded string to decode
Return: The resulting decoded data
function operator«
std::ostream & operator<<(
std::ostream & stream,
const ControlDataAddress & address
)
Print this ControlDataAddress to an output stream, UUIDs separated with ‘:’.
Parameters:
- stream The stream to print to
- address The address to print
Return: Reference to the output stream
function makeFourCC
constexpr uint32_t makeFourCC(
char a,
char b,
char c,
char d
)
Helper function to create a FourCC code out of four characters.
Return: The characters a-d encoded as a 32 bit FourCC code.
function operator«
std::ostream & operator<<(
std::ostream & stream,
const PixelFormat & pixelFormat
)
Add the string representation of a PixelFormat to the output stream.
Parameters:
- pixelFormat The PixelFormat to get as a string
Return: The ostream with the string representation of the PixelFormat appended
function operator«
std::ostream & operator<<(
std::ostream & stream,
const FieldOrder & fieldOrder
)
Add the string representation of a FieldOrder to the output stream.
Parameters:
- fieldOrder The FieldOrder to get as a string
Return: The ostream with the string representation of the FieldOrder appended
function operator«
std::ostream & operator<<(
std::ostream & stream,
const AudioFormat & audioFormat
)
Add the string representation of an AudioFormat to the output stream.
Parameters:
- audioFormat The AudioFormat to get as a string
Return: The ostream with the string representation of the AudioFormat appended
function operator«
std::ostream & operator<<(
std::ostream & stream,
const AudioChannelLayout & audioChannelLayout
)
Add the string representation of an AudioChannelLayout to the output stream.
Parameters:
- audioChannelLayout The AudioChannelLayout to get as a string
Return: The ostream with the string representation of the AudioChannelLayout appended
function operator«
std::ostream & operator<<(
std::ostream & stream,
const UUID & uuid
)
Print this UUID to an output stream.
Parameters:
- stream The stream to print to
Return: Reference to the output stream
6.2.5.3.2 - Acl::AclLog
Acl::AclLog Namespace Reference A namespace for logging utilities.
Classes
| Name | |
|---|---|
| class | Acl::AclLog::ThreadNameFormatterFlag |
| class | Acl::AclLog::FileLocationFormatterFlag A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. |
Types
| Name | |
|---|---|
| enum class | Level { kTrace, kDebug, kInfo, kWarning, kError, kCritical, kOff} Log levels. |
Functions
| Name | |
|---|---|
| void | init(const std::string & name) Initialize logging. |
| void | initControlMessagesLog(const std::string & name) Init the Rendering Engine control messages log. |
| void | setLevel(Level level) Set global logging level. |
| void | logControlMessage(const std::string & origin, const std::string & controlMessage) Write to the control messages log. |
| AclLog::Level | getLogLevel() Internal helper function for getting the setting for the log level. |
| size_t | getMaxFileSize() Internal helper function for getting the setting for the maximum size for a log file. |
| size_t | getMaxLogRotations() Internal helper function for getting the setting for the maximum number of rotated log files. |
| std::filesystem::path | getLogFileFullPath(const std::string & name) Internal helper function for constructing the full path name for the log file. |
| std::string | getThreadName() |
Types Documentation
enum Level
| Enumerator | Value | Description |
|---|---|---|
| kTrace | ||
| kDebug | ||
| kInfo | ||
| kWarning | ||
| kError | ||
| kCritical | ||
| kOff |
Log levels.
Functions Documentation
function init
void init(
const std::string & name
)
Initialize logging.
Parameters:
- name The name of the component (used for log prefix and filename)
By default two sinks are created. The first sink writes messages to the console. The second sink attempts to create a log file in the path set by the environment variable ACL_LOG_PATH (’/tmp’ if unset). The name of the log file is ’name-
function initControlMessagesLog
void initControlMessagesLog(
const std::string & name
)
Init the Rendering Engine control messages log.
Parameters:
- name The name of the Rendering Engine (used for filename)
function setLevel
void setLevel(
Level level
)
Set global logging level.
Parameters:
- level Logging level to set
function logControlMessage
void logControlMessage(
const std::string & origin,
const std::string & controlMessage
)
Write to the control messages log.
Parameters:
- origin The origin of the message to log, usually the UUID of the control panel sending the message
- controlMessage The controlMessage to log
function getLogLevel
AclLog::Level getLogLevel()
Internal helper function for getting the setting for the log level.
Return: The wanted log level fetched from an environment variable if set, or else a default value
function getMaxFileSize
size_t getMaxFileSize()
Internal helper function for getting the setting for the maximum size for a log file.
Return: The wanted maximum size of the log file fetched from an environment variable if set, or else a default value
function getMaxLogRotations
size_t getMaxLogRotations()
Internal helper function for getting the setting for the maximum number of rotated log files.
Return: The wanted number of log files to rotate fetched from an environment variable if set, or else a default value
function getLogFileFullPath
std::filesystem::path getLogFileFullPath(
const std::string & name
)
Internal helper function for constructing the full path name for the log file.
Parameters:
- name The name of the component
Return: The full path to the log file
function getThreadName
inline std::string getThreadName()
6.2.5.3.3 - Acl::ControlDataCommon
Acl::ControlDataCommon Namespace Reference
Classes
| Name | |
|---|---|
| struct | Acl::ControlDataCommon::Response A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. |
| struct | Acl::ControlDataCommon::StatusMessage A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from. |
| struct | Acl::ControlDataCommon::ConnectionEvent A connection related event. |
Types
| Name | |
|---|---|
| enum class uint8_t | EventType { kDisconnect, kConnect} Enum with all supported event types. |
Types Documentation
enum EventType
| Enumerator | Value | Description |
|---|---|---|
| kDisconnect | ||
| kConnect | A node has disconnected. A node has connected |
Enum with all supported event types.
6.2.5.3.4 - Acl::IngestUtils
Acl::IngestUtils Namespace Reference
Functions
| Name | |
|---|---|
| bool | isRunningWithRootPrivileges() |
Functions Documentation
function isRunningWithRootPrivileges
bool isRunningWithRootPrivileges()
Return: true if this application is executing with root privileges, false otherwise
6.2.5.3.5 - Acl::TimeCommon
Acl::TimeCommon Namespace Reference
Classes
| Name | |
|---|---|
| struct | Acl::TimeCommon::TAIStatus |
| struct | Acl::TimeCommon::TimeStructure |
Types
| Name | |
|---|---|
| enum class | StratumLevel { UnknownStratum, stratum0, stratum1, stratum2, stratum3, stratum4} |
Functions
| Name | |
|---|---|
| uint64_t | getMonotonicClockMicro() Get current time since epoch. |
| tl::expected< TimeCommon::TAIStatus, std::string > | getStatus() Get TAI status. |
| int64_t | getTAIMicro() Get current TAI time. |
| std::string | taiMicroToString(int64_t taiTimestamp) Converts the input TAI timestamp to a human readable string. Timestamp is converted to local time including leap seconds. |
Types Documentation
enum StratumLevel
| Enumerator | Value | Description |
|---|---|---|
| UnknownStratum | ||
| stratum0 | ||
| stratum1 | ||
| stratum2 | ||
| stratum3 | ||
| stratum4 |
Functions Documentation
function getMonotonicClockMicro
uint64_t getMonotonicClockMicro()
Get current time since epoch.
Return: Return current time since epoch in microseconds
function getStatus
tl::expected< TimeCommon::TAIStatus, std::string > getStatus()
Get TAI status.
Return: Expected with the TAI status if successful or an error string in case something went wrong
function getTAIMicro
int64_t getTAIMicro()
Get current TAI time.
Return: Return current TAI time in microseconds
function taiMicroToString
std::string taiMicroToString(
int64_t taiTimestamp
)
Converts the input TAI timestamp to a human readable string. Timestamp is converted to local time including leap seconds.
Parameters:
- taiTimestamp A TAI timestamp with microseconds resolution
Return: Return a human readable timestamp
6.2.5.3.6 - fmt
fmt Namespace Reference
Classes
6.2.5.3.7 - spdlog
spdlog Namespace Reference
6.3 - Ateliere Live 7.0.0 developer reference
6.3.1 - REST API v3
The following is a rendering of the OpenAPI for the Ateliere Live System Controller using Swagger. It does not have a backend server, so it cannot be run interactively.
This API is available from the server at the base URL /api/v3.
6.3.2 - Ateliere Live Rendering Engine configuration documentation
This page describes how to configure the Rendering Engine. This topic is closely related to this page on the control command protocol for the video and audio mixers.
Rendering Engine components
The Rendering Engine is an application that uses the Production Pipeline library in the base platform for transport, and adds to that media file playback, HTML rendering, a full video mixer and an audio router and audio mixer. The figure below shows a schematic of the different components and an example of how streams may transition through it.

HTML Renderers
Multiple HTML renderers can be instantiated in runtime by control panels, and in each an HTML page can be opened. Each HTML renderer produces a video stream, but no audio.
Media Players
Multiple media players can be instantiated in runtime by control panels, and in each a media file can be opened. Each media player produces a stream containing a video stream and all audio streams from the file.
Video Mixer
The Video mixer receives all video inputs into the system, i.e. streams from ingests, from HTML renderers and from media players. It outputs one or more named video output streams. The internal structure of the video mixer is defined at startup (as decribed in detail below), and controlling the video mixer is done in runtime by control panels.
Audio Router
The audio router receives all audio streams into the system, i.e. streams from ingests and from media players. It outputs a set of streams that are either mono or a stereo pair, to the audio mixer. The mappings from input streams to output streams in the router is configured in runtime by control panels.
Audio Mixer
Note
The audio mixer can be either our internal audio mixer or an integration towards an external third party audio mixer. The rest of the documentation here is valid for the internal audio mixer.The audio mixer takes a number of mono or stereo pair streams as inputs that we call input strips. It outputs a number of named output streams in stereo. The outputs of the audio mixer are defined at startup, and the audio mixer is controlled in runtime by control panels.
Combine outputs
The combination of video and audio outputs into full output streams from the rendering engine is configured at startup.
Configuring the Rendering Engine
Some aspects of the rendering engine can be configured statically at startup through the use of a configuration file in JSON format. Specifically, the video mixer node graph, the audio mixer outputs and the combination of video and audio outputs can be configured. Exactly how the configuration file is specified at startup is covered in this guide.
As an example, here is the contents of such a JSON configuration file that we will refer to throughout this guide:
{
"version": "1.0",
"video": {
"nodes": {
"transition": {
"type": "transition"
},
"chroma_key_select": {
"type": "select"
},
"chroma_key": {
"type": "chroma_key"
},
"chroma_key_alpha_over": {
"type": "alpha_over"
},
"fade_to_black": {
"type": "fade_to_black"
},
"program": {
"type": "output"
},
"chroma_key_preview": {
"type": "output"
},
"preview": {
"type": "output"
}
},
"links": [
{
"from_node": "transition",
"from_socket": 0,
"to_node": "chroma_key_alpha_over",
"to_socket": 1
},
{
"from_node": "transition",
"from_socket": 1,
"to_node": "preview",
"to_socket": 0
},
{
"from_node": "chroma_key_select",
"from_socket": 0,
"to_node": "chroma_key",
"to_socket": 0
},
{
"from_node": "chroma_key",
"from_socket": 0,
"to_node": "chroma_key_alpha_over",
"to_socket": 0
},
{
"from_node": "chroma_key_alpha_over",
"from_socket": 0,
"to_node": "fade_to_black",
"to_socket": 0
},
{
"from_node": "fade_to_black",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
},
{
"from_node": "chroma_key",
"from_socket": 0,
"to_node": "chroma_key_preview",
"to_socket": 0
}
]
},
"audio": {
"outputs": [
{
"name": "main",
"channels": 2
},
{
"name": "aux1",
"channels": 2,
"follows": "main"
},
{
"name": "aux2",
"channels": 2
}
]
},
"output_mapping": [
{
"name": "program",
"video_output": "program",
"audio_output": "main",
"feedback_input_slot": 1001,
"stream": true
},
{
"name": "preview",
"video_output": "preview",
"audio_output": "",
"feedback_input_slot": 1002,
"stream": false
},
{
"name": "aux1",
"video_output": "program",
"audio_output": "aux1",
"feedback_input_slot": 0,
"stream": true
},
{
"name": "chroma_key_preview",
"video_output": "chroma_key_preview",
"audio_output": "aux2",
"feedback_input_slot": 100,
"stream": true
}
]
}
Video Mixer node graph
The video mixer is defined as a tree graph of nodes that work together in sequence to produce one or several video outputs. Each node performs a specific action, and has zero or more input sockets and zero or more output sockets. Links connect output sockets on one node to input sockets on other nodes. Each node is named and the name is used to control the node in runtime. The node tree configuration is specified in the video section of the JSON file, which contains two parts: the list of nodes and the list of links connecting the nodes.
The following is a graphical representation of the video mixer node graph configuration in the JSON example file above, with two input nodes, three processing nodes and three output nodes, and links in between:

Video nodes block
The nodes object of the video block is a JSON object where the names/keys in the object is the unique name of the
node. The name is used to refer to the node when operating the mixer later on, so names that are easy to
understand what they are supposed to be used for in the production is recommended.
The name can only contain lower case letters, digits, _ and -. Space or other special characters are not allowed.
Each node is an JSON object with parameters defining the node properties.
Here the parameter type defines which type of node it is.
The supported types are listed below. They can be divided into three groups depending on if they provide input to the
graph, output from the graph or is a processing node, placed in the middle of the graph.
Input nodes
The input nodes take their input from the input slots of the Rendering Engine, which contains the latest frame for all connected sources (this includes connected cameras, HTML graphics, media players etc.) The nodes in this group does not have any input sockets, as they take the input frames from the input slots of the Rendering Engine. Which slot to take the frames from is dynamically controlled during runtime.
Alpha combine node (alpha_combine)
Input sockets: 0 (Sources are taken from the input slots of the mixer)
Output sockets: 1
The alpha combine node takes two inputs and combines the color from one of them with the alpha from the other one. The
node features multiple modes that can be set during runtime to either pick the alpha channel of the second video input,
or to take any of the other R, G and B channels, or to average the RGB channels and use as alpha for the output.
This node is useful in case videos with alpha is provided from SDI sources, where the alpha must be sent as a separate
video feed and then combined with the fill/color source in the mixer.
Select node (select)
Input sockets: 0 (Source is taken from the input slots of the mixer)
Output sockets: 1
The select node simply selects an input slot from the Rendering Engine and forwards that video stream.
Which input slot to forward is set during runtime.
The node is a variant of the transition node, but does not support the transitions supported by the transition node.
Transition node (transition)
Input sockets: 0 (Sources are taken from the input slots of the mixer)
Output sockets: 2 (One with the program output and one with the preview output)
The transition node takes two video streams from the Rendering Engine’s input slots, one to use as the program and one
as the preview output stream.
These are output through the two output sockets.
During runtime this node can be used to make transitions such as wipes and fades between the selected program and
preview.
Output nodes
This group only contains a single node, used to mark a point where processed video can exit the graph and be used in output mappings.
Output node (output)
Input sockets: 1
Output sockets: 0 (Output is sent out of the video mixer)
The output node marks an output point in the video mixer’s graph, where the video stream can be used by the output
mapping to be included in the Rendering Engine’s Output streams, or as streams to view in the multi-viewer.
The node takes a single input and makes it possible to use that video feed outside the video mixer.
Output nodes can be used both to output the program and preview feeds of a video mixer, but also to mark auxiliary
outputs, as in the example above, where chroma_key_preview is output to be included in the graph to be able to view
the result of the chroma keying, without the effect being keyed on to the program output.
Processing nodes
The processing nodes take their input from another node’s output and outputs a result that is sent to another node’s input. They are therefore placed in the middle of the graph, after nodes from the input group and before output nodes.
Alpha over node (alpha_over)
Input sockets: 2 (Index 0 for overlay video and index 1 for background video)
Output sockets: 1
The alpha over node composites the overlay video input on top of the background video input. The alpha of the overlay
video input is taken into consideration. During runtime, this node can be controlled to show or not to show the overlay,
and to fade the overlay in or out. This node is useful to composite things such as graphics or chroma keyed video onto a
background video.
Chroma key node (chroma_key)
Input sockets: 1
Output sockets: 1
The chroma key node takes an input video stream and performs chroma keying on it based on parameters set during runtime.
The video output will have the alpha channel (and in some cases also the color channels) altered. The result of this
node can then be composited on top of a background using an Alpha over node.
Fade to black node (fade_to_black)
Input sockets: 1
Output sockets: 1
The fade to black node takes a single input video stream and can fade that video stream to and from black.
This node is normally used as the last node before the main program output node, to be able to fade to and from black at
the beginning and end of the broadcast.
Transform node (transform)
Input sockets: 1
Output sockets: 1
The transform node takes an input video stream and transform the result inside the visible canvas. This node can be
configured during runtime to scale and move the input video. This node is useful for picture-in-picture effects, or to
move a chroma key node output to the lower corner of the frame.
Video delay node (video_delay)
Input sockets: 1
Output sockets: 1
The video delay node is used to delay the video by a given number of frames. The number of frames to delay is controlled
during runtime. This node is useful whenever the need for dynamically delay a video stream arises, for example in
case an external audio mixer is used, which comes with a delay of some frames.
Video links block
The links array in the video block is a list of links between video nodes. The video frames are fed in one direction
from node to node via these links.
An input socket on a node can only have one connected link.
The output sockets on a node can have multiple connected links.
Each block contains the following keys:
from_node- The name of the node in thenodesobject, from which the link is receiving frames fromfrom_socket- The index of the output socket in the node from which this link originatesto_node- The name of the node in thenodesobject, to which the link is sending frames toto_socket- The index of the input socket in the node to which this link connects
Some examples
The simplest video mixer node graph imaginable would be a select node feeding an output node. This mixer would only be able to select one of the inputs and output it unaltered, like a video router would do:
The JSON file section for this is:
"video": {
"nodes": {
"input_select": {
"type": "select"
},
"program": {
"type": "output"
}
},
"links": [
{
"from_node": "input_select",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
}
]
}
A slightly more advanced node graph would be to use a transition node and two outputs, one for the program out and one for the preview:
The JSON file section for this is:
"video": {
"nodes": {
"transition": {
"type": "transition"
},
"program": {
"type": "output"
},
"preview": {
"type": "output"
}
},
"links": [
{
"from_node": "transition",
"from_socket": 0,
"to_node": "program",
"to_socket": 0
},
{
"from_node": "transition",
"from_socket": 1,
"to_node": "preview",
"to_socket": 0
},
]
}
Audio outputs
The audio block of the configuration file defines the properties of the audio mixer.
The JSON object contains a list called outputs which lists the outputs of the audio mixer and the configuration of
each output.
Each output has these parameters:
name- The unique name of this audio output, used to refer to if from theoutput_mappingblockchannels- The number of audio channels of this outputfollows- (Optional parameter) Used to identify the audio output this output is a post fader aux output for. If the output does not have this parameter set, it is considered a main output
The follows parameter is used to set the output in “post fader aux send” mode.
This is used to create extra aux outputs from the audio mixer which are used for mix minus, i.e. where you want the
program output, but with some specific audio source(s) removed.
When follows is set, the volume of that output will follow the volume of the main bus and scale that volume.
If the volume fader of the aux bus is up, it will send the same volume of audio of that strip as the main bus does.
So when the main bus volume is turned down, the same thing will happen automatically in the aux bus.
If an aux bus’ fader is down on the other hand, that strip will not contribute to the aux bus at all.
The aux bus volume faders can therefore be used to remove audio (or scale the volume up or down), but cannot be used to
add more audio strips compared to the main bus it is following.
The input routing and configuration of the strips is made via the control command API.
Combine outputs
The output_mapping block is used to define outputs of the entire Rendering Engine, by combining outputs from the video
and audio mixers and configuring where those should be sent.
The output mapping is an array of output mappings. Each mapping has the following parameters:
name- The unique name of the output mapping. This will be displayed in the REST API both for sources being streamed and sources with feedback streams that can be included in the multi-viewvideo_output- The name of the video mixer node of typeoutputto get the video stream from. Leave empty, or omit the key to create an audio-only outputaudio_output- The name of the audio output to get the audio stream from. Leave empty, or omit the key to create a video-only outputfeedback_input_slot- The input slot to use to feed this output back to the multi-view. The REST API may then refer to this input slot to include this output in a multi-view view. Value must be >= 100 as input slots up to 99 are reserved for “regular” sources. Use 0 to disable feedback of this stream.stream- Boolean value to tell if the output should be streamable and visible as an output in the REST API. If set to false the output will not turn up as anPipeline Outputin the REST API.
The following is a graphical visualisation of the output mappings in the JSON example configuration file above:

The default Rendering Engine config
If no Rendering Engine configuration file has been supplied by the user, a default configuration will be used. The following is the video node graph in the default configuration:
The full JSON for this default configuration is:
{
"version": "1.0",
"video" : {
"nodes":{
"transition": {"type":"transition"},
"alpha_combine": {"type":"alpha_combine"},
"chroma_key_select": {"type":"select"},
"chroma_key": {"type":"chroma_key"},
"chroma_key_transform": {"type":"transform"},
"pip1_select": {"type":"select"},
"pip1_transform": {"type":"transform"},
"pip2_select": {"type":"select"},
"pip2_transform": {"type":"transform"},
"html_select": {"type":"select"},
"alpha_over": {"type":"alpha_over"},
"chroma_key_alpha_over": {"type":"alpha_over"},
"pip1_alpha_over": {"type":"alpha_over"},
"pip2_alpha_over": {"type":"alpha_over"},
"html_alpha_over": {"type":"alpha_over"},
"fade_to_black": {"type":"fade_to_black"},
"program": {"type":"output"},
"preview": {"type":"output"}
},
"links":[
{"from_node":"transition", "from_socket":0, "to_node":"alpha_over", "to_socket":1},
{"from_node":"alpha_combine", "from_socket":0, "to_node":"alpha_over", "to_socket":0},
{"from_node":"alpha_over", "from_socket":0, "to_node":"chroma_key_alpha_over", "to_socket":1},
{"from_node":"chroma_key_select", "from_socket":0, "to_node":"chroma_key", "to_socket":0},
{"from_node":"chroma_key", "from_socket":0, "to_node":"chroma_key_transform", "to_socket":0},
{"from_node":"chroma_key_transform", "from_socket":0, "to_node":"chroma_key_alpha_over", "to_socket":0},
{"from_node":"chroma_key_alpha_over", "from_socket":0, "to_node":"pip1_alpha_over", "to_socket":1},
{"from_node":"pip1_select", "from_socket":0, "to_node":"pip1_transform", "to_socket":0},
{"from_node":"pip1_transform", "from_socket":0, "to_node":"pip1_alpha_over", "to_socket":0},
{"from_node":"pip1_alpha_over", "from_socket":0, "to_node":"pip2_alpha_over", "to_socket":1},
{"from_node":"pip2_select", "from_socket":0, "to_node":"pip2_transform", "to_socket":0},
{"from_node":"pip2_transform", "from_socket":0, "to_node":"pip2_alpha_over", "to_socket":0},
{"from_node":"pip2_alpha_over", "from_socket":0, "to_node":"html_alpha_over", "to_socket":1},
{"from_node":"html_select", "from_socket":0, "to_node":"html_alpha_over", "to_socket":0},
{"from_node":"html_alpha_over", "from_socket":0, "to_node":"fade_to_black", "to_socket":0},
{"from_node":"fade_to_black", "from_socket":0, "to_node":"program", "to_socket":0},
{"from_node":"transition", "from_socket":1, "to_node":"preview", "to_socket":0}
]
},
"audio" : {
"outputs": [
{"name": "main", "channels": 2}
]
},
"output_mapping" : [
{"name":"program", "video_output":"program", "audio_output":"main", "feedback_input_slot":1001, "stream":true},
{"name":"preview", "video_output":"preview", "feedback_input_slot":1002, "stream":false}
]
}
6.3.3 - Ateliere Live Rendering Engine command documentation
This page describes the commands for controlling the video mixer, audio router, audio mixer, HTML renderers and media players in the Ateliere Live Rendering Engine. This topic is closely related to this page on how to configure the rendering engine at startup.
Command protocol
All commands to the Ateliere Live Rendering Engine are sent as human readable strings and are listed below. The Rendering Engine expect no line termination, meaning that you do not need to append any type of new line (\n) characters, or string termination (\0) characters.
Each subsystem of the rendering engine has their own set of commands, prefixed by the subsystem name. As can be seen in the image below, the prefixes of the different subsystems are:
htmlfor the html renderer instancesmediafor the media playback instancesvideofor the video mixeraudio mapfor the audio routeraudiofor the audio mixer (if using the built-in mixer)

Video mixer commands
Background
The video mixer is built as a tree graph of processing nodes, please see this page for further information on the video mixer node graph. The names of the nodes defined in the node graph are used as the first word in the control commands as the way to address the specific node. On this page we will specify the detailed protocol for each node type.
There are eight different node types.
- The
Transitionnode is used to pick which input slots to use for the program and preview output. The node also supports making transitions between the program and preview. - The
Selectnode simply forwards one of the available sources to its output. - The
Alpha combinenode is used to pick two input slots (or the same input slot) to copy the color from one input and combine it with some information from the other input to form the alpha. The color will just be copied from the color input frame, but there are several modes that can be used to produce the alpha channel in the output frame in different ways. This is known as “key & fill” in broadcasting. - The
Alpha overnode is used to perform an “Alpha Over” operation, that is to put the overlay video stream on top of the background video stream, and let the background be seen through the overlay depending on the alpha of the overlay. The node also features fading the graphics in and out by multiplying the alpha channel by a constant factor. - The
Transformnode takes one input stream and transforms it (scaling and translating) to one output stream. - The
Chroma Keynode takes one input stream, and by setting appropriate parameters for the keying, it will remove areas with the key color from the incoming video stream both affecting the alpha and color channels - The
Fade to blacknode takes one input stream, which it can fade to or from black gradually, and then outputs that stream. - The
Outputnode has one input stream and will output that stream out from the video mixer, back to the Rendering Engine. It has no control commands
To reset the runtime configuration of all video nodes to their default state, the following command is used:
video reset- Reset the runtime configuration of all video mixer nodes
Transition
The transition type of node can be controlled with the following commands:
video <node_name> cut <input_slot>- Cut (hot punch) the program output to the given input slot. This won’t affect the preview output.video <node_name> preview <input_slot>- Preview the given input slot. This won’t affect the program output.video <node_name> cut- Cut between the current program and preview outputs, effectively swapping their place.video <node_name> panic <input_slot>- Cut (hot punch) both the preview and program output to the given input slot instantly for all rendering engines that are receiving this command, disregarding any timing differences!
Some transition commands last over a duration of time, for example wipes. These can be performed either automatically or manually. The automatic mode works by the operator first selecting the type of transition, for instance a fade, setting the preview to the input slot to fade to and then trigger the transition at the right time with a set duration for the transition. In manual mode the exact “position” of the transition is set by the control panel. This is used for implementing T-bars, where the T-bar repeatedly sends the current position of the bar. In the manual mode, the transition type is set before the transition begins, just as in the automatic mode. Note that an automatic transition will be overridden in case the transition “position” is manually set, by interrupting the automatic transition and jumping to the manually set position.
video <node_name> type <type>- Set the transition type to use for transitions hereafter. Valid modes are:fade- Fade (mix) from one source to the nextwipe_left- Wipe from one source to the next, wipe going from right side of the screen to the leftwipe_right- Wipe from one source to the next, wipe going from left side of the screen to the right
video <node_name> auto <duration_ms>- Perform an automatic transition from the current program output to the current preview output, lasting for<duration_ms>milliseconds. The currently set transition type is used.video <node_name> factor <factor>- Manually set the position/factor of the transition.<factor>should be between 0.0 and 1.0, where 0.0 is the value before the transition starts and 1.0 is the end of the transition. Note that setting this value to 1.0 will effectively swap place of program and preview output, resetting the transition factor to 0.0 internally. Control panels using this command must take this into consideration to not cause a sudden jump in the transition once the physical control is moved again. Sending this command will interrupt any ongoing automatic transition.
Select
The select type of node only has one control command:
video <node_name> cut <input_slot>- Choose which input slot to forward. Changing looks like a cut.
Alpha Combine
The alpha combine node type can be controlled with these commands:
video <node_name> color <input_slot>- Set which input slot to copy the color data from in the Alpha combine nodevideo <node_name> alpha <input_slot>- Set which input slot to use to create the alpha channel of the output frame in the Alpha combine nodevideo <node_name> mode <mode>- Set which way the alpha channel of the output frame will be produced. Valid modes are:copy-r- Copy the R-channel of the input “alpha frame” and use it as alpha for the outputcopy-g- Copy the G-channel of the input “alpha frame” and use it as alpha for the outputcopy-b- Copy the B-channel of the input “alpha frame” and use it as alpha for the outputcopy-a- Copy the A-channel of the input “alpha frame” and use it as alpha for the outputaverage-rgb- Take the average of the R, G and B channels of the input “alpha frame” and use it as alpha channel for the output
Alpha over
The alpha over node type can be controlled with these commands:
video <node_name> factor <factor>- Manually set the transparency multiplier for the Alpha over node. The value<factor>should be a float between 0.0 and 1.0, where 0.0 means that the overlay is completely invisible and 1.0 means that the overlay is fully visible (where it should be visible according to the overlay image’s alpha channel). Default is 0.0.video <node_name> fade to <duration_ms>- Start an automatic fade from the current factor to a fully visible overlay over the duration of<duration_ms>milliseconds.video <node_name> fade from <duration_ms>- Start an automatic fade from the current factor to a fully invisible overlay over the duration of<duration_ms>milliseconds.
Transform
The transform node type can be controlled with these commands:
video <node_name> scale <factor>- Set the scale of the output size, relative the original size. Parameter factor must be > 0. Default is 1.0.video <node_name> x <position>- Set the X offset of the top left corner of the output, relative the top left corner of the frame. Position is measured in percent of frame width, where 0.0 is the left side of the frame and 1.0 is the right side of the frame. Values outside of the range 0, 1 are valid. Default is 0.0.video <node_name> y <position>- Set the Y offset of the top left corner of the output, relative the top left corner of the frame. Position is measured in percent of frame height, where 0.0 is the top of the frame and 1.0 is the bottom of the frame. Values outside of the range 0, 1 are valid. Default is 0.0.
Chroma Key
The chroma key node type can be controlled with these commands:
video <node_name> r <value>- Set the red component of the chroma key color. Should be a float between 0.0 and 1.0.video <node_name> g <value>- Set the green component of the chroma key color. Should be a float between 0.0 and 1.0.video <node_name> b <value>- Set the blue component of the chroma key color. Should be a float between 0.0 and 1.0.video <node_name> distance <value>- Set the distance parameter, ranging from 0.0 to 1.0, telling how far from the key color is also considered a part of the key. Larger values will result in more colors being included, 0.0 means only the exact key color is considered.video <node_name> falloff <value>- Set the falloff parameter, ranging from 0.0 to 1.0, which makes edges smoother. A lower value means harder edges between the key color and the parts to keep, a higher value means a more smooth falloff between removed and kept parts.video <node_name> spill <value>- Set the color spill reduction parameter, ranging from 0.0 to 1.0, which will desaturate the key color in the parts of the image that are left. Useful for hiding green rims around objects in from of a green screen etc. 0.0 means off and a higher value means more colors further away from the chroma key color will be desaturated.video <node_name> color_picker <x_factor> <y_factor> <square_size>- Set the chroma key by sampling the pixels covered by the square area of size square_size x square_size. The position x,y is set by<x_factor>* width of video and<y_factor>* height of video.<x_factor>&<y_factor>should be a float between 0.0 and 1.0. The<square_size>should be an integer > 0.0.video <node_name> alpha_as_video <value>- Instead of writing an alpha mask, set the alpha value as the RGB value, creating a grayscale image of the mask. Value should be true or false.video <node_name> show_key_color <value>- Draw a 100x100 box in upper left corner with the current chroma key (RGB) value. Value should be true or false.video <node_name> show_color_picker <value>- Draw a pink border around the area where the color picker will sample a new chroma key. Value should be true or false.
Note
For the true/false parameters above, also TRUE, True, t, T and 1 will be treated as true, any other values will be treated as false.Fade to black
The fade to black node can be controlled via the following commands:
video <node_name> factor <factor>- Manually set the blackness factor on a scale from 0.0 to 1.0, where 0.0 means not black and 1.0 means fully black output.video <node_name> fade to <duration_ms>- Start an automatic fade to a fully black output over the duration of<duration_ms>milliseconds.video <node_name> fade from <duration_ms>- Start an automatic fade to a fully visible (non-black) output over the duration of<duration_ms>milliseconds.
Audio Router commands
The audio router is used to route specific audio channels from an input slot of the Rendering Engine to an input channel strip on the audio mixer. By default, it has no audio routes set up. The router can be controlled with the following commands:
audio map <input_slot> <channel> mono <input_strip>- Map the<channel>from input slot<input_slot>as a mono channel into input strip<input_strip>of the audio mixeraudio map <input_slot> <left_channel> stereo <input_strip>- Map the<left_channel>and<left_channel> + 1from input slot<input_slot>as a stereo pair into input strip<input_strip>of the audio mixeraudio map reset <input_strip>- Remove the current mapping from<input_strip>of the audio mixer.
To reset both the audio mixer and the audio router to their default state, including removal of all configured input strips, the following command can be used:
audio reset- Reset both the audio mixer and audio router
Audio mixer commands
The audio mixer and audio router have the following data path:

In the example picture above, three sources are connected to the input slots and four mono or stereo audio streams are picked as input to the audio mixer. The audio mixer is completely separate from the video mixer, so switching image in the video mixer will not change the audio mixer in any way. The internal audio mixer can be controlled using the following commands:
Pre-gain
To control the pre-gain of each input strip use:
audio gain <input_strip> <level_dB>- Set the pre-gain level of a specific input in dB. Parameter<level>should be a floating point number. Default is 0.0.
Low-pass filter
To control the low-pass filter of each input strip use:
audio lpf <input_strip> freq <value>- Set the cutoff frequency for the low-pass filter in an input strip.<value>is the frequency in Hz as a floating point number. The frequency range is 20 Hz to 20 kHz. Setting a value of 20 kHz or higher will bypass the filter.audio lpf <input_strip> q <value>- Set the q-value for the low-pass filter in an input strip. The q-value controls the steepness of cutoff curve with a higher value being a steeper slope. The value is a floating point number ranging from 0.4 to 6.0. The default value is 0.7.
High-pass filter
To control the high-pass filter of each input strip use:
audio hpf <input_strip> freq <value>- Set the cutoff frequency for the high-pass filter in an input strip.<value>is the frequency in Hz as a floating point number. The frequency range is 20 Hz to 20 kHz. Setting a value of 20 Hz or lower will bypass the filter.audio hpf <input_strip> q <value>- Set the q-value for the high-pass filter in an input strip. The q-value controls the steepness of cutoff curve with a higher value being a steeper slope. The value is a floating point number ranging from 0.4 to 6.0. The default value is 0.7.
Parametric equalizer
The parametric equalizer has ten bands, indexed from 0 to 9. By default, all bands are disabled (type “none”) with a gain of 0 dB, a Q value of 0.707, and a frequency of 1 kHz. To control the parametric equalizer of each input strip use:
audio eq <input_strip> <band> freq <value>- Set the frequency of a specific band in the parametric equalizer. Here<band>is the zero-based index of the band.<value>is a floating point number with the frequency in Hz. For peak, notch, and band-pass filters this is the center frequency. For low-pass, high-pass, low-shelf, and high-shelf filters this is the corner frequency.audio eq <input_strip> <band> gain <value>- Set the gain of a specific band in the parametric equalizer. Here<band>is the zero-based index of the band.<value>is a floating point number with the gain in dB. The gain parameter only has effect on peaking and shelving filters.audio eq <input_strip> <band> q <value>- Set the q-value of a specific band in the parametric equalizer to shape the falloff of the band. Here<band>is the zero-based index of the band.<value>is a floating point number with the q-value where a higher value means a more pointy curve. The default value is 0.707.audio eq <input_strip> <band> type <type>- Set the filter type to use for a specific band in the parametric equalizer. Here<band>is the zero-based index of the band. The available values for<type>are:none: Bypass audio without any changeslowpass: Low-pass filter at the current frequency. Gain has no effect.highpass: High-pass filter at the current frequency. Gain has no effect.bandpass: Band-pass filter at the current frequency. Gain has no effect.lowshelf: Low-shelf filter. Audio frequencies below the currently set value are modified by the current gain value.highshelf: High-shelf filter. Audio frequencies above the currently set value are modified by the current gain value.peak: Peak filter. Frequencies around the currently set value are modified by the current gain value.notch: Notch filter. Frequencies around the currently set value are reduced greatly. Gain has no effect.
Panning
To control the panning of each input strip use:
audio pan <input_strip> <factor>- Pan the mono or stereo input of an input strip to the left or right. The range of<factor>is between -1.0 and +1.0, where 0.0 means center (no panning), negative values means more to the left and positive value more to the right. Values outside this range will be clamped. A value of +/- 1.0 means that there will only be audio in the left/right channel.
Dynamic range compressor
To control the dynamic range compressor of each input strip use:
audio comp <input_strip> threshold <value>- Set the threshold for activation of the compressor. The threshold is a negative dB value ranging from -30 dB to 0 dB. The volume of audio which is above the threshold value will be reduced (compressed). The default value is 0 dB, i.e. only compression if the audio signal is overloaded.audio comp <input_strip> ratio <value>- Set the compression ratio for audio exceeding the loudness threshold. The value is the numerator in the compression ratio<value>:1. For instance, if the value is set to 4, the compression ratio is 4:1 and volume overshoot above the threshold will be scaled down to 25 %. The ratio numerator is a floating point number in the range from 1.0 to 24.0, with 4.0 as the default value.audio comp <input_strip> knee <value>- Set the width of the soft knee in decibels. Instead of simply turning the compression completely on or off at the threshold, the knee defines a volume range in which the compression ratio follows a curve, the “knee”. The knee is a floating point number between 0 dB and 30 dB, with a default value of 2.5 dB.audio comp <input_strip> attack <value>- Set the attack time of the compressor in milliseconds. The attack time determines how long it takes to reach the full compression after the threshold has been exceeded. The value is a floating point number in the range from 0.1 ms to 120 ms. The default value is 50 ms.audio comp <input_strip> release <value>- Set the release time of the compressor in milliseconds. The release time determines how long it takes to return to zero compression when the volume is below the compression threshold. The value is a floating point number in the range from 10 ms to 1000 ms. The default value is 200 ms.audio comp <input_strip> gain <value>- Set the make-up gain i decibels. Since the compression filter lowers the volume of louder audio sections it can be desirable to increase the gain after the filtering. The gain value increases the audio volume with the specified number of decibels. The value is a floating point number in the range from 0 dB to 24 dB. The default value is 0 dB.
Volume and master volume
To control the volume faders and master volume faders use:
audio volume <input_strip> <output> <level>- Set the volume level of a specific input in proportion to its original strength for a given output. Parameter<level>should be a floating point number, where 0.0 means that the input slot is not mixed into the output at all and 1.0 means that the volume of the input slot is kept as is for the output. The signal can also be amplified by using values > 1.0. Default is 0.0.audio mastervolume <output> <level>- Set the master volume level of an output, before the audio is clamped and converted from floating point samples to 16-bit integer samples. This can be used to avoid clipping of the audio when mixing multiple input sources. Parameter<level>is a floating point number where 0.0 means that all audio output is off, 1.0 means that the volume is not changed and any value above 1.0 means that the master volume is amplified. Default is 1.0.audio volume <input_strip> <output> auto <level> <time_ms>- Do automatic transition of volume from the current volume to the requested level overtime_msmilliseconds. The volume will be linearly faded over time in the dB scale.audio mastervolume <output> auto <level> <time_ms>- Do automatic transition of the master volume from the current volume to the requested level overtime_msmilliseconds. The volume will be linearly faded over time in the dB scale.audio volume <input_strip> <output> mute <value>- Mute or unmute a specific input strip for a specific output bus. This operation will not change any gain or volume fader of the strip. I.e. unmuting will restore the same audio level as before mute was sent. Value should be a boolean,trueorfalse. Usetrueto mute andfalseto unmute.audio mastervolume <output> mute <value>- Mute or unmute all audio in a specific output bus. This operation will not change any gain or volume fader of any strip. I.e. unmuting will restore the same audio levels as before mute was sent. Value should be a boolean,trueorfalse. Usetrueto mute andfalseto unmute.
Reset all audio filters
To reset both the audio mixer and the audio router to their default state, including removal of all configured input strips, the following command can be used:
audio reset- Reset both the audio mixer and audio router
HTML rendering
The Rendering Engine also features a built-in HTML renderer which uses the Chromium web browser engine to render HTML pages. The following commands can be used to create and control the HTML browser instances:
html create <input_slot> <width> <height>- Create a new HTML browser instance with the canvas size ofwidthxheightpixels and output the rendered frames to the given input slothtml close <input_slot>- Close the HTML browser instance on the given input slothtml load <input_slot> <url>- Load a new URL in the HTML browser on the given input slothtml execute <input_slot> <java script>- Execute JavaScript in the HTML browser on the given input slot. The JavaScript snippet might span over multiple lines and may contain spaces.html reset- Close all open HTML browsers
Media player
The Rendering Engine can create media player instances to play video and audio files from the hard drive of the machine running the Rendering Engine. It is up to the user of the API to ensure the files are uploaded
to the machines running the Rendering Engine(s) before trying to run them. The media players use the FFmpeg library to demux and decode the media files, so most files supported by FFmpeg should work.
The media players each have three state parameters: start, duration and looping, to mark a section of the video to loop, or a last frame to stop at in case looping is set to false.
The following commands can be used to create and control the media player instances:
media create <input_slot> <filename>- Create a new media player instance with the given media file and output the rendered frames to the given input slot.media load <input_slot> <filename>- Load another file into an existing media player on the given input slot. This will reset the start, duration and looping parameters of that media player.media close <input_slot>- Close the media player instance on the given input slotmedia play <input_slot>- Start/resume playing the currently loaded media file in the media player on the given input slotmedia pause <input_slot>- Pause the media player on the given input slotmedia seek <input_slot> <time_ms>- Seek the media player on the given input slot to a time pointtime_msmilliseconds from the start of the media file and pause the playback at the first frame. Usemedia play <input_slot>to resume the playbackmedia set_start <input_slot> <start_time_ms>- Set the start time of the looping section of the media player on the given input slot to a time pointstart_time_msmilliseconds from the start of the media file. It will still be possible to seek before this time point and play the video from there.media set_duration <input_slot> <duration_ms>- Set the duration of the playing/looping section of the media player on the given input slot toduration_msmilliseconds from thestart_time_msof the media file. The duration will be clamped in case it spans past the end of the media file. A running media player will either stop at this point, or loop the video depending on the state of the looping parametermedia set_looping <input_slot> <true/false>- Set if the media should loop from the start time when the media player on the given input slot hits either the end of the looping section defined by the start time and duration, or the end of the media file. If set to false, the media player will stop at the end of the section or at the end of the file instead of looping it from the start point.media reset- Close all open media players
6.3.4 - C++ SDK
Ateliere Live C++ SDK reference.
6.3.4.1 - Classes
- namespace ACL
- namespace AclLog
A namespace for logging utilities.- class CommandLogFormatter
This class is used to format log entries for Rendering Engine commands. - class FileLocationFormatterFlag
A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. - class ThreadNameFormatterFlag
- class CommandLogFormatter
- struct AlignedAudioFrame
AlignedAudioFrame is a frame of interleaved floating point audio samples with a given number of channels. - struct AlignedFrame
A frame of aligned data that is passed to the rendering engine from the MediaReceiver. A DataFrame contains a time stamped frame of media, which might be video, audio and auxiliary data such as subtitles. A single DataFrame can contain one or multiple types of media. Which media types are included can be probed by nullptr-checking/size checking the data members. The struct has ownership of all data pointers included. The struct includes all logic for freeing the resources held by this struct and the user should therefore just make sure the struct itself is deallocated to ensure all resources are freed. - namespace ControlDataCommon
- struct ConnectionStatus
Connection status struct containing information about a connection event. - struct Response
A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. - struct StatusMessage
A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from.
- struct ConnectionStatus
- class ControlDataSender
A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers.- struct Settings
Settings for a ControlDataSender.
- struct Settings
- class DeviceMemory
RAII class for a CUDA memory buffer. - class IControlDataReceiver
IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has areceivingorlisteningside, as well as asendingside. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests.- struct IncomingRequest
An incoming request to this ControlDataReceiver. - struct ReceiverResponse
A response message to a request. - struct Settings
Settings for a ControlDataReceiver.
- struct IncomingRequest
- class IMediaStreamer
IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to.- struct Configuration
The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface. - struct Settings
Settings used when creating a new MediaStreamer.
- struct Configuration
- class ISystemControllerInterface
An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. - class IngestApplication
- struct Settings
- namespace IngestUtils
- class MediaReceiver
A MediaReceiver contains the logic for receiving, decoding and aligning incoming media sources from the Ingests. The aligned data is then delivered to the Rendering Engine which is also responsible for setting up the MediaReceiver. The MediaReceiver has a builtin multi view generator, which can create output streams containing composited subsets of the incoming video sources. This class is controlled using an ISystemControllerInterface provided when starting it.- struct NewStreamParameters
A struct containing information on the format of an incoming stream. - struct Settings
Settings for a MediaReceiver.
- struct NewStreamParameters
- class SystemControllerConnection
An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket.- struct Settings
Settings for a SystemControllerConnection.
- struct Settings
- namespace TimeCommon
- struct TAIStatus
- struct TimeStructure
- namespace UUIDUtils
A namespace for UUID utility functions. - namespace spdlog
6.3.4.1.1 - AclLog::CommandLogFormatter
AclLog::CommandLogFormatter Class Reference
This class is used to format log entries for Rendering Engine commands.
#include <AclLog.h>
Inherits from spdlog::formatter
Public Functions
| Name | |
|---|---|
| CommandLogFormatter() | |
| void | format(const spdlog::details::log_msg & msg, spdlog::memory_buf_t & dest) override |
| std::unique_ptr< spdlog::formatter > | clone() const override |
Public Functions Documentation
function CommandLogFormatter
CommandLogFormatter()
function format
void format(
const spdlog::details::log_msg & msg,
spdlog::memory_buf_t & dest
) override
function clone
std::unique_ptr< spdlog::formatter > clone() const override
6.3.4.1.2 - AclLog::FileLocationFormatterFlag
AclLog::FileLocationFormatterFlag Class Reference
A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call.
#include <AclLog.h>
Inherits from spdlog::custom_flag_formatter
Public Functions
| Name | |
|---|---|
| void | format(const spdlog::details::log_msg & msg, const std::tm & , spdlog::memory_buf_t & dest) override |
| std::unique_ptr< custom_flag_formatter > | clone() const override |
Public Functions Documentation
function format
inline void format(
const spdlog::details::log_msg & msg,
const std::tm & ,
spdlog::memory_buf_t & dest
) override
function clone
inline std::unique_ptr< custom_flag_formatter > clone() const override
6.3.4.1.3 - AclLog::ThreadNameFormatterFlag
AclLog::ThreadNameFormatterFlag Class Reference
Inherits from spdlog::custom_flag_formatter
Public Functions
| Name | |
|---|---|
| void | format(const spdlog::details::log_msg & , const std::tm & , spdlog::memory_buf_t & dest) override |
| std::unique_ptr< custom_flag_formatter > | clone() const override |
Public Functions Documentation
function format
inline void format(
const spdlog::details::log_msg & ,
const std::tm & ,
spdlog::memory_buf_t & dest
) override
function clone
inline std::unique_ptr< custom_flag_formatter > clone() const override
6.3.4.1.4 - AlignedAudioFrame
AlignedAudioFrame Struct Reference
AlignedAudioFrame is a frame of interleaved floating point audio samples with a given number of channels.
#include <AlignedFrame.h>
Public Attributes
| Name | |
|---|---|
| std::vector< float > | mSamples |
| uint8_t | mNumberOfChannels |
| uint32_t | mNumberOfSamplesPerChannel |
Public Attributes Documentation
variable mSamples
std::vector< float > mSamples;
variable mNumberOfChannels
uint8_t mNumberOfChannels = 0;
variable mNumberOfSamplesPerChannel
uint32_t mNumberOfSamplesPerChannel = 0;
6.3.4.1.5 - AlignedFrame
AlignedFrame Struct Reference
A frame of aligned data that is passed to the rendering engine from the MediaReceiver. A DataFrame contains a time stamped frame of media, which might be video, audio and auxiliary data such as subtitles. A single DataFrame can contain one or multiple types of media. Which media types are included can be probed by nullptr-checking/size checking the data members. The struct has ownership of all data pointers included. The struct includes all logic for freeing the resources held by this struct and the user should therefore just make sure the struct itself is deallocated to ensure all resources are freed.
#include <AlignedFrame.h>
Public Functions
| Name | |
|---|---|
| AlignedFrame() =default | |
| ~AlignedFrame() =default | |
| AlignedFrame(AlignedFrame const & ) =delete | |
| AlignedFrame & | operator=(AlignedFrame const & ) =delete |
| std::shared_ptr< AlignedFrame > | makeShallowCopy() const Make a shallow copy of this AlignedFrame (video and audio pointers will point to the same video and audio memory buffers as in the frame copied from) |
Public Attributes
| Name | |
|---|---|
| int64_t | mCaptureTimestamp |
| int64_t | mRenderingTimestamp |
| std::shared_ptr< DeviceMemory > | mVideoFrame |
| PixelFormat | mPixelFormat |
| uint32_t | mFrameRateN |
| uint32_t | mFrameRateD |
| uint32_t | mWidth |
| uint32_t | mHeight |
| AlignedAudioFrameConstPtr | mAudioFrame |
| uint32_t | mAudioSamplingFrequency |
Public Functions Documentation
function AlignedFrame
AlignedFrame() =default
function ~AlignedFrame
~AlignedFrame() =default
function AlignedFrame
AlignedFrame(
AlignedFrame const &
) =delete
function operator=
AlignedFrame & operator=(
AlignedFrame const &
) =delete
function makeShallowCopy
std::shared_ptr< AlignedFrame > makeShallowCopy() const
Make a shallow copy of this AlignedFrame (video and audio pointers will point to the same video and audio memory buffers as in the frame copied from)
Return: A pointer to a new frame, which is a shallow copy of the old one, pointing to the same video and audio memory buffers
Public Attributes Documentation
variable mCaptureTimestamp
int64_t mCaptureTimestamp = 0;
The TAI timestamp in microseconds since the TAI epoch when this frame was captured by the ingest
variable mRenderingTimestamp
int64_t mRenderingTimestamp = 0;
The TAI timestamp in microseconds since the TAI epoch when this frame should be delivered to the rendering engine
variable mVideoFrame
std::shared_ptr< DeviceMemory > mVideoFrame = nullptr;
variable mPixelFormat
PixelFormat mPixelFormat = PixelFormat::kUnknown;
variable mFrameRateN
uint32_t mFrameRateN = 0;
variable mFrameRateD
uint32_t mFrameRateD = 0;
variable mWidth
uint32_t mWidth = 0;
variable mHeight
uint32_t mHeight = 0;
variable mAudioFrame
AlignedAudioFrameConstPtr mAudioFrame = nullptr;
variable mAudioSamplingFrequency
uint32_t mAudioSamplingFrequency = 0;
6.3.4.1.6 - ControlDataCommon::ConnectionStatus
ControlDataCommon::ConnectionStatus Struct Reference
Connection status struct containing information about a connection event.
#include <ControlDataCommon.h>
Public Functions
| Name | |
|---|---|
| ConnectionStatus() =default | |
| ConnectionStatus(ConnectionType mConnectionType, const std::string & mIp, uint16_t mPort) |
Public Attributes
| Name | |
|---|---|
| ConnectionType | mConnectionType |
| std::string | mIP |
| uint16_t | mPort |
Public Functions Documentation
function ConnectionStatus
ConnectionStatus() =default
function ConnectionStatus
inline ConnectionStatus(
ConnectionType mConnectionType,
const std::string & mIp,
uint16_t mPort
)
Public Attributes Documentation
variable mConnectionType
ConnectionType mConnectionType = ConnectionType::DISCONNECTED;
variable mIP
std::string mIP;
variable mPort
uint16_t mPort = 0;
6.3.4.1.7 - ControlDataCommon::Response
ControlDataCommon::Response Struct Reference
A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| std::vector< uint8_t > | mMessage |
| uint64_t | mRequestId The actual message. |
| std::string | mFromUUID The ID of the request this is a response to. |
Public Attributes Documentation
variable mMessage
std::vector< uint8_t > mMessage;
variable mRequestId
uint64_t mRequestId = 0;
The actual message.
variable mFromUUID
std::string mFromUUID;
The ID of the request this is a response to.
6.3.4.1.8 - ControlDataCommon::StatusMessage
ControlDataCommon::StatusMessage Struct Reference
A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from.
#include <ControlDataCommon.h>
Public Attributes
| Name | |
|---|---|
| std::vector< uint8_t > | mMessage |
| std::string | mFromUUID The actual message. |
Public Attributes Documentation
variable mMessage
std::vector< uint8_t > mMessage;
variable mFromUUID
std::string mFromUUID;
The actual message.
6.3.4.1.9 - ControlDataSender
ControlDataSender Class Reference
A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers.
#include <ControlDataSender.h>
Public Classes
| Name | |
|---|---|
| struct | Settings Settings for a ControlDataSender. |
Public Functions
| Name | |
|---|---|
| ControlDataSender() Default constructor, creates an empty object. | |
| ~ControlDataSender() Destructor. Will disconnect from the connected receivers and close the System controller connection. | |
| bool | configure(const std::shared_ptr< ISystemControllerInterface > & controllerInterface, const Settings & settings) Configure this ControlDataSender and connect it to the System Controller. This method will fail in case the ISystemControllerInterface has already been connected to the controller by another component, as such interface can only be used by one component. |
| bool | sendRequestToReceivers(const std::vector< uint8_t > & request, uint64_t & requestId) Send a request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback. |
| bool | sendMultiRequestToReceivers(const std::vector< std::vector< uint8_t » & request, uint64_t & requestId) Send a multi-message request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback. |
| ControlDataSender(ControlDataSender const & ) =delete | |
| ControlDataSender & | operator=(ControlDataSender const & ) =delete |
| std::string | getVersion() Get application version. |
Public Functions Documentation
function ControlDataSender
ControlDataSender()
Default constructor, creates an empty object.
function ~ControlDataSender
~ControlDataSender()
Destructor. Will disconnect from the connected receivers and close the System controller connection.
function configure
bool configure(
const std::shared_ptr< ISystemControllerInterface > & controllerInterface,
const Settings & settings
)
Configure this ControlDataSender and connect it to the System Controller. This method will fail in case the ISystemControllerInterface has already been connected to the controller by another component, as such interface can only be used by one component.
Parameters:
- controllerInterface The interface to the System controller, used for communicating with this ControlDataSender
- settings The Settings to use for this ControlDataSender
Return: True on success, false otherwise
function sendRequestToReceivers
bool sendRequestToReceivers(
const std::vector< uint8_t > & request,
uint64_t & requestId
)
Send a request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback.
Parameters:
- request The request message
- requestId The unique identifier of this request. Used to identify the async responses.
Return: True if the request was successfully sent, false otherwise
function sendMultiRequestToReceivers
bool sendMultiRequestToReceivers(
const std::vector< std::vector< uint8_t >> & request,
uint64_t & requestId
)
Send a multi-message request to all the connected ControlDataReceivers asynchronously. The responses will be sent to the response callback.
Parameters:
- request The request message
- requestId The unique identifier of this request. Used to identify the async responses.
Return: True if the request was successfully sent, false otherwise
function ControlDataSender
ControlDataSender(
ControlDataSender const &
) =delete
function operator=
ControlDataSender & operator=(
ControlDataSender const &
) =delete
function getVersion
static std::string getVersion()
Get application version.
Return: a string with the current version, e.g. “6.0.0-39-g60a35937”
6.3.4.1.10 - ControlDataSender::Settings
ControlDataSender::Settings Struct Reference
Settings for a ControlDataSender.
#include <ControlDataSender.h>
Public Attributes
| Name | |
|---|---|
| std::function< void(const ControlDataCommon::ConnectionStatus &)> | mConnectionStatusCallback |
| std::function< void(const ControlDataCommon::Response &)> | mResponseCallback |
| std::function< void(const ControlDataCommon::StatusMessage &)> | mStatusMessageCallback |
Public Attributes Documentation
variable mConnectionStatusCallback
std::function< void(const ControlDataCommon::ConnectionStatus &)> mConnectionStatusCallback;
variable mResponseCallback
std::function< void(const ControlDataCommon::Response &)> mResponseCallback;
variable mStatusMessageCallback
std::function< void(const ControlDataCommon::StatusMessage &)> mStatusMessageCallback;
6.3.4.1.11 - DeviceMemory
DeviceMemory Class Reference
RAII class for a CUDA memory buffer.
#include <DeviceMemory.h>
Public Functions
| Name | |
|---|---|
| DeviceMemory() =default Default constructor, creates an empty object, without allocating any memory on the device. | |
| DeviceMemory(size_t numberOfBytes) Constructor allocating the required number of bytes. | |
| DeviceMemory(size_t numberOfBytes, cudaStream_t cudaStream) Constructor allocating the required number of bytes by making an async allocation. The allocation will be put in the given CUDA stream. | |
| DeviceMemory(void * deviceMemory) Constructor taking ownership of an already allocated CUDA memory pointer. This class will free the pointer once it goes out of scope. | |
| bool | allocateMemory(size_t numberOfBytes) Allocates device memory. The memory allocated will automatically be freed by the destructor. |
| bool | allocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream) Allocates device memory. The memory allocated will automatically be freed by the destructor. |
| bool | reallocateMemory(size_t numberOfBytes) Reallocates device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status. |
| bool | reallocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream) Asynchronously reallocate device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status. |
| bool | allocateAndResetMemory(size_t numberOfBytes) Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor. |
| bool | allocateAndResetMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream) Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor. |
| bool | freeMemory() Free the device memory held by this class. Calling this when no memory is allocated is a no-op. |
| bool | freeMemoryAsync(cudaStream_t cudaStream) Deallocate memory asynchronously, in a given CUDA stream. Calling this when no memory is allocated is a no-op. |
| void | setFreeingCudaStream(cudaStream_t cudaStream) Set which CUDA stream to use for freeing this DeviceMemory. In case the DeviceMemory already holds a CUDA stream to use for freeing the memory, this will be overwritten. |
| ~DeviceMemory() Destructor, frees the internal CUDA memory. | |
| template T * | getDevicePointer() const |
| size_t | getSize() const |
| DeviceMemory(DeviceMemory && other) | |
| DeviceMemory & | operator=(DeviceMemory && other) |
| void | swap(DeviceMemory & other) |
| DeviceMemory(DeviceMemory const & ) =delete DeviceMemory is not copyable. | |
| DeviceMemory | operator=(DeviceMemory const & ) =delete |
Public Functions Documentation
function DeviceMemory
DeviceMemory() =default
Default constructor, creates an empty object, without allocating any memory on the device.
function DeviceMemory
explicit DeviceMemory(
size_t numberOfBytes
)
Constructor allocating the required number of bytes.
Parameters:
- numberOfBytes Number of bytes to allocate
Exceptions:
- std::runtime_error In case the allocation failed
function DeviceMemory
explicit DeviceMemory(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Constructor allocating the required number of bytes by making an async allocation. The allocation will be put in the given CUDA stream.
Parameters:
- size Number of bytes to allocate
- cudaStream The CUDA stream to put the async allocation in. A reference to this stream will also be saved internally to be used to asynchronously free them memory when the instance goes out of scope.
Exceptions:
- std::runtime_error In case the async allocation failed to be put in queue.
See: freeMemoryAsync method is not explicitly called, the memory will be freed synchronously when this DeviceMemory instance goes out of scope, meaning that the entire GPU is synchronized, which will impact performance negatively.
Note:
- The method will return as soon as the allocation is put in queue in the CUDA stream, i.e. before the actual allocation is made. Using this DeviceMemory is only valid as long as it is used in the same CUDA stream, or in case another stream is used, only if that stream is synchronized first with respect to
cudaStream. - In case the
function DeviceMemory
explicit DeviceMemory(
void * deviceMemory
)
Constructor taking ownership of an already allocated CUDA memory pointer. This class will free the pointer once it goes out of scope.
Parameters:
- deviceMemory CUDA memory pointer to take ownership over.
function allocateMemory
bool allocateMemory(
size_t numberOfBytes
)
Allocates device memory. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
Return: True on success, false if there is already memory allocated by this instance, or if the CUDA malloc failed.
function allocateMemoryAsync
bool allocateMemoryAsync(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Allocates device memory. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
- cudaStream The CUDA stream to use for the allocation. A reference to this stream will also be saved internally to be used to asynchronously free them memory when the instance goes out of scope.
Return: True on success, false if there is already memory allocated by this instance, or if the CUDA malloc failed.
function reallocateMemory
bool reallocateMemory(
size_t numberOfBytes
)
Reallocates device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status.
Parameters:
- numberOfBytes Number of bytes to allocate in the new allocation
Return: True on success, false if CUDA free or CUDA malloc failed.
function reallocateMemoryAsync
bool reallocateMemoryAsync(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Asynchronously reallocate device memory. Already existing memory allocation will be freed before the new allocation is made. In case this DeviceMemory has no earlier memory allocation, this method will just allocate new CUDA memory and return a success status.
Parameters:
- numberOfBytes Number of bytes to allocate in the new allocation
- cudaStream The CUDA stream to use for the allocation and freeing of memory. A reference to this stream will also be saved internally to be used to asynchronously free them memory when this instance goes out of scope.
Return: True on success, false if CUDA free or CUDA malloc failed.
function allocateAndResetMemory
bool allocateAndResetMemory(
size_t numberOfBytes
)
Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
Return: True on success, false if there is already memory allocated by this instance, or if any of the CUDA operations failed.
function allocateAndResetMemoryAsync
bool allocateAndResetMemoryAsync(
size_t numberOfBytes,
cudaStream_t cudaStream
)
Allocates device memory and resets all bytes to zeroes. The memory allocated will automatically be freed by the destructor.
Parameters:
- numberOfBytes Number of bytes to allocate
- cudaStream The CUDA stream to use for the allocation and resetting. A reference to this stream will also be saved internally to be used to asynchronously free them memory when the instance goes out of scope.
Return: True on success, false if there is already memory allocated by this instance, or if any of the CUDA operations failed.
function freeMemory
bool freeMemory()
Free the device memory held by this class. Calling this when no memory is allocated is a no-op.
See: freeMemoryAsync instead.
Return: True in case the memory was successfully freed (or not allocated to begin with), false otherwise.
Note: This method will free the memory in an synchronous fashion, synchronizing the entire CUDA context and ignoring the internally saved CUDA stream reference in case one exist. For async freeing of the memory, use
function freeMemoryAsync
bool freeMemoryAsync(
cudaStream_t cudaStream
)
Deallocate memory asynchronously, in a given CUDA stream. Calling this when no memory is allocated is a no-op.
Parameters:
- cudaStream The CUDA stream to free the memory asynchronously in
Return: True in case the memory deallocation request was successfully put in queue in the CUDA stream.
Note:
- The method will return as soon as the deallocation is put in queue in the CUDA stream, i.e. before the actual deallocation is made.
- It is the programmer’s responsibility to ensure this DeviceMemory is not used in another CUDA stream before this method is called. In case it is used in another CUDA stream, sufficient synchronization must be made before calling this method (and a very good reason given for not freeing the memory in that CUDA stream instead)
function setFreeingCudaStream
void setFreeingCudaStream(
cudaStream_t cudaStream
)
Set which CUDA stream to use for freeing this DeviceMemory. In case the DeviceMemory already holds a CUDA stream to use for freeing the memory, this will be overwritten.
Parameters:
- cudaStream The new CUDA stream to use for freeing the memory when the destructor is called.
Note: It is the programmer’s responsibility to ensure this DeviceMemory is not used in another CUDA stream before this instance is destructed. In case it is used in another CUDA stream, sufficient synchronization must be made before setting this as the new CUDA stream to use when freeing the memory.
function ~DeviceMemory
~DeviceMemory()
Destructor, frees the internal CUDA memory.
function getDevicePointer
template <typename T =uint8_t>
inline T * getDevicePointer() const
Template Parameters:
- T The pointer type to return
Return: the CUDA memory pointer handled by this class. Nullptr in case no memory is allocated.
function getSize
size_t getSize() const
Return: The size of the CUDA memory allocation held by this class.
function DeviceMemory
DeviceMemory(
DeviceMemory && other
)
function operator=
DeviceMemory & operator=(
DeviceMemory && other
)
function swap
void swap(
DeviceMemory & other
)
function DeviceMemory
DeviceMemory(
DeviceMemory const &
) =delete
DeviceMemory is not copyable.
function operator=
DeviceMemory operator=(
DeviceMemory const &
) =delete
6.3.4.1.12 - IControlDataReceiver
IControlDataReceiver Class Reference
IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has a receiving or listening side, as well as a sending side. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests. More…
#include <IControlDataReceiver.h>
Public Classes
| Name | |
|---|---|
| struct | IncomingRequest An incoming request to this ControlDataReceiver. |
| struct | ReceiverResponse A response message to a request. |
| struct | Settings Settings for a ControlDataReceiver. |
Public Functions
| Name | |
|---|---|
| virtual | ~IControlDataReceiver() =default Destructor. |
| virtual bool | configure(const Settings & settings) =0 Configure this instance. |
| virtual bool | sendStatusMessageToSender(const std::vector< uint8_t > & message) =0 Send a status message to the (directly or indirectly) connected ControlDataSender. In case this ControlDataReceiver has another ControlDataReceiver as sender, that receiver will forward the status message to the sender. |
| virtual bool | sendRequestToReceivers(const std::vector< uint8_t > & request, uint64_t & requestId) =0 Send a request to the connected ControlDataReceivers asynchronously. This request will only be sent to ControlDataReceivers on the sending side of this receiver. In case a receiver is located between this ControlDataReceiver and the sender, neither of those will see this request. The response will be sent to the response callback asynchronously. |
| virtual bool | sendMultiRequestToReceivers(const std::vector< std::vector< uint8_t » & request, uint64_t & requestId) =0 Send a multi-message request to the connected ControlDataReceivers asynchronously. This request will only be sent to ControlDataReceivers on the sending side of this receiver. In case a receiver is located between this ControlDataReceiver and the sender, neither of those will see this request. The response will be sent to the response callback asynchronously. |
Detailed Description
class IControlDataReceiver;
IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has a receiving or listening side, as well as a sending side. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests.
Each ControlDataReceiver can be configured to have a certain message delay. This delay parameter is set when the System controller instructs the ControlDataReceiver to start listening for incoming connections from senders (or sending ControlDataReceiver). Each incoming request will then be delayed and delivered according to the parameter, compared to the send timestamp in the message. In case multiple receivers are chained, like sender->receiver1->receiver2, receiver1 will delay the incoming messages from the sender based on when they were sent from the sender. Furthermore, receiver2 will delay them compared to when they were sent from receiver1.
An IControlDataReceiver can send status messages back to the sender. In case of chained receivers, the message will be forwarded back to the sender. A user of the ControlDataReceiver can register callbacks to receive requests and status messages. There is also an optional “preview” callback that is useful in case the incoming messages are delayed (have a delay > 0). This callback will then be called as soon as the request message arrives, to allow the user to prepare for when the actual delayed request callback is called.
Public Functions Documentation
function ~IControlDataReceiver
virtual ~IControlDataReceiver() =default
Destructor.
function configure
virtual bool configure(
const Settings & settings
) =0
Configure this instance.
Parameters:
- settings The settings to use for this receiver
Return: True on success, false otherwise
function sendStatusMessageToSender
virtual bool sendStatusMessageToSender(
const std::vector< uint8_t > & message
) =0
Send a status message to the (directly or indirectly) connected ControlDataSender. In case this ControlDataReceiver has another ControlDataReceiver as sender, that receiver will forward the status message to the sender.
Parameters:
- message The status message
Return: True in case the message was sent successfully, false otherwise.
function sendRequestToReceivers
virtual bool sendRequestToReceivers(
const std::vector< uint8_t > & request,
uint64_t & requestId
) =0
Send a request to the connected ControlDataReceivers asynchronously. This request will only be sent to ControlDataReceivers on the sending side of this receiver. In case a receiver is located between this ControlDataReceiver and the sender, neither of those will see this request. The response will be sent to the response callback asynchronously.
Parameters:
- request The request message
- requestId The unique identifier of this request. Used to identify the async response.
Return: True if the request was successfully sent, false otherwise
function sendMultiRequestToReceivers
virtual bool sendMultiRequestToReceivers(
const std::vector< std::vector< uint8_t >> & request,
uint64_t & requestId
) =0
Send a multi-message request to the connected ControlDataReceivers asynchronously. This request will only be sent to ControlDataReceivers on the sending side of this receiver. In case a receiver is located between this ControlDataReceiver and the sender, neither of those will see this request. The response will be sent to the response callback asynchronously.
Parameters:
- request The request message
- requestId The unique identifier of this request. Used to identify the async response.
Return: True if the request was successfully sent, false otherwise
6.3.4.1.13 - IControlDataReceiver::IncomingRequest
IControlDataReceiver::IncomingRequest Struct Reference
An incoming request to this ControlDataReceiver.
#include <IControlDataReceiver.h>
Public Attributes
| Name | |
|---|---|
| std::vector< std::vector< uint8_t > > | mMessages |
| std::string | mSenderUUID The actual messages. |
| std::string | mRequesterUUID UUID of the sender/forwarder that sent the request to this ControlDataReceiver. |
| uint64_t | mRequestID UUID of the requester (the original sender, creating the request) |
| int64_t | mSenderTimestampUs The requester’s unique id of this request. |
| int64_t | mDeliveryTimestampUs The TAI timestamp when this message was sent from the sender/forwarder in micro sec since TAI epoch. |
Public Attributes Documentation
variable mMessages
std::vector< std::vector< uint8_t > > mMessages;
variable mSenderUUID
std::string mSenderUUID;
The actual messages.
variable mRequesterUUID
std::string mRequesterUUID;
UUID of the sender/forwarder that sent the request to this ControlDataReceiver.
variable mRequestID
uint64_t mRequestID = 0;
UUID of the requester (the original sender, creating the request)
variable mSenderTimestampUs
int64_t mSenderTimestampUs =
0;
The requester’s unique id of this request.
variable mDeliveryTimestampUs
int64_t mDeliveryTimestampUs =
0;
The TAI timestamp when this message was sent from the sender/forwarder in micro sec since TAI epoch.
6.3.4.1.14 - IControlDataReceiver::ReceiverResponse
IControlDataReceiver::ReceiverResponse Struct Reference
A response message to a request.
#include <IControlDataReceiver.h>
Public Attributes
| Name | |
|---|---|
| std::vector< uint8_t > | mMessage |
Public Attributes Documentation
variable mMessage
std::vector< uint8_t > mMessage;
6.3.4.1.15 - IControlDataReceiver::Settings
IControlDataReceiver::Settings Struct Reference
Settings for a ControlDataReceiver.
#include <IControlDataReceiver.h>
Public Attributes
| Name | |
|---|---|
| std::string | mProductionPipelineUUID |
| std::function< void(const IncomingRequest &)> | mPreviewIncomingRequestCallback |
| std::function< ReceiverResponse(const IncomingRequest &)> | mIncomingRequestCallback |
| std::function< void(const ControlDataCommon::ConnectionStatus &)> | mConnectionStatusCallback |
| std::function< void(const ControlDataCommon::Response &)> | mResponseCallback Callback for connection events. |
Public Attributes Documentation
variable mProductionPipelineUUID
std::string mProductionPipelineUUID;
variable mPreviewIncomingRequestCallback
std::function< void(const IncomingRequest &)> mPreviewIncomingRequestCallback;
UUID of the Production Pipeline component this Receiver is a part of Callback called as soon as this ControlDataReceiver gets the request, as a “preview” of what requests will be delivered.
variable mIncomingRequestCallback
std::function< ReceiverResponse(const IncomingRequest &)> mIncomingRequestCallback;
The actual callback used when this ControlDataReceiver gets a request and wants a response back. This callback will delay and deliver the request according to this receiver’s configured delay.
variable mConnectionStatusCallback
std::function< void(const ControlDataCommon::ConnectionStatus &)> mConnectionStatusCallback;
variable mResponseCallback
std::function< void(const ControlDataCommon::Response &)> mResponseCallback;
Callback for connection events.
6.3.4.1.16 - IMediaStreamer
IMediaStreamer Class Reference
IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to. More…
#include <IMediaStreamer.h>
Public Classes
| Name | |
|---|---|
| struct | Configuration The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface. |
| struct | Settings Settings used when creating a new MediaStreamer. |
Public Functions
| Name | |
|---|---|
| virtual | ~IMediaStreamer() =default Destructor. |
| virtual bool | configure(const std::string & uuid, const Settings & settings, CUcontext cudaContext) =0 Configure this MediaStreamer. This must be called before any call to the. |
| virtual bool | setInputFormatAndStart(const Configuration & configuration) =0 Set the input format of this MediaStreamer and start the streamer. The. |
| virtual bool | stopAndResetFormat() =0 Stop streaming and reset the format. A call to this method will stop any output streams set up by the ISystemControllerInterface and reset the input format set by the. |
| virtual bool | hasFormatAndIsRunning() const =0 |
| virtual bool | hasOpenOutputStream() const =0 |
| virtual bool | outputData(const AlignedFramePtr & frame) =0 Output data through this streamer. The AlignedFrame::mRenderingTimestamp of the frame will be used as PTS when encoding the uncompressed frame. |
Detailed Description
class IMediaStreamer;
IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to.
See: outputData is made.
Public Functions Documentation
function ~IMediaStreamer
virtual ~IMediaStreamer() =default
Destructor.
function configure
virtual bool configure(
const std::string & uuid,
const Settings & settings,
CUcontext cudaContext
) =0
Configure this MediaStreamer. This must be called before any call to the.
Parameters:
- uuid UUID of this MediaStreamer
- settings Settings for this MediaStreamer
- cudaContext The CUDA context to use for this MediaStreamer. The frames passed to this instance should be valid in this CUDA context. The streamer will use this context for preprocessing and encoding.
See:
Return: True if the streamer was successfully configured
function setInputFormatAndStart
virtual bool setInputFormatAndStart(
const Configuration & configuration
) =0
Set the input format of this MediaStreamer and start the streamer. The.
Parameters:
- configuration The configuration with the format of the frames that will be sent to this MediaReceiver
See:
- configure method must be called before this method is called. This method must be called before any call to
- outputData. If the format should be reset, the
- stopAndResetFormat method should be called first and then this method can be called again to reset the format.
Return: True if the streamer was successfully started, false otherwise
function stopAndResetFormat
virtual bool stopAndResetFormat() =0
Stop streaming and reset the format. A call to this method will stop any output streams set up by the ISystemControllerInterface and reset the input format set by the.
See: setInputFormatAndStart method. The connection to the ISystemControllerInterface will be kept.
Return: True if the stream was successfully stopped and the format reset, or if the format was not set before this method was called, false on error.
function hasFormatAndIsRunning
virtual bool hasFormatAndIsRunning() const =0
Return: True if the input format is set and the OutputStreamer is running, false otherwise
function hasOpenOutputStream
virtual bool hasOpenOutputStream() const =0
See:
- outputData will be discarded without being encoded, as there is no stream to output them to. This method can be used to check if the frame even needs to be produced by the rendering engine. Note however, that the
- outputData method will still log the frames sent to it as received, even if they are not encoded when the output stream is closed.
Return: True if the output stream of the MediaStreamer is currently open and outputting the data, false otherwise. In case this returns false all frames passed to
function outputData
virtual bool outputData(
const AlignedFramePtr & frame
) =0
Output data through this streamer. The AlignedFrame::mRenderingTimestamp of the frame will be used as PTS when encoding the uncompressed frame.
Parameters:
- frame The data frame to output, with video data in CUDA memory
See: setInputFormatAndStart method, or if the format has not been set by a call to that method.
Return: True if the frame was accepted (but not necessarily streamed, in case the output stream has not been set up by the ISystemControllerInterface), false in case the frame did not match the configuration made in the
Note: The DeviceMemory in the AlignedFrame passed to this method must not be in use by any CUDA stream. In case the memory has been used in kernels in another CUDA stream, make sure to first synchronize with the stream, before passing it over to the MediaStreamer.
6.3.4.1.17 - IMediaStreamer::Configuration
IMediaStreamer::Configuration Struct Reference
The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface.
#include <IMediaStreamer.h>
Public Attributes
| Name | |
|---|---|
| PixelFormat | mIncomingPixelFormat |
| uint32_t | mWidth |
| uint32_t | mHeight |
| uint32_t | mFrameRateN |
| uint32_t | mFrameRateD |
| uint32_t | mAudioSampleRate |
| uint32_t | mNumAudioChannels |
Public Attributes Documentation
variable mIncomingPixelFormat
PixelFormat mIncomingPixelFormat = PixelFormat::kUnknown;
variable mWidth
uint32_t mWidth = 0;
variable mHeight
uint32_t mHeight = 0;
variable mFrameRateN
uint32_t mFrameRateN = 0;
variable mFrameRateD
uint32_t mFrameRateD = 0;
variable mAudioSampleRate
uint32_t mAudioSampleRate = 0;
variable mNumAudioChannels
uint32_t mNumAudioChannels = 0;
6.3.4.1.18 - IMediaStreamer::Settings
IMediaStreamer::Settings Struct Reference
Settings used when creating a new MediaStreamer.
#include <IMediaStreamer.h>
Public Attributes
| Name | |
|---|---|
| std::string | mName |
Public Attributes Documentation
variable mName
std::string mName;
6.3.4.1.19 - IngestApplication
IngestApplication Class Reference
Public Classes
| Name | |
|---|---|
| struct | Settings |
Public Functions
| Name | |
|---|---|
| IngestApplication() Constructor, creates an empty IngestApplication without starting it. | |
| ~IngestApplication() Destructor. | |
| bool | start(const std::shared_ptr< ISystemControllerInterface > & controllerInterface, const Settings & settings) Start this IngestApplication given an interface to the System Controller and an UUID. |
| bool | stop() Stop this IngestApplication. |
| std::string | getVersion() Get application version. |
| std::string | getLibraryVersions() Get the versions of the libraries available at runtime, among others, CUDA version, BMD and NDI versions. |
Public Functions Documentation
function IngestApplication
IngestApplication()
Constructor, creates an empty IngestApplication without starting it.
function ~IngestApplication
~IngestApplication()
Destructor.
function start
bool start(
const std::shared_ptr< ISystemControllerInterface > & controllerInterface,
const Settings & settings
)
Start this IngestApplication given an interface to the System Controller and an UUID.
Parameters:
- controllerInterface The interface for communication with the System Controller
- settings The settings for the IngestApplication
Return: True if the IngestApplication was successfully started, false otherwise
function stop
bool stop()
Stop this IngestApplication.
Return: True if the IngestApplication was successfully stopped, false otherwise
function getVersion
static std::string getVersion()
Get application version.
Return: a string with the current version, e.g. “6.0.0-39-g60a35937”
function getLibraryVersions
static std::string getLibraryVersions()
Get the versions of the libraries available at runtime, among others, CUDA version, BMD and NDI versions.
Return: a string with the currently found versions of the libraries used by this application
6.3.4.1.20 - IngestApplication::Settings
IngestApplication::Settings Struct Reference
6.3.4.1.21 - ISystemControllerInterface
ISystemControllerInterface Class Reference
An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server.
#include <ISystemControllerInterface.h>
Inherited by SystemControllerConnection
Public Classes
| Name | |
|---|---|
| struct | Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | StatusCode { SUCCESS = 3001, TOO_MANY_REQUESTS = 3101, UUID_ALREADY_REGISTERED = 3201, FORMAT_ERROR = 3202, ALREADY_CONFIGURED = 3203, OUT_OF_RESOURCES = 3204, NOT_FOUND = 3205, INTERNAL_ERROR = 3206, CONNECTION_FAILED = 3207, TIMEOUT_EXCEEDED = 3208, KEY_MISMATCH = 3209, UNKNOWN_REQUEST = 3210, MALFORMED_REQUEST = 3211, ALREADY_IN_USE = 3212, VERSION_MISMATCH = 3213} Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1. |
Public Functions
| Name | |
|---|---|
| virtual | ~ISystemControllerInterface() =default Virtual destructor. |
| virtual std::optional< std::string > | sendMessage(const std::string & messageTitle, const nlohmann::json & parameters) =0 Send a message containing a JSON object to the controller. |
| virtual bool | registerRequestCallback(const Callbacks & callbacks) =0 Register the callbacks to call for events in this class. |
| virtual bool | connect() =0 Connect to the System controller. |
| virtual bool | disconnect() =0 Disconnect from the System controller. |
| virtual bool | isConnected() const =0 |
| virtual std::string | getUUID() const =0 |
Public Types Documentation
enum StatusCode
| Enumerator | Value | Description |
|---|---|---|
| SUCCESS | 3001 | 3000-3099 Info/Notifications |
| TOO_MANY_REQUESTS | 3101 | 3100-3199 Warnings |
| UUID_ALREADY_REGISTERED | 3201 | 3200-3299 Error |
| FORMAT_ERROR | 3202 | |
| ALREADY_CONFIGURED | 3203 | |
| OUT_OF_RESOURCES | 3204 | |
| NOT_FOUND | 3205 | |
| INTERNAL_ERROR | 3206 | |
| CONNECTION_FAILED | 3207 | |
| TIMEOUT_EXCEEDED | 3208 | |
| KEY_MISMATCH | 3209 | |
| UNKNOWN_REQUEST | 3210 | |
| MALFORMED_REQUEST | 3211 | |
| ALREADY_IN_USE | 3212 | |
| VERSION_MISMATCH | 3213 |
Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1.
Public Functions Documentation
function ~ISystemControllerInterface
virtual ~ISystemControllerInterface() =default
Virtual destructor.
function sendMessage
virtual std::optional< std::string > sendMessage(
const std::string & messageTitle,
const nlohmann::json & parameters
) =0
Send a message containing a JSON object to the controller.
Parameters:
- messageTitle The title of the status type or request
- parameters The parameters part of the JSON message
Return: Optional containing an error message on error, else nullopt in case the message was successfully sent
Reimplemented by: SystemControllerConnection::sendMessage
function registerRequestCallback
virtual bool registerRequestCallback(
const Callbacks & callbacks
) =0
Register the callbacks to call for events in this class.
Parameters:
- callbacks The callbacks to use when events in this class happen
Return: True on successful registration, false if some callback is not set or if already connected
Reimplemented by: SystemControllerConnection::registerRequestCallback
function connect
virtual bool connect() =0
Connect to the System controller.
Return: True on successful connection, false on error or if already connected
Reimplemented by: SystemControllerConnection::connect
function disconnect
virtual bool disconnect() =0
Disconnect from the System controller.
Return: True on successful disconnection, false on error or if not connected
Reimplemented by: SystemControllerConnection::disconnect
function isConnected
virtual bool isConnected() const =0
Return: True if connected to the System controller, false otherwise
Reimplemented by: SystemControllerConnection::isConnected
function getUUID
virtual std::string getUUID() const =0
Return: The UUID of this interface to the System controller
Reimplemented by: SystemControllerConnection::getUUID
6.3.4.1.22 - ISystemControllerInterface::Callbacks
ISystemControllerInterface::Callbacks Struct Reference
A struct containing the callbacks that needs to be registered by the component using this interface.
#include <ISystemControllerInterface.h>
Public Attributes
| Name | |
|---|---|
| std::function< Response(const std::string &, const nlohmann::json &)> | mRequestCallback |
| std::function< void(uint32_t, const std::string &, const std::error_code &)> | mConnectionClosedCallback |
Public Attributes Documentation
variable mRequestCallback
std::function< Response(const std::string &, const nlohmann::json &)> mRequestCallback;
variable mConnectionClosedCallback
std::function< void(uint32_t, const std::string &, const std::error_code &)> mConnectionClosedCallback;
6.3.4.1.23 - ISystemControllerInterface::Response
ISystemControllerInterface::Response Struct Reference
A response to a request, consists of a status code and an (optional) parameters JSON object.
#include <ISystemControllerInterface.h>
Public Attributes
| Name | |
|---|---|
| StatusCode | mCode |
| nlohmann::json | mParameters |
Public Attributes Documentation
variable mCode
StatusCode mCode;
variable mParameters
nlohmann::json mParameters;
6.3.4.1.24 - MediaReceiver
MediaReceiver Class Reference
A MediaReceiver contains the logic for receiving, decoding and aligning incoming media sources from the Ingests. The aligned data is then delivered to the Rendering Engine which is also responsible for setting up the MediaReceiver. The MediaReceiver has a builtin multi view generator, which can create output streams containing composited subsets of the incoming video sources. This class is controlled using an ISystemControllerInterface provided when starting it.
#include <MediaReceiver.h>
Public Classes
| Name | |
|---|---|
| struct | NewStreamParameters A struct containing information on the format of an incoming stream. |
| struct | Settings Settings for a MediaReceiver. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | TallyBorderColor { kNone, kRed, kGreen, kYellow} Available colors for tally border in multi view. |
Public Functions
| Name | |
|---|---|
| MediaReceiver() Default constructor. | |
| ~MediaReceiver() Default destructor. | |
| bool | start(const std::shared_ptr< ISystemControllerInterface > & controllerInterface, CUcontext cudaContext, const Settings & settings, const ControlDataReceiver::Settings & receiverSettings) Start the MediaReceiver. This method will call connect on the System controller interface and set up the callbacks from the interface to call internal methods. |
| void | stop() Stop the MediaReceiver. |
| std::function< void(const AlignedFramePtr &)> | getCustomMultiViewSourceInput(uint32_t inputSlot, const std::string & name ="") This method allows the Rendering Engine to provide custom input sources to the Multi-view generator to send video streams that can be added to the multi-views. This could for instance be used for adding a “preview” of the video stream the rendering engine is about to cut to. |
| bool | removeCustomMultiViewSourceInput(uint32_t inputSlot) Remove a custom multi-view generator source input earlier registered using the getCustomMultiViewSourceInput method. |
| std::shared_ptr< IMediaStreamer > | createMediaStreamerOutput(const MediaStreamer::Settings & settings) Create a new MediaStreamer instance to output data from this MediaReceiver. |
| bool | removeMediaStreamerOutput(const std::string & uuid) Remove an MediaStreamer created via the. |
| std::shared_ptr< IControlDataReceiver > | getControlDataReceiver() Get a pointer to the ControlDataReceiver instance of this MediaReceiver. A call to this method will always return the same instance. |
| void | setTallyBorder(uint32_t inputSlot, TallyBorderColor color) Set tally border color in the multi-views for a specific input slot. |
| void | clearTallyBorder(uint32_t inputSlot) Remove tally border in the multi-views for a specific input slot. |
| void | clearAllTallyBorders() Remove all tally borders. |
| MediaReceiver::TallyBorderColor | getTallyBorder(uint32_t inputSlot) const get tally border color for an input slot |
| MediaReceiver(MediaReceiver const & ) =delete MediaReceiver is neither copyable nor movable. | |
| MediaReceiver(MediaReceiver && ) =delete | |
| MediaReceiver & | operator=(MediaReceiver const & ) =delete |
| MediaReceiver & | operator=(MediaReceiver && ) =delete |
| std::string | getVersion() Get application version. |
| std::string | getLibraryVersions() Get versions of the libraries available at runtime, among others, CUDA runtime and driver versions. |
Public Types Documentation
enum TallyBorderColor
| Enumerator | Value | Description |
|---|---|---|
| kNone | ||
| kRed | ||
| kGreen | ||
| kYellow |
Available colors for tally border in multi view.
Public Functions Documentation
function MediaReceiver
MediaReceiver()
Default constructor.
function ~MediaReceiver
~MediaReceiver()
Default destructor.
function start
bool start(
const std::shared_ptr< ISystemControllerInterface > & controllerInterface,
CUcontext cudaContext,
const Settings & settings,
const ControlDataReceiver::Settings & receiverSettings
)
Start the MediaReceiver. This method will call connect on the System controller interface and set up the callbacks from the interface to call internal methods.
Parameters:
- controllerInterface The ISystemControllerInterface to use for this MediaReceiver. The interface should be configured (Such as setting the IP address and port of the System Controller if a server based System Controller is used) but not connected before passed to this method. This method will internally set the callbacks before connecting to the controller. If the controller is already connected or if the controller is not configured, this method will return false. This class will take ownership of the smart pointer.
- cudaContext The CUDA context to use for this MediaReceiver. The frames will delivered as CUDA pointers, valid in this context, and the multi-view generator will use this context for rendering and encoding.
- settings The settings to use for the MediaReceiver.
- receiverSettings The settings to use for the ControlDataReceiver.
Return: True if the MediaReceiver was started successfully, false otherwise.
function stop
void stop()
Stop the MediaReceiver.
function getCustomMultiViewSourceInput
std::function< void(const AlignedFramePtr &)> getCustomMultiViewSourceInput(
uint32_t inputSlot,
const std::string & name =""
)
This method allows the Rendering Engine to provide custom input sources to the Multi-view generator to send video streams that can be added to the multi-views. This could for instance be used for adding a “preview” of the video stream the rendering engine is about to cut to.
Parameters:
- inputSlot The input slot this source will be “plugged in” to. The custom input sources share the input slots with the streams connected from Ingests. This means that it is probably a good idea to use higher numbered slots for these custom inputs, such as numbers from 1000, so that the lower numbers, 1 and up, can be used by the connected video cameras, as the input slot number will also be used when cutting.
- name Optional human readable name of this stream, to be presented to the System Controller.
See: MediaReceiver::Settings::mDecodedFormat.
Return: A function to where the Rendering Engine should send the frames. In case the requested inputSlot is already used by another custom input source, or a stream from an ingest, the returned function will be nullptr.
Note: Make sure no CUDA stream will write to the DeviceMemory in the AlignedFrame passed to the function. Failing to do so will lead to undefined behavior. In case another CUDA stream has written to the DeviceMemory, make sure to synchronize with the stream before passing the AlignedFrame.
Precondition: The AlignedFrame sent to this function must have the same pixel format as this MediaReceiver is configured to deliver to the Rendering Engine,
function removeCustomMultiViewSourceInput
bool removeCustomMultiViewSourceInput(
uint32_t inputSlot
)
Remove a custom multi-view generator source input earlier registered using the getCustomMultiViewSourceInput method.
Parameters:
- inputSlot The input slot the custom multi-view source input is connected to, that should be removed
Return: True if the custom multi-view source input was successfully removed, false in case there was no custom input registered for the given input slot, or in case of an internal error.
function createMediaStreamerOutput
std::shared_ptr< IMediaStreamer > createMediaStreamerOutput(
const MediaStreamer::Settings & settings
)
Create a new MediaStreamer instance to output data from this MediaReceiver.
Parameters:
- settings The settings for the new MediaStreamer
Return: A shared pointer to the MediaStreamer instance in case of a successful creation, otherwise nullptr
function removeMediaStreamerOutput
bool removeMediaStreamerOutput(
const std::string & uuid
)
Remove an MediaStreamer created via the.
Parameters:
- uuid The UUID of the MediaStreamer to remove
See: createMediaStreamerOutput method by its UUID.
Return: True if the MediaStreamer was successfully removed, false in case no MediaStreamer with the given UUID was found.
function getControlDataReceiver
std::shared_ptr< IControlDataReceiver > getControlDataReceiver()
Get a pointer to the ControlDataReceiver instance of this MediaReceiver. A call to this method will always return the same instance.
See: start.
Return: Pointer to the ControlDataReceiver instance. Nullptr if called before a successful call to
function setTallyBorder
void setTallyBorder(
uint32_t inputSlot,
TallyBorderColor color
)
Set tally border color in the multi-views for a specific input slot.
Parameters:
- inputSlot the input slot for a source
- color the color to set
function clearTallyBorder
void clearTallyBorder(
uint32_t inputSlot
)
Remove tally border in the multi-views for a specific input slot.
Parameters:
- inputSlot the input slot for a source
function clearAllTallyBorders
void clearAllTallyBorders()
Remove all tally borders.
function getTallyBorder
MediaReceiver::TallyBorderColor getTallyBorder(
uint32_t inputSlot
) const
get tally border color for an input slot
Parameters:
- inputSlot the input slot to get color for
Return: the tally border color for the given input slot
function MediaReceiver
MediaReceiver(
MediaReceiver const &
) =delete
MediaReceiver is neither copyable nor movable.
function MediaReceiver
MediaReceiver(
MediaReceiver &&
) =delete
function operator=
MediaReceiver & operator=(
MediaReceiver const &
) =delete
function operator=
MediaReceiver & operator=(
MediaReceiver &&
) =delete
function getVersion
static std::string getVersion()
Get application version.
Return: a string with the current version, e.g. “6.0.0-39-g60a35937”
function getLibraryVersions
static std::string getLibraryVersions()
Get versions of the libraries available at runtime, among others, CUDA runtime and driver versions.
Return: a string with the currently found versions of the libraries used by this application
6.3.4.1.25 - MediaReceiver::NewStreamParameters
MediaReceiver::NewStreamParameters Struct Reference
A struct containing information on the format of an incoming stream.
#include <MediaReceiver.h>
Public Attributes
| Name | |
|---|---|
| uint32_t | mVideoHeight |
| uint32_t | mVideoWidth |
| uint32_t | mFrameRateN |
| uint32_t | mFrameRateD |
| uint32_t | mAudioSampleRate |
Public Attributes Documentation
variable mVideoHeight
uint32_t mVideoHeight = 0;
variable mVideoWidth
uint32_t mVideoWidth = 0;
variable mFrameRateN
uint32_t mFrameRateN = 0;
variable mFrameRateD
uint32_t mFrameRateD = 1;
variable mAudioSampleRate
uint32_t mAudioSampleRate = 0;
6.3.4.1.26 - MediaReceiver::Settings
MediaReceiver::Settings Struct Reference
Settings for a MediaReceiver.
#include <MediaReceiver.h>
Public Attributes
| Name | |
|---|---|
| PixelFormat | mDecodedFormat The pixel format delivered to the rendering engine. |
| std::function< std::function< void(const AlignedFramePtr &)>uint32_t inputSlot, const std::string &streamID, const NewStreamParameters &newStreamParameters)> | mNewConnectionCallback |
| std::function< void(uint32_t inputSlot)> | mClosedConnectionCallback |
| std::function< std::optional< std::string >)> | mResetCallback |
| bool | mUseMultiViewer |
| bool | mDeliverOld Set to true if this MediaReceiver should have a multi-view generator. |
| CUstream | mAlignedFrameFreeStream |
Public Attributes Documentation
variable mDecodedFormat
PixelFormat mDecodedFormat = PixelFormat::kRgba64Le;
The pixel format delivered to the rendering engine.
variable mNewConnectionCallback
std::function< std::function< void(const AlignedFramePtr &)>uint32_t inputSlot, const std::string &streamID, const NewStreamParameters &newStreamParameters)> mNewConnectionCallback;
Parameters:
- inputSlot can be seen as a virtual SDI input on a hardware mixer and should be used by the Rendering engine to identify sources. For example, if a source is connected to input slot 5, the button “Cut to camera 5” on the control panel ought to cut to this stream. The MediaReceiver is responsible for making sure only one stream can be connected to an input slot at a time. This callback might be called multiple times with the same input slot, however, in case the stream has been disconnected and the mClosedConnectionCallback has been called for that input slot earlier.
- streamID is the identification string of the video/audio source on the Ingest. A Rendering engine might have the same StreamID connected multiple times (for instance if two different alignments are used for the same source) so this should not be used as an unique identifier for the stream.
- newStreamParameters contains information on the pending incoming stream to allow the Rendering engine to decide if it can receive it or not.
Note: The internal CUDA stream is synchronized before delivering the AlignedFrames, meaning the DeviceMemory in the AlignedFrame will always contain the written data; no further synchronization is needed before the rendering engine can read the data.
A callback called by the MediaReceiver whenever a new connection from an Ingest is set up. The callback should return a function to which the data will be delivered. In case the Rendering engine does not want to accept the pending incoming stream (due to a format not supported, etc) the Rendering engine can return nullptr.
variable mClosedConnectionCallback
std::function< void(uint32_t inputSlot)> mClosedConnectionCallback;
Parameters:
- inputSlot The input slot that was disconnected
A callback called whenever a connection from an Ingest has been stopped. When receiving this callback, the callback function returned by the mNewConnectionCallback will not be called anymore and can be discarded if required by the application. After this function has been called, the input slot might be reused by another incoming stream after a call to the mNewConnectionCallback.
variable mResetCallback
std::function< std::optional< std::string >)> mResetCallback;
See: mNewConnectionCallback should be kept, however).
Return: True on successful reset, false in case something unexpected happened
A callback called whenever the System Controller has requested that the Rendering Engine should be reset to its initial state (connections made via the
variable mUseMultiViewer
bool mUseMultiViewer = false;
variable mDeliverOld
bool mDeliverOld = false;
Set to true if this MediaReceiver should have a multi-view generator.
variable mAlignedFrameFreeStream
CUstream mAlignedFrameFreeStream = nullptr;
Set to true if the media frames should be delivered, even if the delivery time has already passed, otherwise they are discarded The CUDA stream to use for asynchronously freeing the AlignedFrames’ DeviceMemory. Set this to the rendering engine’s CUDA stream, to ensure memory is not freed before the rendering engine is done using it asynchronously in its CUDA stream. Note that the MediaReceiver instance and all AlignedFrames delivered from it must be destroyed before the CUDA stream can be destroyed.
6.3.4.1.27 - SystemControllerConnection
SystemControllerConnection Class Reference
An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket.
#include <SystemControllerConnection.h>
Inherits from ISystemControllerInterface
Public Classes
| Name | |
|---|---|
| struct | Settings Settings for a SystemControllerConnection. |
Public Types
| Name | |
|---|---|
| enum class uint32_t | ComponentType { kIngest, kPipeline, kControlPanel} Enumeration of component types the component using this SystemControllerConnection can tell the System Controller to be seen as. |
Public Functions
| Name | |
|---|---|
| SystemControllerConnection() | |
| ~SystemControllerConnection() override | |
| bool | configure(const Settings & settings) Configure this connection. This method should be called before calling. |
| virtual bool | connect() override Connect to the server using the settings set with the. |
| virtual bool | isConnected() const override |
| virtual std::string | getUUID() const override |
| virtual std::optional< std::string > | sendMessage(const std::string & messageTitle, const nlohmann::json & parameters) override Send a message containing a JSON object to the system controller server. |
| virtual bool | disconnect() override Disconnect from the server. |
| virtual bool | registerRequestCallback(const Callbacks & callbacks) override Register callbacks to call when getting requests from the server or the server connection is lost. |
| SystemControllerConnection(SystemControllerConnection const & ) =delete | |
| SystemControllerConnection(SystemControllerConnection && ) =delete | |
| SystemControllerConnection & | operator=(SystemControllerConnection const & ) =delete |
| SystemControllerConnection & | operator=(SystemControllerConnection && ) =delete |
Additional inherited members
Public Classes inherited from ISystemControllerInterface
| Name | |
|---|---|
| struct | Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
| struct | Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
Public Types inherited from ISystemControllerInterface
| Name | |
|---|---|
| enum class uint32_t | StatusCode { SUCCESS, TOO_MANY_REQUESTS, UUID_ALREADY_REGISTERED, FORMAT_ERROR, ALREADY_CONFIGURED, OUT_OF_RESOURCES, NOT_FOUND, INTERNAL_ERROR, CONNECTION_FAILED, TIMEOUT_EXCEEDED, KEY_MISMATCH, UNKNOWN_REQUEST, MALFORMED_REQUEST, ALREADY_IN_USE, VERSION_MISMATCH} Status codes used in JSON response messages for Websockets. These are starting at 3000 since the 1000 - 2000 range is taken up by the Spec: https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1. |
Public Functions inherited from ISystemControllerInterface
| Name | |
|---|---|
| virtual | ~ISystemControllerInterface() =default Virtual destructor. |
Public Types Documentation
enum ComponentType
| Enumerator | Value | Description |
|---|---|---|
| kIngest | ||
| kPipeline | ||
| kControlPanel |
Enumeration of component types the component using this SystemControllerConnection can tell the System Controller to be seen as.
Public Functions Documentation
function SystemControllerConnection
SystemControllerConnection()
function ~SystemControllerConnection
~SystemControllerConnection() override
function configure
bool configure(
const Settings & settings
)
Configure this connection. This method should be called before calling.
Parameters:
- settings The settings to use when connecting to the server
See: connect.
Return: True if successfully configured, false otherwise
function connect
virtual bool connect() override
Connect to the server using the settings set with the.
See: configure method.
Return: True if connection was successful, false otherwise
Reimplements: ISystemControllerInterface::connect
function isConnected
virtual bool isConnected() const override
Return: True if this class is connected to the server, false otherwise
Reimplements: ISystemControllerInterface::isConnected
function getUUID
virtual std::string getUUID() const override
Return: The UUID of this interface to the System controller
Reimplements: ISystemControllerInterface::getUUID
function sendMessage
virtual std::optional< std::string > sendMessage(
const std::string & messageTitle,
const nlohmann::json & parameters
) override
Send a message containing a JSON object to the system controller server.
Parameters:
- messageTitle The title of the status type or request
- parameters The parameters part of the JSON message
Return: Optional containing an error message on error, else nullopt in case the message was successfully sent
Reimplements: ISystemControllerInterface::sendMessage
function disconnect
virtual bool disconnect() override
Disconnect from the server.
Return: True if successfully disconnected, false on internal error
Reimplements: ISystemControllerInterface::disconnect
function registerRequestCallback
virtual bool registerRequestCallback(
const Callbacks & callbacks
) override
Register callbacks to call when getting requests from the server or the server connection is lost.
Parameters:
- callbacks The callbacks to set
Return: True if successfully registered, false if a callback is not set, or if already connected to the server
Reimplements: ISystemControllerInterface::registerRequestCallback
function SystemControllerConnection
SystemControllerConnection(
SystemControllerConnection const &
) =delete
function SystemControllerConnection
SystemControllerConnection(
SystemControllerConnection &&
) =delete
function operator=
SystemControllerConnection & operator=(
SystemControllerConnection const &
) =delete
function operator=
SystemControllerConnection & operator=(
SystemControllerConnection &&
) =delete
6.3.4.1.28 - SystemControllerConnection::Settings
SystemControllerConnection::Settings Struct Reference
Settings for a SystemControllerConnection.
#include <SystemControllerConnection.h>
Public Attributes
| Name | |
|---|---|
| std::string | mSystemControllerIP |
| uint16_t | mSystemControllerPort |
| std::string | mSystemControllerPostfix |
| std::string | mPSK |
| std::string | mUUID |
| ComponentType | mType |
| std::string | mName |
| std::string | mMyIP |
| std::chrono::milliseconds | mConnectTimeout |
| bool | mEnableHTTPS |
| bool | mInsecureHTTPS |
| std::string | mCustomCaCertFile |
Public Attributes Documentation
variable mSystemControllerIP
std::string mSystemControllerIP;
variable mSystemControllerPort
uint16_t mSystemControllerPort;
variable mSystemControllerPostfix
std::string mSystemControllerPostfix;
variable mPSK
std::string mPSK;
variable mUUID
std::string mUUID;
variable mType
ComponentType mType;
variable mName
std::string mName;
variable mMyIP
std::string mMyIP;
variable mConnectTimeout
std::chrono::milliseconds mConnectTimeout {
3000};
variable mEnableHTTPS
bool mEnableHTTPS;
variable mInsecureHTTPS
bool mInsecureHTTPS;
variable mCustomCaCertFile
std::string mCustomCaCertFile;
6.3.4.1.29 - TimeCommon::TAIStatus
TimeCommon::TAIStatus Struct Reference
Public Attributes
| Name | |
|---|---|
| StratumLevel | mStratum |
| bool | mHasLock |
| double | mTimeDiffS |
Public Attributes Documentation
variable mStratum
StratumLevel mStratum = StratumLevel::UnknownStratum;
variable mHasLock
bool mHasLock = false;
variable mTimeDiffS
double mTimeDiffS = 0.0;
6.3.4.1.30 - TimeCommon::TimeStructure
TimeCommon::TimeStructure Struct Reference
Public Attributes
| Name | |
|---|---|
| uint64_t | t1 |
| uint64_t | t2 |
| uint64_t | t3 |
| uint64_t | t4 |
| uint64_t | token |
| uint64_t | dummy1 |
| uint64_t | dummy2 |
| uint64_t | dummy3 |
Public Attributes Documentation
variable t1
uint64_t t1 = 0;
variable t2
uint64_t t2 = 0;
variable t3
uint64_t t3 = 0;
variable t4
uint64_t t4 = 0;
variable token
uint64_t token = 0;
variable dummy1
uint64_t dummy1 = 0;
variable dummy2
uint64_t dummy2 = 0;
variable dummy3
uint64_t dummy3 = 0;
6.3.4.2 - Files
- dir build
- dir install
- dir include
- file include/AclLog.h
- file include/AlignedFrame.h
- file include/Base64.h
- file include/ControlDataCommon.h
- file include/ControlDataSender.h
- file include/DeviceMemory.h
- file include/IControlDataReceiver.h
- file include/IMediaStreamer.h
- file include/ISystemControllerInterface.h
- file include/IngestApplication.h
- file include/IngestUtils.h
- file include/MediaReceiver.h
- file include/PixelFormat.h
- file include/SystemControllerConnection.h
- file include/TimeCommon.h
- file include/UUIDUtils.h
- dir include
- dir install
6.3.4.2.1 - include/AclLog.h
include/AclLog.h File Reference
Namespaces
| Name |
|---|
| AclLog A namespace for logging utilities. |
Classes
| Name | |
|---|---|
| class | AclLog::CommandLogFormatter This class is used to format log entries for Rendering Engine commands. |
| class | AclLog::ThreadNameFormatterFlag |
| class | AclLog::FileLocationFormatterFlag A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <filesystem>
#include <string>
#include <spdlog/details/log_msg.h>
#include <spdlog/fmt/fmt.h>
#include <spdlog/formatter.h>
#include <spdlog/pattern_formatter.h>
#include <sys/prctl.h>
namespace AclLog {
enum class Level {
kTrace, // Detailed diagnostics (for development only)
kDebug, // Messages intended for debugging only
kInfo, // Messages about normal behavior (default log level)
kWarning, // Warnings (functionality intact)
kError, // Recoverable errors (functionality impaired)
kCritical, // Unrecoverable errors (application must stop)
kOff // Turns off all logging
};
void init(const std::string& name);
void initCommandLog(const std::string& name);
void setLevel(Level level);
void logCommand(const std::string& origin, const std::string& command);
AclLog::Level getLogLevel();
size_t getMaxFileSize();
size_t getMaxLogRotations();
std::filesystem::path getLogFileFullPath(const std::string& name);
class CommandLogFormatter : public spdlog::formatter {
public:
CommandLogFormatter();
void format(const spdlog::details::log_msg& msg, spdlog::memory_buf_t& dest) override;
[[nodiscard]] std::unique_ptr<spdlog::formatter> clone() const override;
private:
std::unique_ptr<spdlog::pattern_formatter> mCommandLogPattern;
};
inline std::string getThreadName() {
static const size_t RECOMMENDED_BUFFER_SIZE = 20;
static thread_local std::string name;
if (name.empty()) {
char buffer[RECOMMENDED_BUFFER_SIZE];
int retval = prctl(PR_GET_NAME, buffer);
if (retval == -1) {
throw spdlog::spdlog_ex("Failed to get thread name: ", errno);
}
name = std::string(buffer);
}
return name;
}
class ThreadNameFormatterFlag : public spdlog::custom_flag_formatter {
public:
void format(const spdlog::details::log_msg&, const std::tm&, spdlog::memory_buf_t& dest) override {
std::string threadName = getThreadName();
dest.append(threadName.data(), threadName.data() + threadName.size());
}
[[nodiscard]] std::unique_ptr<custom_flag_formatter> clone() const override {
return spdlog::details::make_unique<ThreadNameFormatterFlag>();
}
};
class FileLocationFormatterFlag : public spdlog::custom_flag_formatter {
public:
void format(const spdlog::details::log_msg& msg, const std::tm&, spdlog::memory_buf_t& dest) override {
if (!msg.source.empty()) {
using namespace spdlog::details;
dest.push_back('[');
const char* filename = short_filename_formatter<null_scoped_padder>::basename(msg.source.filename);
fmt_helper::append_string_view(filename, dest);
dest.push_back(':');
fmt_helper::append_int(msg.source.line, dest);
dest.push_back(']');
}
}
[[nodiscard]] std::unique_ptr<custom_flag_formatter> clone() const override {
return spdlog::details::make_unique<FileLocationFormatterFlag>();
}
};
} // namespace AclLog
6.3.4.2.2 - include/AlignedFrame.h
include/AlignedFrame.h File Reference
Classes
| Name | |
|---|---|
| struct | AlignedAudioFrame AlignedAudioFrame is a frame of interleaved floating point audio samples with a given number of channels. |
| struct | AlignedFrame A frame of aligned data that is passed to the rendering engine from the MediaReceiver. A DataFrame contains a time stamped frame of media, which might be video, audio and auxiliary data such as subtitles. A single DataFrame can contain one or multiple types of media. Which media types are included can be probed by nullptr-checking/size checking the data members. The struct has ownership of all data pointers included. The struct includes all logic for freeing the resources held by this struct and the user should therefore just make sure the struct itself is deallocated to ensure all resources are freed. |
Types
| Name | |
|---|---|
| using std::shared_ptr< AlignedAudioFrame > | AlignedAudioFramePtr |
| using std::shared_ptr< const AlignedAudioFrame > | AlignedAudioFrameConstPtr |
| using std::shared_ptr< AlignedFrame > | AlignedFramePtr |
Functions
| Name | |
|---|---|
| AlignedAudioFramePtr | createAlignedAudioFrame(uint8_t numberOfChannels, uint32_t numberOfSamplesPerChannel) Create a new AlignedAudioFrame with a given amount of samples allocated and all samples initialized to 0.0f. |
| AlignedAudioFramePtr | copyAlignedAudioFrame(AlignedAudioFrameConstPtr audioFrame) Copy an AlignedAudioFrame including its samples. |
| AlignedAudioFramePtr | extractChannel(AlignedAudioFrameConstPtr sourceFrame, uint8_t channelIndex) Extract one channel from an AlignedAudioFrame as a new AlignedAudioFrame. The new AlignedAudioFrame will share no data with the original frame, meaning the new frame can be edited without corrupting the old one. |
Types Documentation
using AlignedAudioFramePtr
using AlignedAudioFramePtr = std::shared_ptr<AlignedAudioFrame>;
using AlignedAudioFrameConstPtr
using AlignedAudioFrameConstPtr = std::shared_ptr<const AlignedAudioFrame>;
using AlignedFramePtr
using AlignedFramePtr = std::shared_ptr<AlignedFrame>;
Functions Documentation
function createAlignedAudioFrame
AlignedAudioFramePtr createAlignedAudioFrame(
uint8_t numberOfChannels,
uint32_t numberOfSamplesPerChannel
)
Create a new AlignedAudioFrame with a given amount of samples allocated and all samples initialized to 0.0f.
Parameters:
- numberOfChannels Number of channels to allocate space for
- numberOfSamplesPerChannel Number of samples per channel to allocate space for
Return: Shared pointer to the new AlignedAudioFrame
function copyAlignedAudioFrame
AlignedAudioFramePtr copyAlignedAudioFrame(
AlignedAudioFrameConstPtr audioFrame
)
Copy an AlignedAudioFrame including its samples.
Parameters:
- audioFrame The AlignedAudioFrame to copy
Return: Shared pointer to the new AlignedAudioFrame
function extractChannel
AlignedAudioFramePtr extractChannel(
AlignedAudioFrameConstPtr sourceFrame,
uint8_t channelIndex
)
Extract one channel from an AlignedAudioFrame as a new AlignedAudioFrame. The new AlignedAudioFrame will share no data with the original frame, meaning the new frame can be edited without corrupting the old one.
Parameters:
- sourceFrame The frame to extract a channel from
- channelIndex The zero-based channel index to extract
Return: Shared pointer to a new mono AlignedAudioFrame, or nullptr if channel is out of bounds
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <array>
#include <iostream>
#include <memory>
#include <vector>
#include <cuda_runtime_api.h>
#include "DeviceMemory.h"
#include "PixelFormat.h"
struct AlignedAudioFrame {
// The samples interleaved
std::vector<float> mSamples;
uint8_t mNumberOfChannels = 0;
uint32_t mNumberOfSamplesPerChannel = 0;
};
using AlignedAudioFramePtr = std::shared_ptr<AlignedAudioFrame>;
using AlignedAudioFrameConstPtr = std::shared_ptr<const AlignedAudioFrame>;
AlignedAudioFramePtr createAlignedAudioFrame(uint8_t numberOfChannels, uint32_t numberOfSamplesPerChannel);
AlignedAudioFramePtr copyAlignedAudioFrame(AlignedAudioFrameConstPtr audioFrame);
AlignedAudioFramePtr extractChannel(AlignedAudioFrameConstPtr sourceFrame, uint8_t channelIndex);
struct AlignedFrame {
AlignedFrame() = default;
~AlignedFrame() = default;
AlignedFrame(AlignedFrame const&) = delete; // Copy construct
AlignedFrame& operator=(AlignedFrame const&) = delete; // Copy assign
[[nodiscard]] std::shared_ptr<AlignedFrame> makeShallowCopy() const;
int64_t mCaptureTimestamp = 0;
int64_t mRenderingTimestamp = 0;
// Video
std::shared_ptr<DeviceMemory> mVideoFrame = nullptr;
PixelFormat mPixelFormat = PixelFormat::kUnknown;
uint32_t mFrameRateN = 0;
uint32_t mFrameRateD = 0;
uint32_t mWidth = 0;
uint32_t mHeight = 0;
// Audio
AlignedAudioFrameConstPtr mAudioFrame = nullptr;
uint32_t mAudioSamplingFrequency = 0;
};
using AlignedFramePtr = std::shared_ptr<AlignedFrame>;
6.3.4.2.3 - include/Base64.h
include/Base64.h File Reference
Functions
| Name | |
|---|---|
| std::string | encodeBase64(const uint8_t * data, size_t size) Base64 encode some data. |
| std::string | encodeBase64(const std::vector< uint8_t > & data) Base64 encode some data. |
| std::vector< uint8_t > | decodeBase64(const std::string & data) Decode some Base64 encoded data. |
Functions Documentation
function encodeBase64
std::string encodeBase64(
const uint8_t * data,
size_t size
)
Base64 encode some data.
Parameters:
- data Pointer to the data to encode with Base64
- size The length of the data to encode with Base64
Return: The resulting Base64 encoded string
function encodeBase64
std::string encodeBase64(
const std::vector< uint8_t > & data
)
Base64 encode some data.
Parameters:
- data The data to encode with Base64
Return: The resulting Base64 encoded string
function decodeBase64
std::vector< uint8_t > decodeBase64(
const std::string & data
)
Decode some Base64 encoded data.
Parameters:
- data The Base64 encoded string to decode
Return: The resulting decoded data
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <string>
#include <vector>
std::string encodeBase64(const uint8_t* data, size_t size);
std::string encodeBase64(const std::vector<uint8_t>& data);
std::vector<uint8_t> decodeBase64(const std::string& data);
6.3.4.2.4 - include/ControlDataCommon.h
include/ControlDataCommon.h File Reference
Namespaces
| Name |
|---|
| ControlDataCommon |
Classes
| Name | |
|---|---|
| struct | ControlDataCommon::ConnectionStatus Connection status struct containing information about a connection event. |
| struct | ControlDataCommon::Response A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. |
| struct | ControlDataCommon::StatusMessage A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from. |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <cstdint>
#include <string>
#include <vector>
namespace ControlDataCommon {
enum class ConnectionType { CONNECTED, DISCONNECTED };
struct ConnectionStatus {
ConnectionStatus() = default;
ConnectionStatus(ConnectionType mConnectionType, const std::string& mIp, uint16_t mPort)
: mConnectionType(mConnectionType)
, mIP(mIp)
, mPort(mPort) {
}
ConnectionType mConnectionType = ConnectionType::DISCONNECTED;
std::string mIP;
uint16_t mPort = 0;
};
struct Response {
std::vector<uint8_t> mMessage;
uint64_t mRequestId = 0;
std::string mFromUUID;
};
struct StatusMessage {
std::vector<uint8_t> mMessage;
std::string mFromUUID;
};
} // namespace ControlDataCommon
6.3.4.2.5 - include/ControlDataSender.h
include/ControlDataSender.h File Reference
Classes
| Name | |
|---|---|
| class | ControlDataSender A ControlDataSender can send control signals to one or more receivers using a network connection. A single ControlDataSender can connect to multiple receivers, all identified by a UUID. The class is controlled using an ISystemControllerInterface; this interface is responsible for setting up connections to receivers. The ControlDataSender can send asynchronous requests to (all) the receivers and get a response back. Each response is identified with a request ID as well as the UUID of the responding receiver. The ControlDataSender can also receive status messages from the receivers. |
| struct | ControlDataSender::Settings Settings for a ControlDataSender. |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <functional>
#include <memory>
#include <vector>
#include <ISystemControllerInterface.h>
#include "ControlDataCommon.h"
class ControlDataSender final {
public:
struct Settings {
std::function<void(const ControlDataCommon::ConnectionStatus&)>
mConnectionStatusCallback; // Callback for receiver connection/disconnection events
std::function<void(const ControlDataCommon::Response&)>
mResponseCallback; // Callback for response messages from receivers
std::function<void(const ControlDataCommon::StatusMessage&)>
mStatusMessageCallback; // Callback for status messages from receivers
};
ControlDataSender();
~ControlDataSender();
bool configure(const std::shared_ptr<ISystemControllerInterface>& controllerInterface, const Settings& settings);
bool sendRequestToReceivers(const std::vector<uint8_t>& request, uint64_t& requestId);
bool sendMultiRequestToReceivers(const std::vector<std::vector<uint8_t>>& request, uint64_t& requestId);
static std::string getVersion();
// ControlDataSender is not copyable
ControlDataSender(ControlDataSender const&) = delete; // Copy construct
ControlDataSender& operator=(ControlDataSender const&) = delete; // Copy assign
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
6.3.4.2.6 - include/DeviceMemory.h
include/DeviceMemory.h File Reference
Classes
| Name | |
|---|---|
| class | DeviceMemory RAII class for a CUDA memory buffer. |
Types
| Name | |
|---|---|
| using std::shared_ptr< DeviceMemory > | DeviceMemoryPtr |
Types Documentation
using DeviceMemoryPtr
using DeviceMemoryPtr = std::shared_ptr<DeviceMemory>;
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <cstddef>
#include <cstdint>
#include <memory>
#include <cuda_runtime.h>
class DeviceMemory {
public:
DeviceMemory() = default;
explicit DeviceMemory(size_t numberOfBytes);
explicit DeviceMemory(size_t numberOfBytes, cudaStream_t cudaStream);
explicit DeviceMemory(void* deviceMemory) noexcept;
bool allocateMemory(size_t numberOfBytes);
bool allocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream);
bool reallocateMemory(size_t numberOfBytes);
bool reallocateMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream);
bool allocateAndResetMemory(size_t numberOfBytes);
bool allocateAndResetMemoryAsync(size_t numberOfBytes, cudaStream_t cudaStream);
bool freeMemory();
bool freeMemoryAsync(cudaStream_t cudaStream);
void setFreeingCudaStream(cudaStream_t cudaStream);
~DeviceMemory();
template <typename T = uint8_t> [[nodiscard]] T* getDevicePointer() const {
return reinterpret_cast<T*>(dMemory);
}
[[nodiscard]] size_t getSize() const;
DeviceMemory(DeviceMemory&& other) noexcept;
DeviceMemory& operator=(DeviceMemory&& other) noexcept;
void swap(DeviceMemory& other) noexcept;
DeviceMemory(DeviceMemory const&) = delete;
DeviceMemory operator=(DeviceMemory const&) = delete;
private:
uint8_t* dMemory = nullptr;
size_t mAllocatedBytes = 0;
cudaStream_t mCudaStream = nullptr; // Stream to use for Async free
};
using DeviceMemoryPtr = std::shared_ptr<DeviceMemory>;
6.3.4.2.7 - include/IControlDataReceiver.h
include/IControlDataReceiver.h File Reference
Classes
| Name | |
|---|---|
| class | IControlDataReceiver IControlDataReceiver is the interface class for the control data receiver. An IControlDataReceiver can receive messages from a sender or other IControlDataReceivers using a network connection. It can also connect to and forward the incoming request messages to other receivers. The connections to the sender and the other receivers are controlled by an ISystemControllerInterface instance. The ControlDataReceiver has a receiving or listening side, as well as a sending side. The listening side can listen to one single network port and have multiple ControlDataSenders and ControlDataReceivers connected to that port to receive requests from them. On the sending side of the ControlDataReceiver, it can be connected to the listening side of other ControlDataReceivers, used to forward all incoming messages to that receiver, as well as sending its own requests. |
| struct | IControlDataReceiver::IncomingRequest An incoming request to this ControlDataReceiver. |
| struct | IControlDataReceiver::ReceiverResponse A response message to a request. |
| struct | IControlDataReceiver::Settings Settings for a ControlDataReceiver. |
Source code
// Copyright (c) 2024, Edgeware AB. All rights reserved.
#pragma once
#include <memory>
#include <ISystemControllerInterface.h>
#include "ControlDataCommon.h"
class IControlDataReceiver {
public:
struct IncomingRequest {
std::vector<std::vector<uint8_t>> mMessages;
std::string mSenderUUID;
std::string mRequesterUUID;
uint64_t mRequestID = 0;
int64_t mSenderTimestampUs =
0;
int64_t mDeliveryTimestampUs =
0;
};
struct ReceiverResponse {
std::vector<uint8_t> mMessage;
};
struct Settings {
std::string mProductionPipelineUUID;
std::function<void(const IncomingRequest&)> mPreviewIncomingRequestCallback;
std::function<ReceiverResponse(const IncomingRequest&)> mIncomingRequestCallback;
std::function<void(const ControlDataCommon::ConnectionStatus&)>
mConnectionStatusCallback;
std::function<void(const ControlDataCommon::Response&)>
mResponseCallback;
};
virtual ~IControlDataReceiver() = default;
virtual bool configure(const Settings& settings) = 0;
virtual bool sendStatusMessageToSender(const std::vector<uint8_t>& message) = 0;
virtual bool sendRequestToReceivers(const std::vector<uint8_t>& request, uint64_t& requestId) = 0;
virtual bool sendMultiRequestToReceivers(const std::vector<std::vector<uint8_t>>& request, uint64_t& requestId) = 0;
};
6.3.4.2.8 - include/IMediaStreamer.h
include/IMediaStreamer.h File Reference
Classes
| Name | |
|---|---|
| class | IMediaStreamer IMediaStreamer is an interface class for MediaStreamers, that can take a single stream of uncompressed video and/or audio frames and encode and output it in some way. This output can either be a stream to a network or writing down the data to a file on the hard drive. This class is configured from two interfaces. The input configuration (input video resolution, frame rate, pixel format, number of audio channels…) is made through this C++ API. The output stream is then started from the System Controller. Any of these configurations can be made first. The actual stream to output will start once the first call to. |
| struct | IMediaStreamer::Settings Settings used when creating a new MediaStreamer. |
| struct | IMediaStreamer::Configuration The input configuration of the frames that will be sent to this MediaStreamer. The output stream configuration is made from the System controller via the ISystemControllerInterface. |
Source code
// Copyright (c) 2024, Edgeware AB. All rights reserved.
#pragma once
#include <memory>
#include <ISystemControllerInterface.h>
#include <cuda.h>
#include "AlignedFrame.h"
class IMediaStreamer {
public:
struct Settings {
std::string mName; // Human-readable name, presented in the REST API
};
struct Configuration {
// Video
PixelFormat mIncomingPixelFormat = PixelFormat::kUnknown;
uint32_t mWidth = 0; // Width of the incoming video frames in pixels
uint32_t mHeight = 0; // Height of the incoming video frames in pixels
uint32_t mFrameRateN = 0; // Frame rate numerator of the incoming video frames
uint32_t mFrameRateD = 0; // Frame rate denominator of the incoming video frames
// Audio
uint32_t mAudioSampleRate = 0; // Audio sample rate of the incoming frames in Hz
uint32_t mNumAudioChannels = 0; // Number of audio channels in the incoming frames
};
virtual ~IMediaStreamer() = default;
virtual bool configure(const std::string& uuid, const Settings& settings, CUcontext cudaContext) = 0;
virtual bool setInputFormatAndStart(const Configuration& configuration) = 0;
virtual bool stopAndResetFormat() = 0;
[[nodiscard]] virtual bool hasFormatAndIsRunning() const = 0;
[[nodiscard]] virtual bool hasOpenOutputStream() const = 0;
virtual bool outputData(const AlignedFramePtr& frame) = 0;
};
6.3.4.2.9 - include/IngestApplication.h
include/IngestApplication.h File Reference
Classes
| Name | |
|---|---|
| class | IngestApplication |
| struct | IngestApplication::Settings |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <memory>
#include "ISystemControllerInterface.h"
class IngestApplication {
public:
struct Settings {};
IngestApplication();
~IngestApplication();
bool start(const std::shared_ptr<ISystemControllerInterface>& controllerInterface, const Settings& settings);
bool stop();
static std::string getVersion();
static std::string getLibraryVersions();
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
6.3.4.2.10 - include/IngestUtils.h
include/IngestUtils.h File Reference
Namespaces
| Name |
|---|
| IngestUtils |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
namespace IngestUtils {
bool isRunningWithRootPrivileges();
} // namespace IngestUtils
6.3.4.2.11 - include/ISystemControllerInterface.h
include/ISystemControllerInterface.h File Reference
Classes
| Name | |
|---|---|
| class | ISystemControllerInterface An ISystemControllerInterface is the interface between a component and the System controller controlling the component. The interface allows for two-way communication between the component and the system controller by means of sending requests and getting responses. Classes deriving from the ISystemControllerInterface should provide the component side implementation of the communication with the system controller. This interface can be inherited and implemented by developers to connect to custom system controllers, or to directly control a component programmatically, without the need for connecting to a remote server. |
| struct | ISystemControllerInterface::Response A response to a request, consists of a status code and an (optional) parameters JSON object. |
| struct | ISystemControllerInterface::Callbacks A struct containing the callbacks that needs to be registered by the component using this interface. |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <functional>
#include <json.hpp>
#include <optional>
#include <string>
class ISystemControllerInterface {
public:
enum class StatusCode : uint32_t {
SUCCESS = 3001, // Accept / Success
TOO_MANY_REQUESTS = 3101, // Too many requests, try again later
UUID_ALREADY_REGISTERED = 3201, // UUID is already registered
FORMAT_ERROR = 3202, // Message formatting error
ALREADY_CONFIGURED = 3203, // The requested thing to configure is already configured
OUT_OF_RESOURCES = 3204, // Out of resources (CPU/GPU close to max utilization, all available slots used, etc.)
NOT_FOUND = 3205, // The requested thing was not found
INTERNAL_ERROR = 3206, // Internal error when trying to serve the request
CONNECTION_FAILED = 3207, // Connection failure
TIMEOUT_EXCEEDED = 3208, // Timeout exceeded
KEY_MISMATCH = 3209, // Key mismatch (might be a timeout, 3007 in the future)
UNKNOWN_REQUEST = 3210, // The name of the request was not known
MALFORMED_REQUEST = 3211, // The request is not correctly formatted
ALREADY_IN_USE = 3212, // The requested resource is already in use
VERSION_MISMATCH = 3213, // The version of the request is not supported
// None, yet
};
struct Response {
StatusCode mCode;
nlohmann::json mParameters; // Can be empty
};
struct Callbacks {
std::function<Response(const std::string&, const nlohmann::json&)>
mRequestCallback; // Callback called when then controller has sent a request
std::function<void(uint32_t, const std::string&, const std::error_code&)>
mConnectionClosedCallback; // Callback called when the connection to the controller is closed
};
virtual ~ISystemControllerInterface() = default;
virtual std::optional<std::string> sendMessage(const std::string& messageTitle,
const nlohmann::json& parameters) = 0;
virtual bool registerRequestCallback(const Callbacks& callbacks) = 0;
virtual bool connect() = 0;
virtual bool disconnect() = 0;
[[nodiscard]] virtual bool isConnected() const = 0;
[[nodiscard]] virtual std::string getUUID() const = 0;
};
6.3.4.2.12 - include/MediaReceiver.h
include/MediaReceiver.h File Reference
Classes
| Name | |
|---|---|
| class | MediaReceiver A MediaReceiver contains the logic for receiving, decoding and aligning incoming media sources from the Ingests. The aligned data is then delivered to the Rendering Engine which is also responsible for setting up the MediaReceiver. The MediaReceiver has a builtin multi view generator, which can create output streams containing composited subsets of the incoming video sources. This class is controlled using an ISystemControllerInterface provided when starting it. |
| struct | MediaReceiver::NewStreamParameters A struct containing information on the format of an incoming stream. |
| struct | MediaReceiver::Settings Settings for a MediaReceiver. |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <memory>
#include <utility>
#include <cuda.h>
#include "AlignedFrame.h"
#include "ControlDataReceiver.h"
#include "ISystemControllerInterface.h"
#include "MediaStreamer.h"
class MediaReceiver {
public:
struct NewStreamParameters {
uint32_t mVideoHeight = 0; // Height of the video in pixels. 0 if the stream does not contain any video
uint32_t mVideoWidth = 0; // Width of the video in pixels. 0 if the stream does not contain any video
uint32_t mFrameRateN = 0; // Frame rate numerator
uint32_t mFrameRateD = 1; // Frame rate denominator
uint32_t mAudioSampleRate = 0; // Sample rate of the audio in Hz. 0 if the stream does not contain any audio
};
struct Settings {
PixelFormat mDecodedFormat = PixelFormat::kRgba64Le;
std::function<std::function<void(const AlignedFramePtr&)>(uint32_t inputSlot,
const std::string& streamID,
const NewStreamParameters& newStreamParameters)>
mNewConnectionCallback;
std::function<void(uint32_t inputSlot)> mClosedConnectionCallback;
std::function<std::optional<std::string>()> mResetCallback;
bool mUseMultiViewer = false;
bool mDeliverOld = false;
CUstream mAlignedFrameFreeStream = nullptr;
};
enum class TallyBorderColor : uint32_t { kNone, kRed, kGreen, kYellow };
MediaReceiver();
~MediaReceiver();
bool start(const std::shared_ptr<ISystemControllerInterface>& controllerInterface,
CUcontext cudaContext,
const Settings& settings,
const ControlDataReceiver::Settings& receiverSettings);
void stop();
std::function<void(const AlignedFramePtr&)> getCustomMultiViewSourceInput(uint32_t inputSlot,
const std::string& name = "");
bool removeCustomMultiViewSourceInput(uint32_t inputSlot);
std::shared_ptr<IMediaStreamer> createMediaStreamerOutput(const MediaStreamer::Settings& settings);
bool removeMediaStreamerOutput(const std::string& uuid);
std::shared_ptr<IControlDataReceiver> getControlDataReceiver();
void setTallyBorder(uint32_t inputSlot, TallyBorderColor color);
void clearTallyBorder(uint32_t inputSlot);
void clearAllTallyBorders();
[[nodiscard]] MediaReceiver::TallyBorderColor getTallyBorder(uint32_t inputSlot) const;
MediaReceiver(MediaReceiver const&) = delete; // Copy construct
MediaReceiver(MediaReceiver&&) = delete; // Move construct
MediaReceiver& operator=(MediaReceiver const&) = delete; // Copy assign
MediaReceiver& operator=(MediaReceiver&&) = delete; // Move assign
static std::string getVersion();
static std::string getLibraryVersions();
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
6.3.4.2.13 - include/PixelFormat.h
include/PixelFormat.h File Reference
Namespaces
| Name |
|---|
| ACL |
Types
| Name | |
|---|---|
| enum uint32_t | PixelFormat { kUnknown = 0, kNv12 = ACL::makeFourCC(‘N’, ‘V’, ‘1’, ‘2’), kUyvy = ACL::makeFourCC(‘U’, ‘Y’, ‘V’, ‘Y’), kP010 = ACL::makeFourCC(‘P’, ‘0’, ‘1’, ‘0’), kP016 = ACL::makeFourCC(‘P’, ‘0’, ‘1’, ‘6’), kP210 = ACL::makeFourCC(‘P’, ‘2’, ‘1’, ‘0’), kP216 = ACL::makeFourCC(‘P’, ‘2’, ‘1’, ‘6’), kRgba = |
| ACL::makeFourCC(‘R’, ‘G’, ‘B’, ‘A’), kV210 = ACL::makeFourCC(‘V’, ‘2’, ‘1’, ‘0’), kRgba64Le = | |
| ACL::makeFourCC(‘R’, ‘G’, ‘B’, 64)} Enumeration of FourCC formats. |
Functions
| Name | |
|---|---|
| std::ostream & | operator«(std::ostream & stream, PixelFormat pixelFormat) Add the string representation of a PixelFormat to the output stream. |
Types Documentation
enum PixelFormat
| Enumerator | Value | Description |
|---|---|---|
| kUnknown | 0 | |
| kNv12 | ACL::makeFourCC(‘N’, ‘V’, ‘1’, ‘2’) | |
| kUyvy | ACL::makeFourCC(‘U’, ‘Y’, ‘V’, ‘Y’) | |
| kP010 | ACL::makeFourCC(‘P’, ‘0’, ‘1’, ‘0’) | |
| kP016 | ACL::makeFourCC(‘P’, ‘0’, ‘1’, ‘6’) | |
| kP210 | ACL::makeFourCC(‘P’, ‘2’, ‘1’, ‘0’) | |
| kP216 | ACL::makeFourCC(‘P’, ‘2’, ‘1’, ‘6’) | |
| kRgba | = | |
| ACL::makeFourCC(‘R’, ‘G’, ‘B’, ‘A’) | ||
| kV210 | ACL::makeFourCC(‘V’, ‘2’, ‘1’, ‘0’) | |
| kRgba64Le | = | |
| ACL::makeFourCC(‘R’, ‘G’, ‘B’, 64) |
Enumeration of FourCC formats.
Functions Documentation
function operator«
std::ostream & operator<<(
std::ostream & stream,
PixelFormat pixelFormat
)
Add the string representation of a PixelFormat to the output stream.
Parameters:
- pixelFormat The PixelFormat to get as a string
Return: The ostream with the string representation of the PixelFormat appended
Source code
// Copyright (c) 2023, Edgeware AB. All rights reserved.
#pragma once
#include <cstdint>
#include <ostream>
namespace ACL {
constexpr uint32_t makeFourCC(char a, char b, char c, char d) {
return static_cast<uint32_t>(a) + (static_cast<uint32_t>(b) << 8) + (static_cast<uint32_t>(c) << 16) +
(static_cast<uint32_t>(d) << 24);
}
} // namespace ACL
enum PixelFormat : uint32_t {
kUnknown = 0, // Unknown format
kNv12 = ACL::makeFourCC('N', 'V', '1', '2'), // 4:2:0 format with Y plane followed by UVUVUV.. plane
kUyvy = ACL::makeFourCC('U', 'Y', 'V', 'Y'), // 4:2:2 format with packed UYVY macropixels
kP010 = ACL::makeFourCC('P', '0', '1', '0'), // 4:2:0 P016 with data in the 10 MSB
kP016 = ACL::makeFourCC('P', '0', '1', '6'), // 4:2:0 format with 16 bit words, Y plane followed by UVUVUV.. plane
kP210 = ACL::makeFourCC('P', '2', '1', '0'), // 4:2:2 P216 with data in the 10 MSB
kP216 = ACL::makeFourCC('P', '2', '1', '6'), // 4:2:2 format with 16 bit words, Y plane followed by UVUVUV.. plane
kRgba =
ACL::makeFourCC('R', 'G', 'B', 'A'), // 4:4:4:4 RGB format, 8 bit per channel, ordered RGBARGBARG.. in memory
kV210 = ACL::makeFourCC('V', '2', '1', '0'), // 4:2:2 packed format with 10 bit per component
kRgba64Le =
ACL::makeFourCC('R', 'G', 'B', 64) // 16 bit per component, ordered as RGBA in memory with little endian words.
};
std::ostream& operator<<(std::ostream& stream, PixelFormat pixelFormat);
6.3.4.2.14 - include/SystemControllerConnection.h
include/SystemControllerConnection.h File Reference
Classes
| Name | |
|---|---|
| class | SystemControllerConnection An implementation of the ISystemControllerInterface for a System controller residing in a remote server. The connection to the server uses a Websocket. |
| struct | SystemControllerConnection::Settings Settings for a SystemControllerConnection. |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <chrono>
#include "ISystemControllerInterface.h"
#include "json.hpp"
class SystemControllerConnection final : public ISystemControllerInterface {
public:
enum class ComponentType : uint32_t {
kIngest,
kPipeline,
kControlPanel,
};
struct Settings {
std::string mSystemControllerIP; // IP of the server
uint16_t mSystemControllerPort; // Port of the server
std::string mSystemControllerPostfix; // Postfix of the address that the backend uses if any
std::string mPSK; // The pre shared key used for authorization with the system controller server
std::string mUUID; // The UUID of the device using this library
ComponentType mType; // The component type of the component using this SystemControllerConnection
std::string mName; // The component name (optional)
std::string mMyIP; // The external IP of the system the component is running on. Will be sent to the system
// controller server in the announce message (optional)
std::chrono::milliseconds mConnectTimeout{
3000}; // Max time to wait on an announcement response from the server during connection
bool mEnableHTTPS; // Enable the communication between the system controller and a component encrypted
bool mInsecureHTTPS; // Disable the verification of the TLS certificate if requested.
std::string mCustomCaCertFile; // Custom CA certificate
};
SystemControllerConnection();
~SystemControllerConnection() override;
bool configure(const Settings& settings);
bool connect() override;
[[nodiscard]] bool isConnected() const override;
[[nodiscard]] std::string getUUID() const override;
std::optional<std::string> sendMessage(const std::string& messageTitle, const nlohmann::json& parameters) override;
bool disconnect() override;
bool registerRequestCallback(const Callbacks& callbacks) override;
SystemControllerConnection(SystemControllerConnection const&) = delete; // Copy construct
SystemControllerConnection(SystemControllerConnection&&) = delete; // Move construct
SystemControllerConnection& operator=(SystemControllerConnection const&) = delete; // Copy assign
SystemControllerConnection& operator=(SystemControllerConnection&&) = delete; // Move assign
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
6.3.4.2.15 - include/TimeCommon.h
include/TimeCommon.h File Reference
Namespaces
| Name |
|---|
| TimeCommon |
Classes
| Name | |
|---|---|
| struct | TimeCommon::TAIStatus |
| struct | TimeCommon::TimeStructure |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <chrono>
#include <cstdint>
#include <fstream>
#include <sstream>
#include "expected.hpp"
namespace TimeCommon {
enum class StratumLevel {
UnknownStratum,
stratum0,
stratum1,
stratum2,
stratum3,
stratum4,
};
struct TAIStatus {
StratumLevel mStratum = StratumLevel::UnknownStratum;
bool mHasLock = false;
double mTimeDiffS = 0.0; // Time diff vs NTP in seconds, +/- value means slow/faster than NTP time
};
// Little endian
// Minimum size packet is 64 - bytes
struct TimeStructure {
uint64_t t1 = 0; // 8-bytes / Total 8-bytes == Client time T1
uint64_t t2 = 0; // 8-bytes / Total 16-bytes == Server
uint64_t t3 = 0; // 8-bytes / Total 24-bytes
uint64_t t4 = 0; // 8-bytes / Total 32-bytes
uint64_t token = 0; // 8-bytes / Total 40-bytes == t1 ^ key
uint64_t dummy1 = 0; // 8-bytes / Total 48-bytes == for future use
uint64_t dummy2 = 0; // 8-bytes / Total 56-bytes == for future use
uint64_t dummy3 = 0; // 8-bytes / Total 64-bytes == for future use
};
uint64_t getMonotonicClockMicro();
tl::expected<TimeCommon::TAIStatus, std::string> getStatus();
int64_t getTAIMicro();
std::string taiMicroToString(int64_t taiTimestamp);
} // namespace TimeCommon
6.3.4.2.16 - include/UUIDUtils.h
include/UUIDUtils.h File Reference
Namespaces
| Name |
|---|
| UUIDUtils A namespace for UUID utility functions. |
Source code
// Copyright (c) 2022, Edgeware AB. All rights reserved.
#pragma once
#include <string>
namespace UUIDUtils {
std::string generateRandomUUID();
bool isValidUUIDString(const std::string& uuid);
} // namespace UUIDUtils
6.3.4.3 - Namespaces
- namespace ACL
- namespace AclLog
A namespace for logging utilities. - namespace ControlDataCommon
- namespace IngestUtils
- namespace TimeCommon
- namespace UUIDUtils
A namespace for UUID utility functions. - namespace spdlog
6.3.4.3.1 - ACL
ACL Namespace Reference
Functions
| Name | |
|---|---|
| constexpr uint32_t | makeFourCC(char a, char b, char c, char d) Helper function to create a FourCC code out of four characters. |
Functions Documentation
function makeFourCC
constexpr uint32_t makeFourCC(
char a,
char b,
char c,
char d
)
Helper function to create a FourCC code out of four characters.
Return: The characters a-d encoded as a 32 bit FourCC code.
6.3.4.3.2 - AclLog
AclLog Namespace Reference A namespace for logging utilities.
Classes
| Name | |
|---|---|
| class | AclLog::CommandLogFormatter This class is used to format log entries for Rendering Engine commands. |
| class | AclLog::ThreadNameFormatterFlag |
| class | AclLog::FileLocationFormatterFlag A custom flag formatter which logs the source file location between a par of “[]”, in case the location is provided with the log call. |
Types
| Name | |
|---|---|
| enum class | Level { kTrace, kDebug, kInfo, kWarning, kError, kCritical, kOff} Log levels. |
Functions
| Name | |
|---|---|
| void | init(const std::string & name) Initialize logging. |
| void | initCommandLog(const std::string & name) Init the Rendering Engine command log. |
| void | setLevel(Level level) Set global logging level. |
| void | logCommand(const std::string & origin, const std::string & command) Log a command to the command log. |
| AclLog::Level | getLogLevel() Internal helper function for getting the setting for the log level. |
| size_t | getMaxFileSize() Internal helper function for getting the setting for the maximum size for a log file. |
| size_t | getMaxLogRotations() Internal helper function for getting the setting for the maximum number of rotated log files. |
| std::filesystem::path | getLogFileFullPath(const std::string & name) Internal helper function for constructing the full path name for the log file. |
| std::string | getThreadName() |
Types Documentation
enum Level
| Enumerator | Value | Description |
|---|---|---|
| kTrace | ||
| kDebug | ||
| kInfo | ||
| kWarning | ||
| kError | ||
| kCritical | ||
| kOff |
Log levels.
Functions Documentation
function init
void init(
const std::string & name
)
Initialize logging.
Parameters:
- name The name of the component (used for log prefix and filename)
By default two sinks are created. The first sink writes messages to the console. The second sink attempts to create a log file in the path set by the environment variable ACL_LOG_PATH (’/tmp’ if unset). The name of the log file is ’name-
function initCommandLog
void initCommandLog(
const std::string & name
)
Init the Rendering Engine command log.
Parameters:
- name The name of the Rendering Engine (used for filename)
function setLevel
void setLevel(
Level level
)
Set global logging level.
Parameters:
- level Logging level to set
function logCommand
void logCommand(
const std::string & origin,
const std::string & command
)
Log a command to the command log.
Parameters:
- origin The origin of the command to log, usually the UUID of the control panel sending the command
- command The command to log
function getLogLevel
AclLog::Level getLogLevel()
Internal helper function for getting the setting for the log level.
Return: The wanted log level fetched from an environment variable if set, or else a default value
function getMaxFileSize
size_t getMaxFileSize()
Internal helper function for getting the setting for the maximum size for a log file.
Return: The wanted maximum size of the log file fetched from an environment variable if set, or else a default value
function getMaxLogRotations
size_t getMaxLogRotations()
Internal helper function for getting the setting for the maximum number of rotated log files.
Return: The wanted number of log files to rotate fetched from an environment variable if set, or else a default value
function getLogFileFullPath
std::filesystem::path getLogFileFullPath(
const std::string & name
)
Internal helper function for constructing the full path name for the log file.
Parameters:
- name The name of the component
Return: The full path to the log file
function getThreadName
inline std::string getThreadName()
6.3.4.3.3 - ControlDataCommon
ControlDataCommon Namespace Reference
Classes
| Name | |
|---|---|
| struct | ControlDataCommon::ConnectionStatus Connection status struct containing information about a connection event. |
| struct | ControlDataCommon::Response A response from a ControlDataReceiver to a request. The UUID tells which receiver the response is sent from. |
| struct | ControlDataCommon::StatusMessage A status message from a ControlDataReceiver. The UUID tells which receiver the message is sent from. |
Types
| Name | |
|---|---|
| enum class | ConnectionType { CONNECTED, DISCONNECTED} The connection types. |
Types Documentation
enum ConnectionType
| Enumerator | Value | Description |
|---|---|---|
| CONNECTED | ||
| DISCONNECTED |
The connection types.
6.3.4.3.4 - IngestUtils
IngestUtils Namespace Reference
Functions
| Name | |
|---|---|
| bool | isRunningWithRootPrivileges() |
Functions Documentation
function isRunningWithRootPrivileges
bool isRunningWithRootPrivileges()
Return: true if this application is executing with root privileges, false otherwise
6.3.4.3.5 - spdlog
spdlog Namespace Reference
6.3.4.3.6 - TimeCommon
TimeCommon Namespace Reference
Classes
| Name | |
|---|---|
| struct | TimeCommon::TAIStatus |
| struct | TimeCommon::TimeStructure |
Types
| Name | |
|---|---|
| enum class | StratumLevel { UnknownStratum, stratum0, stratum1, stratum2, stratum3, stratum4} |
Functions
| Name | |
|---|---|
| uint64_t | getMonotonicClockMicro() Get current time since epoch. |
| tl::expected< TimeCommon::TAIStatus, std::string > | getStatus() Get TAI status. |
| int64_t | getTAIMicro() Get current TAI time. |
| std::string | taiMicroToString(int64_t taiTimestamp) Converts the input TAI timestamp to a human readable string. Timestamp is converted to local time including leap seconds. |
Types Documentation
enum StratumLevel
| Enumerator | Value | Description |
|---|---|---|
| UnknownStratum | ||
| stratum0 | ||
| stratum1 | ||
| stratum2 | ||
| stratum3 | ||
| stratum4 |
Functions Documentation
function getMonotonicClockMicro
uint64_t getMonotonicClockMicro()
Get current time since epoch.
Return: Return current time since epoch in microseconds
function getStatus
tl::expected< TimeCommon::TAIStatus, std::string > getStatus()
Get TAI status.
Return: Expected with the TAI status if successful or an error string in case something went wrong
function getTAIMicro
int64_t getTAIMicro()
Get current TAI time.
Return: Return current TAI time in microseconds
function taiMicroToString
std::string taiMicroToString(
int64_t taiTimestamp
)
Converts the input TAI timestamp to a human readable string. Timestamp is converted to local time including leap seconds.
Parameters:
- taiTimestamp A TAI timestamp with microseconds resolution
Return: Return a human readable timestamp
6.3.4.3.7 - UUIDUtils
UUIDUtils Namespace Reference A namespace for UUID utility functions.
Functions
| Name | |
|---|---|
| std::string | generateRandomUUID() Generates a completely randomized UUID string. |
| bool | isValidUUIDString(const std::string & uuid) Checks if a string is a valid UUID string. |
Functions Documentation
function generateRandomUUID
std::string generateRandomUUID()
Generates a completely randomized UUID string.
Return: A random generated UUID string
function isValidUUIDString
bool isValidUUIDString(
const std::string & uuid
)
Checks if a string is a valid UUID string.
Parameters:
- uuid The string to check
Return: True if uuid is a valid UUID string, otherwise false
6.3.5 - System controller config
This page describes the configuration settings possible to set via the acl_sc_settings.json file.
| Expanded Config name | Config name | Description | Default value |
|---|---|---|---|
| psk | psk | The Pre-shared key used to authorize components to connect to the System Controller. Must be 32 characters long | "" |
| security.salt | salt | Salt string for the generation of tokens and encryption keys | “Some random string” |
| security.n | n | Parameter for token and encryption generation. N is CPU/memory cost parameter, must be a power of 2, greater than 1. 1 | 65536 |
| security.r | r | Parameter for token and encryption generation. R is block size factor. R constrain must satisfy R*P < 2^30. 1 | 8 |
| security.p | p | Parameter for token and encryption generation. P is the parallelization parameter. P constrain must satisfy R*P < 2^30, if this is exceeded, an error will be returned 1 | 1 |
| security.keylen | keylen | The length of the generated tokens | 32 |
| client_auth.enabled | enabled | Switch to enable basic authentication for clients in the REST API | true |
| client_auth.username | username | The username that will grant access to the REST API | “admin” |
| client_auth.password | password | Password that will grant access to the REST API | “changeme” |
| https.enabled | enabled | Switch to enable encryption of the REST API as well as the connections between the System Controller and the connected components | true |
| https.certificate_file | certificate_file | Path to the certificate file. In pem format | "" |
| https.private_key_file | private_key_file | Path to the private key file. In pem format | "" |
| logger.level | level | The level that the logging will produce output, available in ascending order: debug, info, warn, error | info |
| logger.file_name_prefix | file_name_prefix | The prefix of the log filename. A unique timecode and “.log” will automatically be appended to this prefix. The prefix can contain both the path and the prefix of the log file. | "" |
| site.port | port | Port on which the service is accessible | 8080 |
| site.host | host | Hostname on which the service is accessible | localhost |
| rate_limit.requests_per_sec | RateLimit.RequestsPerSec | The average number of requests that are handled per second, before requests are queued up. (Number of tokens added to the token bucket per second 2) | 300 |
| rate_limit.burst_limit | RateLimit.BurstLimit | The number of requests that can be handled in a short burst before rate limiting kicks in (Maximum number of tokens in the token bucket 2). | 10 |
| response_timeout | response_timeout | The maximum time of a request between the System Controller and a component before the request is timed out | 5000ms |
| cors.allowed_origins | allowed_origins | Comma-separated list of origin addresses that are allowed | ["*"] |
| cors.allowed_methods | allowed_methods | Comma-separated list of HTTP methods that the service accepts | [“GET”, “POST”, “PUT”, “PATCH”, “DELETE”] |
| cors.allowed_headers | allowed_headers | Comma-separated list of headers that are allowed | ["*"] |
| cors.exposed_headers | exposed_headers | Comma-separated list of headers that are allowed for exposure | [""] |
| cors.allow_credentials | allow_credentials | Allow the xKHR to set credentials cookies | false |
| cors.max_age | max_age | How long the preflight cache is stored before a new must be made | 300 |
| custom_headers.[N].key | key | Custom headers, the key of the header, e.g.: Cache-Control | None |
| custom_headers.[N].value | value | Custom headers, the value to the key of the header, e.g.: no-cache | None |
| allow_any_version | allow_any_version | Allow components of any version to connect. When set to false, components with another major version than the System Controller will be rejected | false |
7 - Troubleshooting
If you have problems running the Ateliere Live components, check this troubleshooting guide for some common underlying reasons and proposed steps to diagnose and solve them. If your problem isn’t mentioned here or you have a different fix to contribute please contact Ateliere support about including it here.
Ingest
Intel encoder problems
While the Ingest supports both Intel and NVidia GPU-based encoding of video streams depending on available hardware and drivers, for full functionality (e.g. the ability to save thumbnail images) the Intel encoder must be functional. Use this guide to check what’s wrong with the current setup.
Intel processor too old
If the Intel processor is too old the hardware will not support all required GPU features. It is required that you have at least a 6th Generation (Skylake) processor. You can check the model name with (one listing per core):
cat /proc/cpuinfo | grep "model name"
The marketing name of the microarchitecture can be found with:
cat /sys/devices/cpu/caps/pmu_name
You can use this name and the model number to find out more details about your processor capabilities by consulting e.g. https://en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures
Intel GPU is not found
First, check that the Intel GPU is actually mapped to device handle /dev/dri/renderD128. A common problem when running systems with both Intel GPU and Nvidia GPU is that the Nvidia GPU will map to /dev/dri/renderD128 and the Intel GPU to /dev/dri/renderD129. The underlying libraries used by Ateliere Live is however hardcoded to use the Intel GPU via /dev/dri/renderD128. Check this by running:
sudo cat /sys/kernel/debug/dri/128/name
This should output a line starting with i915 if the Intel GPU is mapped to that device handle. In case the line starts with nvidia-drm, the Nvidia card is the primary GPU. Also check that the device renderD129 is present in that case:
sudo cat /sys/kernel/debug/dri/129/name
In case this returns a string starting with i915 the priority order of the GPUs are the wrong way around. In case there is no renderD129 device at all, the Intel GPU is likely disabled in BIOS/UEFI.
To swap the priority order of the devices and/or enable the Intel GPU, check your BIOS/UEFI settings and see if you can change your primary graphics adapter from “PCI Express” to “Onboard” (i.e. the Intel processor rather than a separate graphics card), or enable “Integrated Graphics” or similar (appearance of the setting varies depending on your motherboard manufacturer), and reboot.
Intel driver not active
In case the Intel GPU is mapped to device renderD128, check what display drivers are active on the system. An easy way to check is to install the pciutils package and check with the following command:
lspci -k | grep -EA3 'VGA|3D|Display'
You should see at least one VGA compatible controller listed, described as “Intel Corporation” followed by the model name of the integrated GPU. The listed kernel driver in use should be i915. If you have an NVidia card installed it may be selected as the primary and only active device.
You can also check that LibVA finds the Intel GPU by using the utility application vainfo. Install it using sudo apt install vainfo.
When running the program, it should output something like this in case it successfully finds the Intel GPU:
$ vainfo
error: can't connect to X server!
libva info: VA-API version 1.13.0
libva info: User environment variable requested driver 'iHD'
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_13
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.13 (libva 2.12.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 21.4.1 (be92568)
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
....
(long list of entrypoints)
Note that the X server error message is nothing to be worried about, as this just means you have no screen connected to the machine.
In case LibVA found the driver, but could not communicate with the Intel GPU because the Nvidia GPU is mapped to renderD128 as described in the previous section, the output will look something like this:
$ vainfo
error: can't connect to X server!
libva info: VA-API version 1.14.0
libva info: User environment variable requested driver 'iHD'
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_14
DRM_IOCTL_I915_GEM_APERTURE failed: Invalid argument
Assuming 131072kB available aperture size.
May lead to reduced performance or incorrect rendering.
get chip id failed: -1 [22]
param: 4, val: 0
libva error: /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so init failed
libva info: va_openDriver() returns 18
vaInitialize failed with error code 18 (invalid parameter),exit
Here LibVA reported it finds the Intel iHD driver, but it cannot communicate with the GPU chip (as it is a Nvidia GPU mapped to renderD128, The integrated Intel GPU was disabled in BIOS/UEFI in this case). See the previous section on how to solve this.
In case vainfo does not report iHD as the User environment variable requested driver, or cannot find iHD_drv_video.so check that the following libva environment variables are set correctly (you should have them in /etc/environment):
LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri
LIBVA_DRIVER_NAME=iHD
In case they are missing, double check your oneVPL installation in the next section.
oneVPL not installed or setup correctly for the current user
In case LibVA finds the driver and can communicate with the Intel GPU, check that oneVPL was correctly installed as per the instructions here. You can see if you have version 2022.1.0 or later installed (latest should be a symlink to the used version) with:
ls -la /opt/intel/oneapi/vpl
In case the oneVPL library was installed by another user, the problem likely lies in the configuration for the current user.
The user running the ingest binary must be in the groups video and render to be able to use the Intel encoder. Check what groups your user belongs to with:
groups
If video and render are not both in the listed groups, add them with:
sudo usermod -aG video,render ${USER}
Finally, a number of oneAPI environment variables must be set in the shell from which the Ingest application is started, otherwise it will not be able to find the runtime library (libvpl.so) when trying to use the encoder in the Ingest. This is typically done by adding the following line to your ~/.bashrc file:
source /opt/intel/oneapi/setvars.sh > /dev/null
8 - Credits
8.1 - C++ SDK Credits
License List
The table below lists the third party libraries used by this software and their respective license types.
| Library | Modified | Linked | License | Checked At |
|---|---|---|---|---|
| alsa-lib | no | dynamic | LGPL-2.1 | 2025-01-14 |
| avahi | no | dynamic | LGPL-2.1 | 2022-12-28 |
| blackmagic | no | dynamic | Proprietary | 2024-03-19 |
| brotli | no | dynamic | MIT | 2022-12-28 |
| bsd | no | dynamic | BSD-3-Clause | 2022-12-30 |
| cairo | no | dynamic | MPL-1.1 | 2022-05-16 |
| cef | no | dynamic | BSD-3-Clause | 2023-08-15 |
| cpprestsdk | no | dynamic | MIT | 2022-02-23 |
| cuda | no | dynamic | Proprietary | 2022-02-23 |
| drm | no | dynamic | MIT | 2022-05-16 |
| dbus | no | dynamic | AFL-2.1 | 2023-01-10 |
| ebur128 | no | static | MIT | 2023-08-15 |
| efp | no | static | MIT | 2022-02-23 |
| efpbond | no | static | MIT | 2022-02-23 |
| expat | no | dynamic | MIT | 2023-01-03 |
| fdk-aac | no | dynamic | Proprietary | 2022-02-23 |
| ffmpeg | no | dynamic | LGPL-2.1 | 2023-12-19 |
| fmtlib | no | static | MIT | 2022-12-29 |
| fontconfig | no | dynamic | Proprietary | 2023-01-03 |
| freetype | no | dynamic | FTL | 2022-05-23 |
| gcrypt | no | dynamic | LGPL-2.1 | 2023-01-03 |
| glibc | no | dynamic | LGPL-2.1 | 2023-01-02 |
| gpg-error | no | dynamic | LGPL-2.1 | 2023-01-03 |
| ixwebsocket | no | static | BSD-3-Clause | 2024-03-19 |
| kissnet | no | static | MIT | 2022-12-29 |
| libass | no | dynamic | ISC | 2024-05-13 |
| libatk | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libatspi | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libblkid | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libcap | no | dynamic | BSD-3-Clause | 2022-12-29 |
| libcom-err2 | no | dynamic | Other | 2024-05-14 |
| libcups | no | dynamic | Apache-2.0-with-GPL2-LGPL2-Exception | 2024-05-14 |
| libdatrie | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libdav1d | no | dynamic | BSD-2-Clause | 2024-05-14 |
| libffi | no | dynamic | Other | 2024-05-15 |
| libfribidi | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libgbm | no | dynamic | MIT | 2024-05-14 |
| libgcc | no | dynamic | GCC RUNTIME LIBRARY EXCEPTION | 2023-01-11 |
| libgmp | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libgnutls | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libgraphite | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libgssapi_krb5 | no | dynamic | MIT | 2024-05-14 |
| libharfbuzz | no | dynamic | MIT | 2024-05-14 |
| libhogweed | no | dynamic | LGPL-3+ | 2024-05-13 |
| libidn | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libk5crypto | no | dynamic | MIT | 2024-05-14 |
| libkeyutils | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libkrb5 | no | dynamic | MIT | 2024-05-14 |
| libmount | no | dynamic | LGPL-2.1 | 2024-05-13 |
| libmp3lame | no | dynamic | LGPL-2.1 | 2024-05-16 |
| libnettle | no | dynamic | LGPL-3+ | 2024-05-13 |
| libnspr4 | no | dynamic | MPL-2.0 | 2024-05-16 |
| libnss3 | no | dynamic | MPL-2.0 | 2024-05-16 |
| libogg0 | no | dynamic | Other | 2024-05-16 |
| libp11 | no | dynamic | BSD-3-Clause | 2024-05-16 |
| libpango | no | dynamic | LGPL-2.1 | 2024-05-16 |
| libpcre | no | dynamic | BSD | 2024-05-16 |
| libpng | no | dynamic | libpng | 2023-01-05 |
| libtasn1 | no | dynamic | LGPL-2.1 | 2024-05-16 |
| libthai | no | dynamic | LGPL-2.1 | 2024-05-16 |
| libunistring | no | dynamic | LGPL-3+ | 2024-05-16 |
| libvorbis | no | dynamic | BSD-3-Clause | 2024-05-16 |
| libvpx | no | dynamic | BSD-3-Clause | 2024-05-16 |
| libwayland | no | dynamic | X11 | 2024-05-16 |
| libx11 | no | dynamic | X11 | 2024-05-16 |
| libx11 | no | dynamic | Other | 2024-05-16 |
| libxcb | no | dynamic | Other | 2024-05-16 |
| libxcomposite | no | dynamic | Other | 2024-05-16 |
| libxdamage | no | dynamic | Other | 2024-05-16 |
| libxdmcp | no | dynamic | Other | 2024-05-16 |
| libxext | no | dynamic | Other | 2024-05-16 |
| libxfixes | no | dynamic | Other | 2024-05-16 |
| libxi | no | dynamic | Other | 2024-05-16 |
| libxkb | no | dynamic | Other | 2024-05-16 |
| libxrandr | no | dynamic | Other | 2024-05-16 |
| libxrender | no | dynamic | Other | 2024-05-16 |
| lz4 | no | dynamic | BSD-2-Clause | 2022-02-23 |
| lzma | no | dynamic | Public Domain | 2023-01-03 |
| md | no | dynamic | BSD-3-Clause | 2023-01-03 |
| mpegts | no | static | MIT | 2022-02-23 |
| ndi | no | dynamic | Proprietary | 2022-02-23 |
| nlohmann-json | no | static | MIT | 2022-12-29 |
| npp | no | dynamic | Proprietary | 2023-01-04 |
| nvidia-codec | yes | dynamic | Proprietary | 2022-02-23 |
| onevpl | no | dynamic | MIT | 2024-05-20 |
| openssl | no | dynamic | OpenSSL | 2022-02-23 |
| opus | no | dynamic | BSD-3-Clause | 2023-04-21 |
| pixman | no | dynamic | MIT | 2023-06-13 |
| rist | no | static | BSD-2-Clause | 2022-02-23 |
| rist-cpp | no | static | BSD-2-Clause | 2022-02-23 |
| spdlog | no | static | MIT | 2022-12-29 |
| srt | no | static | MPL-2 | 2022-02-23 |
| srt-cpp | no | static | MIT | 2022-02-23 |
| systemd | no | dynamic | LGPL-2.1 | 2022-05-19 |
| uuid | no | dynamic | BSD-3-clause | 2023-01-12 |
| va | no | dynamic | MIT | 2022-04-28 |
| zlib | no | dynamic | zlib | 2022-12-30 |
| zstandard | no | dynamic | BSD-3-Clause | 2022-02-23 |
License Details
This section includes all the licenses/notices for each dependency verbatim
alsa-lib
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
avahi
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations
below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it
becomes a de-facto standard. To achieve this, non-free programs must
be allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control
compilation and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least
three years, to give the same user the materials specified in
Subsection 6a, above, for a charge no more than the cost of
performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply, and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License
may add an explicit geographical distribution limitation excluding those
countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms
of the ordinary General Public License).
To apply these terms, attach the following notices to the library.
It is safest to attach them to the start of each source file to most
effectively convey the exclusion of warranty; and each file should
have at least the "copyright" line and a pointer to where the full
notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the library,
if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James
Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
blackmagic
Blackmagic Design Pty. Ltd.
License Agreement for all Desktop Video Products
IMPORTANT: Read this before installing this software. This is a legal contract
between yourself and Blackmagic Design Pty. Ltd. Before you click on the
“Agree” button, it's important you carefully read the terms and conditions of
this Agreement. By clicking on the “Agree” button, you are agreeing to be
bound by these terms and are becoming a party to this Agreement. If you do not
agree to all of the terms, click the “Disagree” button and do not install or
use this software.
1. Subject to payment of applicable license fees, Blackmagic Design Pty. Ltd.
("Blackmagic Design") hereby grants to you a non-exclusive license to use this
software product (the "Software") and accompanying documentation on the terms
below. The Software may be used on a single system only, and may be copied for
archival purposes, provided any copy must contain all of the original
Software's proprietary notices.
2. Blackmagic Design makes no representations concerning the suitability for
any purpose of the Software or about the accuracy of data or information made
accessible by it. The Software is provided “as is” without express or implied
warranties, including but not limited to implied warranties of merchantability
and fitness for a particular purpose or non infringement of intellectual
property rights of third persons. Blackmagic Design assumes no liability for
any damages (whether direct, incidental or consequential) suffered by you or
any third person as a result of use of the Software. SOME STATES DO NOT ALLOW
EXCLUSIONS OF AN IMPLIED WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO YOU AND
YOU MAY HAVE OTHER LEGAL RIGHTS THAT VARY FROM STATE TO STATE OR BY
JURISDICTION. LIMITATION OF LIABILITY: UNDER NO CIRCUMSTANCES AND UNDER NO
LEGAL THEORY, TORT, CONTRACT, OR OTHERWISE, SHALL BLACKMAGIC DESIGN OR ITS
SUPPLIERS OR RESELLERS BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT,
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING,
WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER
FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES. IN
NO EVENT WILL BLACKMAGIC DESIGN BE LIABLE FOR ANY DAMAGES IN EXCESS OF
BLACKMAGIC DESIGN'S LIST PRICE FOR A LICENSE TO THE SOFTWARE, EVEN IF
BLACKMAGIC DESIGN SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES,
OR FOR ANY CLAIM BY ANY OTHER PARTY. THIS LIMITATION OF LIABILITY SHALL NOT
APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY TO THE EXTENT APPLICABLE LAW
PROHIBITS SUCH LIMITATION. FURTHERMORE, SOME STATES DO NOT ALLOW THE EXCLUSION
OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION AND
EXCLUSION MAY NOT APPLY TO YOU.
3. Content accessed through or created by this Software is the property of
the applicable content owner and may be protected by applicable copyright or
other intellectual property laws. This License Agreement conveys no rights to
such content.
4. Blackmagic Design has no obligation to issue any updates, revisions,
corrections, new versions or manuals for this Software or otherwise to support
this Software in any way.
5. Blackmagic Design reserves the right at any time to alter prices,
features, specifications, capabilities, functions, licensing terms, release
dates, general availability or other characteristics of this Software.
6. The Software is owned by Blackmagic Design or its suppliers. Title,
ownership rights, and intellectual property rights in and to the Software
shall remain in Blackmagic Design and/or its suppliers. You agree to abide by
the copyright law and all other applicable laws of the Australia, United
States and other applicable jurisdictions. You acknowledge that the Software
in source code form remains a confidential trade secret of Blackmagic Design
and/or its suppliers. You may not, permit unlicensed persons to use your copy
of the Software, modify, translate, reverse engineer, decompile, disassemble,
or create derivative works based on the Software, copy the Software, rent or
lease, rights to the Software, or remove any proprietary notices or labels on
the Software.
7. You may terminate this License Agreement at any time by destroying or
erasing your copy of the Software. Your license will terminate automatically
if you fail to comply with the limitations specified herein. Upon termination
of this License Agreement, you agree to destroy or erase the Software. In the
event of termination, the provisions of paragraphs 2 to 6 of this License
Agreement will survive.
8. This License Agreement shall be governed by the laws of the state of
Victoria, Australia, and the applicable local law of such jurisdiction where
Blackmagic Design's intellectual property rights may be infringed. The venue
of any dispute under this License Agreement shall be the applicable state
and/or courts of Victoria, Australia; except that Blackmagic Design may
enforce its intellectual property rights before the competent courts of any
jurisdiction where an act of infringement has occurred. Final decisions of the
specified courts may be enforced in any court of competent jurisdiction.
9. If any provision of this License Agreement is unenforceable, invalid, or
violates applicable law, such provision shall be deemed stricken and shall not
affect the enforceability of any other provision of this License Agreement.
10. This License Agreement sets forth the entire agreement between you and
Blackmagic Design. No change, modification, addition, or amendment to this
License Agreement shall be valid unless in writing and signed by an authorized
officer of Blackmagic Design.
Copyright 2024 Blackmagic Design. All rights reserved. 'Blackmagic Design', 'Blackmagic', 'Blackmagic Cloud', 'DaVinci Resolve', 'Fusion', 'Fairlight', 'Ultimatte', 'HyperDeck', 'DeckLink', 'HDLink', 'Videohub', 'Intensity' and 'Leading the creative video revolution' are registered trademarks in the US and other countries. All other company and product names may be trade marks of their respective companies with which they are associated.
For further information please contact:
Blackmagic Design Pty. Ltd.
180 Bank St,
South Melbourne,
Victoria, 3205
Australia.
www.blackmagicdesign.com
brotli
Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
bsd
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cairo
MOZILLA PUBLIC LICENSE
Version 1.1
---------------
1. Definitions.
1.0.1. "Commercial Use" means distribution or otherwise making the
Covered Code available to a third party.
1.1. "Contributor" means each entity that creates or contributes to
the creation of Modifications.
1.2. "Contributor Version" means the combination of the Original
Code, prior Modifications used by a Contributor, and the Modifications
made by that particular Contributor.
1.3. "Covered Code" means the Original Code or Modifications or the
combination of the Original Code and Modifications, in each case
including portions thereof.
1.4. "Electronic Distribution Mechanism" means a mechanism generally
accepted in the software development community for the electronic
transfer of data.
1.5. "Executable" means Covered Code in any form other than Source
Code.
1.6. "Initial Developer" means the individual or entity identified
as the Initial Developer in the Source Code notice required by Exhibit
A.
1.7. "Larger Work" means a work which combines Covered Code or
portions thereof with code not governed by the terms of this License.
1.8. "License" means this document.
1.8.1. "Licensable" means having the right to grant, to the maximum
extent possible, whether at the time of the initial grant or
subsequently acquired, any and all of the rights conveyed herein.
1.9. "Modifications" means any addition to or deletion from the
substance or structure of either the Original Code or any previous
Modifications. When Covered Code is released as a series of files, a
Modification is:
A. Any addition to or deletion from the contents of a file
containing Original Code or previous Modifications.
B. Any new file that contains any part of the Original Code or
previous Modifications.
1.10. "Original Code" means Source Code of computer software code
which is described in the Source Code notice required by Exhibit A as
Original Code, and which, at the time of its release under this
License is not already Covered Code governed by this License.
1.10.1. "Patent Claims" means any patent claim(s), now owned or
hereafter acquired, including without limitation, method, process,
and apparatus claims, in any patent Licensable by grantor.
1.11. "Source Code" means the preferred form of the Covered Code for
making modifications to it, including all modules it contains, plus
any associated interface definition files, scripts used to control
compilation and installation of an Executable, or source code
differential comparisons against either the Original Code or another
well known, available Covered Code of the Contributor's choice. The
Source Code can be in a compressed or archival form, provided the
appropriate decompression or de-archiving software is widely available
for no charge.
1.12. "You" (or "Your") means an individual or a legal entity
exercising rights under, and complying with all of the terms of, this
License or a future version of this License issued under Section 6.1.
For legal entities, "You" includes any entity which controls, is
controlled by, or is under common control with You. For purposes of
this definition, "control" means (a) the power, direct or indirect,
to cause the direction or management of such entity, whether by
contract or otherwise, or (b) ownership of more than fifty percent
(50%) of the outstanding shares or beneficial ownership of such
entity.
2. Source Code License.
2.1. The Initial Developer Grant.
The Initial Developer hereby grants You a world-wide, royalty-free,
non-exclusive license, subject to third party intellectual property
claims:
(a) under intellectual property rights (other than patent or
trademark) Licensable by Initial Developer to use, reproduce,
modify, display, perform, sublicense and distribute the Original
Code (or portions thereof) with or without Modifications, and/or
as part of a Larger Work; and
(b) under Patents Claims infringed by the making, using or
selling of Original Code, to make, have made, use, practice,
sell, and offer for sale, and/or otherwise dispose of the
Original Code (or portions thereof).
(c) the licenses granted in this Section 2.1(a) and (b) are
effective on the date Initial Developer first distributes
Original Code under the terms of this License.
(d) Notwithstanding Section 2.1(b) above, no patent license is
granted: 1) for code that You delete from the Original Code; 2)
separate from the Original Code; or 3) for infringements caused
by: i) the modification of the Original Code or ii) the
combination of the Original Code with other software or devices.
2.2. Contributor Grant.
Subject to third party intellectual property claims, each Contributor
hereby grants You a world-wide, royalty-free, non-exclusive license
(a) under intellectual property rights (other than patent or
trademark) Licensable by Contributor, to use, reproduce, modify,
display, perform, sublicense and distribute the Modifications
created by such Contributor (or portions thereof) either on an
unmodified basis, with other Modifications, as Covered Code
and/or as part of a Larger Work; and
(b) under Patent Claims infringed by the making, using, or
selling of Modifications made by that Contributor either alone
and/or in combination with its Contributor Version (or portions
of such combination), to make, use, sell, offer for sale, have
made, and/or otherwise dispose of: 1) Modifications made by that
Contributor (or portions thereof); and 2) the combination of
Modifications made by that Contributor with its Contributor
Version (or portions of such combination).
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
effective on the date Contributor first makes Commercial Use of
the Covered Code.
(d) Notwithstanding Section 2.2(b) above, no patent license is
granted: 1) for any code that Contributor has deleted from the
Contributor Version; 2) separate from the Contributor Version;
3) for infringements caused by: i) third party modifications of
Contributor Version or ii) the combination of Modifications made
by that Contributor with other software (except as part of the
Contributor Version) or other devices; or 4) under Patent Claims
infringed by Covered Code in the absence of Modifications made by
that Contributor.
3. Distribution Obligations.
3.1. Application of License.
The Modifications which You create or to which You contribute are
governed by the terms of this License, including without limitation
Section 2.2. The Source Code version of Covered Code may be
distributed only under the terms of this License or a future version
of this License released under Section 6.1, and You must include a
copy of this License with every copy of the Source Code You
distribute. You may not offer or impose any terms on any Source Code
version that alters or restricts the applicable version of this
License or the recipients' rights hereunder. However, You may include
an additional document offering the additional rights described in
Section 3.5.
3.2. Availability of Source Code.
Any Modification which You create or to which You contribute must be
made available in Source Code form under the terms of this License
either on the same media as an Executable version or via an accepted
Electronic Distribution Mechanism to anyone to whom you made an
Executable version available; and if made available via Electronic
Distribution Mechanism, must remain available for at least twelve (12)
months after the date it initially became available, or at least six
(6) months after a subsequent version of that particular Modification
has been made available to such recipients. You are responsible for
ensuring that the Source Code version remains available even if the
Electronic Distribution Mechanism is maintained by a third party.
3.3. Description of Modifications.
You must cause all Covered Code to which You contribute to contain a
file documenting the changes You made to create that Covered Code and
the date of any change. You must include a prominent statement that
the Modification is derived, directly or indirectly, from Original
Code provided by the Initial Developer and including the name of the
Initial Developer in (a) the Source Code, and (b) in any notice in an
Executable version or related documentation in which You describe the
origin or ownership of the Covered Code.
3.4. Intellectual Property Matters
(a) Third Party Claims.
If Contributor has knowledge that a license under a third party's
intellectual property rights is required to exercise the rights
granted by such Contributor under Sections 2.1 or 2.2,
Contributor must include a text file with the Source Code
distribution titled "LEGAL" which describes the claim and the
party making the claim in sufficient detail that a recipient will
know whom to contact. If Contributor obtains such knowledge after
the Modification is made available as described in Section 3.2,
Contributor shall promptly modify the LEGAL file in all copies
Contributor makes available thereafter and shall take other steps
(such as notifying appropriate mailing lists or newsgroups)
reasonably calculated to inform those who received the Covered
Code that new knowledge has been obtained.
(b) Contributor APIs.
If Contributor's Modifications include an application programming
interface and Contributor has knowledge of patent licenses which
are reasonably necessary to implement that API, Contributor must
also include this information in the LEGAL file.
(c) Representations.
Contributor represents that, except as disclosed pursuant to
Section 3.4(a) above, Contributor believes that Contributor's
Modifications are Contributor's original creation(s) and/or
Contributor has sufficient rights to grant the rights conveyed by
this License.
3.5. Required Notices.
You must duplicate the notice in Exhibit A in each file of the Source
Code. If it is not possible to put such notice in a particular Source
Code file due to its structure, then You must include such notice in a
location (such as a relevant directory) where a user would be likely
to look for such a notice. If You created one or more Modification(s)
You may add your name as a Contributor to the notice described in
Exhibit A. You must also duplicate this License in any documentation
for the Source Code where You describe recipients' rights or ownership
rights relating to Covered Code. You may choose to offer, and to
charge a fee for, warranty, support, indemnity or liability
obligations to one or more recipients of Covered Code. However, You
may do so only on Your own behalf, and not on behalf of the Initial
Developer or any Contributor. You must make it absolutely clear than
any such warranty, support, indemnity or liability obligation is
offered by You alone, and You hereby agree to indemnify the Initial
Developer and every Contributor for any liability incurred by the
Initial Developer or such Contributor as a result of warranty,
support, indemnity or liability terms You offer.
3.6. Distribution of Executable Versions.
You may distribute Covered Code in Executable form only if the
requirements of Section 3.1-3.5 have been met for that Covered Code,
and if You include a notice stating that the Source Code version of
the Covered Code is available under the terms of this License,
including a description of how and where You have fulfilled the
obligations of Section 3.2. The notice must be conspicuously included
in any notice in an Executable version, related documentation or
collateral in which You describe recipients' rights relating to the
Covered Code. You may distribute the Executable version of Covered
Code or ownership rights under a license of Your choice, which may
contain terms different from this License, provided that You are in
compliance with the terms of this License and that the license for the
Executable version does not attempt to limit or alter the recipient's
rights in the Source Code version from the rights set forth in this
License. If You distribute the Executable version under a different
license You must make it absolutely clear that any terms which differ
from this License are offered by You alone, not by the Initial
Developer or any Contributor. You hereby agree to indemnify the
Initial Developer and every Contributor for any liability incurred by
the Initial Developer or such Contributor as a result of any such
terms You offer.
3.7. Larger Works.
You may create a Larger Work by combining Covered Code with other code
not governed by the terms of this License and distribute the Larger
Work as a single product. In such a case, You must make sure the
requirements of this License are fulfilled for the Covered Code.
4. Inability to Comply Due to Statute or Regulation.
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Code due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description
must be included in the LEGAL file described in Section 3.4 and must
be included with all distributions of the Source Code. Except to the
extent prohibited by statute or regulation, such description must be
sufficiently detailed for a recipient of ordinary skill to be able to
understand it.
5. Application of this License.
This License applies to code to which the Initial Developer has
attached the notice in Exhibit A and to related Covered Code.
6. Versions of the License.
6.1. New Versions.
Netscape Communications Corporation ("Netscape") may publish revised
and/or new versions of the License from time to time. Each version
will be given a distinguishing version number.
6.2. Effect of New Versions.
Once Covered Code has been published under a particular version of the
License, You may always continue to use it under the terms of that
version. You may also choose to use such Covered Code under the terms
of any subsequent version of the License published by Netscape. No one
other than Netscape has the right to modify the terms applicable to
Covered Code created under this License.
6.3. Derivative Works.
If You create or use a modified version of this License (which you may
only do in order to apply it to code which is not already Covered Code
governed by this License), You must (a) rename Your license so that
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
"MPL", "NPL" or any confusingly similar phrase do not appear in your
license (except to note that your license differs from this License)
and (b) otherwise make it clear that Your version of the license
contains terms which differ from the Mozilla Public License and
Netscape Public License. (Filling in the name of the Initial
Developer, Original Code or Contributor in the notice described in
Exhibit A shall not of themselves be deemed to be modifications of
this License.)
7. DISCLAIMER OF WARRANTY.
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
8. TERMINATION.
8.1. This License and the rights granted hereunder will terminate
automatically if You fail to comply with terms herein and fail to cure
such breach within 30 days of becoming aware of the breach. All
sublicenses to the Covered Code which are properly granted shall
survive any termination of this License. Provisions which, by their
nature, must remain in effect beyond the termination of this License
shall survive.
8.2. If You initiate litigation by asserting a patent infringement
claim (excluding declatory judgment actions) against Initial Developer
or a Contributor (the Initial Developer or Contributor against whom
You file such action is referred to as "Participant") alleging that:
(a) such Participant's Contributor Version directly or indirectly
infringes any patent, then any and all rights granted by such
Participant to You under Sections 2.1 and/or 2.2 of this License
shall, upon 60 days notice from Participant terminate prospectively,
unless if within 60 days after receipt of notice You either: (i)
agree in writing to pay Participant a mutually agreeable reasonable
royalty for Your past and future use of Modifications made by such
Participant, or (ii) withdraw Your litigation claim with respect to
the Contributor Version against such Participant. If within 60 days
of notice, a reasonable royalty and payment arrangement are not
mutually agreed upon in writing by the parties or the litigation claim
is not withdrawn, the rights granted by Participant to You under
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
the 60 day notice period specified above.
(b) any software, hardware, or device, other than such Participant's
Contributor Version, directly or indirectly infringes any patent, then
any rights granted to You by such Participant under Sections 2.1(b)
and 2.2(b) are revoked effective as of the date You first made, used,
sold, distributed, or had made, Modifications made by that
Participant.
8.3. If You assert a patent infringement claim against Participant
alleging that such Participant's Contributor Version directly or
indirectly infringes any patent where such claim is resolved (such as
by license or settlement) prior to the initiation of patent
infringement litigation, then the reasonable value of the licenses
granted by such Participant under Sections 2.1 or 2.2 shall be taken
into account in determining the amount or value of any payment or
license.
8.4. In the event of termination under Sections 8.1 or 8.2 above,
all end user license agreements (excluding distributors and resellers)
which have been validly granted by You or any distributor hereunder
prior to termination shall survive termination.
9. LIMITATION OF LIABILITY.
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
10. U.S. GOVERNMENT END USERS.
The Covered Code is a "commercial item," as that term is defined in
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
software" and "commercial computer software documentation," as such
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
all U.S. Government End Users acquire Covered Code with only those
rights set forth herein.
11. MISCELLANEOUS.
This License represents the complete agreement concerning subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. This License shall be governed by
California law provisions (except to the extent applicable law, if
any, provides otherwise), excluding its conflict-of-law provisions.
With respect to disputes in which at least one party is a citizen of,
or an entity chartered or registered to do business in the United
States of America, any litigation relating to this License shall be
subject to the jurisdiction of the Federal Courts of the Northern
District of California, with venue lying in Santa Clara County,
California, with the losing party responsible for costs, including
without limitation, court costs and reasonable attorneys' fees and
expenses. The application of the United Nations Convention on
Contracts for the International Sale of Goods is expressly excluded.
Any law or regulation which provides that the language of a contract
shall be construed against the drafter shall not apply to this
License.
12. RESPONSIBILITY FOR CLAIMS.
As between Initial Developer and the Contributors, each party is
responsible for claims and damages arising, directly or indirectly,
out of its utilization of rights under this License and You agree to
work with Initial Developer and Contributors to distribute such
responsibility on an equitable basis. Nothing herein is intended or
shall be deemed to constitute any admission of liability.
13. MULTIPLE-LICENSED CODE.
Initial Developer may designate portions of the Covered Code as
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
Developer permits you to utilize portions of the Covered Code under
Your choice of the NPL or the alternative licenses, if any, specified
by the Initial Developer in the file described in Exhibit A.
EXHIBIT A -Mozilla Public License.
``The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS"
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.
The Original Code is ______________________________________.
The Initial Developer of the Original Code is ________________________.
Portions created by ______________________ are Copyright (C) ______
_______________________. All Rights Reserved.
Contributor(s): ______________________________________.
Alternatively, the contents of this file may be used under the terms
of the _____ license (the "[___] License"), in which case the
provisions of [______] License are applicable instead of those
above. If you wish to allow use of your version of this file only
under the terms of the [____] License and not to allow others to use
your version of this file under the MPL, indicate your decision by
deleting the provisions above and replace them with the notice and
other provisions required by the [___] License. If you do not delete
the provisions above, a recipient may use your version of this file
under either the MPL or the [___] License."
[NOTE: The text of this Exhibit A may differ slightly from the text of
the notices in the Source Code files of the Original Code. You should
use the text of this Exhibit A rather than the text found in the
Original Code Source Code for Your Modifications.]
cef
// Copyright (c) 2008-2020 Marshall A. Greenblatt. Portions Copyright (c)
// 2006-2009 Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cpprestsdk
C++ REST SDK
The MIT License (MIT)
Copyright (c) Microsoft Corporation
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
cuda
End User License Agreements (EULA)
DR-06739-001_v01_v11.7
|
May 2022
Preface
The Software License Agreement in Chapter 1 and the Supplement in Chapter 2 contain
license terms and conditions that govern the use of NVIDIA software. By accepting this
agreement, you agree to comply with all the terms and conditions applicable to the product(s)
included herein.
NVIDIA Driver
Description
This package contains the operating system driver and fundamental system software
components for NVIDIA GPUs.
NVIDIA CUDA Toolkit
Description
The NVIDIA CUDA Toolkit provides command-line and graphical tools for building, debugging
and optimizing the performance of applications accelerated by NVIDIA GPUs, runtime and
math libraries, and documentation including programming guides, user manuals, and API
references.
Default Install Location of CUDA Toolkit
Windows platform:
%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v#.#
Linux platform:
/usr/local/cuda-#.#
Mac platform:
/Developer/NVIDIA/CUDA-#.#
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | ii
Preface
NVIDIA CUDA Samples
Description
CUDA Samples are now located in https://github.com/nvidia/cuda-samples, which includes
instructions for obtaining, building, and running the samples. They are no longer included in
the CUDA toolkit.
NVIDIA Nsight Visual Studio Edition
(Windows only)
Description
NVIDIA Nsight Development Platform, Visual Studio Edition is a development environment
integrated into Microsoft Visual Studio that provides tools for debugging, profiling, analyzing
and optimizing your GPU computing and graphics applications.
Default Install Location of Nsight Visual Studio Edition
Windows platform:
%ProgramFiles(x86)%\NVIDIA Corporation\Nsight Visual Studio Edition #.#
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | iii
Preface
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | iv
Chapter 1.
License Agreement
for NVIDIA Software
Development Kits
Important Notice—Read before downloading, installing, copying or using the
licensed software:
This license agreement, including exhibits attached ("Agreement”) is a legal agreement
between you and NVIDIA Corporation ("NVIDIA") and governs your use of a NVIDIA software
development kit (“SDK”).
Each SDK has its own set of software and materials, but here is a description of the types
of items that may be included in a SDK: source code, header files, APIs, data sets and
assets (examples include images, textures, models, scenes, videos, native API input/output
files), binary software, sample code, libraries, utility programs, programming code and
documentation.
This Agreement can be accepted only by an adult of legal age of majority in the country in
which the SDK is used.
If you are entering into this Agreement on behalf of a company or other legal entity, you
represent that you have the legal authority to bind the entity to this Agreement, in which case
“you” will mean the entity you represent.
If you don’t have the required age or authority to accept this Agreement, or if you don’t accept
all the terms and conditions of this Agreement, do not download, install or use the SDK.
You agree to use the SDK only for purposes that are permitted by (a) this Agreement, and (b)
any applicable law, regulation or generally accepted practices or guidelines in the relevant
jurisdictions.
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 1
License Agreement for NVIDIA Software Development Kits
1.1.
License
1.1.1.
License Grant
Subject to the terms of this Agreement, NVIDIA hereby grants you a non-exclusive, nontransferable license, without the right to sublicense (except as expressly provided in this
Agreement) to:
1. Install and use the SDK,
2. Modify and create derivative works of sample source code delivered in the SDK, and
3. Distribute those portions of the SDK that are identified in this Agreement as distributable,
as incorporated in object code format into a software application that meets the
distribution requirements indicated in this Agreement.
1.1.2.
Distribution Requirements
These are the distribution requirements for you to exercise the distribution grant:
1. Your application must have material additional functionality, beyond the included portions
of the SDK.
2. The distributable portions of the SDK shall only be accessed by your application.
3. The following notice shall be included in modifications and derivative works of sample
source code distributed: “This software contains source code provided by NVIDIA
Corporation.”
4. Unless a developer tool is identified in this Agreement as distributable, it is delivered for
your internal use only.
5. The terms under which you distribute your application must be consistent with the terms
of this Agreement, including (without limitation) terms relating to the license grant and
license restrictions and protection of NVIDIA’s intellectual property rights. Additionally, you
agree that you will protect the privacy, security and legal rights of your application users.
6. You agree to notify NVIDIA in writing of any known or suspected distribution or use of the
SDK not in compliance with the requirements of this Agreement, and to enforce the terms
of your agreements with respect to distributed SDK.
1.1.3.
Authorized Users
You may allow employees and contractors of your entity or of your subsidiary(ies) to access
and use the SDK from your secure network to perform work on your behalf.
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 2
License Agreement for NVIDIA Software Development Kits
If you are an academic institution you may allow users enrolled or employed by the academic
institution to access and use the SDK from your secure network.
You are responsible for the compliance with the terms of this Agreement by your authorized
users. If you become aware that your authorized users didn’t follow the terms of this
Agreement, you agree to take reasonable steps to resolve the non-compliance and prevent
new occurrences.
1.1.4.
Pre-Release SDK
The SDK versions identified as alpha, beta, preview or otherwise as pre-release, may not
be fully functional, may contain errors or design flaws, and may have reduced or different
security, privacy, accessibility, availability, and reliability standards relative to commercial
versions of NVIDIA software and materials. Use of a pre-release SDK may result in unexpected
results, loss of data, project delays or other unpredictable damage or loss.
You may use a pre-release SDK at your own risk, understanding that pre-release SDKs are not
intended for use in production or business-critical systems.
NVIDIA may choose not to make available a commercial version of any pre-release SDK.
NVIDIA may also choose to abandon development and terminate the availability of a prerelease SDK at any time without liability.
1.1.5.
Updates
NVIDIA may, at its option, make available patches, workarounds or other updates to this SDK.
Unless the updates are provided with their separate governing terms, they are deemed part of
the SDK licensed to you as provided in this Agreement. You agree that the form and content of
the SDK that NVIDIA provides may change without prior notice to you. While NVIDIA generally
maintains compatibility between versions, NVIDIA may in some cases make changes that
introduce incompatibilities in future versions of the SDK.
1.1.6.
Components Under Other Licenses
The SDK may come bundled with, or otherwise include or be distributed with, NVIDIA or thirdparty components with separate legal notices or terms as may be described in proprietary
notices accompanying the SDK. If and to the extent there is a conflict between the terms
in this Agreement and the license terms associated with the component, the license terms
associated with the components control only to the extent necessary to resolve the conflict.
Subject to the other terms of this Agreement, you may use the SDK to develop and test
applications released under Open Source Initiative (OSI) approved open source software
licenses.
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 3
License Agreement for NVIDIA Software Development Kits
1.1.7.
Reservation of Rights
NVIDIA reserves all rights, title, and interest in and to the SDK, not expressly granted to you
under this Agreement.
1.2.
Limitations
The following license limitations apply to your use of the SDK:
1. You may not reverse engineer, decompile or disassemble, or remove copyright or other
proprietary notices from any portion of the SDK or copies of the SDK.
2. Except as expressly provided in this Agreement, you may not copy, sell, rent, sublicense,
transfer, distribute, modify, or create derivative works of any portion of the SDK. For
clarity, you may not distribute or sublicense the SDK as a stand-alone product.
3. Unless you have an agreement with NVIDIA for this purpose, you may not indicate that an
application created with the SDK is sponsored or endorsed by NVIDIA.
4. You may not bypass, disable, or circumvent any encryption, security, digital rights
management or authentication mechanism in the SDK.
5. You may not use the SDK in any manner that would cause it to become subject to an
open source software license. As examples, licenses that require as a condition of use,
modification, and/or distribution that the SDK be:
a). Disclosed or distributed in source code form;
b). Licensed for the purpose of making derivative works; or
c). Redistributable at no charge.
6. You acknowledge that the SDK as delivered is not tested or certified by NVIDIA for use in
connection with the design, construction, maintenance, and/or operation of any system
where the use or failure of such system could result in a situation that threatens the
safety of human life or results in catastrophic damages (each, a "Critical Application").
Examples of Critical Applications include use in avionics, navigation, autonomous vehicle
applications, ai solutions for automotive products, military, medical, life support or other
life critical applications. NVIDIA shall not be liable to you or any third party, in whole or
in part, for any claims or damages arising from such uses. You are solely responsible for
ensuring that any product or service developed with the SDK as a whole includes sufficient
features to comply with all applicable legal and regulatory standards and requirements.
7. You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their
respective employees, contractors, agents, officers and directors, from and against
any and all claims, damages, obligations, losses, liabilities, costs or debt, fines,
restitutions and expenses (including but not limited to attorney’s fees and costs incident to
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 4
License Agreement for NVIDIA Software Development Kits
establishing the right of indemnification) arising out of or related to products or services
that use the SDK in or for Critical Applications, and for use of the SDK outside of the scope
of this Agreement or not in compliance with its terms.
8. You may not reverse engineer, decompile or disassemble any portion of the output
generated using SDK elements for the purpose of translating such output artifacts to
target a non-NVIDIA platform.
1.3.
Ownership
1. NVIDIA or its licensors hold all rights, title and interest in and to the SDK and its
modifications and derivative works, including their respective intellectual property rights,
subject to your rights under Section 1.3.2. This SDK may include software and materials
from NVIDIA’s licensors, and these licensors are intended third party beneficiaries that
may enforce this Agreement with respect to their intellectual property rights.
2. You hold all rights, title and interest in and to your applications and your derivative works
of the sample source code delivered in the SDK, including their respective intellectual
property rights, subject to NVIDIA’s rights under Section 1.3.1.
3. You may, but don’t have to, provide to NVIDIA suggestions, feature requests or other
feedback regarding the SDK, including possible enhancements or modifications to the
SDK. For any feedback that you voluntarily provide, you hereby grant NVIDIA and its
affiliates a perpetual, non-exclusive, worldwide, irrevocable license to use, reproduce,
modify, license, sublicense (through multiple tiers of sublicensees), and distribute (through
multiple tiers of distributors) it without the payment of any royalties or fees to you. NVIDIA
will use feedback at its choice. NVIDIA is constantly looking for ways to improve its
products, so you may send feedback to NVIDIA through the developer portal at https://
developer.nvidia.com.
1.4.
No Warranties
THE SDK IS PROVIDED BY NVIDIA “AS IS” AND “WITH ALL FAULTS.” TO THE MAXIMUM
EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL
WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY,
INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR
A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS
THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE ON THE BASIS OF TRADE
USAGE, COURSE OF DEALING OR COURSE OF TRADE.
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 5
License Agreement for NVIDIA Software Development Kits
1.5.
Limitation of Liability
TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES SHALL NOT
BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR
ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS
OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THIS
AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK, WHETHER SUCH LIABILITY
ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY,
TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR
THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA’S AND ITS AFFILIATES TOTAL CUMULATIVE
LIABILITY UNDER OR ARISING OUT OF THIS AGREEMENT EXCEED US$10.00. THE NATURE
OF THE LIABILITY OR THE NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND
THIS LIMIT.
These exclusions and limitations of liability shall apply regardless if NVIDIA or its affiliates
have been advised of the possibility of such damages, and regardless of whether a remedy
fails its essential purpose. These exclusions and limitations of liability form an essential
basis of the bargain between the parties, and, absent any of these exclusions or limitations of
liability, the provisions of this Agreement, including, without limitation, the economic terms,
would be substantially different.
1.6.
Termination
1. This Agreement will continue to apply until terminated by either you or NVIDIA as
described below.
2. If you want to terminate this Agreement, you may do so by stopping to use the SDK.
3. NVIDIA may, at any time, terminate this Agreement if:
a). (i) you fail to comply with any term of this Agreement and the non-compliance is not
fixed within thirty (30) days following notice from NVIDIA (or immediately if you violate
NVIDIA’s intellectual property rights);
b). (ii) you commence or participate in any legal proceeding against NVIDIA with respect to
the SDK; or
c). (iii) NVIDIA decides to no longer provide the SDK in a country or, in NVIDIA’s sole
discretion, the continued use of it is no longer commercially viable.
4. Upon any termination of this Agreement, you agree to promptly discontinue use of the SDK
and destroy all copies in your possession or control. Your prior distributions in accordance
with this Agreement are not affected by the termination of this Agreement. Upon written
request, you will certify in writing that you have complied with your commitments under
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 6
License Agreement for NVIDIA Software Development Kits
this section. Upon any termination of this Agreement all provisions survive except for the
license grant provisions.
1.7.
General
If you wish to assign this Agreement or your rights and obligations, including by merger,
consolidation, dissolution or operation of law, contact NVIDIA to ask for permission. Any
attempted assignment not approved by NVIDIA in writing shall be void and of no effect. NVIDIA
may assign, delegate or transfer this Agreement and its rights and obligations, and if to a nonaffiliate you will be notified.
You agree to cooperate with NVIDIA and provide reasonably requested information to verify
your compliance with this Agreement.
This Agreement will be governed in all respects by the laws of the United States and of the
State of Delaware as those laws are applied to contracts entered into and performed entirely
within Delaware by Delaware residents, without regard to the conflicts of laws principles.
The United Nations Convention on Contracts for the International Sale of Goods is specifically
disclaimed. You agree to all terms of this Agreement in the English language.
The state or federal courts residing in Santa Clara County, California shall have exclusive
jurisdiction over any dispute or claim arising out of this Agreement. Notwithstanding this, you
agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type
of urgent legal relief in any jurisdiction.
If any court of competent jurisdiction determines that any provision of this Agreement is
illegal, invalid or unenforceable, such provision will be construed as limited to the extent
necessary to be consistent with and fully enforceable under the law and the remaining
provisions will remain in full force and effect. Unless otherwise specified, remedies are
cumulative.
Each party acknowledges and agrees that the other is an independent contractor in the
performance of this Agreement.
The SDK has been developed entirely at private expense and is “commercial items” consisting
of “commercial computer software” and “commercial computer software documentation”
provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government
or a U.S. Government subcontractor is subject to the restrictions in this Agreement pursuant
to DFARS 227.7202-3(a) or as set forth in subparagraphs (c)(1) and (2) of the Commercial
Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/
manufacturer is NVIDIA, 2788 San Tomas Expressway, Santa Clara, CA 95051.
The SDK is subject to United States export laws and regulations. You agree that you will not
ship, transfer or export the SDK into any country, or use the SDK in any manner, prohibited
by the United States Bureau of Industry and Security or economic sanctions regulations
administered by the U.S. Department of Treasury’s Office of Foreign Assets Control (OFAC),
or any applicable export laws, restrictions or regulations. These laws include restrictions on
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 7
License Agreement for NVIDIA Software Development Kits
destinations, end users and end use. By accepting this Agreement, you confirm that you are
not a resident or citizen of any country currently embargoed by the U.S. and that you are not
otherwise prohibited from receiving the SDK.
Any notice delivered by NVIDIA to you under this Agreement will be delivered via mail, email
or fax. You agree that any notices that NVIDIA sends you electronically will satisfy any legal
communication requirements. Please direct your legal notices or other correspondence to
NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States
of America, Attention: Legal Department.
This Agreement and any exhibits incorporated into this Agreement constitute the entire
agreement of the parties with respect to the subject matter of this Agreement and supersede
all prior negotiations or documentation exchanged between the parties relating to this SDK
license. Any additional and/or conflicting terms on documents issued by you are null, void,
and invalid. Any amendment or waiver under this Agreement shall be in writing and signed by
representatives of both parties.
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 8
Chapter 2.
CUDA Toolkit Supplement
to Software License
Agreement for NVIDIA
Software Development Kits
The terms in this supplement govern your use of the NVIDIA CUDA Toolkit SDK under the
terms of your license agreement (“Agreement”) as modified by this supplement. Capitalized
terms used but not defined below have the meaning assigned to them in the Agreement.
This supplement is an exhibit to the Agreement and is incorporated as an integral part of the
Agreement. In the event of conflict between the terms in this supplement and the terms in the
Agreement, the terms in this supplement govern.
2.1.
License Scope
The SDK is licensed for you to develop applications only for use in systems with NVIDIA GPUs.
2.2.
Distribution
The portions of the SDK that are distributable under the Agreement are listed in Attachment A.
2.3.
Operating Systems
Those portions of the SDK designed exclusively for use on the Linux or FreeBSD operating
systems, or other operating systems derived from the source code to these operating systems,
may be copied and redistributed for use in accordance with this Agreement, provided that the
object code files are not modified in any way (except for unzipping of compressed files).
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 9
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
2.4.
Audio and Video Encoders and
Decoders
You acknowledge and agree that it is your sole responsibility to obtain any additional thirdparty licenses required to make, have made, use, have used, sell, import, and offer for sale
your products or services that include or incorporate any third-party software and content
relating to audio and/or video encoders and decoders from, including but not limited to,
Microsoft, Thomson, Fraunhofer IIS, Sisvel S.p.A., MPEG-LA, and Coding Technologies. NVIDIA
does not grant to you under this Agreement any necessary patent or other rights with respect
to any audio and/or video encoders and decoders.
2.5.
Licensing
If the distribution terms in this Agreement are not suitable for your organization, or for any
questions regarding this Agreement, please contact NVIDIA at nvidia-compute-licensequestions@nvidia.com.
2.6.
Attachment A
The following CUDA Toolkit files may be distributed with Licensee Applications developed
by you, including certain variations of these files that have version number or architecture
specific information embedded in the file name - as an example only, for release version 9.0 of
the 64-bit Windows software, the file cudart64_90.dll is redistributable.
Component
CUDA Runtime
Windows
cudart.dll, cudart_static.lib, cudadevrt.lib
Mac OSX
libcudart.dylib, libcudart_static.a, libcudadevrt.a
Linux
libcudart.so, libcudart_static.a, libcudadevrt.a
Android
libcudart.so, libcudart_static.a, libcudadevrt.a
Component
CUDA FFT Library
Windows
cufft.dll, cufftw.dll, cufft.lib, cufftw.lib
Mac OSX
libcufft.dylib, libcufft_static.a, libcufftw.dylib,
libcufftw_static.a
Linux
libcufft.so, libcufft_static.a, libcufftw.so,
libcufftw_static.a
Android
libcufft.so, libcufft_static.a, libcufftw.so,
libcufftw_static.a
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 10
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
Component
CUDA BLAS Library
Windows
cublas.dll, cublasLt.dll
Mac OSX
libcublas.dylib, libcublasLt.dylib,
libcublas_static.a, libcublasLt_static.a
Linux
libcublas.so, libcublasLt.so, libcublas_static.a,
libcublasLt_static.a
Android
libcublas.so, libcublasLt.so, libcublas_static.a,
libcublasLt_static.a
Component
NVIDIA "Drop-in" BLAS Library
Windows
nvblas.dll
Mac OSX
libnvblas.dylib
Linux
libnvblas.so
Component
CUDA Sparse Matrix Library
Windows
cusparse.dll, cusparse.lib
Mac OSX
libcusparse.dylib, libcusparse_static.a
Linux
libcusparse.so, libcusparse_static.a
Android
libcusparse.so, libcusparse_static.a
Component
CUDA Linear Solver Library
Windows
cusolver.dll, cusolver.lib
Mac OSX
libcusolver.dylib, libcusolver_static.a
Linux
libcusolver.so, libcusolver_static.a
Android
libcusolver.so, libcusolver_static.a
Component
CUDA Random Number Generation Library
Windows
curand.dll, curand.lib
Mac OSX
libcurand.dylib, libcurand_static.a
Linux
libcurand.so, libcurand_static.a
Android
libcurand.so, libcurand_static.a
Component
NVIDIA Performance Primitives Library
Windows
nppc.dll, nppc.lib, nppial.dll, nppial.lib, nppicc.dll,
nppicc.lib, nppicom.dll, nppicom.lib, nppidei.dll,
nppidei.lib, nppif.dll, nppif.lib, nppig.dll, nppig.lib,
nppim.dll, nppim.lib, nppist.dll, nppist.lib,
nppisu.dll, nppisu.lib, nppitc.dll, nppitc.lib,
npps.dll, npps.lib
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 11
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
Mac OSX
libnppc.dylib, libnppc_static.a, libnppial.dylib,
libnppial_static.a, libnppicc.dylib,
libnppicc_static.a, libnppicom.dylib,
libnppicom_static.a, libnppidei.dylib,
libnppidei_static.a, libnppif.dylib, libnppif_static.a,
libnppig.dylib, libnppig_static.a, libnppim.dylib,
libnppisu_static.a, libnppitc.dylib,
libnppitc_static.a, libnpps.dylib, libnpps_static.a
Linux
libnppc.so, libnppc_static.a, libnppial.so,
libnppial_static.a, libnppicc.so, libnppicc_static.a,
libnppicom.so, libnppicom_static.a, libnppidei.so,
libnppidei_static.a, libnppif.so, libnppif_static.a
libnppig.so, libnppig_static.a, libnppim.so,
libnppim_static.a, libnppist.so, libnppist_static.a,
libnppisu.so, libnppisu_static.a, libnppitc.so
libnppitc_static.a, libnpps.so, libnpps_static.a
Android
libnppc.so, libnppc_static.a, libnppial.so,
libnppial_static.a, libnppicc.so, libnppicc_static.a,
libnppicom.so, libnppicom_static.a, libnppidei.so,
libnppidei_static.a, libnppif.so, libnppif_static.a
libnppig.so, libnppig_static.a, libnppim.so,
libnppim_static.a, libnppist.so, libnppist_static.a,
libnppisu.so, libnppisu_static.a, libnppitc.so
libnppitc_static.a, libnpps.so, libnpps_static.a
Component
NVIDIA JPEG Library
Windows
nvjpeg.lib, nvjpeg.dll
Linux
libnvjpeg.so, libnvjpeg_static.a
Component
Internal common library required for statically
linking to cuBLAS, cuSPARSE, cuFFT, cuRAND,
nvJPEG and NPP
Mac OSX
libculibos.a
Linux
libculibos.a
Component
NVIDIA Runtime Compilation Library and Header
All
nvrtc.h
Windows
nvrtc.dll, nvrtc-builtins.dll
Mac OSX
libnvrtc.dylib, libnvrtc-builtins.dylib
Linux
libnvrtc.so, libnvrtc-builtins.so
Component
NVIDIA Optimizing Compiler Library
Windows
nvvm.dll
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 12
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
Mac OSX
libnvvm.dylib
Linux
libnvvm.so
Component
NVIDIA Common Device Math Functions Library
Windows
libdevice.10.bc
Mac OSX
libdevice.10.bc
Linux
libdevice.10.bc
Component
CUDA Occupancy Calculation Header Library
All
cuda_occupancy.h
Component
CUDA Half Precision Headers
All
cuda_fp16.h, cuda_fp16.hpp
Component
CUDA Profiling Tools Interface (CUPTI) Library
Windows
cupti.dll
Mac OSX
libcupti.dylib
Linux
libcupti.so
Component
NVIDIA Tools Extension Library
Windows
nvToolsExt.dll, nvToolsExt.lib
Mac OSX
libnvToolsExt.dylib
Linux
libnvToolsExt.so
Component
NVIDIA CUDA Driver Libraries
Linux
libcuda.so, libnvidia-ptxjitcompiler.so
Component
NVIDIA CUDA File IO Libraries and Header
All
cufile.h
Linux
libcufile.so, libcufile_rdma.so, libcufile_static.a,
libcufile_rdma_static.a
The NVIDIA CUDA Driver Libraries are only distributable in applications that meet this criteria:
1. The application was developed starting from a NVIDIA CUDA container obtained from
Docker Hub or the NVIDIA GPU Cloud, and
2. The resulting application is packaged as a Docker container and distributed to users on
Docker Hub or the NVIDIA GPU Cloud only.
In addition to the rights above, for parties that are developing software intended solely for use
on Jetson development kits or Jetson modules, and running Linux for Tegra software, the
following shall apply:
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 13
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
‣ The SDK may be distributed in its entirety, as provided by NVIDIA, and without separation
of its components, for you and/or your licensees to create software development kits for
use only on the Jetson platform and running Linux for Tegra software.
2.7.
Attachment B
Additional Licensing Obligations
The following third party components included in the SOFTWARE are licensed to Licensee
pursuant to the following terms and conditions:
1. Licensee's use of the GDB third party component is subject to the terms and conditions of
GNU GPL v3:
This product includes copyrighted third-party software licensed
under the terms of the GNU General Public License v3 ("GPL v3").
All third-party software packages are copyright by their respective
authors. GPL v3 terms and conditions are hereby incorporated into
the Agreement by this reference: http://www.gnu.org/licenses/gpl.txt
Consistent with these licensing requirements, the software listed below is provided
under the terms of the specified open source software licenses. To obtain source code
for software provided under licenses that require redistribution of source code, including
the GNU General Public License (GPL) and GNU Lesser General Public License (LGPL),
contact oss-requests@nvidia.com. This offer is valid for a period of three (3) years from the
date of the distribution of this product by NVIDIA CORPORATION.
Component
CUDA-GDB
License
GPL v3
2. Licensee represents and warrants that any and all third party licensing and/or royalty
payment obligations in connection with Licensee's use of the H.264 video codecs are solely
the responsibility of Licensee.
3. Licensee's use of the Thrust library is subject to the terms and conditions of the Apache
License Version 2.0. All third-party software packages are copyright by their respective
authors. Apache License Version 2.0 terms and conditions are hereby incorporated into the
Agreement by this reference. http://www.apache.org/licenses/LICENSE-2.0.html
In addition, Licensee acknowledges the following notice: Thrust includes source code from
the Boost Iterator, Tuple, System, and Random Number libraries.
Boost Software License - Version 1.0 - August 17th, 2003
. . . .
Permission is hereby granted, free of charge, to any person or
organization obtaining a copy of the software and accompanying
documentation covered by this license (the "Software") to use,
reproduce, display, distribute, execute, and transmit the Software,
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 14
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
and to prepare derivative works of the Software, and to permit
third-parties to whom the Software is furnished to do so, all
subject to the following:
The copyright notices in the Software and this entire statement,
including the above license grant, this restriction and the following
disclaimer, must be included in all copies of the Software, in whole
or in part, and all derivative works of the Software, unless such
copies or derivative works are solely in the form of machine-executable
object code generated by a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR
OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
4. Licensee's use of the LLVM third party component is subject to the following terms and
conditions:
======================================================
LLVM Release License
======================================================
University of Illinois/NCSA
Open Source License
Copyright (c) 2003-2010 University of Illinois at Urbana-Champaign.
All rights reserved.
Developed by:
LLVM Team
University of Illinois at Urbana-Champaign
http://llvm.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal with the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
*
Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimers.
*
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimers in the
documentation and/or other materials provided with the distribution.
*
Neither the names of the LLVM Team, University of Illinois at UrbanaChampaign, nor the names of its contributors may be used to endorse or
promote products derived from this Software without specific prior
written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 15
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
DEALINGS WITH THE SOFTWARE.
5. Licensee's use of the PCRE third party component is subject to the following terms and
conditions:
-----------PCRE LICENCE
-----------PCRE is a library of functions to support regular expressions whose syntax
and semantics are as close as possible to those of the Perl 5 language.
Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
specified below. The documentation for PCRE, supplied in the "doc"
directory, is distributed under the same terms as the software itself. The
basic library functions are written in C and are freestanding. Also
included in the distribution is a set of C++ wrapper functions, and a justin-time compiler that can be used to optimize pattern matching. These are
both optional features that can be omitted when the library is built.
THE BASIC LIBRARY FUNCTIONS
--------------------------Written by:
Philip Hazel
Email local part: ph10
Email domain:
cam.ac.uk
University of Cambridge Computing Service,
Cambridge, England.
Copyright (c) 1997-2012 University of Cambridge
All rights reserved.
PCRE JUST-IN-TIME COMPILATION SUPPORT
------------------------------------Written by:
Zoltan Herczeg
Email local part: hzmester
Emain domain:
freemail.hu
Copyright(c) 2010-2012 Zoltan Herczeg
All rights reserved.
STACK-LESS JUST-IN-TIME COMPILER
-------------------------------Written by:
Zoltan Herczeg
Email local part: hzmester
Emain domain:
freemail.hu
Copyright(c) 2009-2012 Zoltan Herczeg
All rights reserved.
THE C++ WRAPPER FUNCTIONS
------------------------Contributed by:
Google Inc.
Copyright (c) 2007-2012, Google Inc.
All rights reserved.
THE "BSD" LICENCE
----------------Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the name of Google
Inc. nor the names of their contributors may be used to endorse or
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 16
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
6. Some of the cuBLAS library routines were written by or derived from code written by Vasily
Volkov and are subject to the Modified Berkeley Software Distribution License as follows:
Copyright (c) 2007-2009, Regents of the University of California
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the University of California, Berkeley nor
the names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
7. Some of the cuBLAS library routines were written by or derived from code written by
Davide Barbieri and are subject to the Modified Berkeley Software Distribution License as
follows:
Copyright (c) 2008-2009 Davide Barbieri @ University of Rome Tor Vergata.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 17
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
disclaimer in the documentation and/or other materials provided
with the distribution.
* The name of the author may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
8. Some of the cuBLAS library routines were derived from code developed by the University
of Tennessee and are subject to the Modified Berkeley Software Distribution License as
follows:
Copyright (c) 2010 The University of Tennessee.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer listed in this license in the documentation and/or
other materials provided with the distribution.
* Neither the name of the copyright holders nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9. Some of the cuBLAS library routines were written by or derived from code written by
Jonathan Hogg and are subject to the Modified Berkeley Software Distribution License as
follows:
Copyright (c) 2012, The Science and Technology Facilities Council (STFC).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 18
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the STFC nor the names of its contributors
may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE STFC BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10.Some of the cuBLAS library routines were written by or derived from code written by
Ahmad M. Abdelfattah, David Keyes, and Hatem Ltaief, and are subject to the Apache
License, Version 2.0, as follows:
-- (C) Copyright 2013 King Abdullah University of Science and Technology
Authors:
Ahmad Abdelfattah (ahmad.ahmad@kaust.edu.sa)
David Keyes (david.keyes@kaust.edu.sa)
Hatem Ltaief (hatem.ltaief@kaust.edu.sa)
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the King Abdullah University of Science and
Technology nor the names of its contributors may be used to endorse
or promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
11.Some of the cuSPARSE library routines were written by or derived from code written by LiWen Chang and are subject to the NCSA Open Source License as follows:
Copyright (c) 2012, University of Illinois.
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 19
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
All rights reserved.
Developed by: IMPACT Group, University of Illinois, http://
impact.crhc.illinois.edu
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal with the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimers in the documentation and/or other materials provided
with the distribution.
* Neither the names of IMPACT Group, University of Illinois, nor
the names of its contributors may be used to endorse or promote
products derived from this Software without specific prior
written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.
12.Some of the cuRAND library routines were written by or derived from code written by
Mutsuo Saito and Makoto Matsumoto and are subject to the following license:
Copyright (c) 2009, 2010 Mutsuo Saito, Makoto Matsumoto and Hiroshima
University. All rights reserved.
Copyright (c) 2011 Mutsuo Saito, Makoto Matsumoto, Hiroshima
University and University of Tokyo. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Hiroshima University nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 20
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13.Some of the cuRAND library routines were derived from code developed by D. E. Shaw
Research and are subject to the following license:
Copyright 2010-2011, D. E. Shaw Research.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions, and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions, and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of D. E. Shaw Research nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14.Some of the Math library routines were written by or derived from code developed by
Norbert Juffa and are subject to the following license:
Copyright (c) 2015-2017, Norbert Juffa
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 21
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
15.Licensee's use of the lz4 third party component is subject to the following terms and
conditions:
Copyright (C) 2011-2013, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16.The NPP library uses code from the Boost Math Toolkit, and is subject to the following
license:
Boost Software License - Version 1.0 - August 17th, 2003
. . . .
Permission is hereby granted, free of charge, to any person or
organization obtaining a copy of the software and accompanying
documentation covered by this license (the "Software") to use,
reproduce, display, distribute, execute, and transmit the Software,
and to prepare derivative works of the Software, and to permit
third-parties to whom the Software is furnished to do so, all
subject to the following:
The copyright notices in the Software and this entire statement,
including the above license grant, this restriction and the following
disclaimer, must be included in all copies of the Software, in whole
or in part, and all derivative works of the Software, unless such
copies or derivative works are solely in the form of machine-executable
object code generated by a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR
OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
17.Portions of the Nsight Eclipse Edition is subject to the following license:
The Eclipse Foundation makes available all content in this plug-in
("Content"). Unless otherwise indicated below, the Content is provided
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 22
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
to you under the terms and conditions of the Eclipse Public License
Version 1.0 ("EPL"). A copy of the EPL is available at http://
www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program"
will mean the Content.
If you did not receive this Content directly from the Eclipse
Foundation, the Content is being redistributed by another party
("Redistributor") and different terms and conditions may apply to your
use of any object code in the Content. Check the Redistributor's
license that was provided with the Content. If no such license exists,
contact the Redistributor. Unless otherwise indicated below, the terms
and conditions of the EPL still apply to any source code in the
Content and such source code may be obtained at http://www.eclipse.org.
18.Some of the cuBLAS library routines uses code from OpenAI, which is subject to the
following license:
License URL
https://github.com/openai/openai-gemm/blob/master/LICENSE
License Text
The MIT License
Copyright (c) 2016 OpenAI (http://openai.com), 2016 Google Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
19.Licensee's use of the Visual Studio Setup Configuration Samples is subject to the following
license:
The MIT License (MIT)
Copyright (C) Microsoft Corporation. All rights reserved.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 23
CUDA Toolkit Supplement to Software License Agreement for NVIDIA Software Development Kits
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
20.Licensee's use of linmath.h header for CPU functions for GL vector/matrix operations
from lunarG is subject to the Apache License Version 2.0.
21.The DX12-CUDA sample uses the d3dx12.h header, which is subject to the MIT license .
End User License Agreements (EULA)
DR-06739-001_v01_v11.7 | 24
drm
Copyright © 2017-2018 Intel Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
dbus
License: AFL-2.1
The Academic Free License
v. 2.1
.
This Academic Free License (the "License") applies to any original
work of authorship (the "Original Work") whose owner (the "Licensor")
has placed the following notice immediately following the copyright
notice for the Original Work:
.
Licensed under the Academic Free License version 2.1
.
1) Grant of Copyright License. Licensor hereby grants You a
world-wide, royalty-free, non-exclusive, perpetual, sublicenseable
license to do the following:
.
a) to reproduce the Original Work in copies;
.
b) to prepare derivative works ("Derivative Works") based upon the
Original Work;
.
c) to distribute copies of the Original Work and Derivative Works to
the public;
.
d) to perform the Original Work publicly; and
.
e) to display the Original Work publicly.
.
2) Grant of Patent License. Licensor hereby grants You a world-wide,
royalty-free, non-exclusive, perpetual, sublicenseable license, under
patent claims owned or controlled by the Licensor that are embodied in
the Original Work as furnished by the Licensor, to make, use, sell and
offer for sale the Original Work and Derivative Works.
.
3) Grant of Source Code License. The term "Source Code" means the
preferred form of the Original Work for making modifications to it and
all available documentation describing how to modify the Original
Work. Licensor hereby agrees to provide a machine-readable copy of the
Source Code of the Original Work along with each copy of the Original
Work that Licensor distributes. Licensor reserves the right to satisfy
this obligation by placing a machine-readable copy of the Source Code
in an information repository reasonably calculated to permit
inexpensive and convenient access by You for as long as Licensor
continues to distribute the Original Work, and by publishing the
address of that information repository in a notice immediately
following the copyright notice that applies to the Original Work.
.
4) Exclusions From License Grant. Neither the names of Licensor, nor
the names of any contributors to the Original Work, nor any of their
trademarks or service marks, may be used to endorse or promote
products derived from this Original Work without express prior written
permission of the Licensor. Nothing in this License shall be deemed to
grant any rights to trademarks, copyrights, patents, trade secrets or
any other intellectual property of Licensor except as expressly stated
herein. No patent license is granted to make, use, sell or offer to
sell embodiments of any patent claims other than the licensed claims
defined in Section 2. No right is granted to the trademarks of
Licensor even if such marks are included in the Original Work. Nothing
in this License shall be interpreted to prohibit Licensor from
licensing under different terms from this License any Original Work
that Licensor otherwise would have a right to license.
.
5) This section intentionally omitted.
.
6) Attribution Rights. You must retain, in the Source Code of any
Derivative Works that You create, all copyright, patent or trademark
notices from the Source Code of the Original Work, as well as any
notices of licensing and any descriptive text identified therein as an
"Attribution Notice." You must cause the Source Code for any
Derivative Works that You create to carry a prominent Attribution
Notice reasonably calculated to inform recipients that You have
modified the Original Work.
.
7) Warranty of Provenance and Disclaimer of Warranty. Licensor
warrants that the copyright in and to the Original Work and the patent
rights granted herein by Licensor are owned by the Licensor or are
sublicensed to You under the terms of this License with the permission
of the contributor(s) of those copyrights and patent rights. Except as
expressly stated in the immediately proceeding sentence, the Original
Work is provided under this License on an "AS IS" BASIS and WITHOUT
WARRANTY, either express or implied, including, without limitation,
the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL
WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential
part of this License. No license to Original Work is granted hereunder
except under this disclaimer.
.
8) Limitation of Liability. Under no circumstances and under no legal
theory, whether in tort (including negligence), contract, or
otherwise, shall the Licensor be liable to any person for any direct,
indirect, special, incidental, or consequential damages of any
character arising as a result of this License or the use of the
Original Work including, without limitation, damages for loss of
goodwill, work stoppage, computer failure or malfunction, or any and
all other commercial damages or losses. This limitation of liability
shall not apply to liability for death or personal injury resulting
from Licensor's negligence to the extent applicable law prohibits such
limitation. Some jurisdictions do not allow the exclusion or
limitation of incidental or consequential damages, so this exclusion
and limitation may not apply to You.
.
9) Acceptance and Termination. If You distribute copies of the
Original Work or a Derivative Work, You must make a reasonable effort
under the circumstances to obtain the express assent of recipients to
the terms of this License. Nothing else but this License (or another
written agreement between Licensor and You) grants You permission to
create Derivative Works based upon the Original Work or to exercise
any of the rights granted in Section 1 herein, and any attempt to do
so except under the terms of this License (or another written
agreement between Licensor and You) is expressly prohibited by
U.S. copyright law, the equivalent laws of other countries, and by
international treaty. Therefore, by exercising any of the rights
granted to You in Section 1 herein, You indicate Your acceptance of
this License and all of its terms and conditions.
.
10) Termination for Patent Action. This License shall terminate
automatically and You may no longer exercise any of the rights granted
to You by this License as of the date You commence an action,
including a cross-claim or counterclaim, against Licensor or any
licensee alleging that the Original Work infringes a patent. This
termination provision shall not apply for an action alleging patent
infringement by combinations of the Original Work with other software
or hardware.
.
11) Jurisdiction, Venue and Governing Law. Any action or suit relating
to this License may be brought only in the courts of a jurisdiction
wherein the Licensor resides or in which Licensor conducts its primary
business, and under the laws of that jurisdiction excluding its
conflict-of-law provisions. The application of the United Nations
Convention on Contracts for the International Sale of Goods is
expressly excluded. Any use of the Original Work outside the scope of
this License or after its termination shall be subject to the
requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101
et seq., the equivalent laws of other countries, and international
treaty. This section shall survive the termination of this License.
.
12) Attorneys Fees. In any action to enforce the terms of this License
or seeking damages relating thereto, the prevailing party shall be
entitled to recover its costs and expenses, including, without
limitation, reasonable attorneys' fees and costs incurred in
connection with such action, including any appeal of such action. This
section shall survive the termination of this License.
.
13) Miscellaneous. This License represents the complete agreement
concerning the subject matter hereof. If any provision of this License
is held to be unenforceable, such provision shall be reformed only to
the extent necessary to make it enforceable.
.
14) Definition of "You" in This License. "You" throughout this
License, whether in upper or lower case, means an individual or a
legal entity exercising rights under, and complying with all of the
terms of, this License. For legal entities, "You" includes any entity
that controls, is controlled by, or is under common control with
you. For purposes of this definition, "control" means (i) the power,
direct or indirect, to cause the direction or management of such
entity, whether by contract or otherwise, or (ii) ownership of fifty
percent (50%) or more of the outstanding shares, or (iii) beneficial
ownership of such entity.
.
15) Right to Use. You may use the Original Work in all ways not
otherwise restricted or conditioned by this License or by law, and
Licensor promises not to interfere with or be responsible for such
uses by You.
.
This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights
reserved. Permission is hereby granted to copy and distribute this
license without modification. This license may not be modified without
the express written permission of its copyright owner.
ebur128
Copyright (c) 2011 Jan Kokemüller
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
efp
MIT License
Copyright (c) 2020 Edgeware AB
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
efpbond
Copyright (c) 2019-2020 Edgeware AB, Agile Content 2021-2022
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
expat
Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper
Copyright (c) 2001-2022 Expat maintainers
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
fdk-aac
Software License for The Fraunhofer FDK AAC Codec Library for Android
© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
scheme for digital audio. This FDK AAC Codec software is intended to be used on
a wide variety of Android devices.
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
general perceptual audio codecs. AAC-ELD is considered the best-performing
full-bandwidth communications codec by independent studies and is widely
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
specifications.
Patent licenses for necessary patent claims for the FDK AAC Codec (including
those of Fraunhofer) may be obtained through Via Licensing
(www.vialicensing.com) or through the respective patent owners individually for
the purpose of encoding or decoding bit streams in products that are compliant
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
Android devices already license these patent claims through Via Licensing or
directly from the patent owners, and therefore FDK AAC Codec software may
already be covered under those patent licenses when it is used for those
licensed purposes only.
Commercially-licensed AAC software libraries, including floating-point versions
with enhanced sound quality, are also available from Fraunhofer. Users are
encouraged to check the Fraunhofer website for additional applications
information and documentation.
2. COPYRIGHT LICENSE
Redistribution and use in source and binary forms, with or without modification,
are permitted without payment of copyright license fees provided that you
satisfy the following conditions:
You must retain the complete text of this software license in redistributions of
the FDK AAC Codec or your modifications thereto in source code form.
You must retain the complete text of this software license in the documentation
and/or other materials provided with redistributions of the FDK AAC Codec or
your modifications thereto in binary form. You must make available free of
charge copies of the complete source code of the FDK AAC Codec and your
modifications thereto to recipients of copies in binary form.
The name of Fraunhofer may not be used to endorse or promote products derived
from this library without prior written permission.
You may not charge copyright license fees for anyone to use, copy or distribute
the FDK AAC Codec software or your modifications thereto.
Your modified versions of the FDK AAC Codec must carry prominent notices stating
that you changed the software and the date of any change. For modified versions
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
AAC Codec Library for Android."
3. NO PATENT LICENSE
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
Fraunhofer provides no warranty of patent non-infringement with respect to this
software.
You may use this FDK AAC Codec software or modifications thereto only for
purposes that are authorized by appropriate patent licenses.
4. DISCLAIMER
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
including but not limited to the implied warranties of merchantability and
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
or consequential damages, including but not limited to procurement of substitute
goods or services; loss of use, data, or profits, or business interruption,
however caused and on any theory of liability, whether in contract, strict
liability, or tort (including negligence), arising in any way out of the use of
this software, even if advised of the possibility of such damage.
5. CONTACT INFORMATION
Fraunhofer Institute for Integrated Circuits IIS
Attention: Audio and Multimedia Departments - FDK AAC LL
Am Wolfsmantel 33
91058 Erlangen, Germany
www.iis.fraunhofer.de/amm
amm-info@iis.fraunhofer.de
ffmpeg
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
fmtlib
Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--- Optional exception to the license ---
As an exception, if, as a result of your compiling your source code, portions
of this Software are embedded into a machine-executable object form of such
source code, you may redistribute such embedded portions in such object form
without including the above copyright and permission notices.
fontconfig
This package was debianized by Colin Walters <walters@debian.org> on
Sun, 13 Oct 2002 15:01:50 -0400
It was downloaded from http://www.fontconfig.org/
Upstream Author: Keith Packard
Copyright:
Copyright © 2001,2003 Keith Packard
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Keith Packard not be used in
advertising or publicity pertaining to distribution of the software without
specific, written prior permission. Keith Packard makes no
representations about the suitability of this software for any purpose. It
is provided "as is" without express or implied warranty.
KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
freetype
The FreeType Project LICENSE
----------------------------
2006-Jan-27
Copyright 1996-2002, 2006 by
David Turner, Robert Wilhelm, and Werner Lemberg
Introduction
============
The FreeType Project is distributed in several archive packages;
some of them may contain, in addition to the FreeType font engine,
various tools and contributions which rely on, or relate to, the
FreeType Project.
This license applies to all files found in such packages, and
which do not fall under their own explicit license. The license
affects thus the FreeType font engine, the test programs,
documentation and makefiles, at the very least.
This license was inspired by the BSD, Artistic, and IJG
(Independent JPEG Group) licenses, which all encourage inclusion
and use of free software in commercial and freeware products
alike. As a consequence, its main points are that:
o We don't promise that this software works. However, we will be
interested in any kind of bug reports. (`as is' distribution)
o You can use this software for whatever you want, in parts or
full form, without having to pay us. (`royalty-free' usage)
o You may not pretend that you wrote this software. If you use
it, or only parts of it, in a program, you must acknowledge
somewhere in your documentation that you have used the
FreeType code. (`credits')
We specifically permit and encourage the inclusion of this
software, with or without modifications, in commercial products.
We disclaim all warranties covering The FreeType Project and
assume no liability related to The FreeType Project.
Finally, many people asked us for a preferred form for a
credit/disclaimer to use in compliance with this license. We thus
encourage you to use the following text:
"""
Portions of this software are copyright © <year> The FreeType
Project (www.freetype.org). All rights reserved.
"""
Please replace <year> with the value from the FreeType version you
actually use.
Legal Terms
===========
0. Definitions
--------------
Throughout this license, the terms `package', `FreeType Project',
and `FreeType archive' refer to the set of files originally
distributed by the authors (David Turner, Robert Wilhelm, and
Werner Lemberg) as the `FreeType Project', be they named as alpha,
beta or final release.
`You' refers to the licensee, or person using the project, where
`using' is a generic term including compiling the project's source
code as well as linking it to form a `program' or `executable'.
This program is referred to as `a program using the FreeType
engine'.
This license applies to all files distributed in the original
FreeType Project, including all source code, binaries and
documentation, unless otherwise stated in the file in its
original, unmodified form as distributed in the original archive.
If you are unsure whether or not a particular file is covered by
this license, you must contact us to verify this.
The FreeType Project is copyright (C) 1996-2000 by David Turner,
Robert Wilhelm, and Werner Lemberg. All rights reserved except as
specified below.
1. No Warranty
--------------
THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO
USE, OF THE FREETYPE PROJECT.
2. Redistribution
-----------------
This license grants a worldwide, royalty-free, perpetual and
irrevocable right and license to use, execute, perform, compile,
display, copy, create derivative works of, distribute and
sublicense the FreeType Project (in both source and object code
forms) and derivative works thereof for any purpose; and to
authorize others to exercise some or all of the rights granted
herein, subject to the following conditions:
o Redistribution of source code must retain this license file
(`FTL.TXT') unaltered; any additions, deletions or changes to
the original files must be clearly indicated in accompanying
documentation. The copyright notices of the unaltered,
original files must be preserved in all copies of source
files.
o Redistribution in binary form must provide a disclaimer that
states that the software is based in part of the work of the
FreeType Team, in the distribution documentation. We also
encourage you to put an URL to the FreeType web page in your
documentation, though this isn't mandatory.
These conditions apply to any software derived from or based on
the FreeType Project, not just the unmodified files. If you use
our work, you must acknowledge us. However, no fee need be paid
to us.
3. Advertising
--------------
Neither the FreeType authors and contributors nor you shall use
the name of the other for commercial, advertising, or promotional
purposes without specific prior written permission.
We suggest, but do not require, that you use one or more of the
following phrases to refer to this software in your documentation
or advertising materials: `FreeType Project', `FreeType Engine',
`FreeType library', or `FreeType Distribution'.
As you have not signed this license, you are not required to
accept it. However, as the FreeType Project is copyrighted
material, only this license, or another one contracted with the
authors, grants you the right to use, distribute, and modify it.
Therefore, by using, distributing, or modifying the FreeType
Project, you indicate that you understand and accept all the terms
of this license.
4. Contacts
-----------
There are two mailing lists related to FreeType:
o freetype@nongnu.org
Discusses general use and applications of FreeType, as well as
future and wanted additions to the library and distribution.
If you are looking for support, start in this list if you
haven't found anything to help you in the documentation.
o freetype-devel@nongnu.org
Discusses bugs, as well as engine internals, design issues,
specific licenses, porting, etc.
Our home page can be found at
https://www.freetype.org
--- end of FTL.TXT ---
gcrypt
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
glibc
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
gpg-error
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
ixwebsocket
Copyright (c) 2018 Machine Zone, Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the
distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
kissnet
MIT License
Copyright (c) 2018-2024 Arthur Brainville (Ybalrid)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
libass
License: ISC
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
.
THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
libatk
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libatspi
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libblkid
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libcap
Unless otherwise *explicitly* stated, the following text describes the
licensed conditions under which the contents of this libcap release
may be used and distributed:
-------------------------------------------------------------------------
Redistribution and use in source and binary forms of libcap, with
or without modification, are permitted provided that the following
conditions are met:
1. Redistributions of source code must retain any existing copyright
notice, and this entire permission notice in its entirety,
including the disclaimer of warranties.
2. Redistributions in binary form must reproduce all prior and current
copyright notices, this list of conditions, and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
3. The name of any author may not be used to endorse or promote
products derived from this software without their specific prior
written permission.
libcom-err2
This is the Debian GNU/Linux prepackaged version of the Common Error
Description library. It is currently distributed together with the EXT2 file
system utilities, which are otherwise packaged as "e2fsprogs".
This package was put together by Yann Dirson <dirson@debian.org>,
from sources obtained from a mirror of:
tsx-11.mit.edu:/pub/linux/packages/ext2fs/
From the original distribution:
Copyright 1987, 1988 by the Student Information Processing Board
of the Massachusetts Institute of Technology
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is
hereby granted, provided that the above copyright notice
appear in all copies and that both that copyright notice and
this permission notice appear in supporting documentation,
and that the names of M.I.T. and the M.I.T. S.I.P.B. not be
used in advertising or publicity pertaining to distribution
of the software without specific, written prior permission.
M.I.T. and the M.I.T. S.I.P.B. make no representations about
the suitability of this software for any purpose. It is
provided "as is" without express or implied warranty.
libcups
License: Apache-2.0-with-GPL2-LGPL2-Exception
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS"BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
.
On Debian systems, the complete text of the Apache License,
Version 2.0 can be found in '/usr/share/common-licenses/Apache-2.0'.
.
As an exception, if, as a result of your compiling your source code, portions
of this Software are embedded into an Object form of such source code, you
may redistribute such embedded portions in such Object form without complying
with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
.
In addition, if you combine or link compiled forms of this Software with
software that is licensed under the GPLv2 ("Combined Software") and if a
court of competent jurisdiction determines that the patent provision (Section
3), the indemnity provision (Section 9) or other Section of the License
conflicts with the conditions of the GPLv2, you may retroactively and
prospectively choose to deem waived or otherwise exclude such Section(s) of
the License, but only in their entirety and only with respect to the Combined
Software.
libdatrie
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libdav1d
LZ4 Library
Copyright (c) 2011-2020, Yann Collet
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
libffi
License:
libffi - Copyright (c) 1996-2010 Red Hat, Inc and others.
See source files for details.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
``Software''), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Documentation:
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version. A copy of the license is included in the
section entitled ``GNU General Public License''.
libfribidi
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libgbm
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
libgcc
GCC RUNTIME LIBRARY EXCEPTION
Version 3.1, 31 March 2009
Copyright (C) 2009 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
This GCC Runtime Library Exception ("Exception") is an additional
permission under section 7 of the GNU General Public License, version
3 ("GPLv3"). It applies to a given file (the "Runtime Library") that
bears a notice placed by the copyright holder of the file stating that
the file is governed by GPLv3 along with this Exception.
When you use GCC to compile a program, GCC may combine portions of
certain GCC header files and runtime libraries with the compiled
program. The purpose of this Exception is to allow compilation of
non-GPL (including proprietary) programs to use, in this way, the
header files and runtime libraries covered by this Exception.
0. Definitions.
A file is an "Independent Module" if it either requires the Runtime
Library for execution after a Compilation Process, or makes use of an
interface provided by the Runtime Library, but is not otherwise based
on the Runtime Library.
"GCC" means a version of the GNU Compiler Collection, with or without
modifications, governed by version 3 (or a specified later version) of
the GNU General Public License (GPL) with the option of using any
subsequent versions published by the FSF.
"GPL-compatible Software" is software whose conditions of propagation,
modification and use would permit combination with GCC in accord with
the license of GCC.
"Target Code" refers to output from any compiler for a real or virtual
target processor architecture, in executable form or suitable for
input to an assembler, loader, linker and/or execution
phase. Notwithstanding that, Target Code does not include data in any
format that is used as a compiler intermediate representation, or used
for producing a compiler intermediate representation.
The "Compilation Process" transforms code entirely represented in
non-intermediate languages designed for human-written code, and/or in
Java Virtual Machine byte code, into Target Code. Thus, for example,
use of source code generators and preprocessors need not be considered
part of the Compilation Process, since the Compilation Process can be
understood as starting with the output of the generators or
preprocessors.
A Compilation Process is "Eligible" if it is done using GCC, alone or
with other GPL-compatible software, or if it is done without using any
work based on GCC. For example, using non-GPL-compatible Software to
optimize any GCC intermediate representations would not qualify as an
Eligible Compilation Process.
1. Grant of Additional Permission.
You have permission to propagate a work of Target Code formed by
combining the Runtime Library with Independent Modules, even if such
propagation would otherwise violate the terms of GPLv3, provided that
all Target Code was generated by Eligible Compilation Processes. You
may then convey such a combination under terms of your choice,
consistent with the licensing of the Independent Modules.
2. No Weakening of GCC Copyleft.
The availability of this Exception does not imply any general
presumption that third-party software is unaffected by the copyleft
requirements of the license of GCC.
libgmp
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libgnutls
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libgraphite
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libgssapi_krb5
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
libharfbuzz
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
libhogweed
License: LGPL-3+
The nettle library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
.
GNU Nettle is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see http://www.gnu.org/licenses/.
.
On Debian GNU/Linux systems, the complete text of the newest version
of the GNU Lesser General Public License can be found in
/usr/share/common-licenses/LGPL.
libidn
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libk5crypto
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
libkeyutils
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libkrb5
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
libmount
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libmp3lame
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libnettle
License: LGPL-3+
The nettle library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
.
GNU Nettle is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see http://www.gnu.org/licenses/.
.
On Debian GNU/Linux systems, the complete text of the newest version
of the GNU Lesser General Public License can be found in
/usr/share/common-licenses/LGPL.
libnspr4
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
libnss3
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
libogg0
This package was debianized by Christopher L Cheney <ccheney@debian.org> on
Sun, 29 Oct 2000 01:11:57 -0500.
It was downloaded from http://www.xiph.org
Upstream Authors:
Christopher Montgomery <monty@xiph.org>
Greg Maxwell <greg@xiph.org>
Ralph Giles <giles@xiph.org>
Cristian Adam <cristian.adam@gmail.com>
Tim Terriberry <tterribe@xiph.org>
Copyright (c) 2002-2011, Xiph.org Foundation
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of the Xiph.Org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
RFC 5334 is distributed with the following permission:
12. Copying Conditions
The authors agree to grant third parties the irrevocable right to
copy, use and distribute the work, with or without modification, in
any medium, without royalty, provided that, unless separate
permission is granted, redistributed modified works do not contain
misleading author, version, name of work, or endorsement information.
For RFC 3533 the following additional permission is granted:
Received: from mail-vw0-f52.google.com ([209.85.212.52])
by master.debian.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16)
(Exim 4.72)
(envelope-from <silviapfeiffer1@gmail.com>)
id 1QsTXr-0004MO-Ek
for ron@debian.org; Sun, 14 Aug 2011 05:47:35 +0000
In-Reply-To: <20110813065417.GV2324@audi.shelbyville.oz>
References: <20110813065417.GV2324@audi.shelbyville.oz>
From: Silvia Pfeiffer <silviapfeiffer1@gmail.com>
Date: Sun, 14 Aug 2011 15:47:09 +1000
Message-ID: <CAHp8n2nmGN+G09aA118KN86NeX9yw_VJAQNFZebm74k195zz+Q@mail.gmail.com>
Subject: Re: Distributing the libogg RFCs in the Debian package
To: Ron <ron@debian.org>
Cc: Christopher Montgomery <monty@xiph.org>,
Ivo Emanuel Goncalves <justivo@gmail.com>
Hi Ron,
I am happy to have the RFCs that I authored or co-authored to be
published with the additional license as stated below and permit those
RFCs to be distributed under the same terms as libogg itself.
Cheers,
Silvia.
> The author(s) agree to grant third parties the irrevocable
> right to copy, use and distribute the work, with or without
> modification, in any medium, without royalty, provided that,
> unless separate permission is granted, redistributed modified
> works do not contain misleading author, version, name of work,
> or endorsement information.
libp11
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
libpango
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libpcre
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
libpng
License: libpng
Here is the copyright and license for libpng:
.
libpng versions 1.2.6, August 15, 2004, through 1.5.2, March 31, 2011, are
Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors
.
Cosmin Truta
.
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.0.6
with the following individuals added to the list of Contributing Authors
.
Simon-Pierre Cadieux
Eric S. Raymond
Gilles Vollant
.
and with the following additions to the disclaimer:
.
There is no warranty against interference with your enjoyment of the
library or against infringement. There is no warranty that our
efforts or the library will fulfill any of your particular purposes
or needs. This library is provided with all faults, and the entire
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
.
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-0.96,
with the following individuals added to the list of Contributing Authors:
.
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
.
(Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
(Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
.
Authors and maintainers:
libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
libpng versions 0.97, January 1998, through 1.2.26 - April 2, 2008: Glenn
See also "Contributing Authors", below.
.
.
COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
.
If you modify libpng you may insert additional notices immediately following
this sentence.
.
libpng versions 1.2.6, August 15, 2004, through 1.2.26, April 2, 2008, are
Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors:
.
Cosmin Truta
.
libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.0.6
with the following individuals added to the list of Contributing Authors:
.
Simon-Pierre Cadieux
Eric S. Raymond
Gilles Vollant
.
and with the following additions to the disclaimer:
.
There is no warranty against interference with your enjoyment of the
library or against infringement. There is no warranty that our
efforts or the library will fulfill any of your particular purposes
or needs. This library is provided with all faults, and the entire
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
.
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-0.96,
with the following individuals added to the list of Contributing Authors:
.
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
.
libpng versions 0.89, June 1996, through 0.96, May 1997, are
Copyright (c) 1996, 1997 Andreas Dilger
Distributed according to the same disclaimer and license as libpng-0.88,
with the following individuals added to the list of Contributing Authors:
.
John Bowler
Kevin Bracey
Sam Bushell
Magnus Holmgren
Greg Roelofs
Tom Tanner
.
libpng versions 0.5, May 1995, through 0.88, January 1996, are
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
.
Andreas Dilger
Dave Martindale
Guy Eric Schalnat
Paul Schmidt
Tim Wegner
.
The PNG Reference Library is supplied "AS IS". The Contributing Authors
and Group 42, Inc. disclaim all warranties, expressed or implied,
including, without limitation, the warranties of merchantability and of
fitness for any purpose. The Contributing Authors and Group 42, Inc.
assume no liability for direct, indirect, incidental, special, exemplary,
or consequential damages, which may result from the use of the PNG
Reference Library, even if advised of the possibility of such damage.
.
Permission is hereby granted to use, copy, modify, and distribute this
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
.
1. The origin of this source code must not be misrepresented.
.
2. Altered versions must be plainly marked as such and
must not be misrepresented as being the original source.
.
3. This Copyright notice may not be removed or altered from
any source or altered source distribution.
.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
supporting the PNG file format in commercial products. If you use this
source code in a product, acknowledgment is not required but would be
appreciated.
.
contrib/pngsuite:
--------
(c) Willem van Schaik, 1999, 2011
.
Permission to use, copy, modify, and distribute these images for any
purpose and without fee is hereby granted.
libtasn1
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libthai
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
libunistring
License: LGPL-3+
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
On Debian systems the full text of the GNU Lesser General Public
License version 3 can be found in the file
`/usr/share/common-licenses/LGPL-3'.
libvorbis
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
libvpx
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
libwayland
License: X11
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
libx11
License: X11
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
libx11
This package was downloaded from
https://xorg.freedesktop.org/releases/individual/lib/
Copyright 1988, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
libxcb
This package was debianized by Jamey Sharp <sharpone@debian.org> on
Thu, 18 Mar 2004 00:48:42 -0800, and later updated by Josh Triplett
<josh@freedesktop.org>. The package is co-maintained by the XCB developers
via the XCB mailing list <xcb@lists.freedesktop.org>.
It was downloaded from https://xcb.freedesktop.org/dist
Upstream Authors: Jamey Sharp <sharpone@debian.org>
Josh Triplett <josh@freedesktop.org>
Copyright:
Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett.
All Rights Reserved.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall
be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the names of the authors
or their institutions shall not be used in advertising or
otherwise to promote the sale, use or other dealings in this
Software without prior written authorization from the
authors.
libxcomposite
This package was downloaded from
http://xorg.freedesktop.org/releases/individual/lib/
Copyright © 2001,2003 Keith Packard
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Keith Packard not be used in
advertising or publicity pertaining to distribution of the software without
specific, written prior permission. Keith Packard makes no
representations about the suitability of this software for any purpose. It
is provided "as is" without express or implied warranty.
KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
libxdamage
This package was downloaded from
http://xorg.freedesktop.org/releases/individual/lib/
Copyright © 2001,2003 Keith Packard
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Keith Packard not be used in
advertising or publicity pertaining to distribution of the software without
specific, written prior permission. Keith Packard makes no
representations about the suitability of this software for any purpose. It
is provided "as is" without express or implied warranty.
KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
libxdmcp
This package was downloaded from
http://xorg.freedesktop.org/releases/individual/lib/
Copyright © 2001,2003 Keith Packard
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Keith Packard not be used in
advertising or publicity pertaining to distribution of the software without
specific, written prior permission. Keith Packard makes no
representations about the suitability of this software for any purpose. It
is provided "as is" without express or implied warranty.
KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
libxext
This package was downloaded from
http://xorg.freedesktop.org/releases/individual/lib/
Copyright 1986, 1987, 1988, 1989, 1994, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
Copyright (c) 1996 Digital Equipment Corporation, Maynard, Massachusetts.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Digital Equipment Corporation
shall not be used in advertising or otherwise to promote the sale, use or other
dealings in this Software without prior written authorization from Digital
Equipment Corporation.
Copyright (c) 1997 by Silicon Graphics Computer Systems, Inc.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
Copyright 1992 Network Computing Devices
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of NCD. not be used in advertising or
publicity pertaining to distribution of the software without specific,
written prior permission. NCD. makes no representations about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty.
NCD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NCD.
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Copyright 1991,1993 by Digital Equipment Corporation, Maynard, Massachusetts,
and Olivetti Research Limited, Cambridge, England.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Digital or Olivetti
not be used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL AND OLIVETTI DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL THEY BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Copyright 1986, 1987, 1988 by Hewlett-Packard Corporation
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Hewlett-Packard not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
Hewlett-Packard makes no representations about the
suitability of this software for any purpose. It is provided
"as is" without express or implied warranty.
This software is not subject to any license of the American
Telephone and Telegraph Company or of the Regents of the
University of California.
Copyright (c) 1994, 1995 Hewlett-Packard Company
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of the Hewlett-Packard
Company shall not be used in advertising or otherwise to promote the
sale, use or other dealings in this Software without prior written
authorization from the Hewlett-Packard Company.
Copyright Digital Equipment Corporation, 1996
Permission to use, copy, modify, distribute, and sell this
documentation for any purpose is hereby granted without fee,
provided that the above copyright notice and this permission
notice appear in all copies. Digital Equipment Corporation
makes no representations about the suitability for any purpose
of the information in this document. This documentation is
provided ``as is'' without express or implied warranty.
Copyright (c) 1999, 2005, 2006, Oracle and/or its affiliates. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
Copyright (c) 1989 X Consortium, Inc. and Digital Equipment Corporation.
Copyright (c) 1992 X Consortium, Inc. and Intergraph Corporation.
Copyright (c) 1993 X Consortium, Inc. and Silicon Graphics, Inc.
Copyright (c) 1994, 1995 X Consortium, Inc. and Hewlett-Packard Company.
Permission to use, copy, modify, and distribute this documentation for
any purpose and without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
Digital Equipment Corporation, Intergraph Corporation, Silicon
Graphics, Hewlett-Packard, and the X Consortium make no
representations about the suitability for any purpose of the
information in this document. This documentation is provided ``as is''
without express or implied warranty.
libxfixes
This package was downloaded from
https://xorg.freedesktop.org/releases/individual/lib/
Copyright © 2001,2003 Keith Packard
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Keith Packard not be used in
advertising or publicity pertaining to distribution of the software without
specific, written prior permission. Keith Packard makes no
representations about the suitability of this software for any purpose. It
is provided "as is" without express or implied warranty.
KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
libxi
This package was downloaded from
https://xorg.freedesktop.org/releases/individual/lib/
Copyright 1989, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Hewlett-Packard not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Copyright 2008 Peter Hutterer
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of the author shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from the author.
Copyright © 2009 Red Hat, Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
libxkb
Source: http://xkbcommon.org/
Copyright 1985, 1987, 1988, 1990, 1998 The Open Group
Copyright 2008, 2009 Dan Nicholson
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the names of the authors or their
institutions shall not be used in advertising or otherwise to promote the
sale, use or other dealings in this Software without prior written
authorization from the authors.
Copyright (c) 1993, 1994, 1995, 1996 by Silicon Graphics Computer Systems, Inc.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
libxrandr
This package was downloaded from
https://xorg.freedesktop.org/releases/individual/lib/
Copyright © 2000, Compaq Computer Corporation,
Copyright © 2002, Hewlett Packard, Inc.
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Compaq or HP not be used in advertising
or publicity pertaining to distribution of the software without specific,
written prior permission. HP makes no representations about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty.
HP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL HP
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Copyright © 2000 Compaq Computer Corporation, Inc.
Copyright © 2002 Hewlett-Packard Company, Inc.
Copyright © 2006 Intel Corporation
Copyright © 2008 Red Hat, Inc.
Copyright © 2011 Dave Airlie
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting documentation, and
that the name of the copyright holders not be used in advertising or
publicity pertaining to distribution of the software without specific,
written prior permission. The copyright holders make no representations
about the suitability of this software for any purpose. It is provided "as
is" without express or implied warranty.
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
Copyright © 2000 Compaq Computer Corporation, Inc.
Copyright © 2002 Hewlett Packard Company, Inc.
Copyright © 2006 Keith Packard
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting documentation, and
that the name of the copyright holders not be used in advertising or
publicity pertaining to distribution of the software without specific,
written prior permission. The copyright holders make no representations
about the suitability of this software for any purpose. It is provided "as
is" without express or implied warranty.
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
libxrender
This package was downloaded from
https://xorg.freedesktop.org/releases/individual/lib/
Copyright © 2001,2003 Keith Packard
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Keith Packard not be used in
advertising or publicity pertaining to distribution of the software without
specific, written prior permission. Keith Packard makes no
representations about the suitability of this software for any purpose. It
is provided "as is" without express or implied warranty.
KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Copyright © 2000 SuSE, Inc.
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of SuSE not be used in advertising or
publicity pertaining to distribution of the software without specific,
written prior permission. SuSE makes no representations about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty.
SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
lz4
LZ4 Library
Copyright (c) 2011-2020, Yann Collet
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
lzma
LZMA SDK is placed in the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute the original LZMA SDK code, either in source code form or
as a compiled binary, for any purpose, commercial or non-commercial,
and by any means.
md
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mpegts
MIT License
Copyright (c) 2019 akanchi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
ndi
NewTekâs NDI® Software Development Kit (SDK) License Agreement
Please read this document carefully before proceeding. You (the undersigned Licensee) hereby agree to the terms of this NDI® Software Development Kit (SDK) License Agreement (the "License") in order to use the SDK. NewTek, Inc. (âNewTekâ) agrees to license you certain rights as set forth herein under these terms.
1. Definitions
a. "SDK" means the entire NewTek NDI® Software Development Kit, including those portions pertaining to the Specific SDK, provided to you pursuant to this License, including any source code, compiled executables or libraries, and all documentation provided to you to assist you in building tools that use the NDI® Software for data transfer over a local network.
b. "Products" means your software product(s) and/or service(s) that you develop or that are developed on your behalf through the use of the SDK and that are designed to be, and/or are, used, sold and/or distributed to work closely with other NewTek Products or Third Party Video Products.
c. âNewTek Products refers to NewTekâs video line of products distributed by NewTek and any upgrades.
d. âSDK Documentationâ refers to the documentation included with the Software Development Kit including that portion pertaining to the Specific SDK.
e. âSpecific SDKâ refers to the specific SDK for which you intend to use the NewTek SDK and this license (for example: NDI® Send, NDI® Receive, NDI® Find, or other SDKâs that are available from time to time. These are examples only and NewTek may add or subtract to this list at its discretion, and you agree to use them only in accordance with this Agreement), and includes the documentation relating to it.
f. âThird Party Video Productsâ refers to products of third parties developed by or for them also using the NewTek NDI® Software Development Kit in any way.
2. License
a. Pursuant to the terms, conditions and requirements of this License and the SDK Documentation, you are hereby granted a nonexclusive royalty-free license to use the sample code, object code and documentation included in the SDK for the sole purpose of developing Products using the Specific SDK, and to distribute, only in accordance with the SDK Documentation requirements, object code included in the SDK solely as used by such Products (your Product and compiled sample code referred to as the âBundled Productâ).
b. If you are making a product release you must use a version of the SDK that is less than thirty (30) days old if there is one.
c. This is a License only, and no employment, joint venture, partnership, or other business venture is created by this License.
d. Unless otherwise stated in the SDK, no files within the SDK and the Specific SDK may be distributed. Certain files within the SDK or the Specific SDK may be distributed, said files and their respective distribution license are individually identified within the SDK documentation. This is not a license to create revisions or other derivative works of any NewTek software or technology.
e. You agree to comply with the steps outlined in the SDK Documentation, including the SDK manual for the Specific SDK. Different obligations and restrictions may be imposed by NewTek with respect to different Specific SDKâs. NewTek will not agree to sponsor your Product or show affiliation; however NewTek shall have the right to test the Product, and if it does not work or operate to NewTekâs satisfaction, NewTek may terminate this license pursuant to Section 10. Notwithstanding that NewTek may test the Product, it does not warrant the test; it is for NewTekâs benefit, and you agree not to promote in your Product marketing or elsewhere any results or that NewTek has tested the Product.
f. You acknowledge that information provided to NewTek to induce NewTek to enter into this license with you about your experience in the industry, sales, distribution, SDK experience or otherwise, whether such information is provided to NewTek verbally or in writing, is true.
g. NewTek makes the SDK available for developers for developing Products only, under these specific conditions herein, and if any, or all, of the terms of this license are not enforceable within your legal jurisdiction in any way, or if any clause is voided or modified in any way, then you may not enter into this agreement, any license and permission granted herein is revoked and withdrawn as of the date you first downloaded and/or used the SDK, and you are then unauthorized to copy, create derivative works, or otherwise use the SDK in any way.
3. Restrictions and Confidentiality.
a. âConfidential Informationâ includes the SDK and all specifications, source code, example code, tools and documentation provided within the SDK, and any support thereof, and any other proprietary information provided by NewTek and identified as Confidential in the course of assisting You with your NDI® implementation. Confidential Information does not include information that: 1) is or becomes generally available to the public other than as a result of a disclosure by You, or 2) becomes available to You on a non-confidential basis from a source that was not prohibited from disclosing such information. Except as authorized herein, or in the SDK Documentation, or as otherwise approved in writing by NewTek: 1) The disclosure to you of the SDK and all other Confidential Information shall not be disclosed to any third party 2)You agree not to commercialize the Confidential Information for yours or others benefit in any way; 3) You will not make or distribute copies of the SDK, or other Confidential Information or electronically transfer the SDK to any individual within your business or company who does not need to know or view the SDK, and under no circumstances shall you disclose it, or any part of it, to any company, or any other individual not employed directly by the business or company you represent, without express written permission of NewTek.
b. You will not modify, sell, rent, transfer, resell for profit, distribute, or create derivative works based upon the SDK or any part thereof other than as set forth herein, and you will not allow independent contractors to create derivative works; however, you may use the SDK to create your own program for the primary purpose of making it or your Product compatible with the NDI® network APIs, a NewTek Product, or for other purposes expressly set forth by you in advance in writing and agreed to in writing by NewTek. In the case of your derivative works based upon the SDK, you may create and revise your Product using the SDK, and sell, rent, transfer, resell for profit and distribute, so long as it is for the Principal objective for which you were provided the SDK and it otherwise complies with this agreement, including the requirement that your Product or any other Third Party Product using any portion of the SDK continues to use the current SDK as required herein and functions properly using the SDK. NewTek reserves the right to determine at any time the compliance of your Product or any Third Party Product as properly using the SDK including maintaining current and complete NDI® compatability. Notwithstanding anything to the contrary herein, no intellectual property claim, whether in patent, trademark, copyright, or otherwise, is made by NewTek in or to your Product (except as to the SDK including software code and/or Libraries, and copyright rights therein, and any Confidential Information used in or with the Product).
c. You will comply with applicable export control and trade sanctions laws, rules, regulations and licenses and will not export or re-export, directly or indirectly, the SDK into any country, to any organization or individual prohibited by the United States Export Administration Act and the regulations thereunder.
d. Any direct or indirect distribution of your Product or any Bundled Products by you that include your Product, shall be under the terms of a license agreement containing terms that: (i) prohibit any modifications to the SDK or any part thereof, (ii) prohibit any reverse engineering, disassembly or recompilation of the the SDK or any part thereof, or any protocols used in the SDK, and further prohibit any attempt to do so; (iii) disclaim any and all warranties on behalf of NewTek and each of its licensors, (iv) disclaim, to the extent permitted by applicable law, liability of NewTek and/or its licensors for any damages, whether direct, indirect, incidental or consequential, arising from the use of the Product or Bundled Products, (v) comply fully with all relevant export laws and regulations of the United States to assure that the Bundled Products or any part thereof is not exported, directly or indirectly, in violation of United States law; (vi) include the appropriate copyright notice showing NewTek, Inc. as copyright owner; (vii) require all third party developers using your Product to develop Third Party Products to comply with the terms of the NewTek SDK license, including that such Third Party Products have current and complete NDI® compatability, and further require such third party developers to include in their End User License Agreement the terms of this paragraph 3d.
e. You agree not to use the SDK for any unlawful propose or in any way to cause injury, harm or damage to NewTek, Inc., or its Products, trademarks, reputation and/or goodwill, or use information provided pursuant to the SDK, to interfere with NewTek in the commercialization of NewTek Products.
f. You agree to use NewTek trademarks (NewTek trademarks include, but are not limited to NDI®, NDI|HXâ¢, NewTekâ¢, TriCaster®, and LightWave 3D®), only in accordance with applicable policies of NewTek for such trademark usage by software developers in effect from time to time, which policy may be amended at any time with or without notice. NewTekâs trademarks shall not be utilized within the Product itself, or on the Product packaging or promotion, or on websites, except to identify that the Product is compatible with NewTekâs pertinent Video Product, and in all cases where NewTek trademarks are utilized, special and clear notations shall be provided that the marks are NewTek trademarks. Your Product is not a product of NewTek and no promotion, packaging, or use of NewTek trademarks shall suggest sponsorship by NewTek of your Products, except where specifically authorized by NewTek in writing. Any distribution of your Product in a fraudulent manner, or in any other manner or method that violates any civil or criminal laws shall constitute a default under this agreement and result in immediate revocation of any right to utilize NewTekâs marks.
g. NewTek owns or has licensed copyright rights to the SDK. To the extent any of the SDK is incorporated into your Product, you agree to include all applicable copyright notices, along with yours, indicating NewTekâs copyright rights as applicable and as requested by NewTek.
h. You agree that by using the SDK, or any portion or part of the NDI® Software, in your Products, that you shall not at any time during the term create, use or distribute Products utilizing the NDI® SDK that are not interoperable with, or have significantly degraded performance of functionality when working with, NewTek Products or Third Party Video Products that are created with or utilize in whole or in part the SDK. Your Products and Third Party Products must maintain current and complete NDI® compatability at all times.
i. You agree to not to reverse engineer, disassemble or recompile the SDK or any part thereof, or any protocols used in the SDK, or attempt to do so.
j. You agree not to use the SDK, or cause the SDK to be used, for any purpose that it was not designed for, and in particular, you agree not to use the SDK for any purpose but for the precise purposes as expressly identified to NewTek in writing that is the basis of the SDK and this license, and you agree you will not attempt to violate any of the foregoing, or encourage third parties to do so.
4. Software Defect Reporting
If you find software defects in the SDK, you agree to make reasonable effort to report them to NewTek in accordance with the SDK documentation or in such other manner as NewTek directs in writing. NewTek will evaluate and, at its sole discretion, may address them in a future revision of the SDK. NewTek does not warrant the SDK to be free of defects.
5. Updates
You understand and agree that NewTek may amend, modify, change, and/or cease distribution or production of the SDK at any time. You understand that you are not entitled to receive any upgrades, updates, or future versions of the SDK under this License. NewTek does not warrant or represent that its future updates and revisions will be compatible with your Product, and NewTek does not warrant that its updates and/or revisions will allow your Product to be compatible with or without modifications to your Product.
6. Ownership
Nothing herein is intended to convey to you any patent, trademark, copyright, trade secret or other Intellectual Property owned by NewTek or its Licensors in the SDK or in any NewTek software, hardware, products, trade names, or trademarks. NewTek and its suppliers or licensors shall retain all right, title, and interest to the foregoing Intellectual Property and to the SDK. All rights not expressly granted herein are reserved by NewTek.
7. Indemnity and Limitations
You agree to indemnify and hold NewTek harmless from any third party claim, loss, or damage (including attorney's fees) related to your use, sale or distribution of the SDK. THE SDK IS PROVIDED TO YOU FREE OF CHARGE, AND ON AN "AS IS" BASIS AND "WITH ALL FAULTS", WITHOUT ANY TECHNICAL SUPPORT OR WARRANTY OF ANY KIND FROM NEWTEK. YOU ASSUME ALL RISKS THAT THE SDK IS SUITABLE OR ACCURATE FOR YOUR NEEDS AND YOUR USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK. NEWTEK AND ITS LICENSORS DISCLAIM ALL EXPRESS AND IMPLIED WARRANTIES FOR THE SDK INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. ALSO, THERE IS NO WARRANTY OF NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. SOME STATES DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY FROM STATE TO STATE.
8. Limitation of Damages
NEITHER NEWTEK NOR ITS SUPPLIERS OR LICENSORS SHALL BE LIABLE FOR ANY INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOSS (INCLUDING DAMAGES FOR LOSS OF BUSINESS, LOSS OF PROFITS, OR THE LIKE), ARISING OUT OF THIS LICENSE WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, PRODUCT LIABILITY OR OTHERWISE, EVEN IF NEWTEK OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU. The limited warranty, exclusive remedies and limited liability set forth above are fundamental elements of the basis of the bargain between NewTek and you. You agree that NewTek would not be able to provide the Software on an economic basis without such limitations. IN NO EVENT WILL NEWTEK BE LIABLE FOR ANY AMOUNT GREATER THAN WHAT YOU ACTUALLY PAID FOR THE SDK.
9. US Government - Restricted Rights
The SDK and accompanying materials are provided with Restricted Rights. Use, duplication, or disclosure by the U.S. Government is subject to restrictions as set forth in this License and as provided in Federal Regulations, as applicable. (Manufacturer: NewTek, Inc., 5131 Beckwith Blvd., San Antonio, TX 78249).
10. Termination
Either party may terminate this License upon thirty (30) days written notice. Either party may also terminate if the other party materially defaults in the performance of any provision of this License, the non-defaulting party gives written notice to the other party of such default, and the defaulting party fails to cure such default within ten (10) days after receipt of such notice. Upon the termination of this License, the rights and licenses granted to you by NewTek pursuant to this License will automatically cease. Nothing herein shall prevent either party from pursuing any injunctive relief at any time if necessary, or seeking any other remedies available in equity. Each party reserves the right to pursue all legal and equitable remedies available. Upon termination, all SDK materials shall be promptly returned to NewTek, and any and all copies stored in electronic or other format shall be deleted and destroyed, and any rights to use NewTekâs trademarks are revoked. If this License is terminated for any reason, the provisions of Sections 1, 3, 6, 7, 8, 9, 10, and 11 shall survive such termination.
11. General
Notices given hereunder may be sent to either party at the address below by either overnight mail or by email and are deemed effective when sent. This License shall be governed by the laws of the State of Texas, without regard to its choice of law rules and you agree to exclusive jurisdiction therein. This License contains the complete agreement between you and NewTek with respect to the subject matter (SDK) of this License, and supersedes all prior or contemporaneous agreements or understandings, whether oral or written. It does not replace any licenses accompanying NewTek Products. You may not assign this SDK License.
Jan 2020 NDI® Technology License Agreement
nlohmann-json
MIT License
Copyright (c) 2013-2022 Niels Lohmann
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
npp
End User License Agreement
--------------------------
NVIDIA Software License Agreement and CUDA Supplement to
Software License Agreement. Last updated: October 8, 2021
The CUDA Toolkit End User License Agreement applies to the
NVIDIA CUDA Toolkit, the NVIDIA CUDA Samples, the NVIDIA
Display Driver, NVIDIA Nsight tools (Visual Studio Edition),
and the associated documentation on CUDA APIs, programming
model and development tools. If you do not agree with the
terms and conditions of the license agreement, then do not
download or use the software.
Last updated: October 8, 2021.
Preface
-------
The Software License Agreement in Chapter 1 and the Supplement
in Chapter 2 contain license terms and conditions that govern
the use of NVIDIA software. By accepting this agreement, you
agree to comply with all the terms and conditions applicable
to the product(s) included herein.
NVIDIA Driver
Description
This package contains the operating system driver and
fundamental system software components for NVIDIA GPUs.
NVIDIA CUDA Toolkit
Description
The NVIDIA CUDA Toolkit provides command-line and graphical
tools for building, debugging and optimizing the performance
of applications accelerated by NVIDIA GPUs, runtime and math
libraries, and documentation including programming guides,
user manuals, and API references.
Default Install Location of CUDA Toolkit
Windows platform:
%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v#.#
Linux platform:
/usr/local/cuda-#.#
Mac platform:
/Developer/NVIDIA/CUDA-#.#
NVIDIA CUDA Samples
Description
CUDA Samples are now located in
https://github.com/nvidia/cuda-samples, which includes
instructions for obtaining, building, and running the samples.
They are no longer included in the CUDA toolkit.
NVIDIA Nsight Visual Studio Edition (Windows only)
Description
NVIDIA Nsight Development Platform, Visual Studio Edition is a
development environment integrated into Microsoft Visual
Studio that provides tools for debugging, profiling, analyzing
and optimizing your GPU computing and graphics applications.
Default Install Location of Nsight Visual Studio Edition
Windows platform:
%ProgramFiles(x86)%\NVIDIA Corporation\Nsight Visual Studio Edition #.#
1. License Agreement for NVIDIA Software Development Kits
---------------------------------------------------------
Important Notice—Read before downloading, installing,
copying or using the licensed software:
-------------------------------------------------------
This license agreement, including exhibits attached
("Agreement”) is a legal agreement between you and NVIDIA
Corporation ("NVIDIA") and governs your use of a NVIDIA
software development kit (“SDK”).
Each SDK has its own set of software and materials, but here
is a description of the types of items that may be included in
a SDK: source code, header files, APIs, data sets and assets
(examples include images, textures, models, scenes, videos,
native API input/output files), binary software, sample code,
libraries, utility programs, programming code and
documentation.
This Agreement can be accepted only by an adult of legal age
of majority in the country in which the SDK is used.
If you are entering into this Agreement on behalf of a company
or other legal entity, you represent that you have the legal
authority to bind the entity to this Agreement, in which case
“you” will mean the entity you represent.
If you don’t have the required age or authority to accept
this Agreement, or if you don’t accept all the terms and
conditions of this Agreement, do not download, install or use
the SDK.
You agree to use the SDK only for purposes that are permitted
by (a) this Agreement, and (b) any applicable law, regulation
or generally accepted practices or guidelines in the relevant
jurisdictions.
1.1. License
1.1.1. License Grant
Subject to the terms of this Agreement, NVIDIA hereby grants
you a non-exclusive, non-transferable license, without the
right to sublicense (except as expressly provided in this
Agreement) to:
1. Install and use the SDK,
2. Modify and create derivative works of sample source code
delivered in the SDK, and
3. Distribute those portions of the SDK that are identified
in this Agreement as distributable, as incorporated in
object code format into a software application that meets
the distribution requirements indicated in this Agreement.
1.1.2. Distribution Requirements
These are the distribution requirements for you to exercise
the distribution grant:
1. Your application must have material additional
functionality, beyond the included portions of the SDK.
2. The distributable portions of the SDK shall only be
accessed by your application.
3. The following notice shall be included in modifications
and derivative works of sample source code distributed:
“This software contains source code provided by NVIDIA
Corporation.”
4. Unless a developer tool is identified in this Agreement
as distributable, it is delivered for your internal use
only.
5. The terms under which you distribute your application
must be consistent with the terms of this Agreement,
including (without limitation) terms relating to the
license grant and license restrictions and protection of
NVIDIA’s intellectual property rights. Additionally, you
agree that you will protect the privacy, security and
legal rights of your application users.
6. You agree to notify NVIDIA in writing of any known or
suspected distribution or use of the SDK not in compliance
with the requirements of this Agreement, and to enforce
the terms of your agreements with respect to distributed
SDK.
1.1.3. Authorized Users
You may allow employees and contractors of your entity or of
your subsidiary(ies) to access and use the SDK from your
secure network to perform work on your behalf.
If you are an academic institution you may allow users
enrolled or employed by the academic institution to access and
use the SDK from your secure network.
You are responsible for the compliance with the terms of this
Agreement by your authorized users. If you become aware that
your authorized users didn’t follow the terms of this
Agreement, you agree to take reasonable steps to resolve the
non-compliance and prevent new occurrences.
1.1.4. Pre-Release SDK
The SDK versions identified as alpha, beta, preview or
otherwise as pre-release, may not be fully functional, may
contain errors or design flaws, and may have reduced or
different security, privacy, accessibility, availability, and
reliability standards relative to commercial versions of
NVIDIA software and materials. Use of a pre-release SDK may
result in unexpected results, loss of data, project delays or
other unpredictable damage or loss.
You may use a pre-release SDK at your own risk, understanding
that pre-release SDKs are not intended for use in production
or business-critical systems.
NVIDIA may choose not to make available a commercial version
of any pre-release SDK. NVIDIA may also choose to abandon
development and terminate the availability of a pre-release
SDK at any time without liability.
1.1.5. Updates
NVIDIA may, at its option, make available patches, workarounds
or other updates to this SDK. Unless the updates are provided
with their separate governing terms, they are deemed part of
the SDK licensed to you as provided in this Agreement. You
agree that the form and content of the SDK that NVIDIA
provides may change without prior notice to you. While NVIDIA
generally maintains compatibility between versions, NVIDIA may
in some cases make changes that introduce incompatibilities in
future versions of the SDK.
1.1.6. Components Under Other Licenses
The SDK may come bundled with, or otherwise include or be
distributed with, NVIDIA or third-party components with
separate legal notices or terms as may be described in
proprietary notices accompanying the SDK. If and to the extent
there is a conflict between the terms in this Agreement and
the license terms associated with the component, the license
terms associated with the components control only to the
extent necessary to resolve the conflict.
Subject to the other terms of this Agreement, you may use the
SDK to develop and test applications released under Open
Source Initiative (OSI) approved open source software
licenses.
1.1.7. Reservation of Rights
NVIDIA reserves all rights, title, and interest in and to the
SDK, not expressly granted to you under this Agreement.
1.2. Limitations
The following license limitations apply to your use of the
SDK:
1. You may not reverse engineer, decompile or disassemble,
or remove copyright or other proprietary notices from any
portion of the SDK or copies of the SDK.
2. Except as expressly provided in this Agreement, you may
not copy, sell, rent, sublicense, transfer, distribute,
modify, or create derivative works of any portion of the
SDK. For clarity, you may not distribute or sublicense the
SDK as a stand-alone product.
3. Unless you have an agreement with NVIDIA for this
purpose, you may not indicate that an application created
with the SDK is sponsored or endorsed by NVIDIA.
4. You may not bypass, disable, or circumvent any
encryption, security, digital rights management or
authentication mechanism in the SDK.
5. You may not use the SDK in any manner that would cause it
to become subject to an open source software license. As
examples, licenses that require as a condition of use,
modification, and/or distribution that the SDK be:
a. Disclosed or distributed in source code form;
b. Licensed for the purpose of making derivative works;
or
c. Redistributable at no charge.
6. You acknowledge that the SDK as delivered is not tested
or certified by NVIDIA for use in connection with the
design, construction, maintenance, and/or operation of any
system where the use or failure of such system could
result in a situation that threatens the safety of human
life or results in catastrophic damages (each, a "Critical
Application"). Examples of Critical Applications include
use in avionics, navigation, autonomous vehicle
applications, ai solutions for automotive products,
military, medical, life support or other life critical
applications. NVIDIA shall not be liable to you or any
third party, in whole or in part, for any claims or
damages arising from such uses. You are solely responsible
for ensuring that any product or service developed with
the SDK as a whole includes sufficient features to comply
with all applicable legal and regulatory standards and
requirements.
7. You agree to defend, indemnify and hold harmless NVIDIA
and its affiliates, and their respective employees,
contractors, agents, officers and directors, from and
against any and all claims, damages, obligations, losses,
liabilities, costs or debt, fines, restitutions and
expenses (including but not limited to attorney’s fees
and costs incident to establishing the right of
indemnification) arising out of or related to products or
services that use the SDK in or for Critical Applications,
and for use of the SDK outside of the scope of this
Agreement or not in compliance with its terms.
8. You may not reverse engineer, decompile or disassemble
any portion of the output generated using SDK elements for
the purpose of translating such output artifacts to target
a non-NVIDIA platform.
1.3. Ownership
1. NVIDIA or its licensors hold all rights, title and
interest in and to the SDK and its modifications and
derivative works, including their respective intellectual
property rights, subject to your rights under Section
1.3.2. This SDK may include software and materials from
NVIDIA’s licensors, and these licensors are intended
third party beneficiaries that may enforce this Agreement
with respect to their intellectual property rights.
2. You hold all rights, title and interest in and to your
applications and your derivative works of the sample
source code delivered in the SDK, including their
respective intellectual property rights, subject to
NVIDIA’s rights under Section 1.3.1.
3. You may, but don’t have to, provide to NVIDIA
suggestions, feature requests or other feedback regarding
the SDK, including possible enhancements or modifications
to the SDK. For any feedback that you voluntarily provide,
you hereby grant NVIDIA and its affiliates a perpetual,
non-exclusive, worldwide, irrevocable license to use,
reproduce, modify, license, sublicense (through multiple
tiers of sublicensees), and distribute (through multiple
tiers of distributors) it without the payment of any
royalties or fees to you. NVIDIA will use feedback at its
choice. NVIDIA is constantly looking for ways to improve
its products, so you may send feedback to NVIDIA through
the developer portal at https://developer.nvidia.com.
1.4. No Warranties
THE SDK IS PROVIDED BY NVIDIA “AS IS” AND “WITH ALL
FAULTS.” TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND
ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND
OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING,
BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE
ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO
WARRANTY IS MADE ON THE BASIS OF TRADE USAGE, COURSE OF
DEALING OR COURSE OF TRADE.
1.5. Limitation of Liability
TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS
AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS
OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF
PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION
WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK,
WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH
OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE),
PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF
LIABILITY. IN NO EVENT WILL NVIDIA’S AND ITS AFFILIATES
TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS
AGREEMENT EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE
NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS
LIMIT.
These exclusions and limitations of liability shall apply
regardless if NVIDIA or its affiliates have been advised of
the possibility of such damages, and regardless of whether a
remedy fails its essential purpose. These exclusions and
limitations of liability form an essential basis of the
bargain between the parties, and, absent any of these
exclusions or limitations of liability, the provisions of this
Agreement, including, without limitation, the economic terms,
would be substantially different.
1.6. Termination
1. This Agreement will continue to apply until terminated by
either you or NVIDIA as described below.
2. If you want to terminate this Agreement, you may do so by
stopping to use the SDK.
3. NVIDIA may, at any time, terminate this Agreement if:
a. (i) you fail to comply with any term of this
Agreement and the non-compliance is not fixed within
thirty (30) days following notice from NVIDIA (or
immediately if you violate NVIDIA’s intellectual
property rights);
b. (ii) you commence or participate in any legal
proceeding against NVIDIA with respect to the SDK; or
c. (iii) NVIDIA decides to no longer provide the SDK in
a country or, in NVIDIA’s sole discretion, the
continued use of it is no longer commercially viable.
4. Upon any termination of this Agreement, you agree to
promptly discontinue use of the SDK and destroy all copies
in your possession or control. Your prior distributions in
accordance with this Agreement are not affected by the
termination of this Agreement. Upon written request, you
will certify in writing that you have complied with your
commitments under this section. Upon any termination of
this Agreement all provisions survive except for the
license grant provisions.
1.7. General
If you wish to assign this Agreement or your rights and
obligations, including by merger, consolidation, dissolution
or operation of law, contact NVIDIA to ask for permission. Any
attempted assignment not approved by NVIDIA in writing shall
be void and of no effect. NVIDIA may assign, delegate or
transfer this Agreement and its rights and obligations, and if
to a non-affiliate you will be notified.
You agree to cooperate with NVIDIA and provide reasonably
requested information to verify your compliance with this
Agreement.
This Agreement will be governed in all respects by the laws of
the United States and of the State of Delaware as those laws
are applied to contracts entered into and performed entirely
within Delaware by Delaware residents, without regard to the
conflicts of laws principles. The United Nations Convention on
Contracts for the International Sale of Goods is specifically
disclaimed. You agree to all terms of this Agreement in the
English language.
The state or federal courts residing in Santa Clara County,
California shall have exclusive jurisdiction over any dispute
or claim arising out of this Agreement. Notwithstanding this,
you agree that NVIDIA shall still be allowed to apply for
injunctive remedies or an equivalent type of urgent legal
relief in any jurisdiction.
If any court of competent jurisdiction determines that any
provision of this Agreement is illegal, invalid or
unenforceable, such provision will be construed as limited to
the extent necessary to be consistent with and fully
enforceable under the law and the remaining provisions will
remain in full force and effect. Unless otherwise specified,
remedies are cumulative.
Each party acknowledges and agrees that the other is an
independent contractor in the performance of this Agreement.
The SDK has been developed entirely at private expense and is
“commercial items” consisting of “commercial computer
software” and “commercial computer software
documentation” provided with RESTRICTED RIGHTS. Use,
duplication or disclosure by the U.S. Government or a U.S.
Government subcontractor is subject to the restrictions in
this Agreement pursuant to DFARS 227.7202-3(a) or as set forth
in subparagraphs (c)(1) and (2) of the Commercial Computer
Software - Restricted Rights clause at FAR 52.227-19, as
applicable. Contractor/manufacturer is NVIDIA, 2788 San Tomas
Expressway, Santa Clara, CA 95051.
The SDK is subject to United States export laws and
regulations. You agree that you will not ship, transfer or
export the SDK into any country, or use the SDK in any manner,
prohibited by the United States Bureau of Industry and
Security or economic sanctions regulations administered by the
U.S. Department of Treasury’s Office of Foreign Assets
Control (OFAC), or any applicable export laws, restrictions or
regulations. These laws include restrictions on destinations,
end users and end use. By accepting this Agreement, you
confirm that you are not a resident or citizen of any country
currently embargoed by the U.S. and that you are not otherwise
prohibited from receiving the SDK.
Any notice delivered by NVIDIA to you under this Agreement
will be delivered via mail, email or fax. You agree that any
notices that NVIDIA sends you electronically will satisfy any
legal communication requirements. Please direct your legal
notices or other correspondence to NVIDIA Corporation, 2788
San Tomas Expressway, Santa Clara, California 95051, United
States of America, Attention: Legal Department.
This Agreement and any exhibits incorporated into this
Agreement constitute the entire agreement of the parties with
respect to the subject matter of this Agreement and supersede
all prior negotiations or documentation exchanged between the
parties relating to this SDK license. Any additional and/or
conflicting terms on documents issued by you are null, void,
and invalid. Any amendment or waiver under this Agreement
shall be in writing and signed by representatives of both
parties.
2. CUDA Toolkit Supplement to Software License Agreement for
NVIDIA Software Development Kits
------------------------------------------------------------
The terms in this supplement govern your use of the NVIDIA
CUDA Toolkit SDK under the terms of your license agreement
(“Agreement”) as modified by this supplement. Capitalized
terms used but not defined below have the meaning assigned to
them in the Agreement.
This supplement is an exhibit to the Agreement and is
incorporated as an integral part of the Agreement. In the
event of conflict between the terms in this supplement and the
terms in the Agreement, the terms in this supplement govern.
2.1. License Scope
The SDK is licensed for you to develop applications only for
use in systems with NVIDIA GPUs.
2.2. Distribution
The portions of the SDK that are distributable under the
Agreement are listed in Attachment A.
2.3. Operating Systems
Those portions of the SDK designed exclusively for use on the
Linux or FreeBSD operating systems, or other operating systems
derived from the source code to these operating systems, may
be copied and redistributed for use in accordance with this
Agreement, provided that the object code files are not
modified in any way (except for unzipping of compressed
files).
2.4. Audio and Video Encoders and Decoders
You acknowledge and agree that it is your sole responsibility
to obtain any additional third-party licenses required to
make, have made, use, have used, sell, import, and offer for
sale your products or services that include or incorporate any
third-party software and content relating to audio and/or
video encoders and decoders from, including but not limited
to, Microsoft, Thomson, Fraunhofer IIS, Sisvel S.p.A.,
MPEG-LA, and Coding Technologies. NVIDIA does not grant to you
under this Agreement any necessary patent or other rights with
respect to any audio and/or video encoders and decoders.
2.5. Licensing
If the distribution terms in this Agreement are not suitable
for your organization, or for any questions regarding this
Agreement, please contact NVIDIA at
nvidia-compute-license-questions@nvidia.com.
2.6. Attachment A
The following CUDA Toolkit files may be distributed with
Licensee Applications developed by you, including certain
variations of these files that have version number or
architecture specific information embedded in the file name -
as an example only, for release version 9.0 of the 64-bit
Windows software, the file cudart64_90.dll is redistributable.
Component
CUDA Runtime
Windows
cudart.dll, cudart_static.lib, cudadevrt.lib
Mac OSX
libcudart.dylib, libcudart_static.a, libcudadevrt.a
Linux
libcudart.so, libcudart_static.a, libcudadevrt.a
Android
libcudart.so, libcudart_static.a, libcudadevrt.a
Component
CUDA FFT Library
Windows
cufft.dll, cufftw.dll, cufft.lib, cufftw.lib
Mac OSX
libcufft.dylib, libcufft_static.a, libcufftw.dylib,
libcufftw_static.a
Linux
libcufft.so, libcufft_static.a, libcufftw.so,
libcufftw_static.a
Android
libcufft.so, libcufft_static.a, libcufftw.so,
libcufftw_static.a
Component
CUDA BLAS Library
Windows
cublas.dll, cublasLt.dll
Mac OSX
libcublas.dylib, libcublasLt.dylib, libcublas_static.a,
libcublasLt_static.a
Linux
libcublas.so, libcublasLt.so, libcublas_static.a,
libcublasLt_static.a
Android
libcublas.so, libcublasLt.so, libcublas_static.a,
libcublasLt_static.a
Component
NVIDIA "Drop-in" BLAS Library
Windows
nvblas.dll
Mac OSX
libnvblas.dylib
Linux
libnvblas.so
Component
CUDA Sparse Matrix Library
Windows
cusparse.dll, cusparse.lib
Mac OSX
libcusparse.dylib, libcusparse_static.a
Linux
libcusparse.so, libcusparse_static.a
Android
libcusparse.so, libcusparse_static.a
Component
CUDA Linear Solver Library
Windows
cusolver.dll, cusolver.lib
Mac OSX
libcusolver.dylib, libcusolver_static.a
Linux
libcusolver.so, libcusolver_static.a
Android
libcusolver.so, libcusolver_static.a
Component
CUDA Random Number Generation Library
Windows
curand.dll, curand.lib
Mac OSX
libcurand.dylib, libcurand_static.a
Linux
libcurand.so, libcurand_static.a
Android
libcurand.so, libcurand_static.a
Component
NVIDIA Performance Primitives Library
Windows
nppc.dll, nppc.lib, nppial.dll, nppial.lib, nppicc.dll,
nppicc.lib, nppicom.dll, nppicom.lib, nppidei.dll,
nppidei.lib, nppif.dll, nppif.lib, nppig.dll, nppig.lib,
nppim.dll, nppim.lib, nppist.dll, nppist.lib, nppisu.dll,
nppisu.lib, nppitc.dll, nppitc.lib, npps.dll, npps.lib
Mac OSX
libnppc.dylib, libnppc_static.a, libnppial.dylib,
libnppial_static.a, libnppicc.dylib, libnppicc_static.a,
libnppicom.dylib, libnppicom_static.a, libnppidei.dylib,
libnppidei_static.a, libnppif.dylib, libnppif_static.a,
libnppig.dylib, libnppig_static.a, libnppim.dylib,
libnppisu_static.a, libnppitc.dylib, libnppitc_static.a,
libnpps.dylib, libnpps_static.a
Linux
libnppc.so, libnppc_static.a, libnppial.so,
libnppial_static.a, libnppicc.so, libnppicc_static.a,
libnppicom.so, libnppicom_static.a, libnppidei.so,
libnppidei_static.a, libnppif.so, libnppif_static.a
libnppig.so, libnppig_static.a, libnppim.so,
libnppim_static.a, libnppist.so, libnppist_static.a,
libnppisu.so, libnppisu_static.a, libnppitc.so
libnppitc_static.a, libnpps.so, libnpps_static.a
Android
libnppc.so, libnppc_static.a, libnppial.so,
libnppial_static.a, libnppicc.so, libnppicc_static.a,
libnppicom.so, libnppicom_static.a, libnppidei.so,
libnppidei_static.a, libnppif.so, libnppif_static.a
libnppig.so, libnppig_static.a, libnppim.so,
libnppim_static.a, libnppist.so, libnppist_static.a,
libnppisu.so, libnppisu_static.a, libnppitc.so
libnppitc_static.a, libnpps.so, libnpps_static.a
Component
NVIDIA JPEG Library
Windows
nvjpeg.lib, nvjpeg.dll
Linux
libnvjpeg.so, libnvjpeg_static.a
Component
Internal common library required for statically linking to
cuBLAS, cuSPARSE, cuFFT, cuRAND, nvJPEG and NPP
Mac OSX
libculibos.a
Linux
libculibos.a
Component
NVIDIA Runtime Compilation Library and Header
All
nvrtc.h
Windows
nvrtc.dll, nvrtc-builtins.dll
Mac OSX
libnvrtc.dylib, libnvrtc-builtins.dylib
Linux
libnvrtc.so, libnvrtc-builtins.so
Component
NVIDIA Optimizing Compiler Library
Windows
nvvm.dll
Mac OSX
libnvvm.dylib
Linux
libnvvm.so
Component
NVIDIA Common Device Math Functions Library
Windows
libdevice.10.bc
Mac OSX
libdevice.10.bc
Linux
libdevice.10.bc
Component
CUDA Occupancy Calculation Header Library
All
cuda_occupancy.h
Component
CUDA Half Precision Headers
All
cuda_fp16.h, cuda_fp16.hpp
Component
CUDA Profiling Tools Interface (CUPTI) Library
Windows
cupti.dll
Mac OSX
libcupti.dylib
Linux
libcupti.so
Component
NVIDIA Tools Extension Library
Windows
nvToolsExt.dll, nvToolsExt.lib
Mac OSX
libnvToolsExt.dylib
Linux
libnvToolsExt.so
Component
NVIDIA CUDA Driver Libraries
Linux
libcuda.so, libnvidia-ptxjitcompiler.so
Component
NVIDIA CUDA File IO Libraries and Header
All
cufile.h
Linux
libcufile.so, libcufile_rdma.so, libcufile_static.a,
libcufile_rdma_static.a
The NVIDIA CUDA Driver Libraries are only distributable in
applications that meet this criteria:
1. The application was developed starting from a NVIDIA CUDA
container obtained from Docker Hub or the NVIDIA GPU
Cloud, and
2. The resulting application is packaged as a Docker
container and distributed to users on Docker Hub or the
NVIDIA GPU Cloud only.
In addition to the rights above, for parties that are
developing software intended solely for use on Jetson
development kits or Jetson modules, and running Linux for
Tegra software, the following shall apply:
* The SDK may be distributed in its entirety, as provided by
NVIDIA, and without separation of its components, for you
and/or your licensees to create software development kits
for use only on the Jetson platform and running Linux for
Tegra software.
2.7. Attachment B
Additional Licensing Obligations
The following third party components included in the SOFTWARE
are licensed to Licensee pursuant to the following terms and
conditions:
1. Licensee's use of the GDB third party component is
subject to the terms and conditions of GNU GPL v3:
This product includes copyrighted third-party software licensed
under the terms of the GNU General Public License v3 ("GPL v3").
All third-party software packages are copyright by their respective
authors. GPL v3 terms and conditions are hereby incorporated into
the Agreement by this reference: http://www.gnu.org/licenses/gpl.txt
Consistent with these licensing requirements, the software
listed below is provided under the terms of the specified
open source software licenses. To obtain source code for
software provided under licenses that require
redistribution of source code, including the GNU General
Public License (GPL) and GNU Lesser General Public License
(LGPL), contact oss-requests@nvidia.com. This offer is
valid for a period of three (3) years from the date of the
distribution of this product by NVIDIA CORPORATION.
Component License
CUDA-GDB GPL v3
2. Licensee represents and warrants that any and all third
party licensing and/or royalty payment obligations in
connection with Licensee's use of the H.264 video codecs
are solely the responsibility of Licensee.
3. Licensee's use of the Thrust library is subject to the
terms and conditions of the Apache License Version 2.0.
All third-party software packages are copyright by their
respective authors. Apache License Version 2.0 terms and
conditions are hereby incorporated into the Agreement by
this reference.
http://www.apache.org/licenses/LICENSE-2.0.html
In addition, Licensee acknowledges the following notice:
Thrust includes source code from the Boost Iterator,
Tuple, System, and Random Number libraries.
Boost Software License - Version 1.0 - August 17th, 2003
. . . .
Permission is hereby granted, free of charge, to any person or
organization obtaining a copy of the software and accompanying
documentation covered by this license (the "Software") to use,
reproduce, display, distribute, execute, and transmit the Software,
and to prepare derivative works of the Software, and to permit
third-parties to whom the Software is furnished to do so, all
subject to the following:
The copyright notices in the Software and this entire statement,
including the above license grant, this restriction and the following
disclaimer, must be included in all copies of the Software, in whole
or in part, and all derivative works of the Software, unless such
copies or derivative works are solely in the form of machine-executable
object code generated by a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR
OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
4. Licensee's use of the LLVM third party component is
subject to the following terms and conditions:
======================================================
LLVM Release License
======================================================
University of Illinois/NCSA
Open Source License
Copyright (c) 2003-2010 University of Illinois at Urbana-Champaign.
All rights reserved.
Developed by:
LLVM Team
University of Illinois at Urbana-Champaign
http://llvm.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal with the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimers.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimers in the
documentation and/or other materials provided with the distribution.
* Neither the names of the LLVM Team, University of Illinois at Urbana-
Champaign, nor the names of its contributors may be used to endorse or
promote products derived from this Software without specific prior
written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS WITH THE SOFTWARE.
5. Licensee's use of the PCRE third party component is
subject to the following terms and conditions:
------------
PCRE LICENCE
------------
PCRE is a library of functions to support regular expressions whose syntax
and semantics are as close as possible to those of the Perl 5 language.
Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
specified below. The documentation for PCRE, supplied in the "doc"
directory, is distributed under the same terms as the software itself. The
basic library functions are written in C and are freestanding. Also
included in the distribution is a set of C++ wrapper functions, and a just-
in-time compiler that can be used to optimize pattern matching. These are
both optional features that can be omitted when the library is built.
THE BASIC LIBRARY FUNCTIONS
---------------------------
Written by: Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
University of Cambridge Computing Service,
Cambridge, England.
Copyright (c) 1997-2012 University of Cambridge
All rights reserved.
PCRE JUST-IN-TIME COMPILATION SUPPORT
-------------------------------------
Written by: Zoltan Herczeg
Email local part: hzmester
Emain domain: freemail.hu
Copyright(c) 2010-2012 Zoltan Herczeg
All rights reserved.
STACK-LESS JUST-IN-TIME COMPILER
--------------------------------
Written by: Zoltan Herczeg
Email local part: hzmester
Emain domain: freemail.hu
Copyright(c) 2009-2012 Zoltan Herczeg
All rights reserved.
THE C++ WRAPPER FUNCTIONS
-------------------------
Contributed by: Google Inc.
Copyright (c) 2007-2012, Google Inc.
All rights reserved.
THE "BSD" LICENCE
-----------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the name of Google
Inc. nor the names of their contributors may be used to endorse or
promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
6. Some of the cuBLAS library routines were written by or
derived from code written by Vasily Volkov and are subject
to the Modified Berkeley Software Distribution License as
follows:
Copyright (c) 2007-2009, Regents of the University of California
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the University of California, Berkeley nor
the names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
7. Some of the cuBLAS library routines were written by or
derived from code written by Davide Barbieri and are
subject to the Modified Berkeley Software Distribution
License as follows:
Copyright (c) 2008-2009 Davide Barbieri @ University of Rome Tor Vergata.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* The name of the author may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
8. Some of the cuBLAS library routines were derived from
code developed by the University of Tennessee and are
subject to the Modified Berkeley Software Distribution
License as follows:
Copyright (c) 2010 The University of Tennessee.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer listed in this license in the documentation and/or
other materials provided with the distribution.
* Neither the name of the copyright holders nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9. Some of the cuBLAS library routines were written by or
derived from code written by Jonathan Hogg and are subject
to the Modified Berkeley Software Distribution License as
follows:
Copyright (c) 2012, The Science and Technology Facilities Council (STFC).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the STFC nor the names of its contributors
may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE STFC BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10. Some of the cuBLAS library routines were written by or
derived from code written by Ahmad M. Abdelfattah, David
Keyes, and Hatem Ltaief, and are subject to the Apache
License, Version 2.0, as follows:
-- (C) Copyright 2013 King Abdullah University of Science and Technology
Authors:
Ahmad Abdelfattah (ahmad.ahmad@kaust.edu.sa)
David Keyes (david.keyes@kaust.edu.sa)
Hatem Ltaief (hatem.ltaief@kaust.edu.sa)
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the King Abdullah University of Science and
Technology nor the names of its contributors may be used to endorse
or promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
11. Some of the cuSPARSE library routines were written by or
derived from code written by Li-Wen Chang and are subject
to the NCSA Open Source License as follows:
Copyright (c) 2012, University of Illinois.
All rights reserved.
Developed by: IMPACT Group, University of Illinois, http://impact.crhc.illinois.edu
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal with the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimers in the documentation and/or other materials provided
with the distribution.
* Neither the names of IMPACT Group, University of Illinois, nor
the names of its contributors may be used to endorse or promote
products derived from this Software without specific prior
written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.
12. Some of the cuRAND library routines were written by or
derived from code written by Mutsuo Saito and Makoto
Matsumoto and are subject to the following license:
Copyright (c) 2009, 2010 Mutsuo Saito, Makoto Matsumoto and Hiroshima
University. All rights reserved.
Copyright (c) 2011 Mutsuo Saito, Makoto Matsumoto, Hiroshima
University and University of Tokyo. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Hiroshima University nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13. Some of the cuRAND library routines were derived from
code developed by D. E. Shaw Research and are subject to
the following license:
Copyright 2010-2011, D. E. Shaw Research.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions, and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions, and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of D. E. Shaw Research nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14. Some of the Math library routines were written by or
derived from code developed by Norbert Juffa and are
subject to the following license:
Copyright (c) 2015-2017, Norbert Juffa
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15. Licensee's use of the lz4 third party component is
subject to the following terms and conditions:
Copyright (C) 2011-2013, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16. The NPP library uses code from the Boost Math Toolkit,
and is subject to the following license:
Boost Software License - Version 1.0 - August 17th, 2003
. . . .
Permission is hereby granted, free of charge, to any person or
organization obtaining a copy of the software and accompanying
documentation covered by this license (the "Software") to use,
reproduce, display, distribute, execute, and transmit the Software,
and to prepare derivative works of the Software, and to permit
third-parties to whom the Software is furnished to do so, all
subject to the following:
The copyright notices in the Software and this entire statement,
including the above license grant, this restriction and the following
disclaimer, must be included in all copies of the Software, in whole
or in part, and all derivative works of the Software, unless such
copies or derivative works are solely in the form of machine-executable
object code generated by a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR
OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
17. Portions of the Nsight Eclipse Edition is subject to the
following license:
The Eclipse Foundation makes available all content in this plug-in
("Content"). Unless otherwise indicated below, the Content is provided
to you under the terms and conditions of the Eclipse Public License
Version 1.0 ("EPL"). A copy of the EPL is available at http://
www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program"
will mean the Content.
If you did not receive this Content directly from the Eclipse
Foundation, the Content is being redistributed by another party
("Redistributor") and different terms and conditions may apply to your
use of any object code in the Content. Check the Redistributor's
license that was provided with the Content. If no such license exists,
contact the Redistributor. Unless otherwise indicated below, the terms
and conditions of the EPL still apply to any source code in the
Content and such source code may be obtained at http://www.eclipse.org.
18. Some of the cuBLAS library routines uses code from
OpenAI, which is subject to the following license:
License URL
https://github.com/openai/openai-gemm/blob/master/LICENSE
License Text
The MIT License
Copyright (c) 2016 OpenAI (http://openai.com), 2016 Google Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
19. Licensee's use of the Visual Studio Setup Configuration
Samples is subject to the following license:
The MIT License (MIT)
Copyright (C) Microsoft Corporation. All rights reserved.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20. Licensee's use of linmath.h header for CPU functions for
GL vector/matrix operations from lunarG is subject to the
Apache License Version 2.0.
21. The DX12-CUDA sample uses the d3dx12.h header, which is
subject to the MIT license .
-----------------
nvidia-codec
DESIGNWORKS NVIDIA SDKS,
SAMPLES AND TOOLS AGREEMENT,
DISTRIBUTION RIGHTS (V.13.06.2017)
License
v13.06.2017
|
October 2021
Table of Contents
Chapter 1. SOFTWARE DEVELOPER KITS, SAMPLES AND TOOLS LICENSE
AGREEMENT (with distribution rights)............................................................................ 1
Chapter 2. NOTICES............................................................................................................. 8
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | ii
Chapter 1.
SOFTWARE
DEVELOPER
KITS, SAMPLES AND TOOLS
LICENSE AGREEMENT (with
distribution rights)
IMPORTANT – READ BEFORE DOWNLOADING, INSTALLING, COPYING OR USING THE
LICENSED SOFTWARE
READ CAREFULLY: This Software Developer Kits, Samples and Tools License Agreement
("Agreement”), made and entered into as of the time and date of click through action (“Effective
Date”), is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs the
use of the following NVIDIA deliverables to the extent provided to you under this Agreement:
API’s, source code and header files, data sets and assets (examples include images, textures,
models, scenes, videos, native API input/output files), binary software and/or documentation
(collectively, "Licensed Software"). By downloading, installing, copying, or otherwise using the
Licensed Software, you agree to be bound by the terms of this Agreement. If you do NOT AGREE
TO THE TERMS OF THIS AGREEMENT, DO NOT DOWNLOAD, INSTALL, COPY OR USE THE
NVIDIA LICENSED SOFTWARE. IF YOU ARE ENTERING INTO THIS AGREEMENT ON BEHALF
OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL
AUTHORITY TO BIND THE ENTITY TO THIS AGREEMENT, IN WHICH CASE “YOU” WILL MEAN
THE ENTITY YOU REPRESENT. IF YOU DON’T HAVE SUCH AUTHORITY, OR IF YOU DON’T
ACCEPT ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT, THEN NVIDIA IS UNWILLING
TO LICENSE THE LICENSED SOFTWARE TO YOU, AND YOU MAY NOT DOWNLOAD, INSTALL,
COPY OR USE IT.
1. LICENSE.
1.1 License Grant. Subject to the terms of this Agreement, NVIDIA hereby grants you a
nonexclusive, non-transferable, worldwide, revocable, limited, royalty-free, fully paid-up license
during the term of this Agreement to:
(i) install, use and reproduce the Licensed Software delivered by NVIDIA plus make modifications
and create derivative works of the source code and header files delivered by NVIDIA, provided that
the software is executed only in hardware products as specified by NVIDIA in the accompanying
documentation (such as release notes) as supported, to develop, test and service your products
(each, a “Customer Product”) that are interoperable with supported hardware products. If the
NVIDIA documentation is silent, the supported hardware consists of certain NVIDIA GPUs; and
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 1
SOFTWARE DEVELOPER KITS, SAMPLES AND TOOLS LICENSE AGREEMENT (with distribution rights)
(ii) incorporate Licensed Software as delivered by NVIDIA (including source code and header files
as modified by you) into a Customer Product in binary format only and sub-license and distribute
a Customer Product for use by your recipients only in the hardware products specified by NVIDIA
as supported, provided that: (a) all such distributions by you or your distribution channels are
consistent with the terms of this Agreement; and (b) you must enter into enforceable agreements
with your recipients that binds them to terms that are consistent with the terms set forth in this
Agreement for their use of the software binaries, including (without limitation) terms relating to
the license grant and license restrictions, confidentiality and protection of NVIDIA’s intellectual
property rights in and to the software you distributed. You are liable for the distribution and the
use of distributed software if you failed to comply or enforce the distribution requirements of this
Agreement. You agree to notify NVIDIA in writing of any known or suspected use or distribution
of the Licensed Software that are not in compliance with the terms of this Agreement.
1.2 Enterprise and Contractor Usage. Under this Agreement you may allow (i) your Enterprise
employees, and (ii) individuals who work primarily for your Enterprise on a contractor basis
and from your secure network (each a "Contractor") to access and use the Licensed Software
pursuant to the terms in Section 1 solely to perform work on your behalf, provided further
that with respect to Contractors: (i) you obtain a written agreement from the Contractor which
contains terms and obligations with respect to access to or use of Licensed Software no less
protective of NVIDIA than those set forth in this Agreement, and (ii) such Contractor’s access
and use expressly excludes any sublicensing or distribution rights for the Licensed Software.
You are responsible for the compliance with the terms and conditions of this Agreement by your
Enterprise and Contractors. Any act or omission that if committed by you would constitute a
breach of this Agreement shall be deemed to constitute a breach of this Agreement if committed
by your Enterprise or Contractors. “Enterprise” means you or any company or legal entity for
which you accepted the terms of this Agreement, and their subsidiaries of which your company
or legal entity owns more than fifty percent (50%) of the issued and outstanding equity.
1.3 No Support. NVIDIA is under no obligation to provide support for the Licensed Software or to
provide any error corrections or updates to the Licensed Software under this Agreement.
1.4 Product Specific Terms. With respect to the Iray Developer Edition Licensed Software, a
separate license is required from NVIDIA to enable or use the Iray runtime in any given machine.
1.5 Notification. You are required to notify NVIDIA prior to use of the NVIDIA DesignWorks
Licensed Software in a commercial application (including a plug-in to a commercial application).
Please send notification by visiting https://developer.nvidia.com/sw-notification and submitting
the web form requested information. NVIDIA will request company name, DesignWorks software
and version used, platform, commercial application release date, and weblink to product/video.
Failure to notify NVIDIA pursuant to this section shall be considered a material breach of this
Agreement.
2. LIMITATIONS.
2.1 License Restrictions. Except as expressly authorized in this Agreement, you agree that
you will not (nor authorize third parties to): (i) copy and use software that was licensed to
you for use in one or more devices in other unlicensed devices (provided that copies solely
for backup purposes are allowed); (ii) reverse engineer, decompile, disassemble (except to
the extent applicable laws specifically require that such activities be permitted) or attempt to
derive the source code, underlying ideas, algorithm or structure of software provided to you in
object code form; (iii) sell, transfer, assign, distribute, rent, loan, lease, sublicense or otherwise
make available the Licensed Software or its functionality to third parties (a) as an application
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 2
SOFTWARE DEVELOPER KITS, SAMPLES AND TOOLS LICENSE AGREEMENT (with distribution rights)
services provider or service bureau, (b) by operating hosted/virtual system environments, (c) by
hosting, time sharing or providing any other type of services, or (d) otherwise by means of the
internet; (iv) modify, translate or otherwise create any derivative works of any of the Licensed
Software; (v) remove, alter, cover or obscure any proprietary notice that appears on or with the
Licensed Software or any copies thereof; (vi) use the Licensed Software, or allow its use, transfer,
transmission or export in violation of any applicable export control laws, rules or regulations;
(vii) distribute, permit access to, or sublicense the Licensed Software as a stand-alone product;
(viii) bypass, disable, circumvent or remove any form of copy protection, encryption, security or
digital rights management or authentication mechanism used by NVIDIA in connection with the
Licensed Software, or use the Licensed Software together with any authorization code, serial
number, or other copy protection device not supplied by NVIDIA directly or through an authorized
reseller; (ix) use the Licensed Software for the purpose of developing competing products or
technologies or assisting a third party in such activities; (x) use the Licensed Software with any
system or application where the use or failure of such system or application can reasonably be
expected to threaten or result in personal injury, death, or catastrophic loss including, without
limitation, use in connection with any nuclear, avionics, navigation, military, medical, life support
or other life critical application (“Critical Applications”), unless the parties have entered into a
Critical Applications agreement; (xi) distribute any modification or derivative work you make to
the Licensed Software under or by reference to the same name as used by NVIDIA; or (xii) use the
Licensed Software in any manner that would cause the Licensed Software to become subject to
an Open Source License. Nothing in this Agreement shall be construed to give you a right to use,
or otherwise obtain access to, any source code from which the software or any portion thereof
is compiled or interpreted. You acknowledge that NVIDIA does not design, test, manufacture or
certify the Licensed Software for use in the context of a Critical Application and NVIDIA shall
not be liable to you or any third party, in whole or in part, for any claims or damages arising
from such use. You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and
their respective employees, contractors, agents, officers and directors, from and against any
and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and
expenses (including but not limited to attorney’s fees and costs incident to establishing the right
of indemnification) arising out of or related to you and your Enterprise, and their respective
employees, contractors, agents, distributors, resellers, end users, officers and directors use of
Licensed Software outside of the scope of this Agreement or any other breach of the terms of this
Agreement. “Open Source License” includes, without limitation, a software license that requires
as a condition of use, modification, and/or distribution of such software that the software be (x)
disclosed or distributed in source code form; (y) be licensed for the purpose of making derivative
works; or (z) be redistributable at no charge.
2.2 Third Party License Obligations. You acknowledge and agree that the Licensed Software
may include or incorporate third party technology (collectively “Third Party Components”), which
is provided for use in or with the software and not otherwise used separately. If the Licensed
Software includes or incorporates Third Party Components, then the third-party pass-through
terms and conditions (“Third Party Terms”) for the particular Third Party Component will be
bundled with the software or otherwise made available online as indicated by NVIDIA and will be
incorporated by reference into this Agreement. In the event of any conflict between the terms
in this Agreement and the Third Party Terms, the Third Party Terms shall govern. Copyright
to Third Party Components are held by the copyright holders indicated in the copyright notices
indicated in the Third Party Terms.
Audio/Video Encoders and Decoders. You acknowledge and agree that it is your sole
responsibility to obtain any additional third party licenses required to make, have made, use,
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 3
SOFTWARE DEVELOPER KITS, SAMPLES AND TOOLS LICENSE AGREEMENT (with distribution rights)
have used, sell, import, and offer for sale your products or services that include or incorporate
any Third Party Components and content relating to audio and/or video encoders and decoders
from, including but not limited to, Microsoft, Thomson, Fraunhofer IIS, Sisvel S.p.A., MPEG-LA,
and Coding Technologies as NVIDIA does not grant to you under this Agreement any necessary
patent rights with respect to audio and/or video encoders and decoders.
2.3 Limited Rights. Your rights in the Licensed Software are limited to those expressly granted
in Section 1 and no other licenses are granted whether by implication, estoppel or otherwise.
NVIDIA reserves all rights, title and interest in and to the Licensed Software not expressly
granted under this Agreement.
3. CONFIDENTIALITY. Neither party will use the other party’s Confidential Information, except as
necessary for the performance of this Agreement, nor will either party disclose such Confidential
Information to any third party, except to personnel of NVIDIA and its affiliates, you, your
Enterprise, your Enterprise Contractors, and each party’s legal and financial advisors that have
a need to know such Confidential Information for the performance of this Agreement, provided
that each such personnel, employee and Contractor is subject to a written agreement that
includes confidentiality obligations consistent with those set forth herein. Each party will use
all reasonable efforts to maintain the confidentiality of all of the other party’s Confidential
Information in its possession or control, but in no event less than the efforts that it ordinarily
uses with respect to its own Confidential Information of similar nature and importance. The
foregoing obligations will not restrict either party from disclosing the other party’s Confidential
Information or the terms and conditions of this Agreement as required under applicable
securities regulations or pursuant to the order or requirement of a court, administrative agency,
or other governmental body, provided that the party required to make such disclosure (i) gives
reasonable notice to the other party to enable it to contest such order or requirement prior to its
disclosure (whether through protective orders or otherwise), (ii) uses reasonable effort to obtain
confidential treatment or similar protection to the fullest extent possible to avoid such public
disclosure, and (iii) discloses only the minimum amount of information necessary to comply with
such requirements.
“Confidential Information” means the Licensed Software (unless made publicly available
by NVIDIA without confidentiality obligations), and any NVIDIA business, marketing, pricing,
research and development, know-how, technical, scientific, financial status, proposed new
products or other information disclosed by NVIDIA to you which, at the time of disclosure,
is designated in writing as confidential or proprietary (or like written designation), or orally
identified as confidential or proprietary or is otherwise reasonably identifiable by parties
exercising reasonable business judgment as confidential. Confidential Information does not and
will not include information that: (i) is or becomes generally known to the public through no fault
of or breach of this Agreement by the receiving party; (ii) is rightfully known by the receiving
party at the time of disclosure without an obligation of confidentiality; (iii) is independently
developed by the receiving party without use of the disclosing party’s Confidential Information;
or (iv) is rightfully obtained by the receiving party from a third party without restriction on use
or disclosure.
4. OWNERSHIP.
4.1 Ownership of Licensed Software. The Licensed Software, and the respective intellectual
property rights therein, is and will remain the sole and exclusive property of NVIDIA and its
licensors, whether the Licensed Software is separate from or combined with any other products
or materials. You shall not knowingly engage in any act or omission that would impair NVIDIA’s
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 4
SOFTWARE DEVELOPER KITS, SAMPLES AND TOOLS LICENSE AGREEMENT (with distribution rights)
and/or its licensors’ intellectual property rights in the Licensed Software or any other materials,
information, processes or subject matter proprietary to NVIDIA. NVIDIA’s licensors are intended
third party beneficiaries with the right to enforce provisions of this Agreement with respect to
their Confidential Information and/or intellectual property rights.
4.2 Modifications. You have no obligation to provide your permitted modifications to NVIDIA.
You hold all rights, title and interest in and to the modifications to and derivative works of
the NVIDIA source code and header files that you create as permitted hereunder, subject
to NVIDIA’s underlying intellectual property rights in and to the NVIDIA software; provided,
however that you grant NVIDIA, its affiliates and their respective customers an irrevocable,
perpetual, nonexclusive, worldwide, royalty-free paid-up license to make, have made, use, have
used, reproduce, sell, license, distribute, sublicense, transfer and otherwise commercialize
modifications and derivative works including (without limitation) with the Licensed Software or
other products, technologies or materials.
5. FEEDBACK. You have no obligation to provide Feedback to NVIDIA. However, NVIDIA and/or its
affiliates may use and include any Feedback that you provide to improve the Licensed Software
or other NVIDIA products, technologies or materials. Accordingly, if you provide Feedback,
you agree that NVIDIA and/or its affiliates may at their option, and may permit its licensees,
to make, have made, use, have used, reproduce, sell, license, distribute, sublicense, transfer
and otherwise commercialize the Feedback in the Licensed Software or in other products,
technologies or materials without the payment of any royalties or fees to you. All Feedback
becomes the sole property of NVIDIA and may be used in any manner NVIDIA sees fit, and you
hereby assign to NVIDIA all of your right, title and interest in and to any Feedback. NVIDIA has
no obligation to respond to Feedback or to incorporate Feedback into the Licensed Software.
“Feedback” means any and all suggestions, feature requests, comments or other feedback
relating to the Licensed Software, including possible enhancements or modifications thereto.
6. NO WARRANTIES. THE LICENSED SOFTWARE IS PROVIDED BY NVIDIA “AS IS” AND “WITH
ALL FAULTS,” AND NVIDIA EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND OR
NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
TO, ANY WARRANTIES OF OPERABILITY, CONDITION, VALUE, ACCURACY OF DATA, OR
QUALITY, AS WELL AS ANY WARRANTIES OF MERCHANTABILITY, SYSTEM INTEGRATION,
WORKMANSHIP, SUITABILITY, NON-INFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE,
OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY
IS MADE BY NVIDIA ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE
OF TRADE. NVIDIA DOES NOT WARRANT THAT THE LICENSED SOFTWARE WILL MEET
YOUR REQUIREMENTS OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED
OR ERRORFREE, OR THAT ALL ERRORS WILL BE CORRECTED. YOU ACKNOWLEDGE THAT
NVIDIA’S OBLIGATIONS UNDER THIS AGREEMENT ARE FOR THE BENEFIT OF YOU ONLY.
Nothing in this warranty section affects any statutory rights of consumers or other recipients to
the extent that they cannot be waived or limited by contract under applicable law.
7. LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY LAW NVIDIA OR
ITS LICENSORS SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR
CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR
LOSS OF GOODWILL), OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING
OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF
THE LICENSED SOFTWARE, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED
UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE),
PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 5
SOFTWARE DEVELOPER KITS, SAMPLES AND TOOLS LICENSE AGREEMENT (with distribution rights)
EVENT WILL NVIDIA’S TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS
AGREEMENT EXCEED THE GREATER OF THE NET AMOUNT NVIDIA RECEIVED FOR YOUR USE
OF THE LICENSED SOFTWARE ONE HUNDRED U.S. DOLLARS (US $100). THE NATURE OF THE
LIABILITY, THE NUMBER OF CLAIMS OR SUITS OR THE NUMBER OF PARTIES WITHIN YOUR
ENTERPRISE THAT ACCEPTED THE TERMS OF THIS AGREEMENT SHALL NOT ENLARGE OR
EXTEND THIS LIMIT. THE FOREGOING LIMITATIONS SHALL APPLY REGARDLESS OF WHETHER
NVIDIA OR ITS LICENSORS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND
REGARDLESS OF WHETHER ANY REMEDY FAILS ITS ESSENTIAL PURPOSE.
8. TERM AND TERMINATION. This Agreement and your licenses hereunder shall become
effective upon the Effective Date and shall remain in effect unless and until terminated as
follows: (i) automatically if you breach any of the terms of this Agreement; or (ii) by either party
upon written notice if the other party becomes the subject of a voluntary or involuntary petition
in bankruptcy or any proceeding relating to insolvency, receivership, liquidation or composition
for the benefit of creditors, if that petition or proceeding is not dismissed with prejudice within
sixty (60) days after filing, or if a party ceases to do business; (iii) by you, upon ceasing to use the
Licensed Software provided under this Agreement; or (iv) by NVIDIA upon written notice if you
commence or participate in any legal proceeding against NVIDIA, with respect to the Licensed
Software that is the subject of the proceeding during the pendency of such legal proceeding.
Termination of this Agreement regardless of cause or nature shall be without prejudice to any
other rights or remedies of the parties and shall be without liability for any loss or damage
occasioned thereby. Upon any expiration or termination of this Agreement (i) you must promptly
discontinue use of the Licensed Software, and (ii) you must promptly destroy or return to NVIDIA
all copies of the Licensed Software and all portions thereof in your possession or control, and
each party will promptly destroy or return to the other all of the other party’s Confidential
Information within its possession or control, provided that your prior distributions in accordance
with this Agreement are not affected by the expiration or termination of this Agreement. Upon
written request, you will certify in writing that you have complied with your obligations under
this section. Sections 2 through 9 will survive the expiration or termination of this Agreement
for any reason.
9. GENERAL. This Agreement constitutes the entire agreement of the parties with respect to
the subject matter hereto and supersedes all prior negotiations, conversations, or discussions
between the parties relating to the subject matter hereto, oral or written, and all past dealings or
industry custom. Any additional and/or conflicting terms and conditions on purchase order(s) or
any other documents issued by you are null, void, and invalid. Any amendment or waiver under
this Agreement must be in writing and signed by representatives of both parties.
This Agreement and the rights and obligations thereunder may not be assigned by you, in whole
or in part, including by merger, consolidation, dissolution, operation of law, or any other manner,
without written consent of NVIDIA, and any purported assignment in violation of this provision
shall be void and of no effect. NVIDIA may assign, delegate or transfer this Agreement and its
rights and obligations hereunder, and if to a non-affiliate you will be notified.
Each party acknowledges and agrees that the other is an independent contractor in the
performance of this Agreement, and each party is solely responsible for all of its employees,
agents, contractors, and labor costs and expenses arising in connection therewith. The parties
are not partners, joint ventures or otherwise affiliated, and neither has any authority to make any
statements, representations or commitments of any kind to bind the other party without prior
written consent.
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 6
SOFTWARE DEVELOPER KITS, SAMPLES AND TOOLS LICENSE AGREEMENT (with distribution rights)
Neither party will be responsible for any failure or delay in its performance under this Agreement
(except for any payment obligations) to the extent due to causes beyond its reasonable control
for so long as such force majeure event continues in effect.
This Agreement will be governed by and construed under the laws of the State of Delaware and
the United States without regard to the conflicts of law provisions thereof and without regard
to the United Nations Convention on Contracts for the International Sale of Goods. The parties
consent to the personal jurisdiction of the federal and state courts located in Santa Clara County,
California. You acknowledge and agree that a breach of any of your promises or agreements
contained in this Agreement may result in irreparable and continuing injury to NVIDIA for which
monetary damages may not be an adequate remedy and therefore NVIDIA is entitled to seek
injunctive relief as well as such other and further relief as may be appropriate. If any court
of competent jurisdiction determines that any provision of this Agreement is illegal, invalid or
unenforceable, the remaining provisions will remain in full force and effect. Unless otherwise
specified, remedies are cumulative.
The Licensed Software has been developed entirely at private expense and is “commercial
items” consisting of “commercial computer software” and “commercial computer software
documentation” provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S.
Government or a U.S. Government subcontractor is subject to the restrictions set forth in this
Agreement pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (c)(1) and (2) of
the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable.
Contractor/manufacturer is NVIDIA, 2701 San Tomas Expressway, Santa Clara, CA 95050.
You acknowledge that the Licensed Software described under this Agreement is subject to
export control under the U.S. Export Administration Regulations (EAR) and economic sanctions
regulations administered by the U.S. Department of Treasury’s Office of Foreign Assets Control
(OFAC). Therefore, you may not export, reexport or transfer in-country the Licensed Software
without first obtaining any license or other approval that may be required by BIS and/or OFAC.
You are responsible for any violation of the U.S. or other applicable export control or economic
sanctions laws, regulations and requirements related to the Licensed Software. By accepting
this SLA, you confirm that you are not a resident or citizen of any country currently embargoed
by the U.S. and that you are not otherwise prohibited from receiving the Licensed Software.
Any notice delivered by NVIDIA to you under this Agreement will be delivered via mail, email or
fax. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2701 San
Tomas Expressway, Santa Clara, California 95050, United States of America, Attention: Legal
Department.
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 7
Chapter 2.
NOTICES
This SDK includes portions of FFMPEG under GNU LESSER GENERAL PUBLIC LICENSE
(Version 3, 29 June 2007) license. A copy of the license is present in the SDK package
DESIGNWORKS NVIDIA SDKS, SAMPLES AND TOOLS
AGREEMENT, DISTRIBUTION RIGHTS (V.13.06.2017)
v13.06.2017 | 8
onevpl
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
openssl
LICENSE ISSUES
==============
The OpenSSL toolkit stays under a double license, i.e. both the conditions of
the OpenSSL License and the original SSLeay license apply to the toolkit.
See below for the actual license texts.
OpenSSL License
---------------
/* ====================================================================
* Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
Original SSLeay License
-----------------------
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
*
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
*
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* "This product includes cryptographic software written by
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
* 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
*
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
* [including the GNU Public Licence.]
*/
opus
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
pixman
The following is the MIT license, agreed upon by most contributors.
Copyright holders of new code should use this license statement where
possible. They may also add themselves to the list below.
/*
* Copyright 1987, 1988, 1989, 1998 The Open Group
* Copyright 1987, 1988, 1989 Digital Equipment Corporation
* Copyright 1999, 2004, 2008 Keith Packard
* Copyright 2000 SuSE, Inc.
* Copyright 2000 Keith Packard, member of The XFree86 Project, Inc.
* Copyright 2004, 2005, 2007, 2008, 2009, 2010 Red Hat, Inc.
* Copyright 2004 Nicholas Miell
* Copyright 2005 Lars Knoll & Zack Rusin, Trolltech
* Copyright 2005 Trolltech AS
* Copyright 2007 Luca Barbato
* Copyright 2008 Aaron Plattner, NVIDIA Corporation
* Copyright 2008 Rodrigo Kumpera
* Copyright 2008 André Tupinambá
* Copyright 2008 Mozilla Corporation
* Copyright 2008 Frederic Plourde
* Copyright 2009, Oracle and/or its affiliates. All rights reserved.
* Copyright 2009, 2010 Nokia Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
rist
Copyright © 2019-2020, VideoLAN and librist authors
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rist-cpp
Copyright © 2019-2020, VideoLAN and librist authors
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
spdlog
The MIT License (MIT)
Copyright (c) 2016 Gabi Melman.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-- NOTE: Third party dependency used by this software --
This software depends on the fmt lib (MIT License),
and users must comply to its license: https://raw.githubusercontent.com/fmtlib/fmt/master/LICENSE
srt
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
srt-cpp
Copyright (c) 2020 Anders Cedronius
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
systemd
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
uuid
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
va
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sub license, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice (including the
next paragraph) shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
zlib
/* zlib.h -- interface of the 'zlib' general purpose compression library
version 1.2.12, March 27th, 2022
Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Jean-loup Gailly Mark Adler
jloup@gzip.org madler@alumni.caltech.edu
*/
zstandard
BSD License
For Zstandard software
Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name Facebook, nor Meta, nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8.2 - REST API Credits
License List
The table below lists the third party libraries used by this software and their respective license types.
License Details
This section includes all the licenses/notices for each dependency verbatim
github.com/ajg/form
LICENSE
Copyright (c) 2014 Alvaro J. Genial. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
github.com/beorn7/perks/quantile
LICENSE
Copyright (C) 2013 Blake Mizerany
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/cespare/xxhash/v2
LICENSE
Copyright (c) 2016 Caleb Spare
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/gabriel-vasile/mimetype
LICENSE
MIT License
Copyright (c) 2018 Gabriel Vasile
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/go-chi/chi/v5
LICENSE
Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/go-chi/cors
LICENSE
Copyright (c) 2014 Olivier Poitrey rs@dailymotion.com Copyright (c) 2016-Present https://github.com/go-chi authors
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/go-chi/httplog
LICENSE
Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka).
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/go-chi/render
LICENSE
Copyright (c) 2016-Present https://github.com/go-chi authors
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/go-openapi/jsonpointer
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
github.com/go-openapi/jsonreference
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
github.com/go-openapi/spec
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
github.com/go-openapi/swag
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
github.com/go-playground/locales
LICENSE
The MIT License (MIT)
Copyright (c) 2016 Go Playground
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/go-playground/universal-translator
LICENSE
The MIT License (MIT)
Copyright (c) 2016 Go Playground
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/go-playground/validator/v10
LICENSE
The MIT License (MIT)
Copyright (c) 2015 Dean Karn
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/gofrs/uuid
LICENSE
Copyright (C) 2013-2018 by Maxim Bublis b@codemonkey.ru
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/gorilla/websocket
LICENSE
Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
github.com/josharian/intern
license
MIT License
Copyright (c) 2019 Josh Bleecher Snyder
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/kkyr/fig
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2020 Kyriacos Kyriacou contact@kkyr.io
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
github.com/klauspost/compress
LICENSE
Copyright (c) 2012 The Go Authors. All rights reserved. Copyright (c) 2019 Klaus Post. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Files: gzhttp/*
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2016-2017 The New York Times Company
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Files: s2/cmd/internal/readahead/*
The MIT License (MIT)
Copyright (c) 2015 Klaus Post
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Files: snappy/* Files: internal/snapref/*
Copyright (c) 2011 The Snappy-Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Files: s2/cmd/internal/filepathx/*
Copyright 2016 The filepathx Authors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/klauspost/compress/internal/snapref
LICENSE
Copyright (c) 2011 The Snappy-Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
github.com/klauspost/compress/zstd/internal/xxhash
LICENSE
Copyright (c) 2016 Caleb Spare
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/KyleBanks/depth
LICENSE
MIT License
Copyright (c) 2017 Kyle Banks
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/leodido/go-urn
LICENSE
MIT License
Copyright (c) 2018 Leonardo Di Donato
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/mailru/easyjson
LICENSE
Copyright (c) 2016 Mail.Ru Group
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/mattn/go-colorable
LICENSE
The MIT License (MIT)
Copyright (c) 2016 Yasuhiro Matsumoto
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/mattn/go-isatty
LICENSE
Copyright (c) Yasuhiro MATSUMOTO mattn.jp@gmail.com
MIT License (Expat)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/mitchellh/mapstructure
LICENSE
The MIT License (MIT)
Copyright (c) 2013 Mitchell Hashimoto
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/munnerz/goautoneg
LICENSE
Copyright (c) 2011, Open Knowledge Foundation Ltd. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
Neither the name of the Open Knowledge Foundation Ltd. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
github.com/pelletier/go-toml/v2
LICENSE
The MIT License (MIT)
go-toml v2 Copyright (c) 2021 - 2023 Thomas Pelletier
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil
LICENSE
Copyright (c) 2013 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
github.com/prometheus/client_golang/prometheus
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
NOTICE
Prometheus instrumentation library for Go applications Copyright 2012-2015 The Prometheus Authors
This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).
The following components are included in this product:
perks - a fork of https://github.com/bmizerany/perks https://github.com/beorn7/perks Copyright 2013-2015 Blake Mizerany, Björn Rabenstein See https://github.com/beorn7/perks/blob/master/README.md for license details.
Go support for Protocol Buffers - Google’s data interchange format http://github.com/golang/protobuf/ Copyright 2010 The Go Authors See source code for license details.
github.com/prometheus/client_model/go
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
NOTICE
Data model artifacts for Prometheus. Copyright 2012-2015 The Prometheus Authors
This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).
github.com/prometheus/common
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
NOTICE
Common libraries shared by Prometheus Go components. Copyright 2015 The Prometheus Authors
This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).
github.com/prometheus/procfs
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
NOTICE
procfs provides functions to retrieve system, kernel and process metrics from the pseudo-filesystem proc.
Copyright 2014-2015 The Prometheus Authors
This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).
github.com/rs/zerolog
LICENSE
MIT License
Copyright (c) 2017 Olivier Poitrey
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/swaggo/files
LICENSE
MIT License
Copyright (c) 2019 Swaggo
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/swaggo/http-swagger
LICENSE
MIT License
Copyright (c) 2018 Swaggo
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/swaggo/swag
license
MIT License
Copyright (c) 2017 Eason Lin
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
github.com/wagslane/go-password-validator
LICENSE
MIT License
Copyright (c) 2020 Lane Wagner
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
golang.org/x/crypto
LICENSE
Copyright 2009 The Go Authors.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
golang.org/x/net
LICENSE
Copyright 2009 The Go Authors.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
golang.org/x/sys
LICENSE
Copyright 2009 The Go Authors.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
golang.org/x/text
LICENSE
Copyright 2009 The Go Authors.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
golang.org/x/time/rate
LICENSE
Copyright 2009 The Go Authors.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
golang.org/x/tools
LICENSE
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
google.golang.org/protobuf
LICENSE
Copyright (c) 2018 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
gopkg.in/natefinch/lumberjack.v2
LICENSE
The MIT License (MIT)
Copyright (c) 2014 Nate Finch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gopkg.in/yaml.v3
LICENSE
This project is covered by two different licenses: MIT and Apache.
MIT License
The following files were ported to Go from C files of libyaml, and thus are still covered by their original MIT license, with the additional copyright staring in 2011 when the project was ported over:
apic.go emitterc.go parserc.go readerc.go scannerc.go
writerc.go yamlh.go yamlprivateh.go
Copyright (c) 2006-2010 Kirill Simonov Copyright (c) 2006-2011 Kirill Simonov
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Apache License
All the remaining project files are covered by the Apache license:
Copyright (c) 2011-2019 Canonical Ltd
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
NOTICE
Copyright 2011-2016 Canonical Ltd.
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.