gst-plugins-rs/net/ndi
François Laignel 9250c592a7 ndi: don't accumulate meta with audio only streams
Currently, only closed caption metadata are supported. When the next video
frame is received, pending meta are dequeued and parsed. If close captions
are found, they are attached to the video frame.

For audio only streams, it doesn't make sense to enqueue metadata. They would
accumulate in `pending_metadata` and would never be dequeued.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/460

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1392>
2023-11-13 19:26:23 +01:00
..
src ndi: don't accumulate meta with audio only streams 2023-11-13 19:26:23 +01:00
build.rs Move everything to net/ndi for preparing to merge into gst-plugins-rs 2022-10-12 19:25:32 +03:00
Cargo.toml ndisrc: Implement zerocopy handling for the received frames if possible 2023-11-13 13:22:48 +02:00
LICENSE-MPL-2.0 git: replace LICENSE file symlinks with copies 2023-04-04 14:26:37 +01:00
README.md net/ndi: add closed caption support 2023-09-07 14:28:24 +02:00

GStreamer NDI Plugin

Compatible with NDI SDK 5.x

This is a plugin for the GStreamer multimedia framework that allows GStreamer to receive or send an NDI stream.

This plugin has been initially developed by Teltek and was funded by the University of the Arts London and The University of Manchester.

Currently the plugin has a source element for receiving from NDI sources, a sink element to provide an NDI source and a device provider for discovering NDI sources on the network.

The plugin is loading the NDI SDK at runtime, either from the default library path or, if set, from the directory given by the NDI_RUNTIME_DIR_V5 environment variable.

Some examples of how to use these elements from the command line:

# Information about the elements
$ gst-inspect-1.0 ndi
$ gst-inspect-1.0 ndisrc
$ gst-inspect-1.0 ndisink

# Discover all NDI sources on the network
$ gst-device-monitor-1.0 -f Source/Network:application/x-ndi

# Audio/Video source pipeline
$ gst-launch-1.0 ndisrc ndi-name="GC-DEV2 (OBS)" ! ndisrcdemux name=demux   demux.video ! queue ! videoconvert ! autovideosink  demux.audio ! queue ! audioconvert ! autoaudiosink

# Audio/Video sink pipeline
$ gst-launch-1.0 videotestsrc is-live=true ! video/x-raw,format=UYVY ! ndisinkcombiner name=combiner ! ndisink ndi-name="My NDI source"  audiotestsrc is-live=true ! combiner.audio

Feel free to contribute to this project. Some ways you can contribute are:

  • Testing with more hardware and software and reporting bugs
  • Doing pull requests.

Closed Captions Support

Closed captions support is based on 1 & 2.

This pipelines streams a test video with test subtitles from gst-plugins-rs/video/closedcaption. Run from the gst-plugins-rs root directory.

# Audio/Video sink pipeline with closed captions (cc start around 0:00:14)

$ gst-launch-1.0 \
    ndisinkcombiner name=ndicombiner ! ndisink ndi-name="My NDI source" \
    cccombiner name=cccombiner ! videoconvert ! video/x-raw,format=UYVY ! ndicombiner.video \
    videotestsrc is-live=true ! cccombiner. \
    filesrc location=video/closedcaption/tests/dn2018-1217.scc ! sccparse ! cccombiner.caption \
    audiotestsrc is-live=true volume=0.1 ! ndicombiner.audio

# Discover all NDI sources on the network
$ gst-device-monitor-1.0 -f Source/Network:application/x-ndi

# Audio/Video source pipeline with closed caption overlay
$ gst-launch-1.0 \
    ndisrc ndi-name="_REPLACE_WITH_SOURCE_NAME_" ! ndisrcdemux name=demux \
    demux.video ! queue ! cea608overlay ! videoconvert ! autovideosink \
    demux.audio ! queue ! audioconvert ! autoaudiosink

# Variant 1: sink pipeline with c708 closed captions

$ gst-launch-1.0 \
    ndisinkcombiner name=ndicombiner ! ndisink ndi-name="My NDI source" \
    cccombiner name=cccombiner ! videoconvert ! video/x-raw,format=UYVY ! ndicombiner.video \
    videotestsrc is-live=true ! cccombiner. \
    filesrc location=video/closedcaption/tests/dn2018-1217.scc ! sccparse ! ccconverter ! closedcaption/x-cea-708,format=cdp ! cccombiner.caption \
    audiotestsrc is-live=true volume=0.1 ! ndicombiner.audio

# Variant 2: sink pipeline with c608 and c708 closed captions

$ gst-launch-1.0 \
    ndisinkcombiner name=ndicombiner ! ndisink ndi-name="My NDI source" \
    cccombiner name=cccombiner_1 ! cccombiner name=cccombiner_2 ! videoconvert ! video/x-raw,format=UYVY ! ndicombiner.video \
    videotestsrc is-live=true ! cccombiner_1. \
    filesrc location=video/closedcaption/tests/dn2018-1217.scc ! sccparse ! tee name=cctee \
    cctee. ! ccconverter ! closedcaption/x-cea-608,format=raw ! cccombiner_1.caption \
    cctee. ! ccconverter ! closedcaption/x-cea-708,format=cdp ! cccombiner_2.caption \
    audiotestsrc is-live=true volume=0.1 ! ndicombiner.audio

License

This plugin is licensed under the MPL-2 - see the LICENSE file for details

Acknowledgments

  • University of the Arts London and The University of Manchester.
  • Sebastian Dröge (@sdroege).