mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-09-29 15:22:07 +00:00
Compare commits
36 commits
Author | SHA1 | Date | |
---|---|---|---|
|
4e4d226b71 | ||
|
b903503a01 | ||
|
20b18c23e6 | ||
|
160033cb5b | ||
|
3dde725560 | ||
|
1113e0aa51 | ||
|
9b33184018 | ||
|
528f46a510 | ||
|
8b8f10691c | ||
|
6936bf65c4 | ||
|
b3cb41eae3 | ||
|
84bae8b9cf | ||
|
eb296a0e63 | ||
|
b64da48508 | ||
|
37877efc90 | ||
|
f22b3420b6 | ||
|
b17348b08d | ||
|
bf0a23d560 | ||
|
384a9d05f0 | ||
|
eda0d9abe1 | ||
|
3c4d22bc5c | ||
|
56a25af929 | ||
|
54adcb8482 | ||
|
46d7c177c2 | ||
|
2fc2357306 | ||
|
9cd68ffb5f | ||
|
73a5703eeb | ||
|
7d7f73768b | ||
|
510cda303a | ||
|
d2cd2ef5ac | ||
|
a505dba3a2 | ||
|
a4d5a35403 | ||
|
8a6895a73e | ||
|
f3c1a91fb9 | ||
|
6df679d69f | ||
|
85bf8d6c63 |
69 changed files with 7196 additions and 782 deletions
|
@ -72,13 +72,6 @@ trigger:
|
||||||
before_script:
|
before_script:
|
||||||
- source ./ci/env.sh
|
- source ./ci/env.sh
|
||||||
- mkdir .cargo && echo -e "[net]\ngit-fetch-with-cli = true" > .cargo/config
|
- mkdir .cargo && echo -e "[net]\ngit-fetch-with-cli = true" > .cargo/config
|
||||||
# If cargo exists assume we probably will want to update
|
|
||||||
# the lockfile
|
|
||||||
- |
|
|
||||||
if command -v cargo; then
|
|
||||||
cargo generate-lockfile
|
|
||||||
cargo update
|
|
||||||
fi
|
|
||||||
|
|
||||||
.debian:11-stable:
|
.debian:11-stable:
|
||||||
extends: .debian:11
|
extends: .debian:11
|
||||||
|
|
101
CHANGELOG.md
Normal file
101
CHANGELOG.md
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
# Changelog
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html),
|
||||||
|
specifically the [variant used by Rust](http://doc.crates.io/manifest.html#the-version-field).
|
||||||
|
|
||||||
|
## [0.10.3] - 2023-03-02
|
||||||
|
### Added
|
||||||
|
- tracers: `queue_levels` tracer now also supports printing the `appsrc` levels.
|
||||||
|
- webrtc: `webrtcsink` can use `nvvidconv` if `nvvideoconvert` does not exist
|
||||||
|
on an NVIDIA platform.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- gtk4: Set the sync point on the video frame after mapping it as otherwise
|
||||||
|
the frame might not be ready yet for further usage.
|
||||||
|
- livesync: Correctly calculate the fallback buffer duration from the video
|
||||||
|
framerate.
|
||||||
|
- ndi: Handle caps changes correctly in `ndisinkcombiner`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- webrtc: Minor cleanup.
|
||||||
|
|
||||||
|
## [0.10.2] - 2023-02-23
|
||||||
|
### Fixed
|
||||||
|
- hlssink3: Allow signal handlers to return `None`
|
||||||
|
- gtk4: Make GL context sharing more reliable in pipelines with multiple
|
||||||
|
`gtk4paintablesinks`
|
||||||
|
- gtk4: Attach channel receiver to the main context from the correct thread to
|
||||||
|
make it possible to start the sink from a different thread than the main
|
||||||
|
thread without having retrieved the paintable from the main thread before.
|
||||||
|
- fmp4mux/mp4mux: Ignore caps changes if only the framerate changes.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- gtk4: Simplify and refactor GL context sharing. Apart from being more
|
||||||
|
reliable this reduces GL resource usage.
|
||||||
|
|
||||||
|
## [0.10.1] - 2023-02-13
|
||||||
|
### Fixed
|
||||||
|
- rtpav1pay: Fix calculation of Leb128 size size to work correctly with
|
||||||
|
streams from certain encoders.
|
||||||
|
|
||||||
|
## [0.10.0] - 2023-02-10
|
||||||
|
### Fixed
|
||||||
|
- audiornnoise: Use correct value range for the samples
|
||||||
|
- awss3sink: Treat stopping without EOS as an error for multipart upload
|
||||||
|
- awss3hlssink: Fix the name of the hlssink child element
|
||||||
|
- awss3hlssink: Fix deadlock on EOS
|
||||||
|
- dav1d: Various fixes to improve performance, to handle decoding errors more
|
||||||
|
gracefully and to make sure all frames are output in the end
|
||||||
|
- fmp4mux: Various fixes to fragment splitting behaviour, output formatting
|
||||||
|
and header generation
|
||||||
|
- gtk4: Various stability and rendering fixes
|
||||||
|
- meson: Various fixes and improvements to the meson-based build system
|
||||||
|
- ndi: provide non-Linux/macOS UNIX fallback for the soname
|
||||||
|
- ndisrc: Use default channel mask for audio output to allow >2 channels to
|
||||||
|
work better
|
||||||
|
- rav1e: Correctly enable threading support
|
||||||
|
- rtpav1: Various fixes to the payloader and depayloader to handle streams
|
||||||
|
more correctly and to handle errors more cleanly
|
||||||
|
- rtpav1depay: Set caps on the source pad
|
||||||
|
- spotify: fix "start a runtime from within a runtime" with static link
|
||||||
|
- textahead: fix previous buffers
|
||||||
|
- textwrap: Don't panic on empty buffers
|
||||||
|
- tttocea608: Don't fail if a GAP event contains no duration
|
||||||
|
- webrtchttp: whipsink: construct TURN URL correctly
|
||||||
|
- webrtcsink: fix panic on pre-bwe request error
|
||||||
|
- whipsink: Send ICE candidates together with the offer
|
||||||
|
- whipsink: Various cleanups and minor fixes
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- audiornnoise: Add voice detection threshold property
|
||||||
|
- awss3hlssink: Add `stats` property
|
||||||
|
- awss3sink: Add properties to set Content-Type and Content-Disposition
|
||||||
|
- fmp4mux: add 'offset-to-zero' property
|
||||||
|
- fmp4mux/mp4mux: add support for muxing Opus, VP8, VP9 and AV1 streams
|
||||||
|
- fmp4mux/mp4mux: Make media/track timescales configurable
|
||||||
|
- fmp4mux: Add support for CMAF-style chunking, e.g. low-latency / LL HLS and DASH
|
||||||
|
- gtk4: Support for rendering GL textures on X11/EGL, X11/GLX, Wayland and macOS
|
||||||
|
- hlssink3: Allow generating i-frame-only playlist
|
||||||
|
- livesync: New element that alllows maintaining a contiguous live stream
|
||||||
|
without gaps from a potentially unstable source.
|
||||||
|
- mp4mux: New non-fragmented MP4 muxer element
|
||||||
|
- spotifyaudiosrc: Support configurable bitrate
|
||||||
|
- textahead: add settings to display previous buffers
|
||||||
|
- threadshare: Introduce new ts-audiotestsrc
|
||||||
|
- webrtcsink: Support nvv4l2vp9enc
|
||||||
|
- whepsource: Add a WebRTC WHEP source element
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- audiofx: Derive from AudioFilter where possible
|
||||||
|
- dav1ddec: Lower rank to primary to allow usage of hardware decoders with
|
||||||
|
higher ranks
|
||||||
|
- fmp4mux: Only push `fragment_offset` if `write-mfra` is true to reduce memory usage
|
||||||
|
- webrtcsink: Make the `turn-server` property a `turn-servers` list
|
||||||
|
- webrtcsink: Move from async-std to tokio
|
||||||
|
|
||||||
|
[Unreleased]: https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/compare/0.10.2...HEAD
|
||||||
|
[0.10.2]: https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/compare/0.10.1...0.10.2
|
||||||
|
[0.10.1]: https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/compare/0.10.0...0.10.1
|
||||||
|
[0.10.0]: https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/compare/0.9.0...0.10.0
|
6208
Cargo.lock
generated
Normal file
6208
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
|
@ -110,6 +110,8 @@ You will find the following plugins in this repository:
|
||||||
|
|
||||||
- `fmp4`: A fragmented MP4/ISOBMFF/CMAF muxer for generating e.g. DASH/HLS media fragments.
|
- `fmp4`: A fragmented MP4/ISOBMFF/CMAF muxer for generating e.g. DASH/HLS media fragments.
|
||||||
|
|
||||||
|
- `mp4`: A non-fragmented MP4 muxer for generating MP4 files.
|
||||||
|
|
||||||
* `text`
|
* `text`
|
||||||
- `ahead`: A plugin to display upcoming text buffers ahead.
|
- `ahead`: A plugin to display upcoming text buffers ahead.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-audiofx"
|
name = "gst-plugin-audiofx"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,9 +9,9 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"] }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"] }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"] }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"] }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"] }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"] }
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
byte-slice-cast = "1.0"
|
byte-slice-cast = "1.0"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
|
@ -29,11 +29,11 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-claxon"
|
name = "gst-plugin-claxon"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Ruben Gonzalez <rgonzalez@fluendo.com>"]
|
authors = ["Ruben Gonzalez <rgonzalez@fluendo.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,15 +9,15 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
claxon = { version = "0.4" }
|
claxon = { version = "0.4" }
|
||||||
byte-slice-cast = "1.0"
|
byte-slice-cast = "1.0"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
once_cell = "1"
|
once_cell = "1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstclaxon"
|
name = "gstclaxon"
|
||||||
|
@ -25,7 +25,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-csound"
|
name = "gst-plugin-csound"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Natanael Mojica <neithanmo@gmail.com>"]
|
authors = ["Natanael Mojica <neithanmo@gmail.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,15 +9,15 @@ rust-version = "1.63"
|
||||||
description = "GStreamer Audio Filter plugin based on Csound"
|
description = "GStreamer Audio Filter plugin based on Csound"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
csound = "0.1.8"
|
csound = "0.1.8"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
byte-slice-cast = "1.0"
|
byte-slice-cast = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstcsound"
|
name = "gstcsound"
|
||||||
|
@ -29,7 +29,7 @@ name = "csound-effect"
|
||||||
path = "examples/effect_example.rs"
|
path = "examples/effect_example.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path = "../../version-helper" }
|
gst-plugin-version-helper = { path = "../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-lewton"
|
name = "gst-plugin-lewton"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,15 +9,15 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
lewton = { version = "0.10", default-features = false }
|
lewton = { version = "0.10", default-features = false }
|
||||||
byte-slice-cast = "1.0"
|
byte-slice-cast = "1.0"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstlewton"
|
name = "gstlewton"
|
||||||
|
@ -25,7 +25,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-spotify"
|
name = "gst-plugin-spotify"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Guillaume Desmottes <guillaume@desmottes.be>"]
|
authors = ["Guillaume Desmottes <guillaume@desmottes.be>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,8 +9,8 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
librespot = { version = "0.4", default-features = false }
|
librespot = { version = "0.4", default-features = false }
|
||||||
tokio = "1.0"
|
tokio = "1.0"
|
||||||
|
@ -24,7 +24,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -136,6 +136,11 @@ version = "0.13"
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.42"
|
version = "0.42"
|
||||||
|
|
||||||
|
# Various crates depend on an older version of socket2
|
||||||
|
[[bans.skip]]
|
||||||
|
name = "socket2"
|
||||||
|
version = "0.4"
|
||||||
|
|
||||||
[sources]
|
[sources]
|
||||||
unknown-registry = "deny"
|
unknown-registry = "deny"
|
||||||
unknown-git = "deny"
|
unknown-git = "deny"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-file"
|
name = "gst-plugin-file"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -10,8 +10,8 @@ rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
url = "2"
|
url = "2"
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -20,7 +20,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-sodium"
|
name = "gst-plugin-sodium"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Jordan Petridis <jordan@centricular.com>"]
|
authors = ["Jordan Petridis <jordan@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
description = "GStreamer plugin for libsodium-based file encryption and decryption"
|
description = "GStreamer plugin for libsodium-based file encryption and decryption"
|
||||||
|
@ -9,8 +9,8 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package="gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package="gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
sodiumoxide = "0.2.1"
|
sodiumoxide = "0.2.1"
|
||||||
once_cell = "1.3.0"
|
once_cell = "1.3.0"
|
||||||
hex = "0.4"
|
hex = "0.4"
|
||||||
|
@ -27,10 +27,14 @@ rand = "0.8"
|
||||||
|
|
||||||
[dev-dependencies.gst-check]
|
[dev-dependencies.gst-check]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-check"
|
package="gstreamer-check"
|
||||||
|
|
||||||
[dev-dependencies.gst-app]
|
[dev-dependencies.gst-app]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-app"
|
package="gstreamer-app"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -54,7 +58,7 @@ path = "examples/decrypt_example.rs"
|
||||||
required-features = ["serde", "serde_json", "clap"]
|
required-features = ["serde", "serde_json", "clap"]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-threadshare"
|
name = "gst-plugin-threadshare"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
license = "LGPL-2.1-or-later"
|
license = "LGPL-2.1-or-later"
|
||||||
description = "GStreamer Threadshare Plugin"
|
description = "GStreamer Threadshare Plugin"
|
||||||
|
@ -14,17 +14,17 @@ concurrent-queue = "2"
|
||||||
flume = "0.10.13"
|
flume = "0.10.13"
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17" }
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-net = { package = "gstreamer-net", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-net = { package = "gstreamer-net", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
once_cell = "1"
|
once_cell = "1"
|
||||||
pin-project-lite = "0.2.0"
|
pin-project-lite = "0.2.0"
|
||||||
polling = "2.2.0"
|
polling = "2.2.0"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
slab = "0.4.7"
|
slab = "0.4.7"
|
||||||
socket2 = {features = ["all"], version = "0.4"}
|
socket2 = {features = ["all"], version = "0.5"}
|
||||||
waker-fn = "1.1"
|
waker-fn = "1.1"
|
||||||
|
|
||||||
# Used by examples
|
# Used by examples
|
||||||
|
@ -34,8 +34,8 @@ clap = { version = "4", features = ["derive"], optional = true }
|
||||||
winapi = { version = "0.3.9", features = ["winsock2", "processthreadsapi"] }
|
winapi = { version = "0.3.9", features = ["winsock2", "processthreadsapi"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstthreadshare"
|
name = "gstthreadshare"
|
||||||
|
@ -59,7 +59,7 @@ name = "ts-standalone"
|
||||||
path = "examples/standalone/main.rs"
|
path = "examples/standalone/main.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
cc = "1.0.38"
|
cc = "1.0.38"
|
||||||
pkg-config = "0.3.15"
|
pkg-config = "0.3.15"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-flavors"
|
name = "gst-plugin-flavors"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,9 +9,9 @@ rust-version = "1.63"
|
||||||
description = "GStreamer Rust FLV Plugin"
|
description = "GStreamer Rust FLV Plugin"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
num-rational = { version = "0.4", default-features = false, features = [] }
|
num-rational = { version = "0.4", default-features = false, features = [] }
|
||||||
nom = "7"
|
nom = "7"
|
||||||
flavors = { git = "https://github.com/rust-av/flavors" }
|
flavors = { git = "https://github.com/rust-av/flavors" }
|
||||||
|
@ -26,7 +26,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-fmp4"
|
name = "gst-plugin-fmp4"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
description = "GStreamer Fragmented MP4 Plugin"
|
description = "GStreamer Fragmented MP4 Plugin"
|
||||||
|
@ -10,11 +10,11 @@ rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-pbutils = { package = "gstreamer-pbutils", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-pbutils = { package = "gstreamer-pbutils", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -23,14 +23,14 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-pbutils = { package = "gstreamer-pbutils", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"] }
|
gst-pbutils = { package = "gstreamer-pbutils", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"] }
|
||||||
m3u8-rs = "5.0"
|
m3u8-rs = "5.0"
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
|
|
@ -2942,10 +2942,15 @@ impl AggregatorImpl for FMP4Mux {
|
||||||
|
|
||||||
match query.view_mut() {
|
match query.view_mut() {
|
||||||
QueryViewMut::Caps(q) => {
|
QueryViewMut::Caps(q) => {
|
||||||
let allowed_caps = aggregator_pad
|
let mut allowed_caps = aggregator_pad
|
||||||
.current_caps()
|
.current_caps()
|
||||||
.unwrap_or_else(|| aggregator_pad.pad_template_caps());
|
.unwrap_or_else(|| aggregator_pad.pad_template_caps());
|
||||||
|
|
||||||
|
// Allow framerate change
|
||||||
|
for s in allowed_caps.make_mut().iter_mut() {
|
||||||
|
s.remove_field("framerate");
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(filter_caps) = q.filter() {
|
if let Some(filter_caps) = q.filter() {
|
||||||
let res = filter_caps
|
let res = filter_caps
|
||||||
.intersect_with_mode(&allowed_caps, gst::CapsIntersectMode::First);
|
.intersect_with_mode(&allowed_caps, gst::CapsIntersectMode::First);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-mp4"
|
name = "gst-plugin-mp4"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
description = "GStreamer Rust MP4 Plugin"
|
description = "GStreamer Rust MP4 Plugin"
|
||||||
|
@ -10,11 +10,11 @@ rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-pbutils = { package = "gstreamer-pbutils", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-pbutils = { package = "gstreamer-pbutils", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -27,7 +27,7 @@ tempfile = "3"
|
||||||
url = "2"
|
url = "2"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
|
|
@ -1097,10 +1097,15 @@ impl AggregatorImpl for MP4Mux {
|
||||||
|
|
||||||
match query.view_mut() {
|
match query.view_mut() {
|
||||||
QueryViewMut::Caps(q) => {
|
QueryViewMut::Caps(q) => {
|
||||||
let allowed_caps = aggregator_pad
|
let mut allowed_caps = aggregator_pad
|
||||||
.current_caps()
|
.current_caps()
|
||||||
.unwrap_or_else(|| aggregator_pad.pad_template_caps());
|
.unwrap_or_else(|| aggregator_pad.pad_template_caps());
|
||||||
|
|
||||||
|
// Allow framerate change
|
||||||
|
for s in allowed_caps.make_mut().iter_mut() {
|
||||||
|
s.remove_field("framerate");
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(filter_caps) = q.filter() {
|
if let Some(filter_caps) = q.filter() {
|
||||||
let res = filter_caps
|
let res = filter_caps
|
||||||
.intersect_with_mode(&allowed_caps, gst::CapsIntersectMode::First);
|
.intersect_with_mode(&allowed_caps, gst::CapsIntersectMode::First);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-aws"
|
name = "gst-plugin-aws"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Arun Raghavan <arun@arunraghavan.net>",
|
authors = ["Arun Raghavan <arun@arunraghavan.net>",
|
||||||
"Jordan Petridis <jordan@centricular.com>",
|
"Jordan Petridis <jordan@centricular.com>",
|
||||||
"Mathieu Duponchelle <mathieu@centricular.com>"]
|
"Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
|
@ -13,9 +13,9 @@ rust-version = "1.63"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bytes = "1.0"
|
bytes = "1.0"
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"] }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"] }
|
||||||
aws-config = "0.54.0"
|
aws-config = "0.54.0"
|
||||||
aws-sdk-s3 = "0.24.0"
|
aws-sdk-s3 = "0.24.0"
|
||||||
aws-sdk-transcribe = "0.24.0"
|
aws-sdk-transcribe = "0.24.0"
|
||||||
|
@ -29,7 +29,7 @@ chrono = "0.4"
|
||||||
url = "2"
|
url = "2"
|
||||||
percent-encoding = "2"
|
percent-encoding = "2"
|
||||||
tokio = { version = "1.0", features = [ "full" ] }
|
tokio = { version = "1.0", features = [ "full" ] }
|
||||||
async-tungstenite = { version = "0.19", features = ["tokio", "tokio-runtime", "tokio-native-tls"] }
|
async-tungstenite = { version = "0.20", features = ["tokio", "tokio-runtime", "tokio-native-tls"] }
|
||||||
nom = "7"
|
nom = "7"
|
||||||
crc = "3"
|
crc = "3"
|
||||||
byteorder = "1.3.4"
|
byteorder = "1.3.4"
|
||||||
|
@ -40,12 +40,12 @@ serde_json = "1"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
base32 = "0.4"
|
base32 = "0.4"
|
||||||
backoff = { version = "0.4", features = [ "futures", "tokio" ] }
|
backoff = { version = "0.4", features = [ "futures", "tokio" ] }
|
||||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core.git", package = "gio" }
|
gio = { git = "https://github.com/gtk-rs/gtk-rs-core.git", branch = "0.17", version = "0.17", package = "gio" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
chrono = { version = "0.4", features = [ "alloc" ] }
|
chrono = { version = "0.4", features = [ "alloc" ] }
|
||||||
env_logger = "0.10"
|
env_logger = "0.10"
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
test-with = { version = "0.9", default-features = false }
|
test-with = { version = "0.9", default-features = false }
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -2,27 +2,27 @@
|
||||||
name = "gst-plugin-hlssink3"
|
name = "gst-plugin-hlssink3"
|
||||||
description = "GStreamer HLS (HTTP Live Streaming) Plugin"
|
description = "GStreamer HLS (HTTP Live Streaming) Plugin"
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Rafael Caricio <rafael@caricio.com>"]
|
authors = ["Rafael Caricio <rafael@caricio.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
glib = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
glib = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17" }
|
||||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17" }
|
||||||
once_cell = "1.7.2"
|
once_cell = "1.7.2"
|
||||||
m3u8-rs = "5.0"
|
m3u8-rs = "5.0"
|
||||||
regex = "1"
|
regex = "1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path = "../../version-helper" }
|
gst-plugin-version-helper = { path = "../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gsthlssink3"
|
name = "gsthlssink3"
|
||||||
|
|
|
@ -417,7 +417,7 @@ impl BinImpl for HlsSink3 {
|
||||||
"splitmuxsink-fragment-closed" => {
|
"splitmuxsink-fragment-closed" => {
|
||||||
let s = msg.structure().unwrap();
|
let s = msg.structure().unwrap();
|
||||||
if let Ok(fragment_closed_at) = s.get::<gst::ClockTime>("running-time") {
|
if let Ok(fragment_closed_at) = s.get::<gst::ClockTime>("running-time") {
|
||||||
self.write_playlist(Some(fragment_closed_at)).unwrap();
|
let _ = self.write_playlist(Some(fragment_closed_at));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -574,7 +574,7 @@ impl ObjectImpl for HlsSink3 {
|
||||||
vec![
|
vec![
|
||||||
glib::subclass::Signal::builder(SIGNAL_GET_PLAYLIST_STREAM)
|
glib::subclass::Signal::builder(SIGNAL_GET_PLAYLIST_STREAM)
|
||||||
.param_types([String::static_type()])
|
.param_types([String::static_type()])
|
||||||
.return_type::<gio::OutputStream>()
|
.return_type::<Option<gio::OutputStream>>()
|
||||||
.class_handler(|_, args| {
|
.class_handler(|_, args| {
|
||||||
let element = args[0]
|
let element = args[0]
|
||||||
.get::<super::HlsSink3>()
|
.get::<super::HlsSink3>()
|
||||||
|
@ -583,12 +583,7 @@ impl ObjectImpl for HlsSink3 {
|
||||||
args[1].get::<String>().expect("playlist-stream signal arg");
|
args[1].get::<String>().expect("playlist-stream signal arg");
|
||||||
let hlssink3 = element.imp();
|
let hlssink3 = element.imp();
|
||||||
|
|
||||||
Some(
|
Some(hlssink3.new_file_stream(&playlist_location).ok().to_value())
|
||||||
hlssink3
|
|
||||||
.new_file_stream(&playlist_location)
|
|
||||||
.ok()?
|
|
||||||
.to_value(),
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
.accumulator(|_hint, ret, value| {
|
.accumulator(|_hint, ret, value| {
|
||||||
// First signal handler wins
|
// First signal handler wins
|
||||||
|
@ -598,7 +593,7 @@ impl ObjectImpl for HlsSink3 {
|
||||||
.build(),
|
.build(),
|
||||||
glib::subclass::Signal::builder(SIGNAL_GET_FRAGMENT_STREAM)
|
glib::subclass::Signal::builder(SIGNAL_GET_FRAGMENT_STREAM)
|
||||||
.param_types([String::static_type()])
|
.param_types([String::static_type()])
|
||||||
.return_type::<gio::OutputStream>()
|
.return_type::<Option<gio::OutputStream>>()
|
||||||
.class_handler(|_, args| {
|
.class_handler(|_, args| {
|
||||||
let element = args[0]
|
let element = args[0]
|
||||||
.get::<super::HlsSink3>()
|
.get::<super::HlsSink3>()
|
||||||
|
@ -607,12 +602,7 @@ impl ObjectImpl for HlsSink3 {
|
||||||
args[1].get::<String>().expect("fragment-stream signal arg");
|
args[1].get::<String>().expect("fragment-stream signal arg");
|
||||||
let hlssink3 = element.imp();
|
let hlssink3 = element.imp();
|
||||||
|
|
||||||
Some(
|
Some(hlssink3.new_file_stream(&fragment_location).ok().to_value())
|
||||||
hlssink3
|
|
||||||
.new_file_stream(&fragment_location)
|
|
||||||
.ok()?
|
|
||||||
.to_value(),
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
.accumulator(|_hint, ret, value| {
|
.accumulator(|_hint, ret, value| {
|
||||||
// First signal handler wins
|
// First signal handler wins
|
||||||
|
@ -767,7 +757,8 @@ impl ElementImpl for HlsSink3 {
|
||||||
};
|
};
|
||||||
|
|
||||||
if write_final {
|
if write_final {
|
||||||
self.write_final_playlist()?;
|
// Don't fail transitioning to READY if this fails
|
||||||
|
let _ = self.write_final_playlist();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gst::StateChange::ReadyToNull => {
|
gst::StateChange::ReadyToNull => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-ndi"
|
name = "gst-plugin-ndi"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Ruben Gonzalez <rubenrua@teltek.es>", "Daniel Vilar <daniel.peiteado@teltek.es>", "Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Ruben Gonzalez <rubenrua@teltek.es>", "Daniel Vilar <daniel.peiteado@teltek.es>", "Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,11 +9,11 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
glib = { git = "https://github.com/gtk-rs/gtk-rs-core"}
|
glib = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17"}
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
byte-slice-cast = "1"
|
byte-slice-cast = "1"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
byteorder = "1.0"
|
byteorder = "1.0"
|
||||||
|
@ -21,7 +21,7 @@ atomic_refcell = "0.1"
|
||||||
libloading = "0.7"
|
libloading = "0.7"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path = "../../version-helper" }
|
gst-plugin-version-helper = { path = "../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["interlaced-fields", "sink"]
|
default = ["interlaced-fields", "sink"]
|
||||||
|
|
|
@ -25,7 +25,16 @@ struct State {
|
||||||
// to the current_video_buffer below!
|
// to the current_video_buffer below!
|
||||||
video_info: Option<gst_video::VideoInfo>,
|
video_info: Option<gst_video::VideoInfo>,
|
||||||
audio_info: Option<gst_audio::AudioInfo>,
|
audio_info: Option<gst_audio::AudioInfo>,
|
||||||
current_video_buffer: Option<(gst::Buffer, gst::ClockTime)>,
|
// These are only ever set when a change is pending mid-stream. They apply to the currently
|
||||||
|
// pending buffer on the pad and not to the current_video_buffer.
|
||||||
|
pending_caps: Option<gst::Caps>,
|
||||||
|
pending_segment: Option<gst::Segment>,
|
||||||
|
current_video_buffer: Option<(
|
||||||
|
gst::Buffer,
|
||||||
|
gst::ClockTime,
|
||||||
|
Option<gst::Caps>,
|
||||||
|
Option<gst::Segment>,
|
||||||
|
)>,
|
||||||
current_audio_buffers: Vec<(gst::Buffer, gst_audio::AudioInfo, i64)>,
|
current_audio_buffers: Vec<(gst::Buffer, gst_audio::AudioInfo, i64)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,6 +190,8 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
*state_storage = Some(State {
|
*state_storage = Some(State {
|
||||||
audio_info: None,
|
audio_info: None,
|
||||||
video_info: None,
|
video_info: None,
|
||||||
|
pending_caps: None,
|
||||||
|
pending_segment: None,
|
||||||
current_video_buffer: None,
|
current_video_buffer: None,
|
||||||
current_audio_buffers: Vec::new(),
|
current_audio_buffers: Vec::new(),
|
||||||
});
|
});
|
||||||
|
@ -373,75 +384,87 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
None => return Err(gst::FlowError::Flushing),
|
None => return Err(gst::FlowError::Flushing),
|
||||||
};
|
};
|
||||||
|
|
||||||
let (mut current_video_buffer, current_video_running_time_end, next_video_buffer) =
|
let (
|
||||||
if let Some((video_buffer, video_segment)) = video_buffer_and_segment {
|
mut current_video_buffer,
|
||||||
let video_running_time = video_segment.to_running_time(video_buffer.pts()).unwrap();
|
current_video_running_time_end,
|
||||||
|
pending_caps,
|
||||||
|
pending_segment,
|
||||||
|
next_video_buffer,
|
||||||
|
) = if let Some((video_buffer, video_segment)) = video_buffer_and_segment {
|
||||||
|
let video_running_time = video_segment.to_running_time(video_buffer.pts()).unwrap();
|
||||||
|
if let Some(pending_segment) = &state.pending_segment {
|
||||||
|
assert_eq!(video_segment.upcast_ref(), pending_segment);
|
||||||
|
}
|
||||||
|
|
||||||
match state.current_video_buffer {
|
match &state.current_video_buffer {
|
||||||
None => {
|
None => {
|
||||||
gst::trace!(CAT, imp: self, "First video buffer, waiting for second");
|
gst::trace!(CAT, imp: self, "First video buffer, waiting for second");
|
||||||
state.current_video_buffer = Some((video_buffer, video_running_time));
|
state.current_video_buffer = Some((
|
||||||
drop(state_storage);
|
video_buffer,
|
||||||
self.video_pad.drop_buffer();
|
video_running_time,
|
||||||
return Err(gst_base::AGGREGATOR_FLOW_NEED_DATA);
|
state.pending_caps.take(),
|
||||||
}
|
state.pending_segment.take(),
|
||||||
Some((ref buffer, _)) => (
|
));
|
||||||
buffer.clone(),
|
drop(state_storage);
|
||||||
Some(video_running_time),
|
self.video_pad.drop_buffer();
|
||||||
Some((video_buffer, video_running_time)),
|
return Err(gst_base::AGGREGATOR_FLOW_NEED_DATA);
|
||||||
),
|
|
||||||
}
|
}
|
||||||
} else {
|
Some((ref buffer, _, pending_caps, pending_segment)) => (
|
||||||
match (&state.current_video_buffer, &audio_buffer_segment_and_pad) {
|
buffer.clone(),
|
||||||
(None, None) => {
|
Some(video_running_time),
|
||||||
gst::trace!(
|
pending_caps.clone(),
|
||||||
CAT,
|
pending_segment.clone(),
|
||||||
imp: self,
|
Some((video_buffer, video_running_time)),
|
||||||
"All pads are EOS and no buffers are queued, finishing"
|
),
|
||||||
);
|
}
|
||||||
return Err(gst::FlowError::Eos);
|
} else {
|
||||||
}
|
match (&state.current_video_buffer, &audio_buffer_segment_and_pad) {
|
||||||
(None, Some((ref audio_buffer, ref audio_segment, _))) => {
|
(None, None) => {
|
||||||
// Create an empty dummy buffer for attaching the audio. This is going to
|
gst::trace!(
|
||||||
// be dropped by the sink later.
|
CAT,
|
||||||
let audio_running_time =
|
imp: self,
|
||||||
audio_segment.to_running_time(audio_buffer.pts()).unwrap();
|
"All pads are EOS and no buffers are queued, finishing"
|
||||||
|
);
|
||||||
|
return Err(gst::FlowError::Eos);
|
||||||
|
}
|
||||||
|
(None, Some((ref audio_buffer, ref audio_segment, _))) => {
|
||||||
|
// Create an empty dummy buffer for attaching the audio. This is going to
|
||||||
|
// be dropped by the sink later.
|
||||||
|
let audio_running_time =
|
||||||
|
audio_segment.to_running_time(audio_buffer.pts()).unwrap();
|
||||||
|
|
||||||
let video_segment = self.video_pad.segment();
|
let video_segment = self.video_pad.segment();
|
||||||
let video_segment = match video_segment.downcast::<gst::ClockTime>() {
|
let video_segment = match video_segment.downcast::<gst::ClockTime>() {
|
||||||
Ok(video_segment) => video_segment,
|
Ok(video_segment) => video_segment,
|
||||||
Err(video_segment) => {
|
Err(video_segment) => {
|
||||||
gst::error!(
|
gst::error!(
|
||||||
CAT,
|
|
||||||
imp: self,
|
|
||||||
"Video segment of wrong format {:?}",
|
|
||||||
video_segment.format()
|
|
||||||
);
|
|
||||||
return Err(gst::FlowError::Error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let video_pts =
|
|
||||||
video_segment.position_from_running_time(audio_running_time);
|
|
||||||
if video_pts.is_none() {
|
|
||||||
gst::warning!(
|
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Can't output more audio after video EOS"
|
"Video segment of wrong format {:?}",
|
||||||
|
video_segment.format()
|
||||||
);
|
);
|
||||||
return Err(gst::FlowError::Eos);
|
return Err(gst::FlowError::Error);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
let mut buffer = gst::Buffer::new();
|
let video_pts = video_segment.position_from_running_time(audio_running_time);
|
||||||
{
|
if video_pts.is_none() {
|
||||||
let buffer = buffer.get_mut().unwrap();
|
gst::warning!(CAT, imp: self, "Can't output more audio after video EOS");
|
||||||
buffer.set_pts(video_pts);
|
return Err(gst::FlowError::Eos);
|
||||||
}
|
|
||||||
|
|
||||||
(buffer, gst::ClockTime::NONE, None)
|
|
||||||
}
|
}
|
||||||
(Some((ref buffer, _)), _) => (buffer.clone(), gst::ClockTime::NONE, None),
|
|
||||||
|
let mut buffer = gst::Buffer::new();
|
||||||
|
{
|
||||||
|
let buffer = buffer.get_mut().unwrap();
|
||||||
|
buffer.set_pts(video_pts);
|
||||||
|
}
|
||||||
|
|
||||||
|
(buffer, gst::ClockTime::NONE, None, None, None)
|
||||||
}
|
}
|
||||||
};
|
(Some((ref buffer, _, _, _)), _) => {
|
||||||
|
(buffer.clone(), gst::ClockTime::NONE, None, None, None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if let Some((audio_buffer, audio_segment, audio_pad)) = audio_buffer_segment_and_pad {
|
if let Some((audio_buffer, audio_segment, audio_pad)) = audio_buffer_segment_and_pad {
|
||||||
let audio_info = match state.audio_info {
|
let audio_info = match state.audio_info {
|
||||||
|
@ -508,7 +531,7 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some((video_buffer, video_running_time)) = next_video_buffer {
|
if let Some((video_buffer, video_running_time)) = next_video_buffer {
|
||||||
state.current_video_buffer = Some((video_buffer, video_running_time));
|
state.current_video_buffer = Some((video_buffer, video_running_time, None, None));
|
||||||
drop(state_storage);
|
drop(state_storage);
|
||||||
self.video_pad.drop_buffer();
|
self.video_pad.drop_buffer();
|
||||||
} else {
|
} else {
|
||||||
|
@ -522,7 +545,14 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
"Finishing video buffer {:?}",
|
"Finishing video buffer {:?}",
|
||||||
current_video_buffer
|
current_video_buffer
|
||||||
);
|
);
|
||||||
self.obj().finish_buffer(current_video_buffer)
|
if let Some(caps) = pending_caps {
|
||||||
|
self.obj().set_src_caps(&caps);
|
||||||
|
}
|
||||||
|
if let Some(segment) = pending_segment {
|
||||||
|
self.obj().update_segment(&segment);
|
||||||
|
}
|
||||||
|
let ret = self.obj().finish_buffer(current_video_buffer);
|
||||||
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sink_event(&self, pad: &gst_base::AggregatorPad, event: gst::Event) -> bool {
|
fn sink_event(&self, pad: &gst_base::AggregatorPad, event: gst::Event) -> bool {
|
||||||
|
@ -539,6 +569,7 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
};
|
};
|
||||||
|
|
||||||
if pad == &self.video_pad {
|
if pad == &self.video_pad {
|
||||||
|
let mut send_caps_immediately = true;
|
||||||
let info = match gst_video::VideoInfo::from_caps(&caps) {
|
let info = match gst_video::VideoInfo::from_caps(&caps) {
|
||||||
Ok(info) => info,
|
Ok(info) => info,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
|
@ -559,13 +590,21 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
};
|
};
|
||||||
|
|
||||||
state.video_info = Some(info);
|
state.video_info = Some(info);
|
||||||
|
if state.current_video_buffer.is_some() {
|
||||||
|
state.pending_caps = Some(caps.clone());
|
||||||
|
send_caps_immediately = false;
|
||||||
|
} else {
|
||||||
|
state.pending_caps = None;
|
||||||
|
}
|
||||||
|
|
||||||
drop(state_storage);
|
drop(state_storage);
|
||||||
|
|
||||||
self.obj().set_latency(latency, gst::ClockTime::NONE);
|
self.obj().set_latency(latency, gst::ClockTime::NONE);
|
||||||
|
|
||||||
// The video caps are passed through as the audio is included only in a meta
|
// The video caps are passed through as the audio is included only in a meta
|
||||||
self.obj().set_src_caps(&caps);
|
if send_caps_immediately {
|
||||||
|
self.obj().set_src_caps(&caps);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
let info = match gst_audio::AudioInfo::from_caps(&caps) {
|
let info = match gst_audio::AudioInfo::from_caps(&caps) {
|
||||||
Ok(info) => info,
|
Ok(info) => info,
|
||||||
|
@ -582,7 +621,33 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
EventView::Segment(segment) if pad == &self.video_pad => {
|
EventView::Segment(segment) if pad == &self.video_pad => {
|
||||||
let segment = segment.segment();
|
let segment = segment.segment();
|
||||||
gst::debug!(CAT, obj: pad, "Updating segment {:?}", segment);
|
gst::debug!(CAT, obj: pad, "Updating segment {:?}", segment);
|
||||||
self.obj().update_segment(segment);
|
let mut state_storage = self.state.lock().unwrap();
|
||||||
|
let state = match &mut *state_storage {
|
||||||
|
Some(ref mut state) => state,
|
||||||
|
None => return false,
|
||||||
|
};
|
||||||
|
let mut send_segment_immediately = true;
|
||||||
|
if state.current_video_buffer.is_some() {
|
||||||
|
state.pending_segment = Some(segment.clone());
|
||||||
|
send_segment_immediately = false;
|
||||||
|
} else {
|
||||||
|
state.pending_caps = None;
|
||||||
|
}
|
||||||
|
drop(state_storage);
|
||||||
|
|
||||||
|
if send_segment_immediately {
|
||||||
|
self.obj().update_segment(segment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EventView::FlushStop(_) if pad == &self.video_pad => {
|
||||||
|
let mut state_storage = self.state.lock().unwrap();
|
||||||
|
let state = match &mut *state_storage {
|
||||||
|
Some(ref mut state) => state,
|
||||||
|
None => return false,
|
||||||
|
};
|
||||||
|
state.pending_segment = None;
|
||||||
|
state.pending_caps = None;
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-onvif"
|
name = "gst-plugin-onvif"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,16 +9,16 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"] }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"] }
|
||||||
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"] }
|
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"] }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"] }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"] }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"] }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
xmlparser = "0.13"
|
xmlparser = "0.13"
|
||||||
chrono = { version = "0.4", default-features = false }
|
chrono = { version = "0.4", default-features = false }
|
||||||
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", features=["use_glib"] }
|
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17", features=["use_glib"] }
|
||||||
pango = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
pango = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17" }
|
||||||
pangocairo = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
pangocairo = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17" }
|
||||||
xmltree = "0.10"
|
xmltree = "0.10"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -27,7 +27,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-raptorq"
|
name = "gst-plugin-raptorq"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Tomasz Andrzejak <andreiltd@gmail.com>"]
|
authors = ["Tomasz Andrzejak <andreiltd@gmail.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
description = "GStreamer RaptorQ FEC Plugin"
|
description = "GStreamer RaptorQ FEC Plugin"
|
||||||
|
@ -9,14 +9,14 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
raptorq = "1.7"
|
raptorq = "1.7"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -25,7 +25,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-reqwest"
|
name = "gst-plugin-reqwest"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -14,14 +14,14 @@ reqwest = { version = "0.11", features = ["cookies", "gzip"] }
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
headers = "0.3"
|
headers = "0.3"
|
||||||
mime = "0.3"
|
mime = "0.3"
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
tokio = { version = "1.0", default-features = false, features = ["time", "rt-multi-thread"] }
|
tokio = { version = "1.0", default-features = false, features = ["time", "rt-multi-thread"] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
hyper = { version = "0.14", features = ["server"] }
|
hyper = { version = "0.14", features = ["server"] }
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstreqwest"
|
name = "gstreqwest"
|
||||||
|
@ -29,7 +29,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-rtp"
|
name = "gst-plugin-rtp"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Vivienne Watermeier <vwatermeier@igalia.com>", "Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Vivienne Watermeier <vwatermeier@igalia.com>", "Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -10,16 +10,16 @@ rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitstream-io = "1.3"
|
bitstream-io = "1.3"
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"] }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"] }
|
||||||
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"]}
|
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"]}
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
chrono = { version = "0.4", default-features = false }
|
chrono = { version = "0.4", default-features = false }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_20"] }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_20"] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path = "../../version-helper" }
|
gst-plugin-version-helper = { path = "../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstrsrtp"
|
name = "gstrsrtp"
|
||||||
|
|
|
@ -12,23 +12,25 @@
|
||||||
use bitstream_io::{BitRead, BitReader, BitWrite, BitWriter, Endianness};
|
use bitstream_io::{BitRead, BitReader, BitWrite, BitWriter, Endianness};
|
||||||
use std::io::{self, Read, Seek, Write};
|
use std::io::{self, Read, Seek, Write};
|
||||||
|
|
||||||
pub fn parse_leb128<R, E>(reader: &mut BitReader<R, E>) -> io::Result<u32>
|
pub fn parse_leb128<R, E>(reader: &mut BitReader<R, E>) -> io::Result<(u32, u32)>
|
||||||
where
|
where
|
||||||
R: Read + Seek,
|
R: Read + Seek,
|
||||||
E: Endianness,
|
E: Endianness,
|
||||||
{
|
{
|
||||||
let mut value = 0;
|
let mut value = 0;
|
||||||
|
let mut num_bytes = 0;
|
||||||
|
|
||||||
for i in 0..8 {
|
for i in 0..8 {
|
||||||
let byte = reader.read::<u32>(8)?;
|
let byte = reader.read::<u32>(8)?;
|
||||||
value |= (byte & 0x7f) << (i * 7);
|
value |= (byte & 0x7f) << (i * 7);
|
||||||
|
num_bytes += 1;
|
||||||
if byte & 0x80 == 0 {
|
if byte & 0x80 == 0 {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reader.byte_align();
|
reader.byte_align();
|
||||||
Ok(value)
|
Ok((value, num_bytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_leb128<W, E>(writer: &mut BitWriter<W, E>, mut value: u32) -> io::Result<()>
|
pub fn write_leb128<W, E>(writer: &mut BitWriter<W, E>, mut value: u32) -> io::Result<()>
|
||||||
|
@ -82,7 +84,10 @@ mod tests {
|
||||||
println!("testing: value={value}");
|
println!("testing: value={value}");
|
||||||
|
|
||||||
let mut reader = BitReader::endian(Cursor::new(&encoding), BigEndian);
|
let mut reader = BitReader::endian(Cursor::new(&encoding), BigEndian);
|
||||||
assert_eq!(value, parse_leb128(&mut reader).unwrap());
|
assert_eq!(
|
||||||
|
(value, encoding.len() as u32),
|
||||||
|
parse_leb128(&mut reader).unwrap()
|
||||||
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
encoding.len() as u64 * 8,
|
encoding.len() as u64 * 8,
|
||||||
reader.position_in_bits().unwrap()
|
reader.position_in_bits().unwrap()
|
||||||
|
@ -96,7 +101,10 @@ mod tests {
|
||||||
data.set_position(0);
|
data.set_position(0);
|
||||||
|
|
||||||
let mut reader = BitReader::endian(data, BigEndian);
|
let mut reader = BitReader::endian(data, BigEndian);
|
||||||
assert_eq!(value, parse_leb128(&mut reader).unwrap());
|
assert_eq!(
|
||||||
|
(value, encoding.len() as u32),
|
||||||
|
parse_leb128(&mut reader).unwrap()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use crate::av1::common::{leb128_size, parse_leb128};
|
use crate::av1::common::parse_leb128;
|
||||||
use bitstream_io::{BitRead, BitReader, Endianness};
|
use bitstream_io::{BitRead, BitReader, Endianness};
|
||||||
use std::io::{self, Read, Seek};
|
use std::io::{self, Read, Seek};
|
||||||
|
|
||||||
|
@ -165,8 +165,7 @@ impl SizedObu {
|
||||||
|
|
||||||
reader.byte_align();
|
reader.byte_align();
|
||||||
|
|
||||||
let size = parse_leb128(reader)?;
|
let (size, leb_size) = parse_leb128(reader)?;
|
||||||
let leb_size = leb128_size(size) as u32;
|
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
obu_type,
|
obu_type,
|
||||||
|
|
|
@ -393,24 +393,21 @@ impl RTPAv1Depay {
|
||||||
aggr_header: &AggregationHeader,
|
aggr_header: &AggregationHeader,
|
||||||
index: u32,
|
index: u32,
|
||||||
) -> Result<(u32, bool), gst::FlowError> {
|
) -> Result<(u32, bool), gst::FlowError> {
|
||||||
let element_size: u32;
|
|
||||||
let is_last_obu: bool;
|
let is_last_obu: bool;
|
||||||
|
|
||||||
if let Some(count) = aggr_header.obu_count {
|
let element_size = if let Some(count) = aggr_header.obu_count {
|
||||||
is_last_obu = index + 1 == count as u32;
|
is_last_obu = index + 1 == count as u32;
|
||||||
element_size = if is_last_obu {
|
if is_last_obu {
|
||||||
rtp.payload_size() - (reader.position() as u32)
|
rtp.payload_size() - (reader.position() as u32)
|
||||||
} else {
|
} else {
|
||||||
let mut bitreader = BitReader::endian(reader, ENDIANNESS);
|
let mut bitreader = BitReader::endian(reader, ENDIANNESS);
|
||||||
parse_leb128(&mut bitreader).map_err(err_flow!(self, leb_read))?
|
let (size, _) = parse_leb128(&mut bitreader).map_err(err_flow!(self, leb_read))?;
|
||||||
|
size
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
element_size = parse_leb128(&mut BitReader::endian(&mut *reader, ENDIANNESS))
|
let (size, _) = parse_leb128(&mut BitReader::endian(&mut *reader, ENDIANNESS))
|
||||||
.map_err(err_flow!(self, leb_read))?;
|
.map_err(err_flow!(self, leb_read))?;
|
||||||
is_last_obu = match rtp
|
is_last_obu = match rtp.payload_size().cmp(&(reader.position() as u32 + size)) {
|
||||||
.payload_size()
|
|
||||||
.cmp(&(reader.position() as u32 + element_size))
|
|
||||||
{
|
|
||||||
Ordering::Greater => false,
|
Ordering::Greater => false,
|
||||||
Ordering::Equal => true,
|
Ordering::Equal => true,
|
||||||
Ordering::Less => {
|
Ordering::Less => {
|
||||||
|
@ -422,7 +419,8 @@ impl RTPAv1Depay {
|
||||||
return Err(gst::FlowError::Error);
|
return Err(gst::FlowError::Error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
size
|
||||||
|
};
|
||||||
|
|
||||||
Ok((element_size, is_last_obu))
|
Ok((element_size, is_last_obu))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-webrtc"
|
name = "gst-plugin-webrtc"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>", "Thibault Saunier <tsaunier@igalia.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>", "Thibault Saunier <tsaunier@igalia.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,13 +9,13 @@ repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", package = "gstreamer", features = ["v1_20", "serde"] }
|
gst = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", package = "gstreamer", features = ["v1_20", "serde"] }
|
||||||
gst-app = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", package = "gstreamer-app", features = ["v1_20"] }
|
gst-app = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", package = "gstreamer-app", features = ["v1_20"] }
|
||||||
gst-video = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", package = "gstreamer-video", features = ["v1_20", "serde"] }
|
gst-video = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", package = "gstreamer-video", features = ["v1_20", "serde"] }
|
||||||
gst-webrtc = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", package = "gstreamer-webrtc", features = ["v1_20"] }
|
gst-webrtc = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", package = "gstreamer-webrtc", features = ["v1_20"] }
|
||||||
gst-sdp = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", package = "gstreamer-sdp", features = ["v1_20"] }
|
gst-sdp = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", package = "gstreamer-sdp", features = ["v1_20"] }
|
||||||
gst-rtp = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", package = "gstreamer-rtp", features = ["v1_20"] }
|
gst-rtp = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", package = "gstreamer-rtp", features = ["v1_20"] }
|
||||||
gst-utils = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", package = "gstreamer-utils" }
|
gst-utils = { git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", package = "gstreamer-utils" }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
|
@ -23,11 +23,11 @@ futures = "0.3"
|
||||||
tokio = { version = "1", features = ["fs", "macros", "rt-multi-thread", "time"] }
|
tokio = { version = "1", features = ["fs", "macros", "rt-multi-thread", "time"] }
|
||||||
tokio-native-tls = "0.3.0"
|
tokio-native-tls = "0.3.0"
|
||||||
tokio-stream = "0.1.11"
|
tokio-stream = "0.1.11"
|
||||||
async-tungstenite = { version = "0.19", features = ["tokio-runtime", "tokio-native-tls"] }
|
async-tungstenite = { version = "0.20", features = ["tokio-runtime", "tokio-native-tls"] }
|
||||||
serde = "1"
|
serde = "1"
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
fastrand = "1.0"
|
fastrand = "1.0"
|
||||||
gst_plugin_webrtc_protocol = { path="protocol", package = "gst-plugin-webrtc-signalling-protocol" }
|
gst_plugin_webrtc_protocol = { path="protocol", version = "0.10", package = "gst-plugin-webrtc-signalling-protocol" }
|
||||||
human_bytes = "0.4"
|
human_bytes = "0.4"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
@ -43,7 +43,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path = "../../version-helper" }
|
gst-plugin-version-helper = { path = "../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-webrtc-signalling-protocol"
|
name = "gst-plugin-webrtc-signalling-protocol"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-webrtc-signalling"
|
name = "gst-plugin-webrtc-signalling"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -13,7 +13,7 @@ once_cell = "1.0"
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
tokio = { version = "1", features = ["fs", "io-util", "macros", "rt-multi-thread", "time"] }
|
tokio = { version = "1", features = ["fs", "io-util", "macros", "rt-multi-thread", "time"] }
|
||||||
tokio-native-tls = "0.3.0"
|
tokio-native-tls = "0.3.0"
|
||||||
async-tungstenite = { version = "0.19", features = ["tokio-runtime", "tokio-native-tls"] }
|
async-tungstenite = { version = "0.20", features = ["tokio-runtime", "tokio-native-tls"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
clap = { version = "4", features = ["derive"] }
|
clap = { version = "4", features = ["derive"] }
|
||||||
|
@ -25,7 +25,7 @@ uuid = { version = "1", features = ["v4"] }
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
test-log = { version = "0.2", features = ["trace"], default-features = false }
|
test-log = { version = "0.2", features = ["trace"], default-features = false }
|
||||||
pin-project-lite = "0.2"
|
pin-project-lite = "0.2"
|
||||||
gst_plugin_webrtc_protocol = { path="../protocol", package = "gst-plugin-webrtc-signalling-protocol" }
|
gst_plugin_webrtc_protocol = { path="../protocol", version = "0.10", package = "gst-plugin-webrtc-signalling-protocol" }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "gst-webrtc-signalling-server"
|
name = "gst-webrtc-signalling-server"
|
||||||
|
|
|
@ -264,7 +264,7 @@ impl Handler {
|
||||||
#[instrument(level = "debug", skip(self))]
|
#[instrument(level = "debug", skip(self))]
|
||||||
fn start_session(&mut self, producer_id: &str, consumer_id: &str) -> Result<(), Error> {
|
fn start_session(&mut self, producer_id: &str, consumer_id: &str) -> Result<(), Error> {
|
||||||
self.peers.get(producer_id).map_or_else(
|
self.peers.get(producer_id).map_or_else(
|
||||||
|| Err(anyhow!("Peer '{producer_id}' hasn't been welcomed")),
|
|| Err(anyhow!("No producer with ID: '{producer_id}'")),
|
||||||
|peer| {
|
|peer| {
|
||||||
if !peer.producing() {
|
if !peer.producing() {
|
||||||
Err(anyhow!(
|
Err(anyhow!(
|
||||||
|
@ -277,10 +277,9 @@ impl Handler {
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
self.peers.get(consumer_id).map_or_else(
|
self.peers
|
||||||
|| Err(anyhow!("Peer '{consumer_id}' hasn't been welcomed")),
|
.get(consumer_id)
|
||||||
Ok,
|
.map_or_else(|| Err(anyhow!("No consumer with ID: '{consumer_id}'")), Ok)?;
|
||||||
)?;
|
|
||||||
|
|
||||||
let session_id = uuid::Uuid::new_v4().to_string();
|
let session_id = uuid::Uuid::new_v4().to_string();
|
||||||
self.sessions.insert(
|
self.sessions.insert(
|
||||||
|
@ -1083,7 +1082,7 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
sent_message,
|
sent_message,
|
||||||
p::OutgoingMessage::Error {
|
p::OutgoingMessage::Error {
|
||||||
details: "Peer 'producer' hasn't been welcomed".into()
|
details: "No producer with ID: 'producer'".into()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1285,7 +1284,7 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
sent_message,
|
sent_message,
|
||||||
p::OutgoingMessage::Error {
|
p::OutgoingMessage::Error {
|
||||||
details: "Peer 'consumer' hasn't been welcomed".into()
|
details: "No consumer with ID: 'consumer'".into()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
* Since: plugins-rs-0.9
|
* Since: plugins-rs-0.9
|
||||||
*/
|
*/
|
||||||
use gst::glib;
|
use gst::glib;
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
use tokio::runtime;
|
||||||
|
|
||||||
mod signaller;
|
mod signaller;
|
||||||
pub mod webrtcsink;
|
pub mod webrtcsink;
|
||||||
|
@ -28,3 +30,11 @@ gst::plugin_define!(
|
||||||
env!("CARGO_PKG_REPOSITORY"),
|
env!("CARGO_PKG_REPOSITORY"),
|
||||||
env!("BUILD_REL_DATE")
|
env!("BUILD_REL_DATE")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
pub static RUNTIME: Lazy<runtime::Runtime> = Lazy::new(|| {
|
||||||
|
runtime::Builder::new_multi_thread()
|
||||||
|
.enable_all()
|
||||||
|
.worker_threads(1)
|
||||||
|
.build()
|
||||||
|
.unwrap()
|
||||||
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use crate::webrtcsink::{WebRTCSink, RUNTIME};
|
use crate::{webrtcsink::WebRTCSink, RUNTIME};
|
||||||
use anyhow::{anyhow, Error};
|
use anyhow::{anyhow, Error};
|
||||||
use async_tungstenite::tungstenite::Message as WsMessage;
|
use async_tungstenite::tungstenite::Message as WsMessage;
|
||||||
use futures::channel::mpsc;
|
use futures::channel::mpsc;
|
||||||
|
|
|
@ -20,7 +20,7 @@ use std::sync::Mutex;
|
||||||
use super::homegrown_cc::CongestionController;
|
use super::homegrown_cc::CongestionController;
|
||||||
use super::{WebRTCSinkCongestionControl, WebRTCSinkError, WebRTCSinkMitigationMode};
|
use super::{WebRTCSinkCongestionControl, WebRTCSinkError, WebRTCSinkMitigationMode};
|
||||||
use crate::signaller::Signaller;
|
use crate::signaller::Signaller;
|
||||||
use crate::webrtcsink::RUNTIME;
|
use crate::RUNTIME;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
||||||
|
@ -336,9 +336,13 @@ fn make_converter_for_video_caps(caps: &gst::Caps) -> Result<gst::Element, Error
|
||||||
(glupload, glscale)
|
(glupload, glscale)
|
||||||
} else if feature.contains(NVMM_MEMORY_FEATURE) {
|
} else if feature.contains(NVMM_MEMORY_FEATURE) {
|
||||||
let queue = make_element("queue", None)?;
|
let queue = make_element("queue", None)?;
|
||||||
let nvconvert = make_element("nvvideoconvert", None)?;
|
let nvconvert = if let Ok(nvconvert) = make_element("nvvideoconvert", None) {
|
||||||
nvconvert.set_property("compute-hw", 0);
|
nvconvert.set_property("compute-hw", 0);
|
||||||
nvconvert.set_property("nvbuf-memory-type", 0);
|
nvconvert.set_property("nvbuf-memory-type", 0);
|
||||||
|
nvconvert
|
||||||
|
} else {
|
||||||
|
make_element("nvvidconv", None)?
|
||||||
|
};
|
||||||
|
|
||||||
ret.add_many(&[&queue, &nvconvert])?;
|
ret.add_many(&[&queue, &nvconvert])?;
|
||||||
gst::Element::link_many(&[&queue, &nvconvert])?;
|
gst::Element::link_many(&[&queue, &nvconvert])?;
|
||||||
|
|
|
@ -9,9 +9,7 @@
|
||||||
use gst::glib;
|
use gst::glib;
|
||||||
use gst::prelude::*;
|
use gst::prelude::*;
|
||||||
use gst::subclass::prelude::*;
|
use gst::subclass::prelude::*;
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use tokio::runtime;
|
|
||||||
|
|
||||||
mod homegrown_cc;
|
mod homegrown_cc;
|
||||||
mod imp;
|
mod imp;
|
||||||
|
@ -167,11 +165,3 @@ pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||||
WebRTCSink::static_type(),
|
WebRTCSink::static_type(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub static RUNTIME: Lazy<runtime::Runtime> = Lazy::new(|| {
|
|
||||||
runtime::Builder::new_multi_thread()
|
|
||||||
.enable_all()
|
|
||||||
.worker_threads(1)
|
|
||||||
.build()
|
|
||||||
.unwrap()
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-webrtchttp"
|
name = "gst-plugin-webrtchttp"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Taruntej Kanakamalla <taruntej@asymptotic.io"]
|
authors = ["Taruntej Kanakamalla <taruntej@asymptotic.io"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -11,9 +11,9 @@ rust-version = "1.63"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-webrtc = { package = "gstreamer-webrtc", git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-webrtc = { package = "gstreamer-webrtc", git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-sdp = { package = "gstreamer-sdp", git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-sdp = { package = "gstreamer-sdp", git="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
reqwest = { version = "0.11", features = ["default-tls"] }
|
reqwest = { version = "0.11", features = ["default-tls"] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
parse_link_header = {version = "0.3", features = ["url"]}
|
parse_link_header = {version = "0.3", features = ["url"]}
|
||||||
|
@ -28,7 +28,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-textahead"
|
name = "gst-plugin-textahead"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Guillaume Desmottes <guillaume@desmottes.be>"]
|
authors = ["Guillaume Desmottes <guillaume@desmottes.be>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,7 +9,7 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -18,7 +18,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-json"
|
name = "gst-plugin-json"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
@ -15,6 +15,8 @@ serde_json = { version = "1.0", features = ["raw_value"] }
|
||||||
|
|
||||||
[dependencies.gst]
|
[dependencies.gst]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer"
|
package="gstreamer"
|
||||||
features=["serde"]
|
features=["serde"]
|
||||||
|
|
||||||
|
@ -24,10 +26,12 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[dev-dependencies.gst-check]
|
[dev-dependencies.gst-check]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-check"
|
package="gstreamer-check"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-regex"
|
name = "gst-plugin-regex"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
@ -14,6 +14,8 @@ regex = "1.5"
|
||||||
|
|
||||||
[dependencies.gst]
|
[dependencies.gst]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer"
|
package="gstreamer"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -22,10 +24,12 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[dev-dependencies.gst-check]
|
[dev-dependencies.gst-check]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-check"
|
package="gstreamer-check"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-textwrap"
|
name = "gst-plugin-textwrap"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
@ -15,6 +15,8 @@ hyphenation = "0.8"
|
||||||
|
|
||||||
[dependencies.gst]
|
[dependencies.gst]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer"
|
package="gstreamer"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -23,10 +25,12 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[dev-dependencies.gst-check]
|
[dev-dependencies.gst-check]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-check"
|
package="gstreamer-check"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-tutorial"
|
name = "gst-plugin-tutorial"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,10 +9,10 @@ rust-version = "1.63"
|
||||||
description = "GStreamer Rust Tutorial Plugin"
|
description = "GStreamer Rust Tutorial Plugin"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
byte-slice-cast = "1.0"
|
byte-slice-cast = "1.0"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-fallbackswitch"
|
name = "gst-plugin-fallbackswitch"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>", "Jan Schmidt <jan@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>", "Jan Schmidt <jan@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,19 +9,19 @@ rust-version = "1.63"
|
||||||
description = "GStreamer Fallback Switcher and Source Plugin"
|
description = "GStreamer Fallback Switcher and Source Plugin"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-plugin-gtk4 = { path = "../../video/gtk4", optional = true }
|
gst-plugin-gtk4 = { path = "../../video/gtk4", version = "0.10", optional = true }
|
||||||
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", optional = true }
|
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.6", version = "0.6", optional = true }
|
||||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", optional = true }
|
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17", optional = true }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstfallbackswitch"
|
name = "gstfallbackswitch"
|
||||||
|
@ -35,7 +35,7 @@ required-features = ["gtk", "gio", "gst-plugin-gtk4"]
|
||||||
|
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["v1_20"]
|
default = ["v1_20"]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-livesync"
|
name = "gst-plugin-livesync"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>"]
|
authors = ["Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
description = "Livesync Plugin"
|
description = "Livesync Plugin"
|
||||||
|
@ -9,18 +9,18 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", optional = true }
|
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17", optional = true }
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-plugin-gtk4 = { path = "../../video/gtk4", optional = true }
|
gst-plugin-gtk4 = { path = "../../video/gtk4", version = "0.10", optional = true }
|
||||||
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", optional = true }
|
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.6", version = "0.6", optional = true }
|
||||||
muldiv = "1.0"
|
muldiv = "1.0"
|
||||||
num-rational = { version = "0.4", default-features = false, features = [] }
|
num-rational = { version = "0.4", default-features = false, features = [] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstlivesync"
|
name = "gstlivesync"
|
||||||
|
@ -37,7 +37,7 @@ name = "livesync"
|
||||||
path = "tests/livesync.rs"
|
path = "tests/livesync.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -484,7 +484,7 @@ impl State {
|
||||||
.and_then(|s| s.get::<gst::Fraction>("framerate").ok())
|
.and_then(|s| s.get::<gst::Fraction>("framerate").ok())
|
||||||
.and_then(|framerate| {
|
.and_then(|framerate| {
|
||||||
gst::ClockTime::SECOND
|
gst::ClockTime::SECOND
|
||||||
.mul_div_round(framerate.numer() as u64, framerate.denom() as u64)
|
.mul_div_round(framerate.denom() as u64, framerate.numer() as u64)
|
||||||
})
|
})
|
||||||
.filter(|&dur| dur > 8.mseconds() && dur < 10.seconds())
|
.filter(|&dur| dur > 8.mseconds() && dur < 10.seconds())
|
||||||
// Otherwise, half the configured latency
|
// Otherwise, half the configured latency
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-togglerecord"
|
name = "gst-plugin-togglerecord"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
description = "GStreamer Toggle Record Plugin"
|
description = "GStreamer Toggle Record Plugin"
|
||||||
|
@ -9,12 +9,12 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-plugin-gtk4 = { path = "../../video/gtk4", optional = true }
|
gst-plugin-gtk4 = { path = "../../video/gtk4", version = "0.10", optional = true }
|
||||||
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", optional = true }
|
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.6", version = "0.6", optional = true }
|
||||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", optional = true }
|
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17", optional = true }
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ path = "examples/gtk_recording.rs"
|
||||||
required-features = ["gtk", "gio", "gst-plugin-gtk4"]
|
required-features = ["gtk", "gio", "gst-plugin-gtk4"]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-tracers"
|
name = "gst-plugin-tracers"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Guillaume Desmottes <guillaume.desmottes@onestream.live>"]
|
authors = ["Guillaume Desmottes <guillaume.desmottes@onestream.live>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,7 +9,7 @@ description = "GStreamer Rust tracers plugin"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
regex = "1"
|
regex = "1"
|
||||||
|
@ -23,7 +23,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -90,8 +90,17 @@ static MULTIQUEUE_TYPE: Lazy<glib::Type> = Lazy::new(|| {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
static APPSRC_TYPE: Lazy<glib::Type> = Lazy::new(|| {
|
||||||
|
if let Some(queue) = gst::ElementFactory::find("appsrc").and_then(|f| f.load().ok()) {
|
||||||
|
queue.element_type()
|
||||||
|
} else {
|
||||||
|
gst::warning!(CAT, "Can't instantiate appsrc element");
|
||||||
|
glib::Type::INVALID
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
fn is_queue_type(type_: glib::Type) -> bool {
|
fn is_queue_type(type_: glib::Type) -> bool {
|
||||||
[*QUEUE_TYPE, *QUEUE2_TYPE, *MULTIQUEUE_TYPE].contains(&type_)
|
[*QUEUE_TYPE, *QUEUE2_TYPE, *MULTIQUEUE_TYPE, *APPSRC_TYPE].contains(&type_)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -180,9 +189,9 @@ struct LogLine {
|
||||||
cur_level_bytes: u32,
|
cur_level_bytes: u32,
|
||||||
cur_level_time: u64,
|
cur_level_time: u64,
|
||||||
cur_level_buffers: u32,
|
cur_level_buffers: u32,
|
||||||
max_size_bytes: u32,
|
max_size_bytes: u64,
|
||||||
max_size_time: u64,
|
max_size_time: u64,
|
||||||
max_size_buffers: u32,
|
max_size_buffers: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -439,9 +448,19 @@ impl QueueLevels {
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
|
|
||||||
let max_size_bytes = element.property::<u32>("max-size-bytes");
|
let (max_size_bytes, max_size_time, max_size_buffers) = if element.type_() == *APPSRC_TYPE {
|
||||||
let max_size_time = element.property::<u64>("max-size-time");
|
(
|
||||||
let max_size_buffers = element.property::<u32>("max-size-buffers");
|
element.property::<u64>("max-bytes"),
|
||||||
|
element.property::<u64>("max-time"),
|
||||||
|
element.property::<u64>("max-buffers"),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
element.property::<u32>("max-size-bytes") as u64,
|
||||||
|
element.property::<u64>("max-size-time"),
|
||||||
|
element.property::<u32>("max-size-buffers") as u64,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
if element.type_() == *MULTIQUEUE_TYPE {
|
if element.type_() == *MULTIQUEUE_TYPE {
|
||||||
let get_pad_idx = |pad: &gst::Pad| {
|
let get_pad_idx = |pad: &gst::Pad| {
|
||||||
|
@ -497,9 +516,21 @@ impl QueueLevels {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let cur_level_bytes = element.property::<u32>("current-level-bytes");
|
let (cur_level_bytes, cur_level_time, cur_level_buffers) =
|
||||||
let cur_level_time = element.property::<u64>("current-level-time");
|
if element.type_() == *APPSRC_TYPE {
|
||||||
let cur_level_buffers = element.property::<u32>("current-level-buffers");
|
(
|
||||||
|
element.property::<u64>("current-level-bytes") as u32,
|
||||||
|
element.property::<u64>("current-level-time"),
|
||||||
|
element.property::<u64>("current-level-buffers") as u32,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
element.property::<u32>("current-level-bytes"),
|
||||||
|
element.property::<u64>("current-level-time"),
|
||||||
|
element.property::<u32>("current-level-buffers"),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
state.log.push(LogLine {
|
state.log.push(LogLine {
|
||||||
timestamp,
|
timestamp,
|
||||||
name,
|
name,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-uriplaylistbin"
|
name = "gst-plugin-uriplaylistbin"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Guillaume Desmottes <guillaume.desmottes@onestream.live>"]
|
authors = ["Guillaume Desmottes <guillaume.desmottes@onestream.live>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,13 +9,13 @@ description = "GStreamer Playlist Playback Plugin"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
clap = { version = "4", optional = true, features = ["derive"] }
|
clap = { version = "4", optional = true, features = ["derive"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
url = "2.2"
|
url = "2.2"
|
||||||
more-asserts = "0.3"
|
more-asserts = "0.3"
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ path = "examples/playlist.rs"
|
||||||
required-features = ["clap"]
|
required-features = ["clap"]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-version-helper"
|
name = "gst-plugin-version-helper"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.7.5"
|
||||||
authors = ["Sajeer Ahamed <ahamedsajeer.15.15@cse.mrt.ac.lk>",
|
authors = ["Sajeer Ahamed <ahamedsajeer.15.15@cse.mrt.ac.lk>",
|
||||||
"Sebastian Dröge <sebastian@centricular.com>"]
|
"Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
categories = ["development-tools"]
|
categories = ["development-tools"]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-cdg"
|
name = "gst-plugin-cdg"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Guillaume Desmottes <guillaume.desmottes@collabora.com>"]
|
authors = ["Guillaume Desmottes <guillaume.desmottes@collabora.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,9 +9,9 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
cdg = "0.1"
|
cdg = "0.1"
|
||||||
cdg_renderer = "0.7"
|
cdg_renderer = "0.7"
|
||||||
image = { version = "0.24", default-features = false }
|
image = { version = "0.24", default-features = false }
|
||||||
|
@ -19,7 +19,7 @@ muldiv = "1.0"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstcdg"
|
name = "gstcdg"
|
||||||
|
@ -27,7 +27,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-closedcaption"
|
name = "gst-plugin-closedcaption"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>", "Jordan Petridis <jordan@centricular.com>", "Matthew Waters <matthew@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>", "Jordan Petridis <jordan@centricular.com>", "Matthew Waters <matthew@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
@ -16,25 +16,31 @@ uuid = { version = "1.0", features = ["v4"] }
|
||||||
chrono = "0.4.23"
|
chrono = "0.4.23"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", features=["use_glib"] }
|
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17", features=["use_glib"] }
|
||||||
pango = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
pango = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17" }
|
||||||
pangocairo = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
pangocairo = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17" }
|
||||||
byteorder = "1"
|
byteorder = "1"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = { version = "1.0", features = ["raw_value"] }
|
serde_json = { version = "1.0", features = ["raw_value"] }
|
||||||
|
|
||||||
[dependencies.gst]
|
[dependencies.gst]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
features = ["v1_16"]
|
features = ["v1_16"]
|
||||||
package="gstreamer"
|
package="gstreamer"
|
||||||
|
|
||||||
[dependencies.gst-base]
|
[dependencies.gst-base]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
features = ["v1_16"]
|
features = ["v1_16"]
|
||||||
package="gstreamer-base"
|
package="gstreamer-base"
|
||||||
|
|
||||||
[dependencies.gst-video]
|
[dependencies.gst-video]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
features = ["v1_16"]
|
features = ["v1_16"]
|
||||||
package="gstreamer-video"
|
package="gstreamer-video"
|
||||||
|
|
||||||
|
@ -44,6 +50,8 @@ rand = { version = "0.8", features = ["small_rng"] }
|
||||||
|
|
||||||
[dev-dependencies.gst-check]
|
[dev-dependencies.gst-check]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-check"
|
package="gstreamer-check"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -52,7 +60,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
cc = "1.0"
|
cc = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-dav1d"
|
name = "gst-plugin-dav1d"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Philippe Normand <philn@igalia.com>"]
|
authors = ["Philippe Normand <philn@igalia.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
@ -10,9 +10,9 @@ description = "GStreamer dav1d AV1 decoder Plugin"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
dav1d = "0.9"
|
dav1d = "0.9"
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
num_cpus = "1.0"
|
num_cpus = "1.0"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path = "../../version-helper" }
|
gst-plugin-version-helper = { path = "../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-ffv1"
|
name = "gst-plugin-ffv1"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Arun Raghavan <arun@asymptotic.io>"]
|
authors = ["Arun Raghavan <arun@asymptotic.io>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -11,19 +11,19 @@ rust-version = "1.63"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
byte-slice-cast = "1"
|
byte-slice-cast = "1"
|
||||||
ffv1 = { git = "https://github.com/rust-av/ffv1.git", rev = "2afb025a327173ce891954c052e804d0f880368a" }
|
ffv1 = { git = "https://github.com/rust-av/ffv1.git", rev = "2afb025a327173ce891954c052e804d0f880368a" }
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_18"] }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_18"] }
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstffv1"
|
name = "gstffv1"
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-gif"
|
name = "gst-plugin-gif"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Markus Ebner <info@ebner-markus.de>"]
|
authors = ["Markus Ebner <info@ebner-markus.de>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,14 +9,14 @@ rust-version = "1.63"
|
||||||
description = "GStreamer GIF plugin"
|
description = "GStreamer GIF plugin"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gif = "0.12"
|
gif = "0.12"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
once_cell = "1"
|
once_cell = "1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstgif"
|
name = "gstgif"
|
||||||
|
@ -28,7 +28,7 @@ name = "testvideosrc2gif"
|
||||||
path = "examples/testvideosrc2gif.rs"
|
path = "examples/testvideosrc2gif.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-gtk4"
|
name = "gst-plugin-gtk4"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>", "Jordan Petridis <jordan@centricular.com>", "Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>", "Jordan Petridis <jordan@centricular.com>", "Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,24 +9,24 @@ rust-version = "1.63"
|
||||||
description = "GStreamer GTK 4 Sink element and Paintable widget"
|
description = "GStreamer GTK 4 Sink element and Paintable widget"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs" }
|
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.6", version = "0.6" }
|
||||||
gdk_wayland = { package = "gdk4-wayland", git = "https://github.com/gtk-rs/gtk4-rs", features = ["v4_4"], optional = true}
|
gdk_wayland = { package = "gdk4-wayland", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.6", version = "0.6", features = ["v4_4"], optional = true}
|
||||||
gdk_x11 = { package = "gdk4-x11", git = "https://github.com/gtk-rs/gtk4-rs", features = ["v4_4"], optional = true}
|
gdk_x11 = { package = "gdk4-x11", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.6", version = "0.6", features = ["v4_4"], optional = true}
|
||||||
|
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"] }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"] }
|
||||||
gst_base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst_base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst_video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst_video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst_gl = { package = "gstreamer-gl", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"], optional = true }
|
gst_gl = { package = "gstreamer-gl", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"], optional = true }
|
||||||
|
|
||||||
gst_gl_wayland = { package = "gstreamer-gl-wayland", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"], optional = true }
|
gst_gl_wayland = { package = "gstreamer-gl-wayland", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"], optional = true }
|
||||||
gst_gl_x11 = { package = "gstreamer-gl-x11", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"], optional = true }
|
gst_gl_x11 = { package = "gstreamer-gl-x11", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"], optional = true }
|
||||||
gst_gl_egl = { package = "gstreamer-gl-egl", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"], optional = true }
|
gst_gl_egl = { package = "gstreamer-gl-egl", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"], optional = true }
|
||||||
|
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[target.'cfg(target_os = "macos")'.dependencies]
|
[target.'cfg(target_os = "macos")'.dependencies]
|
||||||
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", features = ["v4_6"] }
|
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.6", version = "0.6", features = ["v4_6"] }
|
||||||
gst_gl = { package = "gstreamer-gl", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"] }
|
gst_gl = { package = "gstreamer-gl", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20", features = ["v1_16"] }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstgtk4"
|
name = "gstgtk4"
|
||||||
|
@ -34,7 +34,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
|
|
@ -5,3 +5,57 @@ offer the possibility to use a custom `gst::Pipeline`. The plugin provides a `gs
|
||||||
|
|
||||||
The Sink can generate GL Textures if the system is capable of it, but it needs to be compiled
|
The Sink can generate GL Textures if the system is capable of it, but it needs to be compiled
|
||||||
with either `wayland`, `x11glx` or `x11egl` cargo features.
|
with either `wayland`, `x11glx` or `x11egl` cargo features.
|
||||||
|
|
||||||
|
# Flatpak Integration
|
||||||
|
|
||||||
|
To build and include the plugin in a Flatpak manifest, you can add the following snippet to your json manifest:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"sdk-extensions": [
|
||||||
|
"org.freedesktop.Sdk.Extension.rust-stable"
|
||||||
|
],
|
||||||
|
"build-options": {
|
||||||
|
"env": {
|
||||||
|
"CARGO_HOME": "/run/build/cargo-c/cargo"
|
||||||
|
},
|
||||||
|
"append-path": "/usr/lib/sdk/rust-stable/bin",
|
||||||
|
},
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"name": "cargo-c",
|
||||||
|
"buildsystem": "simple",
|
||||||
|
"build-commands": [
|
||||||
|
"cargo install cargo-c --root /app"
|
||||||
|
],
|
||||||
|
"build-options": {
|
||||||
|
"build-args": [
|
||||||
|
"--share=network"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"cleanup": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gst-plugins-rs",
|
||||||
|
"buildsystem": "simple",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs",
|
||||||
|
"branch": "0.10"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"build-options": {
|
||||||
|
"build-args": [
|
||||||
|
"--share=network"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"build-commands": [
|
||||||
|
"cargo cinstall -p gst-plugin-gtk4 --prefix=/app"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
@ -24,8 +24,6 @@ fn create_ui(app: >k::Application) {
|
||||||
.build()
|
.build()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// Need to set state to Ready to get a GL context
|
|
||||||
gtksink.set_state(gst::State::Ready).unwrap();
|
|
||||||
let paintable = gtksink.property::<gdk::Paintable>("paintable");
|
let paintable = gtksink.property::<gdk::Paintable>("paintable");
|
||||||
|
|
||||||
// TODO: future plans to provide a bin-like element that works with less setup
|
// TODO: future plans to provide a bin-like element that works with less setup
|
||||||
|
|
|
@ -21,7 +21,7 @@ pub(crate) struct Frame {
|
||||||
frame: gst_video::VideoFrame<gst_video::video_frame::Readable>,
|
frame: gst_video::VideoFrame<gst_video::video_frame::Readable>,
|
||||||
overlays: Vec<Overlay>,
|
overlays: Vec<Overlay>,
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
gst_context: Option<gst_gl::GLContext>,
|
wrapped_context: Option<gst_gl::GLContext>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -100,7 +100,7 @@ fn video_frame_to_gl_texture(
|
||||||
cached_textures: &mut HashMap<usize, gdk::Texture>,
|
cached_textures: &mut HashMap<usize, gdk::Texture>,
|
||||||
used_textures: &mut HashSet<usize>,
|
used_textures: &mut HashSet<usize>,
|
||||||
gdk_context: &gdk::GLContext,
|
gdk_context: &gdk::GLContext,
|
||||||
gst_context: &gst_gl::GLContext,
|
wrapped_context: &gst_gl::GLContext,
|
||||||
) -> (gdk::Texture, f64) {
|
) -> (gdk::Texture, f64) {
|
||||||
let texture_id = frame.texture_id(0).expect("Invalid texture id") as usize;
|
let texture_id = frame.texture_id(0).expect("Invalid texture id") as usize;
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ fn video_frame_to_gl_texture(
|
||||||
let height = frame.height();
|
let height = frame.height();
|
||||||
|
|
||||||
let sync_meta = frame.buffer().meta::<gst_gl::GLSyncMeta>().unwrap();
|
let sync_meta = frame.buffer().meta::<gst_gl::GLSyncMeta>().unwrap();
|
||||||
sync_meta.wait(gst_context);
|
sync_meta.wait(wrapped_context);
|
||||||
|
|
||||||
let texture = unsafe {
|
let texture = unsafe {
|
||||||
gdk::GLTexture::with_release_func(
|
gdk::GLTexture::with_release_func(
|
||||||
|
@ -156,19 +156,21 @@ impl Frame {
|
||||||
}
|
}
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
{
|
{
|
||||||
if let (Some(gdk_ctx), Some(gst_ctx)) = (gdk_context, self.gst_context.as_ref()) {
|
if let (Some(gdk_ctx), Some(wrapped_ctx)) =
|
||||||
|
(gdk_context, self.wrapped_context.as_ref())
|
||||||
|
{
|
||||||
video_frame_to_gl_texture(
|
video_frame_to_gl_texture(
|
||||||
self.frame,
|
self.frame,
|
||||||
cached_textures,
|
cached_textures,
|
||||||
&mut used_textures,
|
&mut used_textures,
|
||||||
gdk_ctx,
|
gdk_ctx,
|
||||||
gst_ctx,
|
wrapped_ctx,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
// This will fail badly if the video frame was actually mapped as GL texture
|
// This will fail badly if the video frame was actually mapped as GL texture
|
||||||
// but this case can't really happen as we only do that if we actually have a
|
// but this case can't really happen as we only do that if we actually have a
|
||||||
// GDK GL context.
|
// GDK GL context.
|
||||||
assert!(self.gst_context.is_none());
|
assert!(self.wrapped_context.is_none());
|
||||||
video_frame_to_memory_texture(self.frame, cached_textures, &mut used_textures)
|
video_frame_to_memory_texture(self.frame, cached_textures, &mut used_textures)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,7 +210,12 @@ impl Frame {
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(
|
||||||
buffer: &gst::Buffer,
|
buffer: &gst::Buffer,
|
||||||
info: &gst_video::VideoInfo,
|
info: &gst_video::VideoInfo,
|
||||||
#[allow(unused_variables)] have_gl_context: bool,
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))] wrapped_context: Option<
|
||||||
|
&gst_gl::GLContext,
|
||||||
|
>,
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
#[cfg(not(any(target_os = "macos", feature = "gst_gl")))]
|
||||||
|
wrapped_context: Option<&()>,
|
||||||
) -> Result<Self, gst::FlowError> {
|
) -> Result<Self, gst::FlowError> {
|
||||||
// Empty buffers get filtered out in show_frame
|
// Empty buffers get filtered out in show_frame
|
||||||
debug_assert!(buffer.n_memory() > 0);
|
debug_assert!(buffer.n_memory() > 0);
|
||||||
|
@ -225,44 +232,57 @@ impl Frame {
|
||||||
}
|
}
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
{
|
{
|
||||||
let is_buffer_gl = buffer
|
// Check we received a buffer with GL memory and if the context of that memory
|
||||||
|
// can share with the wrapped context around the GDK GL context.
|
||||||
|
//
|
||||||
|
// If not it has to be uploaded to the GPU.
|
||||||
|
let memory_ctx = buffer
|
||||||
.peek_memory(0)
|
.peek_memory(0)
|
||||||
.downcast_memory_ref::<gst_gl::GLBaseMemory>()
|
.downcast_memory_ref::<gst_gl::GLBaseMemory>()
|
||||||
.is_some();
|
.and_then(|m| {
|
||||||
|
let ctx = m.context();
|
||||||
|
if wrapped_context
|
||||||
|
.map_or(false, |wrapped_context| wrapped_context.can_share(ctx))
|
||||||
|
{
|
||||||
|
Some(ctx)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if !is_buffer_gl || !have_gl_context {
|
if let Some(memory_ctx) = memory_ctx {
|
||||||
frame = Self {
|
// If there is no GLSyncMeta yet then we need to add one here now, which requires
|
||||||
frame: gst_video::VideoFrame::from_buffer_readable(buffer.clone(), info)
|
// obtaining a writable buffer.
|
||||||
.map_err(|_| gst::FlowError::Error)?,
|
let mapped_frame = if buffer.meta::<gst_gl::GLSyncMeta>().is_some() {
|
||||||
overlays: vec![],
|
|
||||||
gst_context: None,
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
let gst_ctx = buffer
|
|
||||||
.peek_memory(0)
|
|
||||||
.downcast_memory_ref::<gst_gl::GLBaseMemory>()
|
|
||||||
.map(|m| m.context())
|
|
||||||
.expect("Failed to retrieve the GstGL Context.");
|
|
||||||
|
|
||||||
let mapped_frame = if let Some(meta) = buffer.meta::<gst_gl::GLSyncMeta>() {
|
|
||||||
meta.set_sync_point(gst_ctx);
|
|
||||||
gst_video::VideoFrame::from_buffer_readable_gl(buffer.clone(), info)
|
gst_video::VideoFrame::from_buffer_readable_gl(buffer.clone(), info)
|
||||||
.map_err(|_| gst::FlowError::Error)?
|
.map_err(|_| gst::FlowError::Error)?
|
||||||
} else {
|
} else {
|
||||||
let mut buffer = buffer.clone();
|
let mut buffer = buffer.clone();
|
||||||
{
|
{
|
||||||
let buffer = buffer.make_mut();
|
let buffer = buffer.make_mut();
|
||||||
let meta = gst_gl::GLSyncMeta::add(buffer, gst_ctx);
|
gst_gl::GLSyncMeta::add(buffer, memory_ctx);
|
||||||
meta.set_sync_point(gst_ctx);
|
|
||||||
}
|
}
|
||||||
gst_video::VideoFrame::from_buffer_readable_gl(buffer, info)
|
gst_video::VideoFrame::from_buffer_readable_gl(buffer, info)
|
||||||
.map_err(|_| gst::FlowError::Error)?
|
.map_err(|_| gst::FlowError::Error)?
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Now that it's guaranteed that there is a sync meta and the frame is mapped, set
|
||||||
|
// a sync point so we can ensure that the texture is ready later when making use of
|
||||||
|
// it as gdk::GLTexture.
|
||||||
|
let meta = mapped_frame.buffer().meta::<gst_gl::GLSyncMeta>().unwrap();
|
||||||
|
meta.set_sync_point(memory_ctx);
|
||||||
|
|
||||||
frame = Self {
|
frame = Self {
|
||||||
frame: mapped_frame,
|
frame: mapped_frame,
|
||||||
overlays: vec![],
|
overlays: vec![],
|
||||||
gst_context: Some(gst_ctx.clone()),
|
wrapped_context: Some(wrapped_context.unwrap().clone()),
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
frame = Self {
|
||||||
|
frame: gst_video::VideoFrame::from_buffer_readable(buffer.clone(), info)
|
||||||
|
.map_err(|_| gst::FlowError::Error)?,
|
||||||
|
overlays: vec![],
|
||||||
|
wrapped_context: None,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,23 @@ use crate::utils;
|
||||||
use gst_gl::prelude::GLContextExt as GstGLContextExt;
|
use gst_gl::prelude::GLContextExt as GstGLContextExt;
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
use gst_gl::prelude::*;
|
use gst_gl::prelude::*;
|
||||||
|
|
||||||
|
// Global GL context that is created by the first sink and kept around until the end of the
|
||||||
|
// process. This is provided to other elements in the pipeline to make sure they create GL contexts
|
||||||
|
// that are sharing with the GTK GL context.
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
enum GLContext {
|
||||||
|
Uninitialized,
|
||||||
|
Unsupported,
|
||||||
|
Initialized {
|
||||||
|
display: gst_gl::GLDisplay,
|
||||||
|
wrapped_context: gst_gl::GLContext,
|
||||||
|
gdk_context: ThreadGuard<gdk::GLContext>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
|
static GL_CONTEXT: Mutex<GLContext> = Mutex::new(GLContext::Uninitialized);
|
||||||
|
|
||||||
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
||||||
gst::DebugCategory::new(
|
gst::DebugCategory::new(
|
||||||
|
@ -47,15 +62,7 @@ pub struct PaintableSink {
|
||||||
info: Mutex<Option<gst_video::VideoInfo>>,
|
info: Mutex<Option<gst_video::VideoInfo>>,
|
||||||
sender: Mutex<Option<Sender<SinkEvent>>>,
|
sender: Mutex<Option<Sender<SinkEvent>>>,
|
||||||
pending_frame: Mutex<Option<Frame>>,
|
pending_frame: Mutex<Option<Frame>>,
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
|
||||||
gst_display: Mutex<Option<gst_gl::GLDisplay>>,
|
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
|
||||||
gst_app_context: Mutex<Option<gst_gl::GLContext>>,
|
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
|
||||||
gst_context: Mutex<Option<gst_gl::GLContext>>,
|
|
||||||
cached_caps: Mutex<Option<gst::Caps>>,
|
cached_caps: Mutex<Option<gst::Caps>>,
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
|
||||||
have_gl_context: AtomicBool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for PaintableSink {
|
impl Drop for PaintableSink {
|
||||||
|
@ -147,10 +154,12 @@ impl ElementImpl for PaintableSink {
|
||||||
|
|
||||||
for features in [
|
for features in [
|
||||||
None,
|
None,
|
||||||
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
Some(gst::CapsFeatures::new([
|
Some(gst::CapsFeatures::new([
|
||||||
"memory:GLMemory",
|
"memory:GLMemory",
|
||||||
"meta:GstVideoOverlayComposition",
|
"meta:GstVideoOverlayComposition",
|
||||||
])),
|
])),
|
||||||
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
Some(gst::CapsFeatures::new(["memory:GLMemory"])),
|
Some(gst::CapsFeatures::new(["memory:GLMemory"])),
|
||||||
Some(gst::CapsFeatures::new([
|
Some(gst::CapsFeatures::new([
|
||||||
"memory:SystemMemory",
|
"memory:SystemMemory",
|
||||||
|
@ -213,16 +222,33 @@ impl ElementImpl for PaintableSink {
|
||||||
|
|
||||||
drop(paintable);
|
drop(paintable);
|
||||||
|
|
||||||
|
// Notify the pipeline about the GL display and wrapped context so that any other
|
||||||
|
// elements in the pipeline ideally use the same / create GL contexts that are
|
||||||
|
// sharing with this one.
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
{
|
{
|
||||||
if self.have_gl_context.load(Ordering::Relaxed) {
|
let gl_context = GL_CONTEXT.lock().unwrap();
|
||||||
if self.initialize_gl_wrapper() {
|
if let GLContext::Initialized {
|
||||||
// We must have a display at this point.
|
display,
|
||||||
let display = self.gst_display.lock().unwrap().clone().unwrap();
|
wrapped_context,
|
||||||
gst_gl::gl_element_propagate_display_context(&*self.obj(), &display);
|
..
|
||||||
} else {
|
} = &*gl_context
|
||||||
self.have_gl_context.store(false, Ordering::Relaxed);
|
{
|
||||||
|
let display = display.clone();
|
||||||
|
let wrapped_context = wrapped_context.clone();
|
||||||
|
drop(gl_context);
|
||||||
|
|
||||||
|
gst_gl::gl_element_propagate_display_context(&*self.obj(), &display);
|
||||||
|
let mut ctx = gst::Context::new("gst.gl.app_context", true);
|
||||||
|
{
|
||||||
|
let ctx = ctx.get_mut().unwrap();
|
||||||
|
ctx.structure_mut().set("context", &wrapped_context);
|
||||||
}
|
}
|
||||||
|
let _ = self.obj().post_message(
|
||||||
|
gst::message::HaveContext::builder(ctx)
|
||||||
|
.src(&*self.obj())
|
||||||
|
.build(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -246,12 +272,6 @@ impl ElementImpl for PaintableSink {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
|
||||||
gst::StateChange::ReadyToNull => {
|
|
||||||
let _ = self.gst_context.lock().unwrap().take();
|
|
||||||
let _ = self.gst_app_context.lock().unwrap().take();
|
|
||||||
let _ = self.gst_display.lock().unwrap().take();
|
|
||||||
}
|
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,25 +292,24 @@ impl BaseSinkImpl for PaintableSink {
|
||||||
templ[0].caps().clone()
|
templ[0].caps().clone()
|
||||||
});
|
});
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Advertising our own caps: {:?}", &tmp_caps);
|
gst::debug!(CAT, imp: self, "Advertising our own caps: {tmp_caps:?}");
|
||||||
|
|
||||||
if let Some(filter_caps) = filter {
|
if let Some(filter_caps) = filter {
|
||||||
gst::debug!(
|
gst::debug!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Intersecting with filter caps: {:?}",
|
"Intersecting with filter caps: {filter_caps:?}",
|
||||||
&filter_caps
|
|
||||||
);
|
);
|
||||||
|
|
||||||
tmp_caps = filter_caps.intersect_with_mode(&tmp_caps, gst::CapsIntersectMode::First);
|
tmp_caps = filter_caps.intersect_with_mode(&tmp_caps, gst::CapsIntersectMode::First);
|
||||||
};
|
};
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Returning caps: {:?}", &tmp_caps);
|
gst::debug!(CAT, imp: self, "Returning caps: {tmp_caps:?}");
|
||||||
Some(tmp_caps)
|
Some(tmp_caps)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_caps(&self, caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
fn set_caps(&self, caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
||||||
gst::debug!(CAT, imp: self, "Setting caps {:?}", caps);
|
gst::debug!(CAT, imp: self, "Setting caps {caps:?}");
|
||||||
|
|
||||||
let video_info = gst_video::VideoInfo::from_caps(caps)
|
let video_info = gst_video::VideoInfo::from_caps(caps)
|
||||||
.map_err(|_| gst::loggable_error!(CAT, "Invalid caps"))?;
|
.map_err(|_| gst::loggable_error!(CAT, "Invalid caps"))?;
|
||||||
|
@ -312,84 +331,21 @@ impl BaseSinkImpl for PaintableSink {
|
||||||
// TODO: Provide a preferred "window size" here for higher-resolution rendering
|
// TODO: Provide a preferred "window size" here for higher-resolution rendering
|
||||||
query.add_allocation_meta::<gst_video::VideoOverlayCompositionMeta>(None);
|
query.add_allocation_meta::<gst_video::VideoOverlayCompositionMeta>(None);
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "macos", feature = "gst_gl")))]
|
|
||||||
{
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
{
|
{
|
||||||
// Early return if there is no context initialized
|
if let GLContext::Initialized {
|
||||||
let gst_context = match &*self.gst_context.lock().unwrap() {
|
wrapped_context, ..
|
||||||
None => {
|
} = &*GL_CONTEXT.lock().unwrap()
|
||||||
gst::debug!(
|
|
||||||
CAT,
|
|
||||||
imp: self,
|
|
||||||
"Found no GL Context during propose_allocation."
|
|
||||||
);
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
Some(gst_context) => gst_context.clone(),
|
|
||||||
};
|
|
||||||
|
|
||||||
// GL specific things
|
|
||||||
let (caps, need_pool) = query.get_owned();
|
|
||||||
let caps = match caps {
|
|
||||||
None => {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
Some(caps) if caps.is_empty() || caps.is_any() => {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
Some(caps) => caps,
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(f) = caps.features(0) {
|
|
||||||
if !f.contains("memory:GLMemory") {
|
|
||||||
gst::debug!(
|
|
||||||
CAT,
|
|
||||||
imp: self,
|
|
||||||
"No 'memory:GLMemory' feature in caps: {}",
|
|
||||||
caps
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let info = gst_video::VideoInfo::from_caps(&caps)
|
|
||||||
.map_err(|_| gst::loggable_error!(CAT, "Failed to get VideoInfo from caps"))?;
|
|
||||||
|
|
||||||
let size = info.size() as u32;
|
|
||||||
let buffer_pool = if need_pool {
|
|
||||||
let buffer_pool = gst_gl::GLBufferPool::new(&gst_context);
|
|
||||||
gst::debug!(CAT, imp: self, "Creating new Pool");
|
|
||||||
|
|
||||||
let mut config = buffer_pool.config();
|
|
||||||
config.set_params(Some(&caps), size, 0, 0);
|
|
||||||
config.add_option("GstBufferPoolOptionGLSyncMeta");
|
|
||||||
|
|
||||||
if let Err(err) = buffer_pool.set_config(config) {
|
|
||||||
return Err(gst::loggable_error!(
|
|
||||||
CAT,
|
|
||||||
format!("Failed to set config in the GL BufferPool.: {err}")
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
Some(buffer_pool)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
|
|
||||||
// we need at least 2 buffer because we hold on to the last one
|
|
||||||
query.add_allocation_pool(buffer_pool.as_ref(), size, 2, 0);
|
|
||||||
|
|
||||||
if gst_context.check_feature("GL_ARB_sync")
|
|
||||||
|| gst_context.check_feature("GL_EXT_EGL_sync")
|
|
||||||
{
|
{
|
||||||
query.add_allocation_meta::<gst_gl::GLSyncMeta>(None)
|
if wrapped_context.check_feature("GL_ARB_sync")
|
||||||
|
|| wrapped_context.check_feature("GL_EXT_EGL_sync")
|
||||||
|
{
|
||||||
|
query.add_allocation_meta::<gst_gl::GLSyncMeta>(None)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn query(&self, query: &mut gst::QueryRef) -> bool {
|
fn query(&self, query: &mut gst::QueryRef) -> bool {
|
||||||
|
@ -400,21 +356,27 @@ impl BaseSinkImpl for PaintableSink {
|
||||||
gst::QueryViewMut::Context(q) => {
|
gst::QueryViewMut::Context(q) => {
|
||||||
// Avoid holding the locks while we respond to the query
|
// Avoid holding the locks while we respond to the query
|
||||||
// The objects are ref-counted anyway.
|
// The objects are ref-counted anyway.
|
||||||
let (gst_display, app_ctx, gst_ctx) = (
|
let mut display_clone = None;
|
||||||
self.gst_display.lock().unwrap().clone(),
|
let mut wrapped_context_clone = None;
|
||||||
self.gst_app_context.lock().unwrap().clone(),
|
if let GLContext::Initialized {
|
||||||
self.gst_context.lock().unwrap().clone(),
|
display,
|
||||||
);
|
wrapped_context,
|
||||||
|
..
|
||||||
|
} = &*GL_CONTEXT.lock().unwrap()
|
||||||
|
{
|
||||||
|
display_clone = Some(display.clone());
|
||||||
|
wrapped_context_clone = Some(wrapped_context.clone());
|
||||||
|
}
|
||||||
|
|
||||||
if let (Some(gst_display), Some(app_ctx), Some(gst_ctx)) =
|
if let (Some(display), Some(wrapped_context)) =
|
||||||
(gst_display, app_ctx, gst_ctx)
|
(display_clone, wrapped_context_clone)
|
||||||
{
|
{
|
||||||
return gst_gl::functions::gl_handle_context_query(
|
return gst_gl::functions::gl_handle_context_query(
|
||||||
&*self.obj(),
|
&*self.obj(),
|
||||||
q,
|
q,
|
||||||
Some(&gst_display),
|
Some(&display),
|
||||||
Some(&gst_ctx),
|
None::<&gst_gl::GLContext>,
|
||||||
Some(&app_ctx),
|
Some(&wrapped_context),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,17 +407,25 @@ impl VideoSinkImpl for PaintableSink {
|
||||||
gst::FlowError::NotNegotiated
|
gst::FlowError::NotNegotiated
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let have_gl_context = {
|
let wrapped_context = {
|
||||||
#[cfg(not(any(target_os = "macos", feature = "gst_gl")))]
|
#[cfg(not(any(target_os = "macos", feature = "gst_gl")))]
|
||||||
{
|
{
|
||||||
false
|
None
|
||||||
}
|
}
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
{
|
{
|
||||||
self.have_gl_context.load(Ordering::Relaxed)
|
let gl_context = GL_CONTEXT.lock().unwrap();
|
||||||
|
if let GLContext::Initialized {
|
||||||
|
wrapped_context, ..
|
||||||
|
} = &*gl_context
|
||||||
|
{
|
||||||
|
Some(wrapped_context.clone())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let frame = Frame::new(buffer, info, have_gl_context).map_err(|err| {
|
let frame = Frame::new(buffer, info, wrapped_context.as_ref()).map_err(|err| {
|
||||||
gst::error!(CAT, imp: self, "Failed to map video frame");
|
gst::error!(CAT, imp: self, "Failed to map video frame");
|
||||||
err
|
err
|
||||||
})?;
|
})?;
|
||||||
|
@ -507,7 +477,7 @@ impl PaintableSink {
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
{
|
{
|
||||||
// Filter out GL caps from the template pads if we have no context
|
// Filter out GL caps from the template pads if we have no context
|
||||||
if !self.have_gl_context.load(Ordering::Relaxed) {
|
if !matches!(&*GL_CONTEXT.lock().unwrap(), GLContext::Initialized { .. }) {
|
||||||
tmp_caps = tmp_caps
|
tmp_caps = tmp_caps
|
||||||
.iter_with_features()
|
.iter_with_features()
|
||||||
.filter(|(_, features)| !features.contains("memory:GLMemory"))
|
.filter(|(_, features)| !features.contains("memory:GLMemory"))
|
||||||
|
@ -523,44 +493,52 @@ impl PaintableSink {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_paintable(&self, paintable_storage: &mut MutexGuard<Option<ThreadGuard<Paintable>>>) {
|
fn create_paintable(&self, paintable_storage: &mut MutexGuard<Option<ThreadGuard<Paintable>>>) {
|
||||||
#[allow(unused_mut)]
|
|
||||||
let mut ctx = None;
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
{
|
{
|
||||||
if let Some(c) = self.realize_context() {
|
self.initialize_gl_context();
|
||||||
self.have_gl_context.store(true, Ordering::Relaxed);
|
|
||||||
ctx = Some(c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.configure_caps();
|
self.configure_caps();
|
||||||
self.initialize_paintable(ctx, paintable_storage);
|
self.initialize_paintable(paintable_storage);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn initialize_paintable(
|
fn initialize_paintable(
|
||||||
&self,
|
&self,
|
||||||
gl_context: Option<ThreadGuard<gdk::GLContext>>,
|
|
||||||
paintable_storage: &mut MutexGuard<Option<ThreadGuard<Paintable>>>,
|
paintable_storage: &mut MutexGuard<Option<ThreadGuard<Paintable>>>,
|
||||||
) {
|
) {
|
||||||
gst::debug!(CAT, imp: self, "Initializing paintable");
|
gst::debug!(CAT, imp: self, "Initializing paintable");
|
||||||
|
|
||||||
let paintable = utils::invoke_on_main_thread(|| {
|
|
||||||
// grab the context out of the fragile
|
|
||||||
let ctx = gl_context.map(|f| f.into_inner());
|
|
||||||
ThreadGuard::new(Paintable::new(ctx))
|
|
||||||
});
|
|
||||||
|
|
||||||
// The channel for the SinkEvents
|
// The channel for the SinkEvents
|
||||||
let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
||||||
let self_ = self.to_owned();
|
let self_ = self.to_owned();
|
||||||
receiver.attach(
|
|
||||||
None,
|
let paintable = utils::invoke_on_main_thread(move || {
|
||||||
glib::clone!(
|
// Attach the receiver from the main thread to make sure it is called
|
||||||
@weak self_ => @default-return glib::Continue(false),
|
// from a place where it can acquire the default main context.
|
||||||
move |action| self_.do_action(action)
|
receiver.attach(
|
||||||
),
|
Some(&glib::MainContext::default()),
|
||||||
);
|
glib::clone!(
|
||||||
|
@weak self_ => @default-return glib::Continue(false),
|
||||||
|
move |action| self_.do_action(action)
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
|
{
|
||||||
|
let gdk_context = if let GLContext::Initialized { gdk_context, .. } =
|
||||||
|
&*GL_CONTEXT.lock().unwrap()
|
||||||
|
{
|
||||||
|
Some(gdk_context.get_ref().clone())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
ThreadGuard::new(Paintable::new(gdk_context))
|
||||||
|
}
|
||||||
|
#[cfg(not(any(target_os = "macos", feature = "gst_gl")))]
|
||||||
|
{
|
||||||
|
ThreadGuard::new(Paintable::new(None))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
**paintable_storage = Some(paintable);
|
**paintable_storage = Some(paintable);
|
||||||
|
|
||||||
|
@ -568,211 +546,144 @@ impl PaintableSink {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
fn realize_context(&self) -> Option<ThreadGuard<gdk::GLContext>> {
|
fn initialize_gl_context(&self) {
|
||||||
gst::debug!(CAT, imp: self, "Realizing GDK GL Context");
|
gst::debug!(CAT, imp: self, "Realizing GDK GL Context");
|
||||||
|
|
||||||
let self_ = self.to_owned();
|
let self_ = self.to_owned();
|
||||||
utils::invoke_on_main_thread(move || -> Option<ThreadGuard<gdk::GLContext>> {
|
utils::invoke_on_main_thread(move || {
|
||||||
gst::debug!(
|
self_.initialize_gl_context_main();
|
||||||
CAT,
|
});
|
||||||
imp: self_,
|
|
||||||
"Realizing GDK GL Context from main context"
|
|
||||||
);
|
|
||||||
|
|
||||||
// This can return NULL but only happens in 2 situations:
|
|
||||||
// * If the function is called before gtk_init
|
|
||||||
// * If the function is called after gdk_display_close(default_display)
|
|
||||||
// Both of which are treated as programming errors.
|
|
||||||
//
|
|
||||||
// However, when we are building the docs, gtk_init doesn't get called
|
|
||||||
// and this would cause the documentation generation to error.
|
|
||||||
// Thus its okayish to return None here and fallback to software
|
|
||||||
// rendering, since this path isn't going to be used by applications
|
|
||||||
// anyway.
|
|
||||||
//
|
|
||||||
// FIXME: add a couple more gtk_init checks across the codebase where
|
|
||||||
// applicable since this is no longer going to panic.
|
|
||||||
let display = gdk::Display::default()?;
|
|
||||||
let ctx = match display.create_gl_context() {
|
|
||||||
Ok(ctx) => ctx,
|
|
||||||
Err(err) => {
|
|
||||||
gst::warning!(CAT, imp: self_, "Failed to create GDK GL Context: {err}");
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
match ctx.type_().name() {
|
|
||||||
#[cfg(all(target_os = "linux", feature = "x11egl"))]
|
|
||||||
"GdkX11GLContextEGL" => (),
|
|
||||||
#[cfg(all(target_os = "linux", feature = "x11glx"))]
|
|
||||||
"GdkX11GLContextGLX" => (),
|
|
||||||
#[cfg(all(target_os = "linux", feature = "wayland"))]
|
|
||||||
"GdkWaylandGLContext" => (),
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
"GdkMacosGLContext" => (),
|
|
||||||
display => {
|
|
||||||
gst::error!(CAT, imp: self_, "Unsupported GDK display {display} for GL");
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gst::info!(CAT, imp: &self_, "Realizing GDK GL Context",);
|
|
||||||
|
|
||||||
match ctx.realize() {
|
|
||||||
Ok(_) => {
|
|
||||||
gst::info!(CAT, imp: self_, "Successfully realized GDK GL Context",);
|
|
||||||
Some(ThreadGuard::new(ctx))
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
gst::warning!(CAT, imp: self_, "Failed to realize GDK GL Context: {err}",);
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
||||||
fn initialize_gl_wrapper(&self) -> bool {
|
fn initialize_gl_context_main(&self) {
|
||||||
gst::info!(CAT, imp: self, "Initializing GDK GL Context");
|
gst::debug!(CAT, imp: self, "Realizing GDK GL Context from main thread");
|
||||||
let self_ = self.to_owned();
|
|
||||||
utils::invoke_on_main_thread(move || self_.initialize_gl())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
let mut gl_context_guard = GL_CONTEXT.lock().unwrap();
|
||||||
fn initialize_gl(&self) -> bool {
|
if !matches!(&*gl_context_guard, GLContext::Uninitialized) {
|
||||||
let ctx = {
|
gst::debug!(CAT, imp: self, "Already initialized GL context before");
|
||||||
let paintable = self.paintable.lock().unwrap();
|
return;
|
||||||
// Impossible to not have a paintable and GL context at this point
|
}
|
||||||
paintable.as_ref().unwrap().get_ref().context().unwrap()
|
*gl_context_guard = GLContext::Unsupported;
|
||||||
};
|
|
||||||
|
|
||||||
let display = gtk::prelude::GLContextExt::display(&ctx)
|
// This can return NULL but only happens in 2 situations:
|
||||||
.expect("Failed to get GDK Display from GDK Context.");
|
// * If the function is called before gtk_init
|
||||||
ctx.make_current();
|
// * If the function is called after gdk_display_close(default_display)
|
||||||
|
// Both of which are treated as programming errors.
|
||||||
let mut app_ctx_guard = self.gst_app_context.lock().unwrap();
|
//
|
||||||
let mut display_guard = self.gst_display.lock().unwrap();
|
// However, when we are building the docs, gtk_init doesn't get called
|
||||||
|
// and this would cause the documentation generation to error.
|
||||||
match ctx.type_().name() {
|
// Thus its okayish to return None here and fallback to software
|
||||||
#[cfg(all(target_os = "linux", feature = "x11egl"))]
|
// rendering, since this path isn't going to be used by applications
|
||||||
"GdkX11GLContextEGL" => {
|
// anyway.
|
||||||
self.initialize_x11egl(display, &mut display_guard, &mut app_ctx_guard);
|
//
|
||||||
}
|
// FIXME: add a couple more gtk_init checks across the codebase where
|
||||||
#[cfg(all(target_os = "linux", feature = "x11glx"))]
|
// applicable since this is no longer going to panic.
|
||||||
"GdkX11GLContextGLX" => {
|
let gdk_display = match gdk::Display::default() {
|
||||||
self.initialize_x11glx(display, &mut display_guard, &mut app_ctx_guard);
|
|
||||||
}
|
|
||||||
#[cfg(all(target_os = "linux", feature = "wayland"))]
|
|
||||||
"GdkWaylandGLContext" => {
|
|
||||||
self.initialize_waylandegl(display, &mut display_guard, &mut app_ctx_guard);
|
|
||||||
}
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
"GdkMacosGLContext" => {
|
|
||||||
self.initialize_macosgl(display, &mut display_guard, &mut app_ctx_guard);
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
unreachable!("Unsupported GDK display {display} for GL");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// This should have been initialized once we are done with the platform checks
|
|
||||||
let app_ctx = match &*app_ctx_guard {
|
|
||||||
None => {
|
|
||||||
assert!(display_guard.is_none());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Some(app_ctx) => app_ctx,
|
|
||||||
};
|
|
||||||
|
|
||||||
let display = match &*display_guard {
|
|
||||||
None => return false,
|
|
||||||
Some(display) => display,
|
Some(display) => display,
|
||||||
|
None => {
|
||||||
|
gst::warning!(CAT, imp: self, "Failed to retrieve GDK display");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let gdk_context = match gdk_display.create_gl_context() {
|
||||||
|
Ok(gdk_context) => gdk_context,
|
||||||
|
Err(err) => {
|
||||||
|
gst::warning!(CAT, imp: self, "Failed to create GDK GL Context: {err}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
match app_ctx.activate(true) {
|
match gdk_context.type_().name() {
|
||||||
Ok(_) => gst::info!(CAT, imp: self, "Successfully activated GL Context."),
|
#[cfg(all(target_os = "linux", feature = "x11egl"))]
|
||||||
|
"GdkX11GLContextEGL" => (),
|
||||||
|
#[cfg(all(target_os = "linux", feature = "x11glx"))]
|
||||||
|
"GdkX11GLContextGLX" => (),
|
||||||
|
#[cfg(all(target_os = "linux", feature = "wayland"))]
|
||||||
|
"GdkWaylandGLContext" => (),
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
"GdkMacosGLContext" => (),
|
||||||
|
display => {
|
||||||
|
gst::error!(CAT, imp: self, "Unsupported GDK display {display} for GL");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gst::info!(CAT, imp: self, "Realizing GDK GL Context",);
|
||||||
|
|
||||||
|
if let Err(err) = gdk_context.realize() {
|
||||||
|
gst::warning!(CAT, imp: self, "Failed to realize GDK GL Context: {err}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst::info!(CAT, imp: self, "Successfully realized GDK GL Context");
|
||||||
|
|
||||||
|
gdk_context.make_current();
|
||||||
|
|
||||||
|
let res = match gdk_context.type_().name() {
|
||||||
|
#[cfg(all(target_os = "linux", feature = "x11egl"))]
|
||||||
|
"GdkX11GLContextEGL" => self.initialize_x11egl(gdk_display),
|
||||||
|
#[cfg(all(target_os = "linux", feature = "x11glx"))]
|
||||||
|
"GdkX11GLContextGLX" => self.initialize_x11glx(gdk_display),
|
||||||
|
#[cfg(all(target_os = "linux", feature = "wayland"))]
|
||||||
|
"GdkWaylandGLContext" => self.initialize_waylandegl(gdk_display),
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
"GdkMacosGLContext" => self.initialize_macosgl(gdk_display),
|
||||||
|
display_type => {
|
||||||
|
unreachable!("Unsupported GDK display {display_type} for GL");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let (display, wrapped_context) = match res {
|
||||||
|
Some((display, wrapped_context)) => (display, wrapped_context),
|
||||||
|
None => {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match wrapped_context.activate(true) {
|
||||||
|
Ok(_) => gst::info!(CAT, imp: self, "Successfully activated GL Context"),
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
gst::error!(CAT, imp: self, "Failed to activate GL context",);
|
gst::error!(CAT, imp: self, "Failed to activate GL context",);
|
||||||
*app_ctx_guard = None;
|
return;
|
||||||
*display_guard = None;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Err(err) = app_ctx.fill_info() {
|
if let Err(err) = wrapped_context.fill_info() {
|
||||||
gst::error!(
|
gst::error!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Failed to fill info on the GL Context: {err}",
|
"Failed to fill info on the GL Context: {err}",
|
||||||
);
|
);
|
||||||
// Deactivate the context upon failure
|
// Deactivate the context upon failure
|
||||||
if app_ctx.activate(false).is_err() {
|
if wrapped_context.activate(false).is_err() {
|
||||||
gst::error!(
|
gst::error!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Failed to deactivate the context after failing fill info",
|
"Failed to deactivate the context after failing fill info",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
*app_ctx_guard = None;
|
return;
|
||||||
*display_guard = None;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if app_ctx.activate(false).is_err() {
|
gst::info!(CAT, imp: self, "Successfully initialized GL Context");
|
||||||
gst::error!(CAT, imp: self, "Failed to deactivate GL context",);
|
|
||||||
*app_ctx_guard = None;
|
|
||||||
*display_guard = None;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst::info!(
|
*gl_context_guard = GLContext::Initialized {
|
||||||
CAT,
|
display,
|
||||||
imp: self,
|
wrapped_context,
|
||||||
"Successfully deactivated GL Context after fill_info"
|
gdk_context: ThreadGuard::new(gdk_context),
|
||||||
);
|
};
|
||||||
|
|
||||||
let display_object_guard = display.object_lock();
|
|
||||||
let gst_context =
|
|
||||||
match gst_gl::GLDisplay::create_context(&display_object_guard, Some(app_ctx)) {
|
|
||||||
Ok(gst_context) => gst_context,
|
|
||||||
Err(err) => {
|
|
||||||
gst::error!(CAT, imp: self, "Could not create GL context: {err}");
|
|
||||||
drop(display_object_guard);
|
|
||||||
*app_ctx_guard = None;
|
|
||||||
*display_guard = None;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
match gst_gl::GLDisplay::add_context(&display_object_guard, &gst_context) {
|
|
||||||
Ok(_) => {
|
|
||||||
let mut gst_ctx_guard = self.gst_context.lock().unwrap();
|
|
||||||
gst::info!(CAT, imp: self, "Successfully initialized GL Context");
|
|
||||||
gst_ctx_guard.replace(gst_context);
|
|
||||||
true
|
|
||||||
}
|
|
||||||
Err(_) => {
|
|
||||||
gst::error!(CAT, imp: self, "Could not add GL context to display");
|
|
||||||
drop(display_object_guard);
|
|
||||||
*app_ctx_guard = None;
|
|
||||||
*display_guard = None;
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(target_os = "linux", feature = "x11egl"))]
|
#[cfg(all(target_os = "linux", feature = "x11egl"))]
|
||||||
fn initialize_x11egl(
|
fn initialize_x11egl(
|
||||||
&self,
|
&self,
|
||||||
display: gdk::Display,
|
display: gdk::Display,
|
||||||
display_guard: &mut Option<gst_gl::GLDisplay>,
|
) -> Option<(gst_gl::GLDisplay, gst_gl::GLContext)> {
|
||||||
app_ctx_guard: &mut Option<gst_gl::GLContext>,
|
|
||||||
) {
|
|
||||||
gst::info!(
|
gst::info!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Initializing GL for x11 EGL backend and display."
|
"Initializing GL for x11 EGL backend and display"
|
||||||
);
|
);
|
||||||
|
|
||||||
let platform = gst_gl::GLPlatform::EGL;
|
let platform = gst_gl::GLPlatform::EGL;
|
||||||
|
@ -780,37 +691,37 @@ impl PaintableSink {
|
||||||
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
||||||
|
|
||||||
if gl_ctx == 0 {
|
if gl_ctx == 0 {
|
||||||
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext",);
|
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: bindings
|
// FIXME: bindings
|
||||||
unsafe {
|
unsafe {
|
||||||
use glib::translate::*;
|
use glib::translate::*;
|
||||||
|
|
||||||
let d = display.downcast::<gdk_x11::X11Display>().unwrap();
|
let display = display.downcast::<gdk_x11::X11Display>().unwrap();
|
||||||
let x11_display = gdk_x11::ffi::gdk_x11_display_get_egl_display(d.to_glib_none().0);
|
let x11_display =
|
||||||
|
gdk_x11::ffi::gdk_x11_display_get_egl_display(display.to_glib_none().0);
|
||||||
if x11_display.is_null() {
|
if x11_display.is_null() {
|
||||||
gst::error!(CAT, imp: self, "Failed to get EGL display");
|
gst::error!(CAT, imp: self, "Failed to get EGL display");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let gst_display = gst_gl_egl::ffi::gst_gl_display_egl_new_with_egl_display(x11_display);
|
let gst_display = gst_gl_egl::ffi::gst_gl_display_egl_new_with_egl_display(x11_display);
|
||||||
let gst_display =
|
let gst_display =
|
||||||
gst_gl::GLDisplay::from_glib_full(gst_display as *mut gst_gl::ffi::GstGLDisplay);
|
gst_gl::GLDisplay::from_glib_full(gst_display as *mut gst_gl::ffi::GstGLDisplay);
|
||||||
|
|
||||||
let gst_app_context =
|
let wrapped_context =
|
||||||
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
||||||
let gst_app_context = match gst_app_context {
|
let wrapped_context = match wrapped_context {
|
||||||
None => {
|
None => {
|
||||||
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
Some(gst_app_context) => gst_app_context,
|
Some(wrapped_context) => wrapped_context,
|
||||||
};
|
};
|
||||||
|
|
||||||
display_guard.replace(gst_display);
|
Some((gst_display, wrapped_context))
|
||||||
app_ctx_guard.replace(gst_app_context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -818,13 +729,11 @@ impl PaintableSink {
|
||||||
fn initialize_x11glx(
|
fn initialize_x11glx(
|
||||||
&self,
|
&self,
|
||||||
display: gdk::Display,
|
display: gdk::Display,
|
||||||
display_guard: &mut Option<gst_gl::GLDisplay>,
|
) -> Option<(gst_gl::GLDisplay, gst_gl::GLContext)> {
|
||||||
app_ctx_guard: &mut Option<gst_gl::GLContext>,
|
|
||||||
) {
|
|
||||||
gst::info!(
|
gst::info!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Initializing GL for x11 GLX backend and display."
|
"Initializing GL for x11 GLX backend and display"
|
||||||
);
|
);
|
||||||
|
|
||||||
let platform = gst_gl::GLPlatform::GLX;
|
let platform = gst_gl::GLPlatform::GLX;
|
||||||
|
@ -832,37 +741,36 @@ impl PaintableSink {
|
||||||
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
||||||
|
|
||||||
if gl_ctx == 0 {
|
if gl_ctx == 0 {
|
||||||
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext",);
|
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: bindings
|
// FIXME: bindings
|
||||||
unsafe {
|
unsafe {
|
||||||
use glib::translate::*;
|
use glib::translate::*;
|
||||||
|
|
||||||
let d = display.downcast::<gdk_x11::X11Display>().unwrap();
|
let display = display.downcast::<gdk_x11::X11Display>().unwrap();
|
||||||
let x11_display = gdk_x11::ffi::gdk_x11_display_get_xdisplay(d.to_glib_none().0);
|
let x11_display = gdk_x11::ffi::gdk_x11_display_get_xdisplay(display.to_glib_none().0);
|
||||||
if x11_display.is_null() {
|
if x11_display.is_null() {
|
||||||
gst::error!(CAT, imp: self, "Failed to get X11 display");
|
gst::error!(CAT, imp: self, "Failed to get X11 display");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let gst_display = gst_gl_x11::ffi::gst_gl_display_x11_new_with_display(x11_display);
|
let gst_display = gst_gl_x11::ffi::gst_gl_display_x11_new_with_display(x11_display);
|
||||||
let gst_display =
|
let gst_display =
|
||||||
gst_gl::GLDisplay::from_glib_full(gst_display as *mut gst_gl::ffi::GstGLDisplay);
|
gst_gl::GLDisplay::from_glib_full(gst_display as *mut gst_gl::ffi::GstGLDisplay);
|
||||||
|
|
||||||
let gst_app_context =
|
let wrapped_context =
|
||||||
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
||||||
let gst_app_context = match gst_app_context {
|
let wrapped_context = match wrapped_context {
|
||||||
None => {
|
None => {
|
||||||
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
Some(gst_app_context) => gst_app_context,
|
Some(wrapped_context) => wrapped_context,
|
||||||
};
|
};
|
||||||
|
|
||||||
display_guard.replace(gst_display);
|
Some((gst_display, wrapped_context))
|
||||||
app_ctx_guard.replace(gst_app_context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -870,13 +778,11 @@ impl PaintableSink {
|
||||||
fn initialize_waylandegl(
|
fn initialize_waylandegl(
|
||||||
&self,
|
&self,
|
||||||
display: gdk::Display,
|
display: gdk::Display,
|
||||||
display_guard: &mut Option<gst_gl::GLDisplay>,
|
) -> Option<(gst_gl::GLDisplay, gst_gl::GLContext)> {
|
||||||
app_ctx_guard: &mut Option<gst_gl::GLContext>,
|
|
||||||
) {
|
|
||||||
gst::info!(
|
gst::info!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Initializing GL for Wayland EGL backend and display."
|
"Initializing GL for Wayland EGL backend and display"
|
||||||
);
|
);
|
||||||
|
|
||||||
let platform = gst_gl::GLPlatform::EGL;
|
let platform = gst_gl::GLPlatform::EGL;
|
||||||
|
@ -884,8 +790,8 @@ impl PaintableSink {
|
||||||
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
||||||
|
|
||||||
if gl_ctx == 0 {
|
if gl_ctx == 0 {
|
||||||
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext",);
|
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: bindings
|
// FIXME: bindings
|
||||||
|
@ -894,12 +800,12 @@ impl PaintableSink {
|
||||||
|
|
||||||
// let wayland_display = gdk_wayland::WaylandDisplay::wl_display(display.downcast());
|
// let wayland_display = gdk_wayland::WaylandDisplay::wl_display(display.downcast());
|
||||||
// get the ptr directly since we are going to use it raw
|
// get the ptr directly since we are going to use it raw
|
||||||
let d = display.downcast::<gdk_wayland::WaylandDisplay>().unwrap();
|
let display = display.downcast::<gdk_wayland::WaylandDisplay>().unwrap();
|
||||||
let wayland_display =
|
let wayland_display =
|
||||||
gdk_wayland::ffi::gdk_wayland_display_get_wl_display(d.to_glib_none().0);
|
gdk_wayland::ffi::gdk_wayland_display_get_wl_display(display.to_glib_none().0);
|
||||||
if wayland_display.is_null() {
|
if wayland_display.is_null() {
|
||||||
gst::error!(CAT, imp: self, "Failed to get Wayland display");
|
gst::error!(CAT, imp: self, "Failed to get Wayland display");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let gst_display =
|
let gst_display =
|
||||||
|
@ -907,19 +813,18 @@ impl PaintableSink {
|
||||||
let gst_display =
|
let gst_display =
|
||||||
gst_gl::GLDisplay::from_glib_full(gst_display as *mut gst_gl::ffi::GstGLDisplay);
|
gst_gl::GLDisplay::from_glib_full(gst_display as *mut gst_gl::ffi::GstGLDisplay);
|
||||||
|
|
||||||
let gst_app_context =
|
let wrapped_context =
|
||||||
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
||||||
|
|
||||||
let gst_app_context = match gst_app_context {
|
let wrapped_context = match wrapped_context {
|
||||||
None => {
|
None => {
|
||||||
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
Some(gst_app_context) => gst_app_context,
|
Some(wrapped_context) => wrapped_context,
|
||||||
};
|
};
|
||||||
|
|
||||||
display_guard.replace(gst_display);
|
Some((gst_display, wrapped_context))
|
||||||
app_ctx_guard.replace(gst_app_context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -927,13 +832,11 @@ impl PaintableSink {
|
||||||
fn initialize_macosgl(
|
fn initialize_macosgl(
|
||||||
&self,
|
&self,
|
||||||
display: gdk::Display,
|
display: gdk::Display,
|
||||||
display_guard: &mut Option<gst_gl::GLDisplay>,
|
) -> Option<(gst_gl::GLDisplay, gst_gl::GLContext)> {
|
||||||
app_ctx_guard: &mut Option<gst_gl::GLContext>,
|
|
||||||
) {
|
|
||||||
gst::info!(
|
gst::info!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Initializing GL for macOS backend and display."
|
"Initializing GL for macOS backend and display"
|
||||||
);
|
);
|
||||||
|
|
||||||
let platform = gst_gl::GLPlatform::CGL;
|
let platform = gst_gl::GLPlatform::CGL;
|
||||||
|
@ -941,25 +844,24 @@ impl PaintableSink {
|
||||||
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
let gl_ctx = gst_gl::GLContext::current_gl_context(platform);
|
||||||
|
|
||||||
if gl_ctx == 0 {
|
if gl_ctx == 0 {
|
||||||
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext",);
|
gst::error!(CAT, imp: self, "Failed to get handle from GdkGLContext");
|
||||||
return;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let gst_display = gst_gl::GLDisplay::new();
|
let gst_display = gst_gl::GLDisplay::new();
|
||||||
unsafe {
|
unsafe {
|
||||||
let gst_app_context =
|
let wrapped_context =
|
||||||
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
gst_gl::GLContext::new_wrapped(&gst_display, gl_ctx, platform, gl_api);
|
||||||
|
|
||||||
let gst_app_context = match gst_app_context {
|
let wrapped_context = match wrapped_context {
|
||||||
None => {
|
None => {
|
||||||
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
gst::error!(CAT, imp: self, "Failed to create wrapped GL context");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Some(gst_app_context) => gst_app_context,
|
Some(wrapped_context) => wrapped_context,
|
||||||
};
|
};
|
||||||
|
|
||||||
display_guard.replace(gst_display);
|
Some((gst_display, wrapped_context))
|
||||||
app_ctx_guard.replace(gst_app_context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,11 +165,6 @@ impl PaintableImpl for Paintable {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Paintable {
|
impl Paintable {
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
|
||||||
pub(super) fn context(&self) -> Option<gdk::GLContext> {
|
|
||||||
self.gl_context.borrow().clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) fn handle_frame_changed(&self, frame: Option<Frame>) {
|
pub(super) fn handle_frame_changed(&self, frame: Option<Frame>) {
|
||||||
let context = self.gl_context.borrow();
|
let context = self.gl_context.borrow();
|
||||||
if let Some(frame) = frame {
|
if let Some(frame) = frame {
|
||||||
|
@ -191,9 +186,7 @@ impl Paintable {
|
||||||
gst::debug!(
|
gst::debug!(
|
||||||
CAT,
|
CAT,
|
||||||
imp: self,
|
imp: self,
|
||||||
"Size changed from {:?} to {:?}",
|
"Size changed from {old_size:?} to {new_size:?}",
|
||||||
old_size,
|
|
||||||
new_size,
|
|
||||||
);
|
);
|
||||||
self.obj().invalidate_size();
|
self.obj().invalidate_size();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,11 +30,6 @@ impl Paintable {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Paintable {
|
impl Paintable {
|
||||||
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
|
|
||||||
pub(crate) fn context(&self) -> Option<gdk::GLContext> {
|
|
||||||
self.imp().context()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn handle_frame_changed(&self, frame: Option<Frame>) {
|
pub(crate) fn handle_frame_changed(&self, frame: Option<Frame>) {
|
||||||
self.imp().handle_frame_changed(frame);
|
self.imp().handle_frame_changed(frame);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-hsv"
|
name = "gst-plugin-hsv"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Julien Bardagi <julien.bardagi@gmail.com>"]
|
authors = ["Julien Bardagi <julien.bardagi@gmail.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,16 +9,16 @@ rust-version = "1.63"
|
||||||
description = "GStreamer plugin with HSV manipulation elements"
|
description = "GStreamer plugin with HSV manipulation elements"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-base = { package = "gstreamer-base", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-audio = { package = "gstreamer-audio", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
byte-slice-cast = "1.0"
|
byte-slice-cast = "1.0"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst_check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst_check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gsthsv"
|
name = "gsthsv"
|
||||||
|
@ -26,7 +26,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-png"
|
name = "gst-plugin-png"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Natanael Mojica <neithanmo@gmail.com>"]
|
authors = ["Natanael Mojica <neithanmo@gmail.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,14 +9,14 @@ rust-version = "1.63"
|
||||||
description = "GStreamer Rust PNG encoder/decoder"
|
description = "GStreamer Rust PNG encoder/decoder"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst_video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst_video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
png = "0.17.2"
|
png = "0.17.2"
|
||||||
once_cell = "1"
|
once_cell = "1"
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst_check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst_check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstrspng"
|
name = "gstrspng"
|
||||||
|
@ -24,7 +24,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-rav1e"
|
name = "gst-plugin-rav1e"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
@ -9,14 +9,14 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-video = { package = "gstreamer-video", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
rav1e = { version = "0.6", default-features = false, features = ["threading"] }
|
rav1e = { version = "0.6", default-features = false, features = ["threading"] }
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.20", version = "0.20" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstrav1e"
|
name = "gstrav1e"
|
||||||
|
@ -24,7 +24,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["hdr"]
|
default = ["hdr"]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-videofx"
|
name = "gst-plugin-videofx"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Sanchayan Maity <sanchayan@asymptotic.io>", "Rafael Caricio <rafael@caricio.com>"]
|
authors = ["Sanchayan Maity <sanchayan@asymptotic.io>", "Rafael Caricio <rafael@caricio.com>"]
|
||||||
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
|
@ -9,7 +9,7 @@ edition = "2021"
|
||||||
rust-version = "1.63"
|
rust-version = "1.63"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", features=["use_glib"] }
|
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.17", version = "0.17", features=["use_glib"] }
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
once_cell = "1.0"
|
once_cell = "1.0"
|
||||||
color-thief = "0.2.2"
|
color-thief = "0.2.2"
|
||||||
|
@ -21,21 +21,29 @@ rgb = { version = "0.8", optional = true }
|
||||||
|
|
||||||
[dependencies.gst]
|
[dependencies.gst]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
features = ["v1_16"]
|
features = ["v1_16"]
|
||||||
package = "gstreamer"
|
package = "gstreamer"
|
||||||
|
|
||||||
[dependencies.gst-base]
|
[dependencies.gst-base]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
features = ["v1_16"]
|
features = ["v1_16"]
|
||||||
package = "gstreamer-base"
|
package = "gstreamer-base"
|
||||||
|
|
||||||
[dependencies.gst-video]
|
[dependencies.gst-video]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
features = ["v1_16"]
|
features = ["v1_16"]
|
||||||
package = "gstreamer-video"
|
package = "gstreamer-video"
|
||||||
|
|
||||||
[dev-dependencies.gst-check]
|
[dev-dependencies.gst-check]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package = "gstreamer-check"
|
package = "gstreamer-check"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -44,7 +52,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gst-plugin-webp"
|
name = "gst-plugin-webp"
|
||||||
version = "0.10.0-alpha.1"
|
version = "0.10.3"
|
||||||
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
authors = ["Mathieu Duponchelle <mathieu@centricular.com>"]
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
@ -14,10 +14,14 @@ libwebp-sys2 = { version = "0.1.2", features = ["demux", "0_5"] }
|
||||||
|
|
||||||
[dependencies.gst]
|
[dependencies.gst]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer"
|
package="gstreamer"
|
||||||
|
|
||||||
[dependencies.gst-video]
|
[dependencies.gst-video]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-video"
|
package="gstreamer-video"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
@ -25,6 +29,8 @@ pretty_assertions = "1"
|
||||||
|
|
||||||
[dev-dependencies.gst-check]
|
[dev-dependencies.gst-check]
|
||||||
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||||
|
branch = "0.20"
|
||||||
|
version = "0.20"
|
||||||
package="gstreamer-check"
|
package="gstreamer-check"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -33,7 +39,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gst-plugin-version-helper = { path="../../version-helper" }
|
gst-plugin-version-helper = { path="../../version-helper", version = "0.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
static = []
|
static = []
|
||||||
|
|
Loading…
Reference in a new issue