{"id":14551273,"url":"https://github.com/NVIDIA/nvnmos","last_synced_at":"2025-09-03T21:32:30.623Z","repository":{"id":248902443,"uuid":"827931045","full_name":"NVIDIA/nvnmos","owner":"NVIDIA","description":"NVIDIA NMOS (Networked Media Open Specifications) Library","archived":false,"fork":false,"pushed_at":"2024-09-09T15:32:17.000Z","size":89,"stargazers_count":10,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-18T11:02:18.512Z","etag":null,"topics":["c","cpp","nmos","sdk"],"latest_commit_sha":null,"homepage":"https://nvidia.github.io/nvnmos/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NVIDIA.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-12T17:35:23.000Z","updated_at":"2024-12-17T20:24:14.000Z","dependencies_parsed_at":"2024-07-17T20:46:23.477Z","dependency_job_id":"2fd79882-abca-464f-9dd1-7671cbedf3bc","html_url":"https://github.com/NVIDIA/nvnmos","commit_stats":null,"previous_names":["nvidia/nvnmos"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NVIDIA%2Fnvnmos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NVIDIA%2Fnvnmos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NVIDIA%2Fnvnmos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NVIDIA%2Fnvnmos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NVIDIA","download_url":"https://codeload.github.com/NVIDIA/nvnmos/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231921662,"owners_count":18446374,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","cpp","nmos","sdk"],"created_at":"2024-09-06T14:00:35.444Z","updated_at":"2025-09-03T21:32:30.610Z","avatar_url":"https://github.com/NVIDIA.png","language":"C++","readme":"\u003c!--\n SPDX-FileCopyrightText: Copyright (c) 2022-2024 NVIDIA CORPORATION \u0026 AFFILIATES. All rights reserved.\n SPDX-License-Identifier: Apache-2.0\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\u003e\n\n# NVIDIA Networked Media Open Specifications Library\n\n## Introduction\n\nThe [Networked Media Open Specifications (NMOS)](https://www.amwa.tv/nmos-overview) enable the registration, discovery and management of Media Nodes.\n\nThe NVIDIA NMOS control plane library, NvNmos, provides the APIs to create, destroy and internally manage an [NMOS](https://specs.amwa.tv/nmos) Node for a Media Node application.\nIt is intended to be integrated with an ST 2110 data plane library such as [NVIDIA Rivermax](https://developer.nvidia.com/networking/rivermax) or [NVIDIA DeepStream](https://developer.nvidia.com/deepstream-sdk).\n\nThe library can automatically discover and register with an NMOS Registry on the network using the [AMWA IS-04](https://specs.amwa.tv/is-04/) Registration API.\n\nThe library provides callbacks for NMOS events such as [AMWA IS-05](https://specs.amwa.tv/is-05/) Connection API requests from an NMOS Controller.\nThese callbacks can be used to update running DeepStream pipelines with new transport parameters, for example.\n\nNvNmos currently supports Senders and Receivers for uncompressed Video and Audio, i.e., SMPTE ST 2110-20 and SMPTE ST 2110-30 streams.\n\nThe NvNmos library supports the following specifications, using the [Sony nmos-cpp](https://github.com/sony/nmos-cpp) implementation internally:\n- [AMWA IS-04 NMOS Discovery and Registration Specification](https://specs.amwa.tv/is-04/) v1.3\n- [AMWA IS-05 NMOS Device Connection Management Specification](https://specs.amwa.tv/is-05/) v1.1\n- [AMWA IS-09 NMOS System Parameters Specification](https://specs.amwa.tv/is-09/) v1.0\n- [AMWA BCP-002-01 Natural Grouping of NMOS Resources](https://specs.amwa.tv/bcp-002-01/) v1.0\n- [AMWA BCP-002-02 NMOS Asset Distinguishing Information](https://specs.amwa.tv/bcp-002-02/) v1.0\n- [AMWA BCP-004-01 NMOS Receiver Capabilities](https://specs.amwa.tv/bcp-004-01/) v1.0\n- [AMWA BCP-006-01 NMOS With JPEG XS](https://specs.amwa.tv/bcp-006-01/) v1.0\n- Session Description Protocol conforming to SMPTE ST 2110-20, -22, -30, -40, and ST 2022-7\n\n## Supported Platforms\n\nThe library is intended to be portable to different environments.\nThe following operating systems and compilers have been tested.\n\n* Ubuntu 22.04 with GCC 11\n* Windows 10 with Visual Studio 2022\n\n## Usage\n\nNvNmos consists of a single shared library (_libnvnmos.so_ on Linux, _nvnmos.dll_ on Windows).\nThe API is specified by the _nvnmos.h_ header file.\n\nThe nvnmos-example application demonstrates use of the library.\n\n## Docker-Based Build\n\nA _Dockerfile_ is provided which builds, packages and tests the library and application from source.\n\n```sh\ndocker build -t nvnmos .\n```\n\nThe package can then be copied directly to the host system.\n\n```sh\ndocker create --name nvnmos-test nvnmos\ndocker cp nvnmos-test:/nvnmos-ubuntu-22.04.tar.gz .\ndocker rm nvnmos-test\n```\n\nThe container also has an _entrypoint.sh_ which demonstrates how to install the run-time requirements and run the application.\n\n```sh\ndocker run -it nvnmos /bin/bash\n```\n\n### Dockerfile Build Arguments\n\nThe following build arguments are available.\n\n| Argument | Explanation |\n| --- | --- |\n| BASE_IMAGE | Controls the base container image and therefore the compatibility of the created package. Default is `ubuntu:22.04`. | \n| PACKAGE_SUFFIX | Controls the package filename, which will be _nvnmos\\\u003csuffix\\\u003e.tar.gz_. Default is based on the base image, e.g. `-ubuntu-22.04`. |\n| USE_CONAN_LOCK | Controls whether the _conan.lock_ file is used to ensure reproducible dependencies, even when new versions are available. Default is `1` (on). |\n\nIf this isn't sufficient for your purposes, read on for manual build instructions.\n\n## Pre-Build Requirements\n\n### Python Package Installer\n\nHaving Python 3 isn't an absolute requirement but it makes the subsequent steps to install the dependencies easier.\n\n**Linux**\n\nUse the system package manager to install Python 3 and the [Package Installer for Python (pip)](https://pypi.org/project/pip/).\n\n\u003e 💬 **Note:**\n\u003e The `-y` option allows `apt install` to run non-interactively.\n\n```sh\nsudo apt install -y python3-pip\n\npip3 install --upgrade pip\n```\n\n**Windows**\n\nDownload the Python 3 installer and run it manually or use the following PowerShell script.\n\n\u003e 💬 **Note:**\n\u003e The `` ` `` is the PowerShell line continuation character.\n\n```PowerShell\nInvoke-WebRequest `\n  https://www.python.org/ftp/python/3.10.9/python-3.10.9-amd64.exe `\n  -OutFile python-3.10.9-amd64.exe\n\n./python-3.10.9-amd64.exe /quiet PrependPath=1 Include_tcltk=0 Include_test=0\n\npip3 install --upgrade pip\n```\n\n### CMake\n\nThe project requires CMake 3.17 or higher. (The system-provided CMake 3.10 on the Jetson is not sufficient.)\n\nThere are x86_64 and arm64 packages for CMake 3.30.0 on the [Python Package Index (PyPI)](https://pypi.org/) which have been tested.\n\n**Linux**\n\n```sh\npip3 install cmake~=3.17\n```\n\n\u003e 💬 **Note:**\n\u003e Using `sudo` would overwrite an existing CMake package in _/usr/local/bin_.\n\u003e Avoiding this is recommended; without `sudo` the installer puts binaries in a per-user directory, _/home/\\\u003cuserid\\\u003e/.local/bin_.\n\u003e On the Jetson, this isn't in the user's `PATH` by default.\n\u003e To add it for the current session, use the following command.\n\u003e Replace `\u003cuserid\u003e` with the necessary value.\n\u003e\n\u003e ```sh\n\u003e export PATH=/home/\u003cuserid\u003e/.local/bin:${PATH}\n\u003e ```\n\n**Windows**\n\n```sh\npip3 install cmake~=3.17\n```\n\n### Conan\n\nUsing [Conan](https://conan.io/) simplifies fetching, building, and installing the required C++ dependencies from [Conan Center](https://conan.io/center/).\n\nThe project requires Conan 2.2 or higher. Conan 2.5.0 has been tested.\n\n**Linux**\n\n```sh\npip3 install conan~=2.2 --upgrade\nconan profile detect\n```\n\n\u003e 💬 **Note:**\n\u003e As per the CMake instructions, on the Jetson a warning is reported that the per-user install directory _/home/\\\u003cuserid\\\u003e/.local/bin_ is not on the `PATH` if it hasn't yet been added.\n\n\u003e On some platforms with Python 2 and Python 3 both installed this may need to be `pip3 install --upgrade conan~=2.2`\n\n\u003e Conan 2.2 or higher is required; dependencies may require a higher version; version 2.5.0 (latest release at the time) has been tested\n\n**Windows**\n\n```sh\npip3 install conan~=2.2 --upgrade\nconan profile detect\n```\n\n## Building the NvNmos Library\n\n**Linux**\n\nPrepare a _build_ directory adjacent to the _src_ directory.\n\n```sh\nmkdir build\n```\n\nTo install the dependencies using Conan, use the following command.\n\n\u003e 💬 **Note:**\n\u003e Replace `\u003cRelease-or-Debug\u003e` with the necessary value.\n\n```sh\nconan install src \\\n  -g CMakeToolchain \\\n  --settings:all build_type=\u003cRelease-or-Debug\u003e \\\n  --build=missing \\\n  --output-folder=src/conan\n```\n\nUse the following CMake command to configure the build.\n\n\u003e 💬 **Note:**\n\u003e Replace `\u003cRelease-or-Debug\u003e` with the necessary value.\n\n```sh\ncmake -B build \\\n  -DCMAKE_TOOLCHAIN_FILE=conan/conan_toolchain.cmake \\\n  -DCMAKE_BUILD_TYPE=\u003cRelease-or-Debug\u003e \\\n  src\n```\n\nBuild the library and example application.\n\n```sh\ncmake --build build --parallel\n```\n\n**Windows**\n\nPrepare a _build_ directory adjacent to the _src_ directory.\n\n```sh\nmkdir build\n```\n\nTo install the dependencies using Conan, use the following command.\n\n\u003e 💬 **Note:**\n\u003e The `` ` `` is the PowerShell line continuation character. In the Windows command prompt, use `^` instead.\n\u003e Replace `\u003cRelease-or-Debug\u003e` with the necessary value.\n\n```PowerShell\nconan install src `\n  -g CMakeToolchain `\n  --settings:all build_type=\u003cRelease-or-Debug\u003e `\n  --build=missing `\n  --output-folder=src/conan\n```\n\nRepeat the command for both `Debug` and `Release` if required.\n\nUse the following CMake command to configure the build.\n\n```PowerShell\ncmake -B build `\n  -G \"Visual Studio 17 2022\" `\n  -DCMAKE_TOOLCHAIN_FILE=conan/conan_toolchain.cmake `\n  -DCMAKE_CONFIGURATION_TYPES=\"Debug;Release\" `\n  src\n```\n\nBuild the library and application with the following command or manually using the generated Visual Studio solution.\n\n\u003e 💬 **Note:**\n\u003e Replace `\u003cRelease-or-Debug\u003e` with the necessary value.\n\n```sh\ncmake --build build --config \u003cRelease-or-Debug\u003e --parallel\n```\n\n## Run-Time Requirements\n\n*Linux*\n\nInstall and run the Avahi Daemon.\n\n```sh\napt update\napt install -y dbus avahi-daemon\n\n/etc/init.d/dbus start\n/etc/init.d/avahi-daemon start\n```\n\n\u003e 💬 **Note:**\n\u003e Since Ubuntu 24.04, an init script is not provided for the Avahi daemon; run `avahi-daemon --daemonize` instead.\n\n*Windows*\n\nInstall and start the Bonjour Service.\n\nSee [Download Bonjour Print Services for Windows v2.0.2](https://support.apple.com/kb/DL999).\n\n## Running the Example Application\n\n### Starting the Example Application\n\nRun the nvnmos-example app specifying host name, port, IP address, and optionally a log level.\n\nFor example:\n```sh\nnvnmos-example nmos-api.local 8080 192.0.2.0\n```\n\nThe host name can be a .local name, in which case the Node will attempt to discover a Registry being advertised via multicast DNS-SD (mDNS).\nWhen a fully-qualified domain name is specified, e.g. \"api.example.com\", the NMOS Node will instead use unicast DNS-SD discovery in the relevant domain, e.g. \"example.com\".\n\nThe port is used to serve the HTTP APIs.\n\nThe IP address identifies the interface to be used for the mock Senders and Receivers created by the nvnmos-example application.\n\nThe log level ranges between -40 (most verbose) and 40 (least verbose), as per the NvNmos API.\nValues greater than zero are warnings and errors. Values less than zero are debugging or trace messages.\n\nThe nvnmos-example app runs through the following steps which are output independent of the log level:\n```\nCreating NvNmos server...\nRemoving some senders and receivers...\nAdding back some senders and receivers...\nActivating senders and receivers...\nDeactivating senders and receivers...\nDestroying NvNmos server...\nFinished\n```\n\nAfter each step, the app prompts before moving on to the next step:\n```\nContinue ([y]/n)?\n```\n\nIf the app runs successfully to completion, the process exits with code 0.\nIf any step fails, or the user responds negatively to a prompt, the process exits immediately with code 1.\n\n### Accessing the NMOS APIs\n\nWhile the app is running, the IS-04 Node API, the IS-05 Connection API, etc., are available for an NMOS Controller to use.\nThe HTTP APIs can be accessed at:\n```\nhttp://\u003chost-address\u003e:\u003cport\u003e/\n```\n\n## Troubleshooting\n\n### Address already in use\n\nWhen running multiple NMOS Node instances, each process must be configured to use different ports, i.e., with a unique `port` value.\nWhen the port is already in use, at start-up, the application may show a message like the following:\n\n```\nasio listen error: system:98 (Address already in use)\n```\n\n### Apple Bonjour compatibility warnings\n\nWhen using Avahi for DNS-SD, shortly after start-up the following lines may be displayed in the log.\nThey do not indicate a problem and can be ignored.\n\n```\n*** WARNING *** The program 'nvnmos-example' uses the Apple Bonjour compatibility layer of Avahi.\n*** WARNING *** Please fix your application to use the native API of Avahi!\n*** WARNING *** For more information see \u003chttp://0pointer.de/blog/projects/avahi-compat.html\u003e\n```\n\n### DNSServiceRegister and DNSServiceBrowse errors\n\nThe application may show messages like the following shortly after start-up:\n\n```\nDNSServiceRegister reported error: -65537 while registering advertisement for: nmos-cpp_node_192-168-1-194:12345._nmos-node._tcp\nDNSServiceBrowse reported error: -65537\n```\n\nIn this case, the NMOS Node will not be able to discover or register with the NMOS Registry.\n\nOne reason for these errors is that the DNS-SD daemon/service is not running.\n\n**Linux**\n\nWhen using Avahi, check that the `avahi-daemon` is running.\n\n**Windows**\n\nWhen using mDNSResponder/Bonjour, check that the Bonjour Service is running.\n","funding_links":[],"categories":["Recently Updated","NMOS"],"sub_categories":["[Sep 03, 2024](/content/2024/09/03/README.md)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNVIDIA%2Fnvnmos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNVIDIA%2Fnvnmos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNVIDIA%2Fnvnmos/lists"}