gst-plugins-rs/README.md
Jan Alexander Steffens (heftig) 42385c81be Add livesync plugin
It attempts to produce a (nearly) gapless live stream by synchronizing
its output to the running time and forwarding the next input buffer if
its start is (nearly) flush with the end of the last output buffer.

If the input buffer is missing or too far in the future, it duplicates
the last output buffer with adjusted timestamps. If it is operating on a
raw audio stream, it will fill duplicate buffers with silence.

If an input buffer arrives too late, it is thrown away. If the last
input buffer was accepted too long ago (according to `late-threshold`),
a late input buffer is accepted anyway, but immediately considered a
duplicate. Due to the silence-filling, this has no effect on audio, but
video gets a "slideshow" effect instead of freezing completely.

The "many-repeats" property will be notified when this element has
recently duplicated a lot of buffers or recovered from such a state.

Co-authored-by: Vivia Nikolaidou <vivia@ahiru.eu>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/708>
2022-12-14 18:51:36 +02:00

204 lines
9.5 KiB
Markdown

# gst-plugins-rs [![crates.io](https://img.shields.io/crates/v/gst-plugin.svg)](https://crates.io/crates/gst-plugin) [![pipeline status](https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/badges/main/pipeline.svg)](https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/commits/main)
Repository containing various [GStreamer](https://gstreamer.freedesktop.org/)
plugins and elements written in the [Rust programming
language](https://www.rust-lang.org/).
The plugins build upon the [GStreamer Rust bindings](https://gitlab.freedesktop.org/gstreamer/gstreamer-rs).
Check the README.md of that repository also for details about how to set-up
your development environment.
## Plugins
You will find the following plugins in this repository:
* `generic`
- `file`: A Rust implementation of the standard `filesrc` and `filesink` elements
- `sodium`: Elements to perform encryption and decryption using [libsodium](https://libsodium.org).
- `threadshare`: Some popular threaded elements reimplemented using common thread-sharing infrastructure.
* `net`
- `aws`: Various elements for Amazon AWS services using the [AWS SDK](https://awslabs.github.io/aws-sdk-rust/) library
- `s3src`/`s3sink`: A source and sink element to talk to the Amazon S3 object storage system.
- `s3hlssink`: A sink element to store HLS streams on Amazon S3.
- `awstranscriber`: an element wrapping the AWS Transcriber service.
- `awstranscribeparse`: an element parsing the packets of the AWS Transcriber service.
- `hlssink3`: An element for generating MPEG-TS HLS streams.
- `ndi`: An [NDI](https://www.newtek.com/ndi/) plugin containing a source, sink and device provider.
- `onvif`: Various elements for parsing, RTP (de)payloading, overlaying of ONVIF timed metadata.
- `raptorq`: Encoder/decoder element for RaptorQ RTP FEC mechanism.
- `reqwest`: An HTTP source element based on the [reqwest](https://github.com/seanmonstar/reqwest) library.
- `rtp`:
- `rtpav1pay` / `rtpav1depay`: RTP (de)payloader for the AV1 video codec.
- `rtpgccbwe`: RTP bandwidth estimator based on the Google Congestion Control algorithm.
- `webrtc`: WebRTC elements, with batteries included Sink elements for specific signalling protocols.
- `webrtchttp`: Simple WebRTC HTTP elements (WHIP/WHEP).
* `audio`
- `audiofx`: Elements to apply audio effects to a stream
- `rsaudioecho`: a simple echo/reverb filter.
- `audioloudnorm`: [audio normalization](http://k.ylo.ph/2016/04/04/loudnorm.html) filter.
- `audiornnoise`: Filter for [removing noise](https://jmvalin.ca/demo/rnnoise/).
- `ebur128level`: Filter for measuring audio loudness according to EBU R-128.
- `hrtfrender`: Filter for rendering audio according to a [head-related transfer
function](https://en.wikipedia.org/wiki/Head-related_transfer_function).
- `claxon`: A FLAC decoder based on the [Claxon](https://github.com/ruuda/claxon) library.
- `csound`: A plugin to implement audio effects using the [Csound](https://csound.com/) library.
- `lewton`: A Vorbis decoder based on the [lewton](https://github.com/RustAudio/lewton) library.
- `spotify`: A plugin to access content from [Spotify](https://www.spotify.com/) based on the [librespot](https://github.com/librespot-org/) library.
* `video`
- `cdg`: A parser and renderer for [CD+G karaoke data](https://docs.rs/cdg/0.1.0/cdg/).
- `closedcaption`: Plugin to deal with closed caption streams
- `ccdetect`: Detects if a stream contains active Closed Captions.
- `cea608overlay`: Overlay CEA-608 / EIA-608 closed captions over a
video stream.
- `cea608tojson`: Convert CEA-608 / EIA-608 closed captions to a JSON
stream.
- `cea608tott`: Convert CEA-608 / EIA-608 closed captions to timed text.
- `jsontovtt`: Convert JSON to timed text.
- `mccenc`: Convert CEA-608 / EIA-608 and CEA-708 / EIA-708 closed captions to the MCC format.
- `mccparse`: Parse CEA-608 / EIA-608 and CEA-708 / EIA-708 closed captions from the MCC format.
- `sccenc`: Convert CEA-608 / EIA-608 closed captions to the MCC format.
- `sccparse`: Parse CEA-608 / EIA-608 closed captions from the MCC format.
- `transcriberbin`: Convenience bin around transcriber elements like `aws_transcriber`.
- `tttocea608`: Convert timed text to CEA-608 / EIA-608 closed captions.
- `tttojson`: Convert timed text to JSON.
- `dav1d`: AV1 decoder based on the [dav1d](https://code.videolan.org/videolan/dav1d) library.
- `ffv1`: FFV1 decoder based on the [ffv1](https://github.com/rust-av/ffv1) library.
- `gif`: A GIF encoder based on the [gif](https://github.com/image-rs/image-gif) library.
- `gtk4`: A [GTK4](https://www.gtk.org) video sink that provides a `GdkPaintable` for UI integration.
- `hsv`: Plugin with various elements to work with video data in hue, saturation, value format
- `hsvdetector`: Mark pixels that are close to a configured color in HSV format.
- `hsvfilter`: Apply various transformations in the HSV colorspace.
- `png`: PNG encoder based on the [png](https://github.com/image-rs/image-png) library.
- `rav1e`: AV1 encoder based on the [rav1e](https://github.com/xiph/rav1e) library.
- `videofx`: Plugin with various video filters.
- `roundedcorners`: Element to make the corners of a video rounded via the alpha channel.
- `colordetect`: A pass-through filter able to detect the dominant color(s) on incoming frames, using [color-thief](https://github.com/RazrFalcon/color-thief-rs).
- `videocompare`: Compare similarity of video frames. The element can use different hashing algorithms like [Blockhash](https://github.com/commonsmachinery/blockhash-rfc), [DSSIM](https://kornel.ski/dssim), and others.
- `webp`: WebP decoder based on the [libwebp-sys-2](https://github.com/qnighy/libwebp-sys2-rs) library.
* `mux`
- `flavors`: FLV demuxer based on the [flavors](https://github.com/rust-av/flavors) library.
- `fmp4`: A fragmented MP4/ISOBMFF/CMAF muxer for generating e.g. DASH/HLS media fragments.
* `text`
- `ahead`: A plugin to display upcoming text buffers ahead.
- `json`: A plugin to convert a stream of JSON objects to a higher level wrapped NDJSON output.
- `regex`: A regular expression text filter plugin.
- `wrap`: A plugin to perform text wrapping with hyphenation.
* `utils`
- `fallbackswitch`:
- `fallbackswitch`: An element that allows falling back to different
sink pads after a timeout based on the sink pads' priorities.
- `fallbacksrc`: Element similar to `urisourcebin` that allows
configuring a fallback audio/video if there are problems with the main
source.
- `livesync`: Element to maintain a continuous live stream from a
potentially unstable source.
- `togglerecord`: Element to enable starting and stopping multiple streams together.
- `tracers`: Plugin with multiple tracers:
- `buffer-lateness`: Records lateness of buffers and the reported
latency for each pad in a CSV file. Contains a script for
visualization.
- `pipeline-snapshot`: Creates a .dot file of all pipelines in the
application whenever requested.
- `queue-levels`: Records queue levels for each queue in a CSV file.
Contains a script for visualization.
- `uriplaylistbin`: Helper bin to gaplessly play a list of URIs.
## Building
gst-plugins-rs relies on [cargo-c](https://github.com/lu-zero/cargo-c/) to
generate shared and static C libraries. It can be installed using:
```
$ cargo install cargo-c
```
Then you can easily build and test a specific plugin:
```
$ cargo cbuild -p gst-plugin-cdg
$ GST_PLUGIN_PATH="target/x86_64-unknown-linux-gnu/debug:$GST_PLUGIN_PATH" gst-inspect-1.0 cdgdec
```
Replace `x86_64-unknown-linux-gnu` with your system's Rust target triple (`rustc -vV`).
The plugin can also be installed system-wide:
```
$ cargo cbuild -p gst-plugin-cdg --prefix=/usr
$ cargo cinstall -p gst-plugin-cdg --prefix=/usr
```
This will install the plugin to `/usr/lib/gstreamer-1.0`.
You can use `--libdir` to pass a custom `lib` directory
such as `/usr/lib/x86_64-linux-gnu` for example.
Note that you can also just use `cargo` directly to build Rust static libraries
and shared C libraries. `cargo-c` is mostly useful to build static C libraries
and generate `pkg-config` files.
In case cargo complains about dependency versions after a `git pull`, `cargo update` may
be able to resolve those.
## LICENSE
gst-plugins-rs and all crates contained in here are licensed under one of the
following licenses
* Mozilla Public License Version 2.0 ([LICENSE-MPL-2.0](LICENSE-MPL-2.0) or http://opensource.org/licenses/MPL-2.0)
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
* Lesser General Public License ([LICENSE-LGPLv2](LICENSE-LGPLv2)) version 2.1 or (at your option) any later version
GStreamer itself is licensed under the Lesser General Public License version
2.1 or (at your option) any later version: https://www.gnu.org/licenses/lgpl-2.1.html
## Contribution
Any kinds of contributions are welcome as a merge request.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in gst-plugins-rs by you shall be licensed under the license of
the plugin it is added to.
For new plugins the MPL-2 license is preferred.