Awesome
An NMOS C++ Implementation
Introduction
This repository contains an implementation of the AMWA Networked Media Open Specifications in C++, licensed under the terms of the Apache License 2.0.
- AMWA IS-04 NMOS Discovery and Registration Specification
- AMWA IS-05 NMOS Device Connection Management Specification
- AMWA IS-07 NMOS Event & Tally Specification
- AMWA IS-08 NMOS Audio Channel Mapping Specification
- AMWA IS-09 NMOS System Parameters Specification (originally defined in JT-NM TR-1001-1:2018 Annex A)
- AMWA IS-10 NMOS Authorization Specification
- AMWA IS-12 AMWA IS-12 NMOS Control Protocol
- AMWA BCP-002-01 NMOS Grouping Recommendations - Natural Grouping
- AMWA BCP-002-02 NMOS Asset Distinguishing Information
- AMWA BCP-003-01 Secure Communication in NMOS Systems
- AMWA BCP-003-02 Authorization in NMOS Systems
- AMWA BCP-004-01 NMOS Receiver Capabilities
- AMWA BCP-006-01 NMOS With JPEG XS
- AMWA MS-05-01 NMOS Control Architecture
- AMWA MS-05-02 NMOS Control Framework
For more information about AMWA, NMOS and the Networked Media Incubator, please refer to http://amwa.tv/.
- The nmos module includes implementations of the NMOS Node, Registration and Query APIs, the NMOS Connection API, and so on.
- The nmos-cpp-registry application provides a simple but functional instance of an NMOS Registration & Discovery System (RDS), utilising the nmos module.
- The nmos-cpp-node application provides an example NMOS Node, also utilising the nmos module.
The repository structure, and the external dependencies, are outlined in the documentation. Some information about the overall design of nmos-cpp is also included in the architecture documentation.
Getting Started With NMOS
The Easy-NMOS starter kit allows the user to launch a simple NMOS setup with minimal installation steps. It relies on a containerized nmos-cpp build to provide an NMOS Registry and a virtual NMOS Node in a Docker Compose network, along with the AMWA NMOS Testing Tool and supporting services.
Alternatively, it is possible to install a pre-built package for many platforms. See the instructions for installing with Conan.
Getting Started For Developers
Easy-NMOS is also a great first way to explore the relationship between NMOS services before building nmos-cpp for yourself.
The codebase is intended to be portable, and the nmos-cpp CMake project can be built on at least Linux, Windows and macOS.
After setting up the dependencies, follow these instructions to build and install nmos-cpp on your platform, and run the test suite.
Next, try out the registry and node applications in the tutorial.
An nmos-cpp Conan package is occasionally published at Conan Center Index.
Agile Development
The nmos-cpp applications, like the NMOS Specifications, are intended to be always ready, but steadily developing. They have been successfully tested in many AMWA Networked Media Incubator workshops, and are used as reference NMOS implementations in the JT-NM Tested programme. Several vendors have deployed JT-NM Tested badged products, using nmos-cpp, to their customers.
Build Status
The following configurations, defined by the build-test jobs, are built and unit tested automatically via continuous integration.
Platform | Version | Build Options | Test Options |
---|---|---|---|
Linux | Ubuntu 22.04 (GCC 11.2.0) | Avahi | Secure Communications<br/>Multicast DNS-SD |
Linux | Ubuntu 22.04 (GCC 11.2.0) | Avahi | Secure Communications<br/>IS-10 Authorization<br/>Multicast DNS-SD |
Linux | Ubuntu 20.04 (GCC 9.4.0) | Avahi | Secure Communications<br/>IS-10 Authorization<br/>Multicast DNS-SD |
Linux | Ubuntu 20.04 (GCC 9.4.0) | Avahi | Secure Communications<br/>IS-10 Authorization<br/>Unicast DNS-SD |
Linux | Ubuntu 20.04 (GCC 9.4.0) | mDNSResponder | Secure Communications<br/>IS-10 Authorization<br/>Multicast DNS-SD |
Linux | Ubuntu 14.04 (GCC 4.8.4) | mDNSResponder, not using Conan | Secure Communications<br/>IS-10 Authorization<br/>Multicast DNS-SD |
Windows | Server 2019 (VS 2019) | Bonjour (mDNSResponder), WinHTTP | Secure Communications<br/>IS-10 Authorization<br/>Multicast DNS-SD |
Windows | Server 2022 (VS 2022) | Bonjour (mDNSResponder), ASIO | Secure Communications<br/>Multicast DNS-SD |
Windows | Server 2022 (VS 2022) | Bonjour (mDNSResponder), ASIO | Secure Communications<br/>IS-10 Authorization<br/>Multicast DNS-SD |
macOS | 11 (AppleClang 13.0) | Bonjour (mDNSResponder) | Secure Communications<br/>IS-10 Authorization<br/>Multicast DNS-SD |
The AMWA NMOS API Testing Tool is automatically run against the APIs of the nmos-cpp-node and nmos-cpp-registry applications.
Recent Activity
The implementation is designed to be extended. Development is ongoing, following the evolution of the NMOS specifications in the AMWA Networked Media Incubator.
Recent activity on the project (newest first):
- Added support for the IS-12 NMOS Control Protocol
- Update to Conan 2; Conan 1.X is no longer supported
- Added support for IS-10 Authorization
- Added support for HSTS and OCSP stapling
- Added support for BCP-006-01 v1.0-dev, which can be demonstrated with nmos-cpp-node by using
"video_type": "video/jxsv"
- Updates to the GitHub Actions build-test workflow for better coverage of platforms and to include unicast DNS-SD tests
- Regular Conan Center Index releases (see nmos-cpp recipe)
- Update to RQL implementation to support advanced queries for string values containing '.'
- Improvements to the SDP parser/generator
- Improvements to Conan/CMake build, including updates to preferred version of dependencies such as Boost and OpenSSL
- Prepared a basic Conan recipe for building nmos-cpp, in
Sandbox/conan-recipe - Refactored the CMake build to make it easier to use nmos-cpp from another project, demonstrated by Sandbox/my-nmos-node
- Added support for BCP-004-01 Receiver Capabilities
- Switched CI testing to run the nmos-cpp applications and the AMWA NMOS Testing Tool with secure communication (TLS) enabled, as per BCP-003-01
- Added support for the IS-08 Channel Mapping API
- JT-NM Tested 03/20 badge
- Switched Continous Integration to GitHub Actions and added Windows and macOS to the tested platforms
- Extended the nmos-cpp-node to include mock senders/receivers of audio and ancillary data and offer some additional configuration settings
- Simplified the build process to use Conan by default to download most of the dependencies
- Added support in the Node implementation for discovery of, and interaction with, a System API, as required for compliance with TR-1001-1
- Changed the implementation of
nmos::tai_clock
with the effect that it may no longer be monotonic - Added a minimum viable LLDP implementation (enabled by a CMake configuration option) to support sending and receiving the IS-04 v1.3 additional network data for Nodes required by IS-06
- Update the IS-05 schemas to correct an unfortunate bug in the IS-05 v1.1 spec (see AMWA-TV/nmos-device-connection-management#99)
- Attempt to determine the DNS domain name automatically if not explicitly specified, for TR-1001-1
- Travis CI integration
- Updates for resolutions of specification issues in IS-04 v1.3 and IS-05 v1.1 final drafts
- Experimental support for human-readable HTML rendering of NMOS responses
- Experimental support for the rehomed (work in progress) IS-09 System API (originally defined in JT-NM TR-1001-1:2018 Annex A)
- IS-07 Events API and Events WebSocket API implementation and updated nmos-cpp-node example
- Experimental support for secure communications (HTTPS, WSS)
- Bug fixes (with test cases added to the AMWA NMOS API Testing Tool)
- Support for running nmos-cpp applications with forward/reverse proxies
- Experimental support for JT-NM TR-1001-1 System API
- Instructions for cross-compiling for the Raspberry Pi
- Instructions for running the official AMWA NMOS API Testing Tool
- Updates to build instructions and required dependencies
- Simpler creation/processing of the types of SDP files required to support ST 2110 and ST 2022-7
- Simpler run-time configuration of the nmos-cpp-node and nmos-cpp-registry settings
- Some documentation about the overall design of nmos-cpp for developers
- An implementation of the Connection API
- A fix for a potential memory leak
- An SDP parser/generator (to/from a JSON representation)
- JSON Schema validation in the Registration API and the Query API
- Cross-platform build support using CMake
- An initial release of the nmos-cpp-node example application
- Back-end enhancements as part of the NMOS Scalability Activity
Contributing
We welcome bug reports, feature requests and contributions to the implementation and documentation. Please have a look at the simple Contribution Guidelines.
Thank you for your interest!