Skip to content

Commit

Permalink
Added README
Browse files Browse the repository at this point in the history
  • Loading branch information
LufeBisect committed Feb 3, 2025
1 parent f5a372e commit 50b18f1
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 0 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,5 +128,11 @@ Open `cpp/demos/ossrf-nmos-api/config/nmos_config.json` and adjust the following

./scripts/build-inside-container.sh

## GStreamer Plugins

We have also developed GStreamer plugins (nmossender, nmosreceiver, and nmosaudioreceiver) that integrate with NMOS for audio/video sending and receiving.

For detailed instructions on building, installing, and using these plugins (including examples of gst-launch-1.0 pipelines), please see the [Plugins Guide](/cpp/libs/gst_nmos_plugins/).

## Notes
At the moment, the gstreamer plugins with NMOS (nmossender and nmosreceiver) aren't 100% functional, being more of a proof of concept that will be refined in the near future.
118 changes: 118 additions & 0 deletions cpp/libs/gst_nmos_plugins/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# NMOS GStreamer Plugins

This repository contains GStreamer plugins that integrate AMWA NMOS functionality into your pipelines.
Specifically, it provides an **NMOS Audio Receiver** (`nmosaudioreceiver`), **NMOS Video Receiver** (`nmosvideoreceiver`), and **NMOS Sender** (`nmossender`) that can dynamically receive and send audio/video streams configured by the NMOS control panel.

## Table of Contents

1. [Overview](#overview)
2. [Building from Source](#building-from-source)
3. [Using the Plugin](#using-the-plugin)
- [Environment Variables](#environment-variables)
- [Inspecting the Plugin](#inspecting-the-plugin)
- [Example Pipelines](#example-pipelines)
- [NMOS Interface](#nmos-interface)
4. [Notes and Troubleshooting](#notes-and-troubleshooting)
5. [License](#license)

---

## Overview

The **NMOS plugins** communicate with an NMOS registry (using the AMWA [IS-04](https://specs.amwa.tv/is-04/) and [IS-05](https://specs.amwa.tv/is-05/) APIs) to automatically configure raw video/audio streams.

## Building from Source

To build the plugin, follow the build steps in the [**README**](/) inside the root directory of this project. The binary files for the plugin will then be created in `/build/Release/plugins/`.

## Using the Plugin

### Environment Variables

Once you've compiled the plugins, you can add them to your local GStreamer plugin folder or set the environment variable `GST_PLUGIN_PATH` to the directory where the binary files are saved.

i.e.

```bash
export GST_PLUGIN_PATH=/home/gst-plugins/
```

### Inspecting the Plugin

When using these plugins, you can inspect them along with all the properties you can change, capabilities, and info with the following command:

```bash
gst-inspect-1.0 nmos(sender/videoreceiver/audioreceiver)
```

Some of the more important properties to change are as follows:

| Property | Description |
|------------------------------|-----------------------------------------------------------|
| `node-id` | NMOS Node ID (UUID) |
| `node-config-file-location` | Path to the node configuration JSON file (String) |
| `device-id` | NMOS Device ID (UUID) |
| `device-label` | A label for the NMOS Device (String) |
| `device-description` | A description of the NMOS Device (String) |
| `receiver-id` | NMOS Receiver ID (UUID) |
| `receiver-label` | A label for the NMOS Receiver (String) |
| `receiver-description` | A description of the NMOS Receiver (String) |
| `destination-address` | IP address for the outgoing/incoming RTP stream (String) |

**Important Note:** Currently, the node fields aren't configurable by properties but instead by a JSON file. An example can be found at `/cpp/demos/config/`.

### Example Pipelines
-----
#### Sender (Audio):
```bash
gst-launch-1.0 audiotestsrc is-live=true wave=square ! audio/x-raw, format=S24BE, rate=48000, channels=2, layout=interleaved ! nmossender destination-address="192.168.1.1" destination-port=5004
```

#### Audio Receiver:
```bash
gst-launch-1.0 -v nmosaudioreceiver destination-address="192.168.1.1" receiver-id="9dd4cb3e-7d28-411d-9939-b8e439bd8c2a" ! queue ! audioconvert ! wavescope ! ximagesink sync=false
```
-----

#### Sender (Video):
```bash
gst-launch-1.0 videotestsrc is-live=true timestamp-offset=1 pattern=ball ! videoconvert ! "video/x-raw, format=UYVP, sampling=YCbCr-4:2:2, width=460, height=240, clock-rate=9000, framerate=50/1" ! nmossender destination-address="192.168.1.1" source-address="192.168.1.1" destination-port=9999
```
#### Video Receiver:
```bash
gst-launch-1.0 -v nmosvideoreceiver destination-address="192.168.1.1" receiver-id="9dd4cb3e-7d28-411d-9939-b8e439bd8c2a" ! queue ! videoconvert ! autovideosink sync=false
```
-----
### NMOS Interface

The NMOS Interface allows users to manage senders and receivers through a graphical user interface. It provides an overview of active streams, transport methods, and detailed configurations.

The NMOS page can be accessed through the following link ```http://localhost:8010/admin/```

- **Senders Management**: Displays active senders, transport type (e.g., RTP Multicast), and allows toggling activation.
- **Receivers Management**: Lists available receivers, their bindings, supported media formats, and current connections.
- **Detailed View**: Clicking on a node, device, sender or receiver provides detailed configuration options, including transport settings and associated flows.
- **Connection Setup**: Users can establish connections between senders and receivers through a simple UI inside the receiver page, where they can freely connect and disconnect them.

Note: When changing the parameters inside the connect tab, be sure to activate the activation mode ```activate_immediate``` if you want to change the connection dynamically.

## Notes and Troubleshooting

- **State Management:** The plugin automatically transitions to PLAYING when valid SDP data is received. If the receiver is disabled from the NMOS registry side, the pipeline tears down its internal elements.
- **Flush and Dynamic Reconfiguration:** If you dynamically change streams at runtime (e.g., the NMOS registry activates a new source), the plugin will remove old elements and construct new ones on the fly without restarting the entire pipeline.
- **Verbose Debug:** If you need to see more logs, you can enable GStreamer debug categories:

```bash
GST_DEBUG=nmosaudioreceiver:5 gst-launch-1.0 nmosaudioreceiver ...
```

- **Current Issues:** When turning off the sender and then reconnecting it to the same receiver without resetting it, there might be a slight delay in video streams before the image unfreezes.

### Dependencies

- GStreamer (1.18+ recommended)

## License

This project is licensed under the Apache 2.0 License.
Please see the LICENSE file on the root directory for more details.

0 comments on commit 50b18f1

Please sign in to comment.