mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-09-28 23:02:16 +00:00
Compare commits
243 commits
Author | SHA1 | Date | |
---|---|---|---|
|
6a04bad125 | ||
|
192844c173 | ||
|
7b51a7c77b | ||
|
b5bf829876 | ||
|
90f9406377 | ||
|
73544718b4 | ||
|
ce92502d61 | ||
|
bd37999166 | ||
|
6a87d4a66a | ||
|
6849e4b4c3 | ||
|
f14efbd70c | ||
|
224215a844 | ||
|
700004b8ce | ||
|
6035bffbab | ||
|
d16b28fc2f | ||
|
f62c8658e4 | ||
|
88a52d9ea1 | ||
|
96ec17b1e9 | ||
|
1b578b6113 | ||
|
7eaf47d7b5 | ||
|
5c39500308 | ||
|
299601f7e3 | ||
|
9bb441880d | ||
|
c818778ad7 | ||
|
628f040e2d | ||
|
b9d34e1c21 | ||
|
ed6aac91bd | ||
|
497f15acd3 | ||
|
be7b3e3522 | ||
|
2f9f70bd67 | ||
|
78c490ef17 | ||
|
e8797c95e7 | ||
|
a8234a67d2 | ||
|
9b5b1d4650 | ||
|
4ee374e60c | ||
|
c5dfc87953 | ||
|
57aa8e09ea | ||
|
4cf22e91cf | ||
|
7959e37204 | ||
|
ebe7f5f663 | ||
|
63935bb680 | ||
|
c463c07871 | ||
|
09bc0a2836 | ||
|
44479cf42a | ||
|
ec66403c24 | ||
|
c7694a4a91 | ||
|
b829c41cdc | ||
|
75ed9b668f | ||
|
ae120b300f | ||
|
6c5ceca804 | ||
|
6674f8d23a | ||
|
326e5861f3 | ||
|
57f407fa89 | ||
|
c9412e663b | ||
|
99f598a45a | ||
|
ce9c1729b8 | ||
|
a145ce6ab1 | ||
|
30d247fd5c | ||
|
2061a4e310 | ||
|
80d1066a20 | ||
|
4d6c30cdb6 | ||
|
4306c9a2c9 | ||
|
bc96a99576 | ||
|
0bd9fbd615 | ||
|
f8d1d813c5 | ||
|
73d9793f5b | ||
|
3dab797c32 | ||
|
7be6a9fef4 | ||
|
2ae1e4a511 | ||
|
658b8c2231 | ||
|
0f5c0e935c | ||
|
c8853734c0 | ||
|
b290d52639 | ||
|
0ed46425f6 | ||
|
3521eb920c | ||
|
efb8d85bd0 | ||
|
7dc7f3c0cd | ||
|
48436458bb | ||
|
9b76ef35cf | ||
|
c55daa88ca | ||
|
a5c044dda4 | ||
|
e45dbc8fd9 | ||
|
f4d3f01d25 | ||
|
cae7285013 | ||
|
94313e67c5 | ||
|
a871f71515 | ||
|
426d95bc6a | ||
|
207694ca6c | ||
|
adf3e9236a | ||
|
7a5096b1e4 | ||
|
cfb0fe6a17 | ||
|
f3d7e18bcd | ||
|
cd9f38135f | ||
|
53ede03b3b | ||
|
45ec7cedd9 | ||
|
84ea10dc73 | ||
|
a978f6d942 | ||
|
87c16d8f9f | ||
|
5ea912d702 | ||
|
0be8b364f8 | ||
|
c21da79eac | ||
|
8527c0e39e | ||
|
e4e5cfd63b | ||
|
f99c519a00 | ||
|
6bab9de772 | ||
|
6a8e8055b9 | ||
|
1970a043d4 | ||
|
7c87874c28 | ||
|
b59a92b29e | ||
|
e1a387229c | ||
|
3888f65e4d | ||
|
50b941ecfc | ||
|
60302732f3 | ||
|
259066e5b1 | ||
|
c593ae5cfc | ||
|
ea16222625 | ||
|
d8b7356f3d | ||
|
bc96d439d0 | ||
|
e6ed67cbc5 | ||
|
8a3ea1192d | ||
|
b045708353 | ||
|
c545154472 | ||
|
b20ea25147 | ||
|
4ebec84f5e | ||
|
10aff0d66e | ||
|
9d3ec9da53 | ||
|
413a6baa8c | ||
|
9e2c6268cb | ||
|
4cda565a39 | ||
|
805cd6c591 | ||
|
a0e58ec359 | ||
|
9f151466b7 | ||
|
1b537c17c8 | ||
|
c3619b45aa | ||
|
f59029b57c | ||
|
b468280353 | ||
|
0ef80c4fe7 | ||
|
455996c60b | ||
|
83fe420466 | ||
|
5af4a262b8 | ||
|
b8dbfc66ca | ||
|
b15e0e1633 | ||
|
a430291725 | ||
|
0ee36ea4b5 | ||
|
a7a0bf226d | ||
|
19ea814a09 | ||
|
2a9d0d035f | ||
|
1e293e5cb8 | ||
|
fe1fe5b114 | ||
|
238768f525 | ||
|
2f99c4c560 | ||
|
9fca740851 | ||
|
9490735655 | ||
|
81b20b9329 | ||
|
ba4bd5c631 | ||
|
4b79dddc14 | ||
|
01b32ce143 | ||
|
873aeff133 | ||
|
87cc9fe6e4 | ||
|
bac0828260 | ||
|
200d8b1c0c | ||
|
dc04a53207 | ||
|
0bb334e14c | ||
|
46226106b4 | ||
|
b7b5352353 | ||
|
88a6977777 | ||
|
cb560e59a3 | ||
|
241338f43c | ||
|
5c8a989029 | ||
|
57050f66c6 | ||
|
63654c67da | ||
|
70a15e8dbe | ||
|
953e3747f2 | ||
|
e117010bc0 | ||
|
694d1fd39b | ||
|
db03c8edd1 | ||
|
ea25c9262b | ||
|
0d872ae6f8 | ||
|
7433ea79c9 | ||
|
46be4a0b1e | ||
|
43c82da25a | ||
|
da1f53f4c7 | ||
|
0524435190 | ||
|
917c458a86 | ||
|
5eaa0ca46d | ||
|
5400979e28 | ||
|
c43c08804a | ||
|
a7ebe45ff3 | ||
|
2b53c55ee6 | ||
|
04c840a1d9 | ||
|
6111663e26 | ||
|
7cea7ba6f1 | ||
|
e2e38d9494 | ||
|
676e41064b | ||
|
4524af89ee | ||
|
e5830c2ea9 | ||
|
d7fe0709a5 | ||
|
983e8b3308 | ||
|
6aff1773bd | ||
|
ebc06257b5 | ||
|
86d02890ca | ||
|
29c82cd54d | ||
|
c05563d22e | ||
|
9e80250b49 | ||
|
0b027c853b | ||
|
3246f4fb5b | ||
|
82f6accc31 | ||
|
ffad1188b9 | ||
|
353e3d1611 | ||
|
b5cb4ae831 | ||
|
14576fdf26 | ||
|
70045a36fb | ||
|
28451435a4 | ||
|
fcc7ab6b88 | ||
|
18a02f6d34 | ||
|
c5111ddcc2 | ||
|
d5917be045 | ||
|
4e6ddf6663 | ||
|
ab0a29b765 | ||
|
8062a8748f | ||
|
28fe70f479 | ||
|
c8b98dde8c | ||
|
b47aba1837 | ||
|
28931e2f09 | ||
|
1649e268c5 | ||
|
d575cd1f95 | ||
|
ac275fe10e | ||
|
b10f395c2c | ||
|
22796cee0c | ||
|
7f9dd58718 | ||
|
798ee29b98 | ||
|
040a194700 | ||
|
b69fee9abe | ||
|
a87a844604 | ||
|
5d19b26974 | ||
|
2613c57739 | ||
|
f82b9cc197 | ||
|
12c9ada9e0 | ||
|
a784ea2d0b | ||
|
90e6108ed7 | ||
|
77b2800caf | ||
|
c4636fc0cd | ||
|
6a1441203d |
786 changed files with 11144 additions and 3781 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
target/
|
||||
**/*.rs.bk
|
||||
Cargo.lock
|
||||
|
|
|
@ -11,13 +11,16 @@
|
|||
# - setting it to the current date and the version suffix to 0
|
||||
# - incrementing the version suffix
|
||||
#
|
||||
# Same for GST_RS_IMG_WINDOWS_TAG. There's a separate tag for it to cater for
|
||||
# image-only updates that only affect Windows or only Linux.
|
||||
#
|
||||
# After each update commit your changes and push to your personal repo.
|
||||
# After review and ci approval merge the branch as usual.
|
||||
#
|
||||
# Updating the nightly image should be done by simply running a scheduled ci
|
||||
# pipeline on the upstream repo with the $UPDATE_NIGHTLY variable defined.
|
||||
|
||||
.templates_sha: &templates_sha b2e24205598dc1d80b5f2c88cf7618051e30e9fd
|
||||
.templates_sha: &templates_sha 6a40df92957c8ce9ee741aaccc5daaaf70545b1e
|
||||
|
||||
include:
|
||||
- project: 'freedesktop/ci-templates'
|
||||
|
@ -39,15 +42,23 @@ workflow:
|
|||
|
||||
default:
|
||||
interruptible: true
|
||||
# Auto-retry jobs in case of infra failures
|
||||
retry:
|
||||
max: 1
|
||||
when:
|
||||
- 'runner_system_failure'
|
||||
- 'stuck_or_timeout_failure'
|
||||
- 'scheduler_failure'
|
||||
- 'api_failure'
|
||||
|
||||
variables:
|
||||
FDO_UPSTREAM_REPO: gstreamer/gstreamer-rs
|
||||
|
||||
# DIY CI-templates like setup for windows
|
||||
WINDOWS_RUST_MINIMUM_IMAGE: "$CI_REGISTRY_IMAGE/windows:$GST_RS_IMG_TAG-main-$GST_RS_MSRV"
|
||||
WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/windows:$GST_RS_IMG_TAG-main-$GST_RS_MSRV"
|
||||
WINDOWS_RUST_STABLE_IMAGE: "$CI_REGISTRY_IMAGE/windows:$GST_RS_IMG_TAG-main-$GST_RS_STABLE"
|
||||
WINDOWS_RUST_STABLE_UPSTREAM_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/windows:$GST_RS_IMG_TAG-main-$GST_RS_STABLE"
|
||||
WINDOWS_RUST_MINIMUM_IMAGE: "$CI_REGISTRY_IMAGE/windows:$GST_RS_IMG_WINDOWS_TAG-main-$GST_RS_MSRV"
|
||||
WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/windows:$GST_RS_IMG_WINDOWS_TAG-main-$GST_RS_MSRV"
|
||||
WINDOWS_RUST_STABLE_IMAGE: "$CI_REGISTRY_IMAGE/windows:$GST_RS_IMG_WINDOWS_TAG-main-$GST_RS_STABLE"
|
||||
WINDOWS_RUST_STABLE_UPSTREAM_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/windows:$GST_RS_IMG_WINDOWS_TAG-main-$GST_RS_STABLE"
|
||||
|
||||
RUST_DOCS_FLAGS: "--cfg docsrs --extern-html-root-url=muldiv=https://docs.rs/muldiv/1.0.0/muldiv/ -Z unstable-options --generate-link-to-definition"
|
||||
NAMESPACE: gstreamer
|
||||
|
@ -56,7 +67,7 @@ variables:
|
|||
# latest release must be at the top
|
||||
# (only relevant on main branch)
|
||||
RELEASES:
|
||||
0.21=0.21
|
||||
0.23=0.23
|
||||
|
||||
stages:
|
||||
- "trigger"
|
||||
|
@ -73,6 +84,8 @@ trigger:
|
|||
stage: 'trigger'
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
GIT_SUBMODULE_STRATEGY: "none"
|
||||
tags: [ 'placeholder-job' ]
|
||||
script:
|
||||
- echo "Trigger job done, now running the pipeline."
|
||||
rules:
|
||||
|
@ -94,7 +107,7 @@ trigger:
|
|||
FDO_DISTRIBUTION_VERSION: 'bookworm-slim'
|
||||
before_script:
|
||||
- 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.toml
|
||||
|
||||
.debian:12-base:
|
||||
extends: .debian:12
|
||||
|
@ -141,11 +154,11 @@ trigger:
|
|||
libpango1.0-dev libcairo2-dev libjson-glib-dev libgdk-pixbuf-2.0-dev
|
||||
libtiff-dev libpng-dev libjpeg-dev libepoxy-dev libsass-dev sassc
|
||||
libcsound64-dev llvm clang nasm libsodium-dev libwebp-dev
|
||||
libflac-dev libmysofa-dev libgtk-4-dev
|
||||
FDO_DISTRIBUTION_EXEC: >-
|
||||
bash ci/install-gst.sh &&
|
||||
bash ci/install-dav1d.sh &&
|
||||
pip3 install --break-system-packages git+http://gitlab.freedesktop.org/freedesktop/ci-templates &&
|
||||
pip3 install --break-system-packages tomli
|
||||
pip3 install --break-system-packages git+http://gitlab.freedesktop.org/freedesktop/ci-templates
|
||||
|
||||
.build-final-image:
|
||||
extends:
|
||||
|
@ -311,6 +324,9 @@ test nightly sys:
|
|||
rustfmt:
|
||||
extends: .img-stable
|
||||
stage: "lint"
|
||||
tags: [ 'placeholder-job' ]
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: "none"
|
||||
script:
|
||||
- cargo fmt --version
|
||||
- cargo fmt -- --color=always --check
|
||||
|
@ -321,6 +337,9 @@ rustfmt:
|
|||
check commits:
|
||||
extends: .img-stable
|
||||
stage: "lint"
|
||||
tags: [ 'placeholder-job' ]
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: "none"
|
||||
script:
|
||||
- ci-fairy check-commits --textwidth 0 --no-signed-off-by
|
||||
needs:
|
||||
|
@ -330,6 +349,9 @@ check commits:
|
|||
typos:
|
||||
extends: .img-stable
|
||||
stage: "lint"
|
||||
tags: [ 'placeholder-job' ]
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: "none"
|
||||
script:
|
||||
- typos
|
||||
needs:
|
||||
|
@ -366,6 +388,8 @@ gir-checks:
|
|||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
extends: .img-stable
|
||||
stage: 'extras'
|
||||
tags:
|
||||
- "gstreamer"
|
||||
needs:
|
||||
- job: 'build-stable'
|
||||
artifacts: false
|
||||
|
@ -376,6 +400,8 @@ gir-checks:
|
|||
outdated:
|
||||
extends: .img-stable
|
||||
stage: 'extras'
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: "none"
|
||||
needs:
|
||||
- job: 'build-stable'
|
||||
artifacts: false
|
||||
|
@ -383,7 +409,8 @@ outdated:
|
|||
- if: $CI_PIPELINE_SOURCE == "schedule"
|
||||
script:
|
||||
- cargo update --color=always
|
||||
- cargo outdated --color=always --root-deps-only --exit-code 1 -v
|
||||
# Ignore derive_more until we can depend on Rust 1.75 or newer
|
||||
- cargo outdated --color=always --root-deps-only --exit-code 1 -v --ignore derive_more
|
||||
|
||||
coverage:
|
||||
allow_failure: true
|
||||
|
@ -402,25 +429,26 @@ coverage:
|
|||
LLVM_PROFILE_FILE: "gstreamer-rs-%p-%m.profraw"
|
||||
script:
|
||||
- *cargo_test
|
||||
# generate html report
|
||||
- grcov . --binary-path ./target/debug/ -s . -t html --branch --ignore-not-existing --ignore "*target*" --ignore "*/sys/*" --ignore "examples/*" --ignore "tutorials/*" --ignore "*/build.rs" -o ./coverage/
|
||||
# generate cobertura report for gitlab integration
|
||||
- grcov . --binary-path ./target/debug/ -s . -t cobertura --branch --ignore-not-existing --ignore "*target*" --ignore "*/sys/*" --ignore "examples/*" --ignore "tutorials/*" --ignore "*/build.rs" -o coverage.xml
|
||||
# generate html and cobertura report for gitlab integration
|
||||
- mkdir -p coverage
|
||||
- grcov . --binary-path ./target/debug/ -s . -t html,cobertura --branch --ignore-not-existing --ignore "*target*" --ignore "*/sys/*" --ignore "examples/*" --ignore "tutorials/*" --ignore "*/build.rs" -o ./coverage/
|
||||
# output coverage summary for gitlab parsing.
|
||||
# TODO: use grcov once https://github.com/mozilla/grcov/issues/556 is fixed
|
||||
- grep % coverage/index.html | head -1 ; true
|
||||
- grep % coverage/html/index.html | head -1 ; true
|
||||
artifacts:
|
||||
paths:
|
||||
- 'coverage'
|
||||
reports:
|
||||
coverage_report:
|
||||
coverage_format: cobertura
|
||||
path: coverage.xml
|
||||
path: "coverage/cobertura.xml"
|
||||
|
||||
doc-stripping:
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
extends: .img-nightly
|
||||
tags:
|
||||
- "gstreamer"
|
||||
stage: 'extras'
|
||||
needs:
|
||||
- job: 'build-nightly'
|
||||
|
@ -435,6 +463,8 @@ regen-check:
|
|||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
extends: .img-nightly
|
||||
tags:
|
||||
- "gstreamer"
|
||||
stage: 'extras'
|
||||
needs:
|
||||
- job: 'build-nightly'
|
||||
|
@ -449,6 +479,8 @@ docs:
|
|||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
extends: .img-nightly
|
||||
stage: 'extras'
|
||||
tags:
|
||||
- "gstreamer"
|
||||
needs:
|
||||
- job: 'build-nightly'
|
||||
artifacts: false
|
||||
|
@ -508,11 +540,11 @@ pages:
|
|||
# We also don't need a CONTEXT_DIR var as its also
|
||||
# hardcoded to be windows-docker/
|
||||
DOCKERFILE: 'ci/windows-docker/Dockerfile'
|
||||
GST_UPSTREAM_BRANCH: 'main'
|
||||
tags:
|
||||
- 'windows'
|
||||
- 'shell'
|
||||
- '2022'
|
||||
- "gstreamer-windows"
|
||||
script:
|
||||
# We need to pass an array and to resolve the env vars, so we can't use a variable:
|
||||
- $DOCKER_BUILD_ARGS = @("--build-arg", "DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH", "--build-arg", "RUST_VERSION=$RUST_VERSION")
|
||||
|
@ -533,7 +565,6 @@ windows rust docker stable:
|
|||
|
||||
windows rust docker msrv:
|
||||
extends: '.windows rust docker build'
|
||||
when: 'manual'
|
||||
variables:
|
||||
RUST_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_IMAGE"]
|
||||
RUST_UPSTREAM_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE"]
|
||||
|
@ -545,6 +576,7 @@ windows rust docker msrv:
|
|||
- 'docker'
|
||||
- 'windows'
|
||||
- '2022'
|
||||
- "gstreamer-windows"
|
||||
script:
|
||||
# Skip -sys tests as they don't work
|
||||
# https://github.com/gtk-rs/gtk3-rs/issues/54
|
||||
|
|
910
Cargo.lock
generated
910
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
91
Cargo.toml
91
Cargo.toml
|
@ -107,46 +107,63 @@ members = [
|
|||
exclude = ["gir"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.22.1"
|
||||
version = "0.24.0"
|
||||
categories = ["api-bindings", "multimedia"]
|
||||
repository = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs"
|
||||
homepage = "https://gstreamer.freedesktop.org"
|
||||
edition = "2021"
|
||||
rust-version = "1.70"
|
||||
rust-version = "1.71.1"
|
||||
|
||||
[workspace.dependencies]
|
||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
gio-sys = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
glib = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
glib-sys = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
gobject-sys = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
pango = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
pangocairo = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
|
||||
gstreamer-audio-sys = { path = "./gstreamer-audio/sys", version = "0.22" }
|
||||
gstreamer-base-sys = { path = "./gstreamer-base/sys", version = "0.22" }
|
||||
gstreamer-gl-sys = { path = "./gstreamer-gl/sys", version = "0.22" }
|
||||
gstreamer-net-sys = { path = "./gstreamer-net/sys", version = "0.22" }
|
||||
gstreamer-pbutils-sys = { path = "./gstreamer-pbutils/sys", version = "0.22" }
|
||||
gstreamer-rtsp-sys = { path = "./gstreamer-rtsp/sys", version = "0.22" }
|
||||
gstreamer-sdp-sys = { path = "./gstreamer-sdp/sys", version = "0.22" }
|
||||
gstreamer-sys = { path = "./gstreamer/sys", version = "0.22" }
|
||||
gstreamer-video-sys = { path = "./gstreamer-video/sys", version = "0.22" }
|
||||
ges = { package = "gstreamer-editing-services", path = "./gstreamer-editing-services", version = "0.22" }
|
||||
gst = { package = "gstreamer", path = "./gstreamer", version = "0.22" }
|
||||
gst-allocators = { package = "gstreamer-allocators", path = "./gstreamer-allocators", version = "0.22" }
|
||||
gst-app = { package = "gstreamer-app", path = "./gstreamer-app", version = "0.22" }
|
||||
gst-audio = { package = "gstreamer-audio", path = "./gstreamer-audio", version = "0.22" }
|
||||
gst-base = { package = "gstreamer-base", path = "./gstreamer-base", version = "0.22" }
|
||||
gst-check = { package = "gstreamer-check", path = "./gstreamer-check", version = "0.22" }
|
||||
gst-gl = { package = "gstreamer-gl", path = "./gstreamer-gl", version = "0.22" }
|
||||
gst-gl-egl = { package = "gstreamer-gl-egl", path = "./gstreamer-gl/egl", version = "0.22" }
|
||||
gst-gl-x11 = { package = "gstreamer-gl-x11", path = "./gstreamer-gl/x11", version = "0.22" }
|
||||
gst-net = { package = "gstreamer-net", path = "./gstreamer-net", version = "0.22" }
|
||||
gst-pbutils = { package = "gstreamer-pbutils", path = "./gstreamer-pbutils", version = "0.22" }
|
||||
gst-play = { package = "gstreamer-play", path = "./gstreamer-play", version = "0.22" }
|
||||
gst-player = { package = "gstreamer-player", path = "./gstreamer-player", version = "0.22" }
|
||||
gst-rtsp = { package = "gstreamer-rtsp", path = "./gstreamer-rtsp", version = "0.22" }
|
||||
gst-rtsp-server = { package = "gstreamer-rtsp-server", path = "./gstreamer-rtsp-server", version = "0.22" }
|
||||
gst-sdp = { package = "gstreamer-sdp", path = "./gstreamer-sdp", version = "0.22" }
|
||||
gst-video = { package = "gstreamer-video", path = "./gstreamer-video", version = "0.22" }
|
||||
gio = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
gio-sys = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
glib = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
glib-sys = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
gobject-sys = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
cairo-rs = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
pango = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
pangocairo = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "master" }
|
||||
gstreamer-allocators-sys = { path = "gstreamer-allocators/sys" }
|
||||
gstreamer-analytics-sys = { path = "gstreamer-analytics/sys" }
|
||||
gstreamer-app-sys = { path = "gstreamer-app/sys" }
|
||||
gstreamer-audio-sys = { path = "./gstreamer-audio/sys"}
|
||||
gstreamer-base-sys = { path = "./gstreamer-base/sys"}
|
||||
gstreamer-check-sys = { path = "./gstreamer-check/sys" }
|
||||
gstreamer-controller-sys = { path = "./gstreamer-controller/sys" }
|
||||
gstreamer-editing-services-sys = { path = "./gstreamer-editing-services/sys"}
|
||||
gstreamer-gl-egl-sys = { path = "./gstreamer-gl/egl/sys"}
|
||||
gstreamer-gl-wayland-sys = { path = "./gstreamer-gl/wayland/sys"}
|
||||
gstreamer-gl-x11-sys = { path = "./gstreamer-gl/x11/sys"}
|
||||
gstreamer-gl-sys = { path = "./gstreamer-gl/sys"}
|
||||
gstreamer-mpegts-sys = { path = "./gstreamer-mpegts/sys"}
|
||||
gstreamer-net-sys = { path = "./gstreamer-net/sys"}
|
||||
gstreamer-pbutils-sys = { path = "./gstreamer-pbutils/sys"}
|
||||
gstreamer-play-sys = { path = "./gstreamer-play/sys" }
|
||||
gstreamer-player-sys = { path = "./gstreamer-player/sys" }
|
||||
gstreamer-rtp-sys = { path = "./gstreamer-rtp/sys" }
|
||||
gstreamer-rtsp-sys = { path = "./gstreamer-rtsp/sys"}
|
||||
gstreamer-rtsp-server-sys = { path = "./gstreamer-rtsp-server/sys" }
|
||||
gstreamer-sdp-sys = { path = "./gstreamer-sdp/sys"}
|
||||
gstreamer-tag-sys = { path = "./gstreamer-tag/sys" }
|
||||
gstreamer-sys = { path = "./gstreamer/sys"}
|
||||
gstreamer-validate-sys = { path = "./gstreamer-validate/sys" }
|
||||
gstreamer-video-sys = { path = "./gstreamer-video/sys"}
|
||||
gstreamer-webrtc-sys = { path = "./gstreamer-webrtc/sys" }
|
||||
ges = { package = "gstreamer-editing-services", path = "./gstreamer-editing-services" }
|
||||
gst = { package = "gstreamer", path = "./gstreamer" }
|
||||
gst-allocators = { package = "gstreamer-allocators", path = "./gstreamer-allocators" }
|
||||
gst-app = { package = "gstreamer-app", path = "./gstreamer-app" }
|
||||
gst-audio = { package = "gstreamer-audio", path = "./gstreamer-audio" }
|
||||
gst-base = { package = "gstreamer-base", path = "./gstreamer-base" }
|
||||
gst-check = { package = "gstreamer-check", path = "./gstreamer-check" }
|
||||
gst-gl = { package = "gstreamer-gl", path = "./gstreamer-gl" }
|
||||
gst-gl-egl = { package = "gstreamer-gl-egl", path = "./gstreamer-gl/egl" }
|
||||
gst-gl-x11 = { package = "gstreamer-gl-x11", path = "./gstreamer-gl/x11" }
|
||||
gst-net = { package = "gstreamer-net", path = "./gstreamer-net" }
|
||||
gst-pbutils = { package = "gstreamer-pbutils", path = "./gstreamer-pbutils" }
|
||||
gst-play = { package = "gstreamer-play", path = "./gstreamer-play" }
|
||||
gst-player = { package = "gstreamer-player", path = "./gstreamer-player" }
|
||||
gst-rtsp = { package = "gstreamer-rtsp", path = "./gstreamer-rtsp" }
|
||||
gst-rtsp-server = { package = "gstreamer-rtsp-server", path = "./gstreamer-rtsp-server" }
|
||||
gst-sdp = { package = "gstreamer-sdp", path = "./gstreamer-sdp" }
|
||||
gst-video = { package = "gstreamer-video", path = "./gstreamer-video" }
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
variables:
|
||||
GST_RS_IMG_TAG: "2024-02-12.0"
|
||||
GST_RS_STABLE: "1.76.0"
|
||||
GST_RS_MSRV: "1.70.0"
|
||||
GST_RS_IMG_TAG: "2024-09-12.1"
|
||||
GST_RS_IMG_WINDOWS_TAG: "2024-09-12.1"
|
||||
GST_RS_STABLE: "1.81.0"
|
||||
GST_RS_MSRV: "1.71.1"
|
||||
# The branch we use to build GStreamer from in the docker images
|
||||
# Ex. main, 1.24, my-test-branch
|
||||
GST_UPSTREAM_BRANCH: 'main'
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
set -e
|
||||
|
||||
RELEASE=1.1.0
|
||||
RELEASE=1.4.3
|
||||
|
||||
git clone https://code.videolan.org/videolan/dav1d.git --branch $RELEASE
|
||||
cd dav1d
|
||||
|
|
|
@ -2,38 +2,41 @@
|
|||
|
||||
set -e
|
||||
|
||||
pip3 install meson==1.1.1 --break-system-packages
|
||||
DEFAULT_BRANCH="$GST_UPSTREAM_BRANCH"
|
||||
|
||||
pip3 install meson==1.5.1 --break-system-packages
|
||||
|
||||
# gstreamer-rs already has a 'gstreamer' directory so don't clone there
|
||||
pushd .
|
||||
cd ..
|
||||
git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git \
|
||||
--depth 1 \
|
||||
--branch main
|
||||
--branch "$DEFAULT_BRANCH"
|
||||
|
||||
cd gstreamer
|
||||
|
||||
# plugins required by tests
|
||||
PLUGINS="-D gst-plugins-base:ogg=enabled \
|
||||
-D gst-plugins-base:vorbis=enabled \
|
||||
-D gst-plugins-base:theora=enabled \
|
||||
-D gst-plugins-good:matroska=enabled \
|
||||
-D gst-plugins-good:vpx=enabled \
|
||||
-D gst-plugins-bad:opus=enabled \
|
||||
-D gst-plugins-ugly:x264=enabled"
|
||||
PLUGINS=(
|
||||
-Dgst-plugins-base:ogg=enabled
|
||||
-Dgst-plugins-base:vorbis=enabled
|
||||
-Dgst-plugins-base:theora=enabled
|
||||
-Dgst-plugins-good:matroska=enabled
|
||||
-Dgst-plugins-good:vpx=enabled
|
||||
-Dgst-plugins-bad:opus=enabled
|
||||
-Dgst-plugins-ugly:x264=enabled
|
||||
)
|
||||
|
||||
echo "subproject('gtk')" >> meson.build
|
||||
meson setup build \
|
||||
-D prefix=/usr/local \
|
||||
-D gpl=enabled \
|
||||
-D ugly=enabled \
|
||||
-D examples=disabled \
|
||||
-D gtk_doc=disabled \
|
||||
-D introspection=disabled \
|
||||
-D libav=disabled \
|
||||
-D python=disabled \
|
||||
-D vaapi=disabled \
|
||||
$PLUGINS
|
||||
-Dprefix=/usr/local \
|
||||
-Dgpl=enabled \
|
||||
-Dugly=enabled \
|
||||
-Dexamples=disabled \
|
||||
-Dgtk_doc=disabled \
|
||||
-Dintrospection=disabled \
|
||||
-Dlibav=disabled \
|
||||
-Dpython=disabled \
|
||||
-Dvaapi=disabled \
|
||||
"${PLUGINS[@]}" "$@"
|
||||
meson compile -C build
|
||||
meson install -C build
|
||||
ldconfig
|
||||
|
|
|
@ -5,7 +5,7 @@ source ./ci/env.sh
|
|||
set -e
|
||||
export CARGO_HOME='/usr/local/cargo'
|
||||
|
||||
RUSTUP_VERSION=1.26.0
|
||||
RUSTUP_VERSION=1.27.1
|
||||
RUST_VERSION=$1
|
||||
RUST_IMAGE_FULL=$2
|
||||
RUST_ARCH="x86_64-unknown-linux-gnu"
|
||||
|
@ -26,26 +26,34 @@ if [ "$RUST_IMAGE_FULL" = "1" ]; then
|
|||
rustup component add clippy-preview
|
||||
rustup component add rustfmt
|
||||
|
||||
cargo install --locked --force cargo-deny
|
||||
cargo install --locked --force cargo-outdated
|
||||
cargo install --locked --force typos-cli
|
||||
cargo install --locked cargo-deny
|
||||
if [ "$RUST_VERSION" = "1.71.1" ]; then
|
||||
cargo install --locked cargo-outdated
|
||||
else
|
||||
# Don't use --locked because time-0.3.30 does not build with 1.80 or newer
|
||||
cargo install cargo-outdated
|
||||
fi
|
||||
cargo install --locked typos-cli --version "1.19.0"
|
||||
|
||||
# Coverage tools
|
||||
rustup component add llvm-tools-preview
|
||||
cargo install --locked --force grcov
|
||||
if [ "$RUST_VERSION" = "1.71.1" ]; then
|
||||
cargo install --locked grcov
|
||||
else
|
||||
# Don't use --locked because time-0.3.30 does not build with 1.80 or newer
|
||||
cargo install grcov
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$RUST_VERSION" = "nightly" ]; then
|
||||
# FIXME: Don't build cargo-c with --locked for now because otherwise a
|
||||
# version of ahash is used that doesn't build on nightly anymore
|
||||
cargo install cargo-c --version 0.9.22+cargo-0.72
|
||||
if [ "$RUST_VERSION" = "1.71.1" ]; then
|
||||
cargo install --locked cargo-c --version 0.9.26+cargo-0.74
|
||||
else
|
||||
cargo install --locked cargo-c --version 0.9.22+cargo-0.72
|
||||
cargo install --locked cargo-c --version 0.10.3+cargo-0.81
|
||||
fi
|
||||
|
||||
if [ "$RUST_VERSION" = "nightly" ]; then
|
||||
rustup component add rustfmt --toolchain nightly
|
||||
|
||||
# Documentation tools
|
||||
cargo install --locked --force rustdoc-stripper
|
||||
cargo install --locked rustdoc-stripper
|
||||
fi
|
||||
|
|
|
@ -5,6 +5,9 @@ set -ex
|
|||
rustc --version
|
||||
cargo --version
|
||||
|
||||
cpus=$(nproc || sysctl -n hw.ncpu)
|
||||
CARGO_FLAGS="-j${FDO_CI_CONCURRENT:-$cpus}"
|
||||
|
||||
for crate in gstreamer* gstreamer-gl/{egl,wayland,x11}; do
|
||||
if [ -e "$crate/Cargo.toml" ]; then
|
||||
if [ -n "$ALL_FEATURES" ]; then
|
||||
|
@ -15,8 +18,8 @@ for crate in gstreamer* gstreamer-gl/{egl,wayland,x11}; do
|
|||
|
||||
echo "Building and testing $crate with $FEATURES"
|
||||
|
||||
cargo build --locked --color=always --manifest-path "$crate/Cargo.toml" $FEATURES
|
||||
G_DEBUG=fatal_warnings cargo test --color=always --manifest-path "$crate/Cargo.toml" $FEATURES
|
||||
cargo build $CARGO_FLAGS --locked --color=always --manifest-path "$crate/Cargo.toml" $FEATURES
|
||||
RUST_BACKTRACE=1 G_DEBUG=fatal_warnings cargo test $CARGO_FLAGS --color=always --manifest-path "$crate/Cargo.toml" $FEATURES
|
||||
fi
|
||||
done
|
||||
|
||||
|
@ -25,6 +28,6 @@ if [ -n "$EXAMPLES_TUTORIALS" ]; then
|
|||
# List all features except windows/win32
|
||||
EXAMPLES_FEATURES="--features=rtsp-server,rtsp-server-record,pango-cairo,overlay-composition,gl,gst-gl-x11,gst-gl-egl,allocators,gst-play,gst-player,ges,image,cairo-rs,gst-video/v1_18"
|
||||
|
||||
cargo build --locked --color=always --manifest-path examples/Cargo.toml --bins --examples "$EXAMPLES_FEATURES"
|
||||
cargo build --locked --color=always --manifest-path tutorials/Cargo.toml --bins --examples --all-features
|
||||
cargo build $CARGO_FLAGS --locked --color=always --manifest-path examples/Cargo.toml --bins --examples "$EXAMPLES_FEATURES"
|
||||
cargo build $CARGO_FLAGS --locked --color=always --manifest-path tutorials/Cargo.toml --bins --examples --all-features
|
||||
fi
|
||||
|
|
|
@ -11,13 +11,10 @@ get_features() {
|
|||
crate=$1
|
||||
case "$crate" in
|
||||
gstreamer-audio|gstreamer-editing-services|gstreamer-gl|gstreamer-pbutils|gstreamer-rtp|gstreamer-rtsp|gstreamer-video|gstreamer)
|
||||
echo "--features=serde,v1_24"
|
||||
;;
|
||||
gstreamer-analytics)
|
||||
echo ""
|
||||
echo "--features=serde,v1_26"
|
||||
;;
|
||||
*)
|
||||
echo "--features=v1_24"
|
||||
echo "--features=v1_26"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
|
|
@ -5,19 +5,25 @@ set -ex
|
|||
rustc --version
|
||||
cargo --version
|
||||
|
||||
cpus=$(nproc || sysctl -n hw.ncpu)
|
||||
CARGO_FLAGS="-j${FDO_CI_CONCURRENT:-$cpus}"
|
||||
|
||||
for crate in gstreamer*/sys gstreamer-gl/*/sys; do
|
||||
if [ -e "$crate/Cargo.toml" ]; then
|
||||
echo "Building $crate with --all-features"
|
||||
cargo build --locked --color=always --manifest-path "$crate/Cargo.toml" --all-features
|
||||
cargo build $CARGO_FLAGS --locked --color=always --manifest-path "$crate/Cargo.toml" --all-features
|
||||
fi
|
||||
done
|
||||
|
||||
for crate in gstreamer/sys \
|
||||
gstreamer-allocators/sys \
|
||||
gstreamer-analytics/sys \
|
||||
gstreamer-app/sys \
|
||||
gstreamer-audio/sys \
|
||||
gstreamer-base/sys \
|
||||
gstreamer-check/sys \
|
||||
gstreamer-controller/sys \
|
||||
gstreamer-editing-services/sys \
|
||||
gstreamer-gl/sys \
|
||||
gstreamer-gl/egl/sys \
|
||||
gstreamer-gl/wayland/sys \
|
||||
|
@ -25,13 +31,16 @@ for crate in gstreamer/sys \
|
|||
gstreamer-mpegts/sys \
|
||||
gstreamer-net/sys \
|
||||
gstreamer-pbutils/sys \
|
||||
gstreamer-play/sys \
|
||||
gstreamer-player/sys \
|
||||
gstreamer-rtp/sys \
|
||||
gstreamer-rtsp-server/sys \
|
||||
gstreamer-rtsp/sys \
|
||||
gstreamer-sdp/sys \
|
||||
gstreamer-tag/sys \
|
||||
gstreamer-validate/sys \
|
||||
gstreamer-video/sys \
|
||||
gstreamer-webrtc/sys; do
|
||||
echo "Testing $crate with --all-features)"
|
||||
cargo test --locked --color=always --manifest-path $crate/Cargo.toml --all-features
|
||||
RUST_BACKTRACE=1 cargo test $CARGO_FLAGS --locked --color=always --manifest-path $crate/Cargo.toml --all-features
|
||||
done
|
||||
|
|
|
@ -16,8 +16,7 @@
|
|||
# 'gstreamer-gl/egl',
|
||||
# 'gstreamer-gl/wayland',
|
||||
# 'gstreamer-gl/x11',
|
||||
# only has sys
|
||||
# 'gstreamer-mpegts',
|
||||
'gstreamer-mpegts',
|
||||
'gstreamer-mpegts/sys',
|
||||
'gstreamer-net',
|
||||
'gstreamer-pbutils',
|
||||
|
@ -26,8 +25,7 @@
|
|||
'gstreamer-rtsp',
|
||||
'gstreamer-rtsp-server',
|
||||
'gstreamer-sdp',
|
||||
# only has sys
|
||||
# 'gstreamer-tag',
|
||||
'gstreamer-tag',
|
||||
'gstreamer-tag/sys',
|
||||
'gstreamer-video',
|
||||
'gstreamer-webrtc',
|
||||
|
@ -56,7 +54,7 @@ foreach($features in $features_matrix) {
|
|||
if ($env:LocalFeatures -and ($env:LocalFeatures -ne '--no-default-features')) {
|
||||
if ($crate -eq 'examples') {
|
||||
# FIXME: We can do --all-features for examples once we have gtk3 installed in the image
|
||||
$env:LocalFeatures = "--features=rtsp-server,rtsp-server-record,pango-cairo,overlay-composition,gst-play,gst-player,ges,image,cairo-rs,gst-video/v1_18,windows"
|
||||
$env:LocalFeatures = "--features=rtsp-server,rtsp-server-record,pango-cairo,overlay-composition,gst-play,gst-player,ges,image,cairo-rs,gst-video/v1_18,windows,gl"
|
||||
}
|
||||
|
||||
if ($crate -eq 'tutorials') {
|
||||
|
@ -78,6 +76,7 @@ foreach($features in $features_matrix) {
|
|||
}
|
||||
|
||||
$env:G_DEBUG="fatal_warnings"
|
||||
$env:RUST_BACKTRACE="1"
|
||||
cargo test --no-fail-fast --color=always --manifest-path $crate/Cargo.toml $env:LocalFeatures
|
||||
|
||||
if (!$?) {
|
||||
|
|
|
@ -4,7 +4,10 @@ FROM "registry.freedesktop.org/gstreamer/gstreamer/amd64/windows:2023-07-17.0-ma
|
|||
|
||||
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
|
||||
|
||||
ARG DEFAULT_BRANCH="main"
|
||||
# These arguments are always required to be specified with --build-arg
|
||||
# when building the image.
|
||||
# See DOCKER_BUILD_ARGS in .gitlab-ci.yml for an example
|
||||
ARG DEFAULT_BRANCH="invalid"
|
||||
ARG RUST_VERSION="invalid"
|
||||
|
||||
RUN choco install -y pkgconfiglite nasm llvm openssl
|
||||
|
@ -13,10 +16,8 @@ RUN choco install -y pkgconfiglite nasm llvm openssl
|
|||
RUN setx PATH '%PATH%;C:\Program Files\NASM;C:\gst-install\bin'
|
||||
ENV PKG_CONFIG_PATH="C:\gst-install\lib\pkgconfig"
|
||||
|
||||
COPY install_gst.ps1 install_dav1d.ps1 C:\
|
||||
COPY install_gst.ps1 install_dav1d.ps1 install_rust.ps1 install_cargo_utils.ps1 C:\
|
||||
RUN C:\install_gst.ps1
|
||||
RUN C:\install_dav1d.ps1
|
||||
|
||||
RUN Invoke-WebRequest -Uri https://win.rustup.rs/x86_64 -OutFile C:\rustup-init.exe
|
||||
RUN C:\rustup-init.exe -y --profile minimal --default-toolchain $env:RUST_VERSION
|
||||
RUN cargo install --locked cargo-c --version 0.9.22+cargo-0.72
|
||||
RUN C:\install_rust.ps1
|
||||
RUN C:\install_cargo_utils.ps1
|
||||
|
|
18
ci/windows-docker/install_cargo_utils.ps1
Normal file
18
ci/windows-docker/install_cargo_utils.ps1
Normal file
|
@ -0,0 +1,18 @@
|
|||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
|
||||
|
||||
rustup --version
|
||||
rustc --version
|
||||
cargo --version
|
||||
|
||||
if ("$env:RUST_VERSION" -eq "1.71.1") {
|
||||
cargo install --locked cargo-c --version 0.9.26+cargo-0.74
|
||||
} else {
|
||||
cargo install --locked cargo-c --version 0.10.3+cargo-0.81
|
||||
}
|
||||
|
||||
if (!$?) {
|
||||
Write-Host "Failed to install cargo-c"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
cargo-cbuild --version
|
|
@ -1,7 +1,7 @@
|
|||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
|
||||
|
||||
# Download gstreamer and all its subprojects
|
||||
git clone -b 1.1.0 --depth 1 https://code.videolan.org/videolan/dav1d.git C:\dav1d
|
||||
git clone -b 1.4.3 --depth 1 https://code.videolan.org/videolan/dav1d.git C:\dav1d
|
||||
if (!$?) {
|
||||
Write-Host "Failed to clone dav1d"
|
||||
Exit 1
|
||||
|
|
|
@ -38,14 +38,12 @@ $MESON_ARGS = @(`
|
|||
"-Dpython=disabled", `
|
||||
"-Dlibav=disabled", `
|
||||
"-Dvaapi=disabled", `
|
||||
"-Dgtk=enabled", `
|
||||
"-Dgst-plugins-base:pango=enabled", `
|
||||
"-Dgst-plugins-good:cairo=enabled", `
|
||||
"-Dgst-plugins-good:lame=disabled"
|
||||
)
|
||||
|
||||
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
|
||||
echo "subproject('gtk')" >> meson.build
|
||||
|
||||
Write-Output "Building gstreamer"
|
||||
meson setup --vsenv $MESON_ARGS _build
|
||||
if (!$?) {
|
||||
|
|
17
ci/windows-docker/install_rust.ps1
Normal file
17
ci/windows-docker/install_rust.ps1
Normal file
|
@ -0,0 +1,17 @@
|
|||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
|
||||
|
||||
$rustup_url = 'https://win.rustup.rs/x86_64'
|
||||
|
||||
Invoke-WebRequest -Uri $rustup_url -OutFile C:\rustup-init.exe
|
||||
|
||||
if (!$?) {
|
||||
Write-Host "Failed to download rustup"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
C:\rustup-init.exe -y --profile minimal --default-toolchain $env:RUST_VERSION
|
||||
|
||||
if (!$?) {
|
||||
Write-Host "Failed to install rust"
|
||||
Exit 1
|
||||
}
|
22
deny.toml
22
deny.toml
|
@ -1,34 +1,30 @@
|
|||
[graph]
|
||||
exclude = [
|
||||
"examples",
|
||||
"tutorials",
|
||||
]
|
||||
|
||||
[advisories]
|
||||
version = 2
|
||||
db-path = "~/.cargo/advisory-db"
|
||||
db-urls = ["https://github.com/rustsec/advisory-db"]
|
||||
vulnerability = "deny"
|
||||
unmaintained = "warn"
|
||||
notice = "warn"
|
||||
ignore = []
|
||||
|
||||
[licenses]
|
||||
unlicensed = "deny"
|
||||
default = "deny"
|
||||
copyleft = "deny"
|
||||
allow-osi-fsf-free = "either"
|
||||
version = 2
|
||||
confidence-threshold = 0.8
|
||||
allow = [
|
||||
"MIT",
|
||||
"Apache-2.0",
|
||||
"Apache-2.0 WITH LLVM-exception",
|
||||
"Unicode-DFS-2016",
|
||||
]
|
||||
|
||||
[bans]
|
||||
multiple-versions = "deny"
|
||||
wildcards = "allow"
|
||||
highlight = "all"
|
||||
|
||||
# proc-macro-crate depends on an older version of toml_edit
|
||||
# https://github.com/bkchr/proc-macro-crate/pull/50
|
||||
[[bans.skip]]
|
||||
name = "toml_edit"
|
||||
version = "0.21"
|
||||
|
||||
[sources]
|
||||
unknown-registry = "deny"
|
||||
unknown-git = "deny"
|
||||
|
|
|
@ -30,8 +30,9 @@ byte-slice-cast = "1"
|
|||
cairo-rs = { workspace = true, features=["use_glib"], optional = true }
|
||||
derive_more = "0.99.5"
|
||||
futures = "0.3"
|
||||
glutin = { version = "0.31", optional = true, default-features = false }
|
||||
glutin-winit = { version = "0.4", optional = true, default-features = false }
|
||||
# Since there's nothing Windows-specific to enable on gstreamer-rs, unconditionally enable glutin's WGL backend
|
||||
glutin = { version = "0.31", optional = true, default-features = false, features = ["wgl"] }
|
||||
glutin-winit = { version = "0.4", optional = true, default-features = false, features = ["wgl"] }
|
||||
image = { version = "0.24", optional = true, default-features = false, features = ["png", "jpeg"] }
|
||||
memfd = { version = "0.6", optional = true }
|
||||
memmap2 = { version = "0.9", optional = true }
|
||||
|
@ -45,16 +46,22 @@ data-encoding = "2.0"
|
|||
once_cell = "1"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
windows = { version = "0.52", features=["Win32_Graphics_Direct3D11",
|
||||
windows = { version = "0.58", features=["Win32_Graphics_Direct3D11",
|
||||
"Win32_Foundation", "Win32_Graphics_Direct3D", "Win32_Graphics_Dxgi",
|
||||
"Win32_Graphics_Dxgi_Common", "Win32_Graphics_Direct2D",
|
||||
"Win32_Graphics_Direct2D_Common", "Win32_Graphics_DirectWrite",
|
||||
"Win32_Graphics_Imaging", "Win32_System_Com", "Foundation_Numerics"], optional = true }
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
cocoa = "0.25"
|
||||
cocoa = "0.26"
|
||||
objc = "0.2.7"
|
||||
|
||||
[target.'cfg(target_os = "macos")'.build-dependencies]
|
||||
system-deps = "7"
|
||||
|
||||
[package.metadata.system-deps]
|
||||
"gstreamer-1.0" = "1.14"
|
||||
|
||||
[build-dependencies]
|
||||
gl_generator = { version = "0.14", optional = true }
|
||||
|
||||
|
@ -204,3 +211,10 @@ required-features = ["cairo-rs", "gst-video/v1_18"]
|
|||
[[bin]]
|
||||
name = "d3d11videosink"
|
||||
required-features = ["windows"]
|
||||
|
||||
[[bin]]
|
||||
name = "audio_multichannel_interleave"
|
||||
|
||||
[[bin]]
|
||||
name = "zoom"
|
||||
required-features = ["gst-video/v1_18"]
|
||||
|
|
|
@ -19,4 +19,22 @@ fn generate_gl_bindings() {}
|
|||
fn main() {
|
||||
println!("cargo:rerun-if-changed=build.rs");
|
||||
generate_gl_bindings();
|
||||
|
||||
// https://github.com/rust-lang/cargo/issues/5077#issuecomment-1284482987
|
||||
#[cfg(all(not(docsrs), target_os = "macos"))]
|
||||
match system_deps::Config::new().probe() {
|
||||
Ok(deps) => {
|
||||
let usr = std::path::Path::new("/usr/lib");
|
||||
let usr_local = std::path::Path::new("/usr/local/lib");
|
||||
for dep in deps.all_link_paths() {
|
||||
if dep != &usr && dep != &usr_local {
|
||||
println!("cargo:rustc-link-arg=-Wl,-rpath,{:?}", dep.as_os_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(s) => {
|
||||
println!("cargo:warning={s}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,8 +10,6 @@
|
|||
// This is the format we request:
|
||||
// Audio / Signed 16bit / 1 channel / arbitrary sample rate
|
||||
|
||||
use std::i16;
|
||||
|
||||
use anyhow::Error;
|
||||
use byte_slice_cast::*;
|
||||
use derive_more::{Display, Error};
|
||||
|
|
153
examples/src/bin/audio_multichannel_interleave.rs
Normal file
153
examples/src/bin/audio_multichannel_interleave.rs
Normal file
|
@ -0,0 +1,153 @@
|
|||
// This example demonstrates how to mix multiple audio
|
||||
// streams into a single output using the audiomixer element.
|
||||
// In this case, we're mixing 4 stereo streams into a single 8 channel output.
|
||||
|
||||
use gst::prelude::*;
|
||||
use std::env;
|
||||
|
||||
#[path = "../examples-common.rs"]
|
||||
mod examples_common;
|
||||
|
||||
const TRACKS: i32 = 4;
|
||||
|
||||
fn create_source_and_link(pipeline: &gst::Pipeline, mixer: &gst::Element, track_number: i32) {
|
||||
let freq = ((track_number + 1) * 1000) as f64;
|
||||
let audiosrc = gst::ElementFactory::make("audiotestsrc")
|
||||
.property("freq", freq)
|
||||
.property("num-buffers", 2000)
|
||||
.build()
|
||||
.unwrap();
|
||||
let caps = gst_audio::AudioCapsBuilder::new().channels(2).build();
|
||||
let capsfilter = gst::ElementFactory::make("capsfilter")
|
||||
.property("caps", &caps)
|
||||
.build()
|
||||
.unwrap();
|
||||
|
||||
pipeline.add_many([&audiosrc, &capsfilter]).unwrap();
|
||||
gst::Element::link_many([&audiosrc, &capsfilter]).unwrap();
|
||||
|
||||
let src_pad = capsfilter.static_pad("src").unwrap();
|
||||
let mixer_pad = mixer.request_pad_simple("sink_%u").unwrap();
|
||||
|
||||
// audiomixer expects a mix-matrix set on each input pad,
|
||||
// indicating which output channels our input should appear in.
|
||||
// Rows => input channels, columns => output channels.
|
||||
// Here each input channel will appear in exactly one output channel.
|
||||
let mut mix_matrix: Vec<Vec<f32>> = vec![];
|
||||
for i in 0..TRACKS {
|
||||
if i == track_number {
|
||||
mix_matrix.push(vec![1.0, 0.0]);
|
||||
mix_matrix.push(vec![0.0, 1.0]);
|
||||
} else {
|
||||
mix_matrix.push(vec![0.0, 0.0]);
|
||||
mix_matrix.push(vec![0.0, 0.0]);
|
||||
}
|
||||
}
|
||||
let mut audiomixer_config = gst_audio::AudioConverterConfig::new();
|
||||
audiomixer_config.set_mix_matrix(&mix_matrix);
|
||||
mixer_pad.set_property("converter-config", audiomixer_config);
|
||||
|
||||
src_pad.link(&mixer_pad).unwrap();
|
||||
}
|
||||
|
||||
fn example_main() {
|
||||
gst::init().unwrap();
|
||||
|
||||
let args: Vec<_> = env::args().collect();
|
||||
let output_file = if args.len() == 2 {
|
||||
&args[1]
|
||||
} else {
|
||||
println!("Usage: audiomixer <output file>");
|
||||
std::process::exit(-1);
|
||||
};
|
||||
|
||||
let pipeline = gst::Pipeline::new();
|
||||
let audiomixer = gst::ElementFactory::make("audiomixer").build().unwrap();
|
||||
|
||||
// Using an arbitrary layout of 4 stereo pairs.
|
||||
let positions = [
|
||||
gst_audio::AudioChannelPosition::FrontLeft,
|
||||
gst_audio::AudioChannelPosition::FrontRight,
|
||||
gst_audio::AudioChannelPosition::RearLeft,
|
||||
gst_audio::AudioChannelPosition::RearRight,
|
||||
gst_audio::AudioChannelPosition::SideLeft,
|
||||
gst_audio::AudioChannelPosition::SideRight,
|
||||
gst_audio::AudioChannelPosition::TopFrontLeft,
|
||||
gst_audio::AudioChannelPosition::TopFrontRight,
|
||||
];
|
||||
|
||||
let mask = gst_audio::AudioChannelPosition::positions_to_mask(&positions, true).unwrap();
|
||||
let caps = gst_audio::AudioCapsBuilder::new()
|
||||
.channels(positions.len() as i32)
|
||||
.channel_mask(mask)
|
||||
.build();
|
||||
let capsfilter = gst::ElementFactory::make("capsfilter")
|
||||
.property("caps", &caps)
|
||||
.build()
|
||||
.unwrap();
|
||||
|
||||
let audioconvert = gst::ElementFactory::make("audioconvert").build().unwrap();
|
||||
let audioresample = gst::ElementFactory::make("audioresample").build().unwrap();
|
||||
let wavenc = gst::ElementFactory::make("wavenc").build().unwrap();
|
||||
let sink = gst::ElementFactory::make("filesink")
|
||||
.property("location", output_file)
|
||||
.build()
|
||||
.unwrap();
|
||||
|
||||
pipeline
|
||||
.add_many([
|
||||
&audiomixer,
|
||||
&capsfilter,
|
||||
&audioconvert,
|
||||
&audioresample,
|
||||
&wavenc,
|
||||
&sink,
|
||||
])
|
||||
.unwrap();
|
||||
gst::Element::link_many([
|
||||
&audiomixer,
|
||||
&capsfilter,
|
||||
&audioconvert,
|
||||
&audioresample,
|
||||
&wavenc,
|
||||
&sink,
|
||||
])
|
||||
.unwrap();
|
||||
|
||||
for i in 0..TRACKS {
|
||||
create_source_and_link(&pipeline, &audiomixer, i);
|
||||
}
|
||||
|
||||
let bus = pipeline.bus().expect("Pipeline without bus");
|
||||
|
||||
pipeline
|
||||
.set_state(gst::State::Playing)
|
||||
.expect("Unable to start pipeline");
|
||||
|
||||
for msg in bus.iter_timed(gst::ClockTime::NONE) {
|
||||
use gst::MessageView;
|
||||
match msg.view() {
|
||||
MessageView::Eos(..) => break,
|
||||
MessageView::Error(err) => {
|
||||
eprintln!(
|
||||
"Error from {:?}: {} ({:?})",
|
||||
msg.src().map(|s| s.path_string()),
|
||||
err.error(),
|
||||
err.debug()
|
||||
);
|
||||
break;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
|
||||
pipeline
|
||||
.set_state(gst::State::Null)
|
||||
.expect("Unable to change pipeline state to NULL");
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// tutorials_common::run is only required to set up the application environment on macOS
|
||||
// (but not necessary in normal Cocoa applications where this is set up automatically)
|
||||
examples_common::run(example_main);
|
||||
}
|
|
@ -194,7 +194,7 @@ fn main() -> Result<()> {
|
|||
let mut metrics = DWRITE_TEXT_METRICS::default();
|
||||
layout.GetMetrics(&mut metrics).unwrap();
|
||||
layout
|
||||
.GetFontSize2(0, &mut font_size, Some(&mut range))
|
||||
.GetFontSize(0, &mut font_size, Some(&mut range))
|
||||
.unwrap();
|
||||
|
||||
if metrics.widthIncludingTrailingWhitespace >= desc.Width as f32 {
|
||||
|
@ -304,7 +304,7 @@ fn main() -> Result<()> {
|
|||
// Add pad probe to calculate framerate
|
||||
let sinkpad = videosink.static_pad("sink").unwrap();
|
||||
let overlay_context_weak = Arc::downgrade(&overlay_context);
|
||||
sinkpad.add_probe(gst::PadProbeType::BUFFER, move |_, probe_info| {
|
||||
sinkpad.add_probe(gst::PadProbeType::BUFFER, move |_pad, _probe_info| {
|
||||
let overlay_context = overlay_context_weak.upgrade().unwrap();
|
||||
let mut context = overlay_context.lock().unwrap();
|
||||
context.timestamp_queue.push_back(SystemTime::now());
|
||||
|
|
|
@ -189,7 +189,7 @@ fn example_main() -> Result<(), Error> {
|
|||
("Failed to insert sink"),
|
||||
details: gst::Structure::builder("error-details")
|
||||
.field("error",
|
||||
&ErrorValue(Arc::new(Mutex::new(Some(err)))))
|
||||
ErrorValue(Arc::new(Mutex::new(Some(err)))))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
|
|
@ -215,7 +215,7 @@ fn example_main() -> Result<(), Error> {
|
|||
("Failed to insert sink"),
|
||||
details: gst::Structure::builder("error-details")
|
||||
.field("error",
|
||||
&ErrorValue(Arc::new(Mutex::new(Some(err)))))
|
||||
ErrorValue(Arc::new(Mutex::new(Some(err)))))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
|
|
@ -30,9 +30,44 @@ fn example_main() {
|
|||
let main_loop = glib::MainLoop::new(None, false);
|
||||
|
||||
// This creates a pipeline by parsing the gst-launch pipeline syntax.
|
||||
let pipeline = gst::parse::launch("audiotestsrc ! fakesink").unwrap();
|
||||
let pipeline = gst::parse::launch("audiotestsrc ! identity name=capsmut ! fakesink").unwrap();
|
||||
let bus = pipeline.bus().unwrap();
|
||||
|
||||
// This is a contrived example to mutate events. This would normally be code inside an element,
|
||||
// which might transform caps to reflect transformation in the data
|
||||
let identity = pipeline
|
||||
.downcast_ref::<gst::Bin>()
|
||||
.unwrap()
|
||||
.by_name("capsmut")
|
||||
.unwrap();
|
||||
let _ = identity.static_pad("sink").unwrap().add_probe(
|
||||
gst::PadProbeType::EVENT_DOWNSTREAM,
|
||||
move |_, probe_info| {
|
||||
let Some(e) = probe_info.event() else {
|
||||
return gst::PadProbeReturn::Ok;
|
||||
};
|
||||
|
||||
if e.type_() != gst::EventType::Caps {
|
||||
return gst::PadProbeReturn::Ok;
|
||||
};
|
||||
|
||||
let mut ev = probe_info.take_event().unwrap();
|
||||
let ev_ref = ev.make_mut();
|
||||
|
||||
let gst::EventViewMut::Caps(caps) = ev_ref.view_mut() else {
|
||||
unreachable!()
|
||||
};
|
||||
|
||||
caps.structure_mut().set("custom-field", true);
|
||||
identity
|
||||
.static_pad("src")
|
||||
.unwrap()
|
||||
.push_event(ev_ref.to_owned());
|
||||
|
||||
gst::PadProbeReturn::Drop
|
||||
},
|
||||
);
|
||||
|
||||
pipeline
|
||||
.set_state(gst::State::Playing)
|
||||
.expect("Unable to set the pipeline to the `Playing` state");
|
||||
|
|
|
@ -459,7 +459,7 @@ mod video_filter {
|
|||
frame: &mut VideoFrameRef<&mut gst::BufferRef>,
|
||||
) -> Result<gst::FlowSuccess, gst::FlowError> {
|
||||
self.transform_fd_mem_ip(frame).map_err(|err| {
|
||||
gst::error!(CAT, imp: self, "Failed to transform frame`: {}", err);
|
||||
gst::error!(CAT, imp = self, "Failed to transform frame`: {}", err);
|
||||
gst::FlowError::Error
|
||||
})?;
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ mod mirror {
|
|||
|
||||
gst::debug!(
|
||||
CAT,
|
||||
imp: self,
|
||||
imp = self,
|
||||
"Compiling fragment shader {}",
|
||||
FRAGMENT_SHADER
|
||||
);
|
||||
|
@ -99,7 +99,7 @@ mod mirror {
|
|||
|
||||
gst::debug!(
|
||||
CAT,
|
||||
imp: self,
|
||||
imp = self,
|
||||
"Successfully compiled and linked {:?}",
|
||||
shader
|
||||
);
|
||||
|
|
|
@ -132,116 +132,125 @@ fn create_pipeline() -> Result<gst::Pipeline, Error> {
|
|||
overlay.connect_closure(
|
||||
"draw",
|
||||
false,
|
||||
glib::closure!(@strong drawer => move |_overlay: &gst::Element,
|
||||
sample: &gst::Sample| {
|
||||
use std::f64::consts::PI;
|
||||
glib::closure!(
|
||||
#[strong]
|
||||
drawer,
|
||||
move |_overlay: &gst::Element, sample: &gst::Sample| {
|
||||
use std::f64::consts::PI;
|
||||
|
||||
let drawer = drawer.lock().unwrap();
|
||||
let drawer = drawer.lock().unwrap();
|
||||
|
||||
let buffer = sample.buffer().unwrap();
|
||||
let timestamp = buffer.pts().unwrap();
|
||||
let buffer = sample.buffer().unwrap();
|
||||
let timestamp = buffer.pts().unwrap();
|
||||
|
||||
let info = drawer.info.as_ref().unwrap();
|
||||
let text_layout = &drawer.text_layout;
|
||||
let bitmap = drawer.bitmap.as_ref().unwrap();
|
||||
let render_target = drawer.render_target.as_ref().unwrap();
|
||||
let info = drawer.info.as_ref().unwrap();
|
||||
let text_layout = &drawer.text_layout;
|
||||
let bitmap = drawer.bitmap.as_ref().unwrap();
|
||||
let render_target = drawer.render_target.as_ref().unwrap();
|
||||
|
||||
let global_angle = 360. * (timestamp % (10 * gst::ClockTime::SECOND)).nseconds() as f64
|
||||
/ (10.0 * gst::ClockTime::SECOND.nseconds() as f64);
|
||||
let center_x = (info.width() / 2) as f32;
|
||||
let center_y = (info.height() / 2) as f32;
|
||||
let top_margin = (info.height() / 20) as f32;
|
||||
|
||||
unsafe {
|
||||
// Begin drawing
|
||||
render_target.BeginDraw();
|
||||
|
||||
// Clear background
|
||||
render_target.Clear(Some(&D2D1_COLOR_F {
|
||||
r: 0f32,
|
||||
g: 0f32,
|
||||
b: 0f32,
|
||||
a: 0f32,
|
||||
}));
|
||||
|
||||
// This loop will render 10 times the string "GStreamer" in a circle
|
||||
for i in 0..10 {
|
||||
let angle = (360. * f64::from(i)) / 10.0;
|
||||
let red = ((1.0 + f64::cos((angle - 60.0) * PI / 180.0)) / 2.0) as f32;
|
||||
let text_brush = render_target
|
||||
.CreateSolidColorBrush(
|
||||
&D2D1_COLOR_F {
|
||||
r: red,
|
||||
g: 0f32,
|
||||
b: 1f32 - red,
|
||||
a: 1f32,
|
||||
},
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let angle = (angle + global_angle) as f32;
|
||||
let matrix = Matrix3x2::rotation(angle, center_x, center_y);
|
||||
render_target.SetTransform(&matrix);
|
||||
render_target.DrawTextLayout(
|
||||
D2D_POINT_2F { x: 0f32, y: top_margin },
|
||||
text_layout,
|
||||
&text_brush,
|
||||
D2D1_DRAW_TEXT_OPTIONS_NONE,
|
||||
);
|
||||
}
|
||||
|
||||
// EndDraw may not be successful for some reasons.
|
||||
// Ignores any error in this example
|
||||
let _ = render_target.EndDraw(None, None);
|
||||
|
||||
// Make sure all operations is completed before copying
|
||||
// bitmap to buffer
|
||||
let _ = render_target.Flush(None::<*mut u64>, None::<*mut u64>);
|
||||
}
|
||||
|
||||
let mut buffer = gst::Buffer::with_size((info.width() * info.height() * 4) as usize).unwrap();
|
||||
{
|
||||
let buffer_mut = buffer.get_mut().unwrap();
|
||||
let mut map = buffer_mut.map_writable().unwrap();
|
||||
let dst = map.as_mut_slice_of::<u8>().unwrap();
|
||||
let global_angle = 360.
|
||||
* (timestamp % (10 * gst::ClockTime::SECOND)).nseconds() as f64
|
||||
/ (10.0 * gst::ClockTime::SECOND.nseconds() as f64);
|
||||
let center_x = (info.width() / 2) as f32;
|
||||
let center_y = (info.height() / 2) as f32;
|
||||
let top_margin = (info.height() / 20) as f32;
|
||||
|
||||
unsafe {
|
||||
// Bitmap size is equal to the background image size.
|
||||
// Copy entire memory
|
||||
bitmap.CopyPixels(std::ptr::null(), info.width() * 4, dst).unwrap();
|
||||
// Begin drawing
|
||||
render_target.BeginDraw();
|
||||
|
||||
// Clear background
|
||||
render_target.Clear(Some(&D2D1_COLOR_F {
|
||||
r: 0f32,
|
||||
g: 0f32,
|
||||
b: 0f32,
|
||||
a: 0f32,
|
||||
}));
|
||||
|
||||
// This loop will render 10 times the string "GStreamer" in a circle
|
||||
for i in 0..10 {
|
||||
let angle = (360. * f64::from(i)) / 10.0;
|
||||
let red = ((1.0 + f64::cos((angle - 60.0) * PI / 180.0)) / 2.0) as f32;
|
||||
let text_brush = render_target
|
||||
.CreateSolidColorBrush(
|
||||
&D2D1_COLOR_F {
|
||||
r: red,
|
||||
g: 0f32,
|
||||
b: 1f32 - red,
|
||||
a: 1f32,
|
||||
},
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let angle = (angle + global_angle) as f32;
|
||||
let matrix = Matrix3x2::rotation(angle, center_x, center_y);
|
||||
render_target.SetTransform(&matrix);
|
||||
render_target.DrawTextLayout(
|
||||
D2D_POINT_2F {
|
||||
x: 0f32,
|
||||
y: top_margin,
|
||||
},
|
||||
text_layout,
|
||||
&text_brush,
|
||||
D2D1_DRAW_TEXT_OPTIONS_NONE,
|
||||
);
|
||||
}
|
||||
|
||||
// EndDraw may not be successful for some reasons.
|
||||
// Ignores any error in this example
|
||||
let _ = render_target.EndDraw(None, None);
|
||||
|
||||
// Make sure all operations is completed before copying
|
||||
// bitmap to buffer
|
||||
let _ = render_target.Flush(None::<*mut u64>, None::<*mut u64>);
|
||||
}
|
||||
|
||||
let mut buffer =
|
||||
gst::Buffer::with_size((info.width() * info.height() * 4) as usize).unwrap();
|
||||
{
|
||||
let buffer_mut = buffer.get_mut().unwrap();
|
||||
let mut map = buffer_mut.map_writable().unwrap();
|
||||
let dst = map.as_mut_slice_of::<u8>().unwrap();
|
||||
|
||||
unsafe {
|
||||
// Bitmap size is equal to the background image size.
|
||||
// Copy entire memory
|
||||
bitmap
|
||||
.CopyPixels(std::ptr::null(), info.width() * 4, dst)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
gst_video::VideoMeta::add_full(
|
||||
buffer.get_mut().unwrap(),
|
||||
gst_video::VideoFrameFlags::empty(),
|
||||
gst_video::VideoFormat::Bgra,
|
||||
info.width(),
|
||||
info.height(),
|
||||
&[0],
|
||||
&[(info.width() * 4) as i32],
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
// Turn the buffer into a VideoOverlayRectangle, then place
|
||||
// that into a VideoOverlayComposition and return it.
|
||||
//
|
||||
// A VideoOverlayComposition can take a Vec of such rectangles
|
||||
// spaced around the video frame, but we're just outputting 1
|
||||
// here
|
||||
let rect = gst_video::VideoOverlayRectangle::new_raw(
|
||||
&buffer,
|
||||
0,
|
||||
0,
|
||||
info.width(),
|
||||
info.height(),
|
||||
gst_video::VideoOverlayFormatFlags::PREMULTIPLIED_ALPHA,
|
||||
);
|
||||
|
||||
gst_video::VideoOverlayComposition::new(Some(&rect)).unwrap()
|
||||
}
|
||||
|
||||
gst_video::VideoMeta::add_full(
|
||||
buffer.get_mut().unwrap(),
|
||||
gst_video::VideoFrameFlags::empty(),
|
||||
gst_video::VideoFormat::Bgra,
|
||||
info.width(),
|
||||
info.height(),
|
||||
&[0],
|
||||
&[(info.width() * 4) as i32],
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
// Turn the buffer into a VideoOverlayRectangle, then place
|
||||
// that into a VideoOverlayComposition and return it.
|
||||
//
|
||||
// A VideoOverlayComposition can take a Vec of such rectangles
|
||||
// spaced around the video frame, but we're just outputting 1
|
||||
// here
|
||||
let rect = gst_video::VideoOverlayRectangle::new_raw(
|
||||
&buffer,
|
||||
0,
|
||||
0,
|
||||
info.width(),
|
||||
info.height(),
|
||||
gst_video::VideoOverlayFormatFlags::PREMULTIPLIED_ALPHA,
|
||||
);
|
||||
|
||||
gst_video::VideoOverlayComposition::new(Some(&rect))
|
||||
.unwrap()
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
// Add a signal handler to the overlay's "caps-changed" signal. This could e.g.
|
||||
|
|
|
@ -119,8 +119,9 @@ fn create_pipeline() -> Result<gst::Pipeline, Error> {
|
|||
overlay.connect_closure(
|
||||
"draw",
|
||||
false,
|
||||
glib::closure!(@strong drawer => move |_overlay: &gst::Element,
|
||||
sample: &gst::Sample| {
|
||||
glib::closure!(
|
||||
#[strong] drawer,
|
||||
move |_overlay: &gst::Element, sample: &gst::Sample| {
|
||||
use std::f64::consts::PI;
|
||||
|
||||
let drawer = drawer.lock().unwrap();
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
// {audiotestsrc} - {fakesink}
|
||||
#![allow(clippy::question_mark)]
|
||||
|
||||
use std::i16;
|
||||
|
||||
use byte_slice_cast::*;
|
||||
use gst::prelude::*;
|
||||
|
||||
|
|
|
@ -36,14 +36,14 @@ fn example_main() {
|
|||
// For flags handling
|
||||
// With flags, one can configure playbin's behavior such as whether it
|
||||
// should play back contained video streams, or if it should render subtitles.
|
||||
// let flags = playbin.get_property("flags").unwrap();
|
||||
// let flags_class = FlagsClass::new(flags.type_()).unwrap();
|
||||
// let flags = playbin.property_value("flags");
|
||||
// let flags_class = FlagsClass::with_type(flags.type_()).unwrap();
|
||||
// let flags = flags_class.builder_with_value(flags).unwrap()
|
||||
// .unset_by_nick("text")
|
||||
// .unset_by_nick("video")
|
||||
// .build()
|
||||
// .unwrap();
|
||||
// playbin.set_property_from_value("flags", &flags).unwrap();
|
||||
// playbin.set_property_from_value("flags", &flags);
|
||||
|
||||
// The playbin also provides any kind of metadata that it found in the played stream.
|
||||
// For this, the playbin provides signals notifying about changes in the metadata.
|
||||
|
|
|
@ -138,7 +138,11 @@ mod auth {
|
|||
if let Some(authorization) = auth_credentials.authorization() {
|
||||
if let Some(user) = self.external_auth(authorization) {
|
||||
// Update context token with authenticated username
|
||||
ctx.set_token(gst_rtsp_server::RTSPToken::new(&[("user", &user)]));
|
||||
ctx.set_token(
|
||||
gst_rtsp_server::RTSPToken::builder()
|
||||
.field("user", user)
|
||||
.build(),
|
||||
);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,11 +4,10 @@
|
|||
// send to the server. For this, the launch syntax pipeline, that is passed
|
||||
// to this example's cli is spawned and the client's media is streamed into it.
|
||||
|
||||
use std::{env, ptr};
|
||||
use std::env;
|
||||
|
||||
use anyhow::Error;
|
||||
use derive_more::{Display, Error};
|
||||
use glib::translate::*;
|
||||
use gst_rtsp_server::prelude::*;
|
||||
|
||||
#[path = "../examples-common.rs"]
|
||||
|
@ -45,10 +44,9 @@ fn main_loop() -> Result<(), Error> {
|
|||
// Here we configure a method of authentication that we want the
|
||||
// server to require from clients.
|
||||
let auth = gst_rtsp_server::RTSPAuth::new();
|
||||
let token = gst_rtsp_server::RTSPToken::new(&[(
|
||||
gst_rtsp_server::RTSP_TOKEN_MEDIA_FACTORY_ROLE,
|
||||
&"user",
|
||||
)]);
|
||||
let token = gst_rtsp_server::RTSPToken::builder()
|
||||
.field(gst_rtsp_server::RTSP_TOKEN_MEDIA_FACTORY_ROLE, "user")
|
||||
.build();
|
||||
let basic = gst_rtsp_server::RTSPAuth::make_basic("user", "password");
|
||||
// For proper authentication, we want to use encryption. And there's no
|
||||
// encryption without a certificate!
|
||||
|
@ -78,24 +76,14 @@ fn main_loop() -> Result<(), Error> {
|
|||
W535W8UBbEg=-----END PRIVATE KEY-----",
|
||||
)?;
|
||||
|
||||
// Bindable versions were added in b1f515178a363df0322d7adbd5754e1f6e2083c9
|
||||
// This declares that the user "user" (once authenticated) has a role that
|
||||
// allows them to access and construct media factories.
|
||||
unsafe {
|
||||
gst_rtsp_server::ffi::gst_rtsp_media_factory_add_role(
|
||||
factory.to_glib_none().0,
|
||||
"user".to_glib_none().0,
|
||||
gst_rtsp_server::RTSP_PERM_MEDIA_FACTORY_ACCESS
|
||||
.to_glib_none()
|
||||
.0,
|
||||
<bool as StaticType>::static_type().into_glib() as *const u8,
|
||||
true.into_glib() as *const u8,
|
||||
gst_rtsp_server::RTSP_PERM_MEDIA_FACTORY_CONSTRUCT.as_ptr() as *const u8,
|
||||
<bool as StaticType>::static_type().into_glib() as *const u8,
|
||||
true.into_glib() as *const u8,
|
||||
ptr::null_mut::<u8>(),
|
||||
);
|
||||
}
|
||||
factory.add_role_from_structure(
|
||||
&gst::Structure::builder("user")
|
||||
.field(gst_rtsp_server::RTSP_PERM_MEDIA_FACTORY_ACCESS, true)
|
||||
.field(gst_rtsp_server::RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, true)
|
||||
.build(),
|
||||
);
|
||||
|
||||
auth.set_tls_certificate(Some(&cert));
|
||||
auth.add_basic(basic.as_str(), &token);
|
||||
|
|
|
@ -19,10 +19,6 @@ mod examples_common;
|
|||
#[display(fmt = "Could not get mount points")]
|
||||
struct NoMountPoints;
|
||||
|
||||
#[derive(Debug, Display, Error)]
|
||||
#[display(fmt = "Usage: {_0} LAUNCH_LINE")]
|
||||
struct UsageError(#[error(not(source))] String);
|
||||
|
||||
fn main_loop() -> Result<(), Error> {
|
||||
let main_loop = glib::MainLoop::new(None, false);
|
||||
let server = server::Server::default();
|
||||
|
|
|
@ -142,7 +142,7 @@ mod fir_filter {
|
|||
// Drop state
|
||||
self.history.lock().unwrap().clear();
|
||||
|
||||
gst::info!(CAT, imp: self, "Stopped");
|
||||
gst::info!(CAT, imp = self, "Stopped");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ mod fir_filter {
|
|||
// Get coefficients and return directly if we have none
|
||||
let coeffs = self.coeffs.lock().unwrap();
|
||||
if coeffs.is_empty() {
|
||||
gst::trace!(CAT, imp: self, "No coefficients set -- passthrough");
|
||||
gst::trace!(CAT, imp = self, "No coefficients set -- passthrough");
|
||||
return Ok(gst::FlowSuccess::Ok);
|
||||
}
|
||||
|
||||
|
@ -183,7 +183,7 @@ mod fir_filter {
|
|||
|
||||
gst::trace!(
|
||||
CAT,
|
||||
imp: self,
|
||||
imp = self,
|
||||
"Transforming {} samples with filter of length {}",
|
||||
samples.len(),
|
||||
coeffs.len()
|
||||
|
|
|
@ -116,7 +116,7 @@ impl BaseTransformImpl for IirFilter {
|
|||
}
|
||||
|
||||
let mut map = buf.map_writable().map_err(|_| {
|
||||
gst::error!(CAT, imp: self, "Failed to map buffer writable");
|
||||
gst::error!(CAT, imp = self, "Failed to map buffer writable");
|
||||
gst::FlowError::Error
|
||||
})?;
|
||||
|
||||
|
@ -166,7 +166,7 @@ impl AudioFilterImpl for IirFilter {
|
|||
fn setup(&self, info: &gst_audio::AudioInfo) -> Result<(), gst::LoggableError> {
|
||||
self.parent_setup(info)?;
|
||||
|
||||
gst::debug!(CAT, imp: self, "Rate changed to {}", info.rate());
|
||||
gst::debug!(CAT, imp = self, "Rate changed to {}", info.rate());
|
||||
let obj = self.obj();
|
||||
(obj.class().as_ref().set_rate)(&obj, info.rate());
|
||||
|
||||
|
@ -177,7 +177,7 @@ impl AudioFilterImpl for IirFilter {
|
|||
/// Wrappers for public methods and associated helper functions.
|
||||
impl IirFilter {
|
||||
pub(super) fn set_coeffs(&self, a: Vec<f64>, b: Vec<f64>) {
|
||||
gst::debug!(CAT, imp: self, "Setting coefficients a: {a:?}, b: {b:?}");
|
||||
gst::debug!(CAT, imp = self, "Setting coefficients a: {a:?}, b: {b:?}");
|
||||
*self.coeffs.lock().unwrap() = Some((a, b));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -177,7 +177,6 @@ fn example_main() {
|
|||
state.clicked = false;
|
||||
}
|
||||
}
|
||||
#[cfg(feature = "v1_18")]
|
||||
NavigationEvent::MouseScroll { x, y, delta_y, .. } => {
|
||||
if delta_y > 0.0 {
|
||||
zoom(mixer_sink_pad, x as i32, y as i32, true);
|
||||
|
|
|
@ -29,7 +29,7 @@ where
|
|||
delegate,
|
||||
};
|
||||
use objc::{
|
||||
class, msg_send,
|
||||
msg_send,
|
||||
runtime::{Object, Sel},
|
||||
sel, sel_impl,
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@ use std::{
|
|||
mem,
|
||||
num::NonZeroU32,
|
||||
ptr,
|
||||
sync::Mutex,
|
||||
};
|
||||
|
||||
use anyhow::{Context, Result};
|
||||
|
@ -81,6 +82,7 @@ void main() {
|
|||
#[allow(clippy::too_many_arguments)]
|
||||
#[allow(clippy::manual_non_exhaustive)]
|
||||
#[allow(clippy::upper_case_acronyms)]
|
||||
#[allow(clippy::missing_transmute_annotations)]
|
||||
pub(crate) mod gl {
|
||||
pub use self::Gles2 as Gl;
|
||||
include!(concat!(env!("OUT_DIR"), "/test_gl_bindings.rs"));
|
||||
|
@ -433,8 +435,8 @@ impl App {
|
|||
|
||||
println!("Using raw GL context {:?}", raw_gl_context);
|
||||
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
compile_error!("This example only has Linux support");
|
||||
#[cfg(not(any(target_os = "linux", windows)))]
|
||||
compile_error!("This example only has Linux and Windows support");
|
||||
|
||||
let api = App::map_gl_api(gl_config.api());
|
||||
|
||||
|
@ -448,7 +450,6 @@ impl App {
|
|||
unsafe { gst_gl_egl::GLDisplayEGL::with_egl_display(egl_display as usize) }
|
||||
.context("Failed to create GLDisplayEGL from raw `EGLDisplay`")?
|
||||
.upcast::<gst_gl::GLDisplay>();
|
||||
|
||||
(egl_context as usize, gl_display, gst_gl::GLPlatform::EGL)
|
||||
}
|
||||
#[cfg(feature = "gst-gl-x11")]
|
||||
|
@ -462,6 +463,11 @@ impl App {
|
|||
.upcast::<gst_gl::GLDisplay>();
|
||||
(glx_context as usize, gl_display, gst_gl::GLPlatform::GLX)
|
||||
}
|
||||
#[cfg(windows)]
|
||||
(glutin::display::RawDisplay::Wgl, glutin::context::RawContext::Wgl(wgl_context)) => {
|
||||
let gl_display = gst_gl::GLDisplay::new();
|
||||
(wgl_context as usize, gl_display, gst_gl::GLPlatform::WGL)
|
||||
}
|
||||
#[allow(unreachable_patterns)]
|
||||
handler => anyhow::bail!("Unsupported platform: {handler:?}."),
|
||||
};
|
||||
|
@ -472,7 +478,9 @@ impl App {
|
|||
.context("Couldn't wrap GL context")?;
|
||||
|
||||
let gl_context = shared_context.clone();
|
||||
let event_proxy = event_loop.create_proxy();
|
||||
// FIXME: Once MSRV is 1.72 the Mutex is not necessary anymore because
|
||||
// std::sync::mpsc::Sender is Sync by itself
|
||||
let event_proxy = Mutex::new(event_loop.create_proxy());
|
||||
|
||||
#[allow(clippy::single_match)]
|
||||
bus.set_sync_handler(move |_, msg| {
|
||||
|
@ -505,7 +513,7 @@ impl App {
|
|||
_ => (),
|
||||
}
|
||||
|
||||
if let Err(e) = event_proxy.send_event(Message::BusEvent) {
|
||||
if let Err(e) = event_proxy.lock().unwrap().send_event(Message::BusEvent) {
|
||||
eprintln!("Failed to send BusEvent to event proxy: {e}")
|
||||
}
|
||||
|
||||
|
|
2
gir
2
gir
|
@ -1 +1 @@
|
|||
Subproject commit 0e476ab5c1dec04355e4f516ebcce4edaa940c9e
|
||||
Subproject commit a11b11f2e403d615edd94497b6fe5b3c5283145b
|
|
@ -1 +1 @@
|
|||
Subproject commit cfc0305f903bcce1c9fb5b5055d3ae8a30912750
|
||||
Subproject commit 62da9eb7c4bd5d6091a0eaab0d5e97a51f59fd6d
|
|
@ -1 +1 @@
|
|||
Subproject commit 39e21eeb5d1062772e57f62571b00fe5f3f379b4
|
||||
Subproject commit db97a3ad67f5d3e46d88ddfb498344cbd3e08731
|
|
@ -15,7 +15,7 @@ rust-version.workspace = true
|
|||
|
||||
[dependencies]
|
||||
libc = "0.2"
|
||||
ffi = { package = "gstreamer-allocators-sys", path = "sys", version = "0.22" }
|
||||
gstreamer-allocators-sys.workspace = true
|
||||
glib.workspace = true
|
||||
gst.workspace = true
|
||||
once_cell = "1"
|
||||
|
@ -25,11 +25,12 @@ gir-format-check = "0.1"
|
|||
|
||||
[features]
|
||||
default = []
|
||||
v1_16 = ["gst/v1_16", "ffi/v1_16"]
|
||||
v1_18 = ["gst/v1_18", "ffi/v1_18", "v1_16"]
|
||||
v1_20 = ["gst/v1_20", "ffi/v1_20", "v1_18"]
|
||||
v1_22 = ["gst/v1_22", "ffi/v1_22", "v1_20"]
|
||||
v1_24 = ["gst/v1_24", "ffi/v1_24", "v1_22"]
|
||||
v1_16 = ["gst/v1_16", "gstreamer-allocators-sys/v1_16"]
|
||||
v1_18 = ["gst/v1_18", "gstreamer-allocators-sys/v1_18", "v1_16"]
|
||||
v1_20 = ["gst/v1_20", "gstreamer-allocators-sys/v1_20", "v1_18"]
|
||||
v1_22 = ["gst/v1_22", "gstreamer-allocators-sys/v1_22", "v1_20"]
|
||||
v1_24 = ["gst/v1_24", "gstreamer-allocators-sys/v1_24", "v1_22"]
|
||||
v1_26 = ["gst/v1_26", "gstreamer-allocators-sys/v1_26", "v1_24"]
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
all-features = true
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::GStr;
|
||||
|
||||
#[doc(alias = "GST_ALLOCATOR_DMABUF")]
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::FdAllocator;
|
||||
use crate::{ffi, FdAllocator};
|
||||
use glib::{prelude::*, translate::*};
|
||||
|
||||
glib::wrapper! {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{prelude::*, translate::*};
|
||||
|
||||
glib::wrapper! {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{prelude::*, translate::*};
|
||||
|
||||
glib::wrapper! {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{bitflags::bitflags, translate::*};
|
||||
|
||||
bitflags! {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::prelude::*;
|
||||
|
||||
glib::wrapper! {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::FdAllocator;
|
||||
use crate::{ffi, FdAllocator};
|
||||
|
||||
glib::wrapper! {
|
||||
#[doc(alias = "GstShmAllocator")]
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Generated by gir (https://github.com/gtk-rs/gir @ 0e476ab5c1de)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ cfc0305f903b)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ 39e21eeb5d10)
|
||||
Generated by gir (https://github.com/gtk-rs/gir @ a11b11f2e403)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ 62da9eb7c4bd)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ db97a3ad67f5)
|
||||
|
|
|
@ -9,7 +9,7 @@ use gst::{Memory, MemoryRef};
|
|||
#[cfg(feature = "v1_16")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
|
||||
use crate::FdMemoryFlags;
|
||||
use crate::{DmaBufAllocator, FdMemory, FdMemoryRef};
|
||||
use crate::{ffi, DmaBufAllocator, FdMemory, FdMemoryRef};
|
||||
|
||||
gst::memory_object_wrapper!(
|
||||
DmaBufMemory,
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::{fmt, mem, os::unix::prelude::IntoRawFd};
|
|||
use glib::{prelude::*, translate::*};
|
||||
use gst::{Memory, MemoryRef};
|
||||
|
||||
use crate::{DRMDumbAllocator, DmaBufMemory};
|
||||
use crate::{ffi, DRMDumbAllocator, DmaBufMemory};
|
||||
|
||||
gst::memory_object_wrapper!(
|
||||
DRMDumbMemory,
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::{fmt, os::unix::prelude::RawFd};
|
|||
use glib::{prelude::*, translate::*};
|
||||
use gst::{Memory, MemoryRef};
|
||||
|
||||
use crate::{FdAllocator, FdMemoryFlags};
|
||||
use crate::{ffi, FdAllocator, FdMemoryFlags};
|
||||
|
||||
gst::memory_object_wrapper!(
|
||||
FdMemory,
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
#![allow(clippy::missing_safety_doc)]
|
||||
#![doc = include_str!("../README.md")]
|
||||
|
||||
pub use ffi;
|
||||
pub use glib;
|
||||
pub use gst;
|
||||
pub use gstreamer_allocators_sys as ffi;
|
||||
|
||||
macro_rules! assert_initialized_main_thread {
|
||||
() => {
|
||||
|
@ -56,6 +56,8 @@ pub use phys_memory::*;
|
|||
pub mod prelude {
|
||||
#[doc(hidden)]
|
||||
pub use gst::prelude::*;
|
||||
|
||||
pub use crate::auto::traits::*;
|
||||
}
|
||||
|
||||
pub mod subclass;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use std::fmt;
|
||||
|
||||
use crate::ffi;
|
||||
use glib::translate::*;
|
||||
use gst::{Memory, MemoryRef};
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use glib::translate::*;
|
||||
|
||||
use crate::ShmAllocator;
|
||||
use crate::{ffi, ShmAllocator};
|
||||
|
||||
impl ShmAllocator {
|
||||
#[doc(alias = "gst_shm_allocator_get")]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[build-dependencies]
|
||||
system-deps = "6"
|
||||
system-deps = "7"
|
||||
|
||||
[dependencies]
|
||||
libc = "0.2"
|
||||
|
@ -23,6 +23,7 @@ v1_18 = ["v1_16"]
|
|||
v1_20 = ["v1_18"]
|
||||
v1_22 = ["v1_20"]
|
||||
v1_24 = ["v1_22"]
|
||||
v1_26 = ["v1_24"]
|
||||
|
||||
[lib]
|
||||
name = "gstreamer_allocators_sys"
|
||||
|
@ -77,4 +78,7 @@ version = "1.20"
|
|||
version = "1.22"
|
||||
|
||||
[package.metadata.system-deps.gstreamer_allocators_1_0.v1_24]
|
||||
version = "1.23"
|
||||
version = "1.24"
|
||||
|
||||
[package.metadata.system-deps.gstreamer_allocators_1_0.v1_26]
|
||||
version = "1.25"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Generated by gir (https://github.com/gtk-rs/gir @ 0e476ab5c1de)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ cfc0305f903b)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ 39e21eeb5d10)
|
||||
Generated by gir (https://github.com/gtk-rs/gir @ a11b11f2e403)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ 62da9eb7c4bd)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ db97a3ad67f5)
|
||||
|
|
|
@ -16,10 +16,14 @@ use glib_sys as glib;
|
|||
use gobject_sys as gobject;
|
||||
use gstreamer_sys as gst;
|
||||
|
||||
#[cfg(unix)]
|
||||
#[allow(unused_imports)]
|
||||
use libc::{
|
||||
use libc::{dev_t, gid_t, pid_t, socklen_t, uid_t};
|
||||
#[allow(unused_imports)]
|
||||
use libc::{intptr_t, off_t, size_t, ssize_t, time_t, uintptr_t, FILE};
|
||||
#[allow(unused_imports)]
|
||||
use std::ffi::{
|
||||
c_char, c_double, c_float, c_int, c_long, c_short, c_uchar, c_uint, c_ulong, c_ushort, c_void,
|
||||
intptr_t, size_t, ssize_t, uintptr_t, FILE,
|
||||
};
|
||||
|
||||
#[allow(unused_imports)]
|
||||
|
@ -114,6 +118,7 @@ impl ::std::fmt::Debug for GstShmAllocatorClass {
|
|||
|
||||
// Classes
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct GstDRMDumbAllocator {
|
||||
_data: [u8; 0],
|
||||
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
|
||||
|
@ -156,6 +161,7 @@ impl ::std::fmt::Debug for GstFdAllocator {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct GstShmAllocator {
|
||||
_data: [u8; 0],
|
||||
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
|
||||
|
@ -170,6 +176,7 @@ impl ::std::fmt::Debug for GstShmAllocator {
|
|||
|
||||
// Interfaces
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct GstPhysMemoryAllocator {
|
||||
_data: [u8; 0],
|
||||
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
|
||||
|
@ -181,7 +188,6 @@ impl ::std::fmt::Debug for GstPhysMemoryAllocator {
|
|||
}
|
||||
}
|
||||
|
||||
#[link(name = "gstallocators-1.0")]
|
||||
extern "C" {
|
||||
|
||||
//=========================================================================
|
||||
|
|
|
@ -15,7 +15,7 @@ rust-version.workspace = true
|
|||
|
||||
[dependencies]
|
||||
libc = "0.2"
|
||||
ffi = { package = "gstreamer-analytics-sys", path = "sys", version = "0.22" }
|
||||
gstreamer-analytics-sys.workspace = true
|
||||
glib.workspace = true
|
||||
gst.workspace = true
|
||||
|
||||
|
@ -24,6 +24,7 @@ gir-format-check = "0.1"
|
|||
|
||||
[features]
|
||||
default = []
|
||||
v1_26 = ["gst/v1_26", "gstreamer-analytics-sys/v1_26"]
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
all-features = true
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{bitflags::bitflags, translate::*};
|
||||
|
||||
bitflags! {
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Generated by gir (https://github.com/gtk-rs/gir @ 0e476ab5c1de)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ cfc0305f903b)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ 39e21eeb5d10)
|
||||
Generated by gir (https://github.com/gtk-rs/gir @ a11b11f2e403)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ 62da9eb7c4bd)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ db97a3ad67f5)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
use glib::translate::*;
|
||||
|
||||
use crate::relation_meta::*;
|
||||
use crate::{ffi, relation_meta::*};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum AnalyticsClassificationMtd {}
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
#![allow(clippy::missing_safety_doc)]
|
||||
#![doc = include_str!("../README.md")]
|
||||
|
||||
pub use ffi;
|
||||
pub use glib;
|
||||
pub use gst;
|
||||
pub use gstreamer_analytics_sys as ffi;
|
||||
|
||||
macro_rules! skip_assert_initialized {
|
||||
() => {};
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
use glib::translate::*;
|
||||
|
||||
use crate::relation_meta::*;
|
||||
use crate::{ffi, relation_meta::*};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum AnalyticsODMtd {}
|
||||
|
@ -82,11 +82,15 @@ unsafe fn from(t: ffi::GstAnalyticsMtd) -> ffi::GstAnalyticsODMtd {
|
|||
|
||||
impl<'a> AnalyticsMtdRef<'a, AnalyticsODMtd> {
|
||||
#[doc(alias = "gst_analytics_od_mtd_get_obj_type")]
|
||||
pub fn obj_type(&self) -> glib::Quark {
|
||||
pub fn obj_type(&self) -> Option<glib::Quark> {
|
||||
unsafe {
|
||||
let mut mtd = from(ffi::GstAnalyticsMtd::unsafe_from(self));
|
||||
let type_ = ffi::gst_analytics_od_mtd_get_obj_type(&mut mtd);
|
||||
glib::Quark::from_glib(type_)
|
||||
if type_ == 0 {
|
||||
None
|
||||
} else {
|
||||
Some(glib::Quark::from_glib(type_))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,7 +147,7 @@ mod tests {
|
|||
.add_od_mtd(glib::Quark::from_str("blb"), 0, 1, 10, 20, 0.8)
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(od.obj_type(), glib::Quark::from_str("blb"));
|
||||
assert_eq!(od.obj_type().unwrap(), glib::Quark::from_str("blb"));
|
||||
|
||||
let loc = od.location().unwrap();
|
||||
|
||||
|
@ -159,7 +163,7 @@ mod tests {
|
|||
let meta2 = buf.meta::<AnalyticsRelationMeta>().unwrap();
|
||||
let od2 = meta2.mtd::<AnalyticsODMtd>(0).unwrap();
|
||||
|
||||
assert_eq!(od2.obj_type(), glib::Quark::from_str("blb"));
|
||||
assert_eq!(od2.obj_type().unwrap(), glib::Quark::from_str("blb"));
|
||||
let loc = od2.location().unwrap();
|
||||
|
||||
assert_eq!(loc.x, 0);
|
||||
|
|
|
@ -4,7 +4,7 @@ use glib::translate::*;
|
|||
use gst::prelude::*;
|
||||
use std::marker::PhantomData;
|
||||
|
||||
use crate::RelTypes;
|
||||
use crate::{ffi, RelTypes};
|
||||
|
||||
#[repr(transparent)]
|
||||
#[doc(alias = "GstAnalyticsRelationMeta")]
|
||||
|
@ -484,7 +484,7 @@ macro_rules! define_mtd_iter {
|
|||
meta,
|
||||
state: std::ptr::null_mut(),
|
||||
mtd_type: T::mtd_type(),
|
||||
an_meta_id: std::u32::MAX,
|
||||
an_meta_id: u32::MAX,
|
||||
rel_type: RelTypes::ANY.into_glib(),
|
||||
phantom: PhantomData,
|
||||
}
|
||||
|
@ -513,7 +513,7 @@ macro_rules! define_mtd_iter {
|
|||
unsafe {
|
||||
let mut mtd = ffi::GstAnalyticsMtd::unsafe_from(&**self.meta);
|
||||
let ret = {
|
||||
if self.an_meta_id == std::u32::MAX {
|
||||
if self.an_meta_id == u32::MAX {
|
||||
ffi::gst_analytics_relation_meta_iterate(
|
||||
self.meta.as_mut_ptr(),
|
||||
&mut self.state,
|
||||
|
@ -652,13 +652,13 @@ mod tests {
|
|||
assert_eq!(meta.len(), meta.iter::<AnalyticsAnyMtd>().count());
|
||||
assert_eq!(meta.len(), meta.iter::<AnalyticsODMtd>().count());
|
||||
for mtd in meta.iter::<AnalyticsODMtd>() {
|
||||
assert_eq!(mtd.obj_type(), glib::Quark::from_str("blb"))
|
||||
assert_eq!(mtd.obj_type().unwrap(), glib::Quark::from_str("blb"))
|
||||
}
|
||||
|
||||
assert_eq!(meta.len(), meta.iter::<AnalyticsAnyMtd>().count());
|
||||
for mtd in meta.iter::<AnalyticsAnyMtd>() {
|
||||
if let Ok(mtd) = mtd.downcast::<AnalyticsODMtd>() {
|
||||
assert_eq!(mtd.obj_type(), glib::Quark::from_str("blb"))
|
||||
assert_eq!(mtd.obj_type().unwrap(), glib::Quark::from_str("blb"))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -689,7 +689,7 @@ mod tests {
|
|||
0
|
||||
);
|
||||
for mtd in meta.iter_direct_related::<AnalyticsODMtd>(od1_id, crate::RelTypes::IS_PART_OF) {
|
||||
assert_eq!(mtd.obj_type(), glib::Quark::from_str("blb"))
|
||||
assert_eq!(mtd.obj_type().unwrap(), glib::Quark::from_str("blb"))
|
||||
}
|
||||
|
||||
let mut meta = buf.make_mut().meta_mut::<AnalyticsRelationMeta>().unwrap();
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
use glib::translate::*;
|
||||
|
||||
use crate::relation_meta::*;
|
||||
use crate::{ffi, relation_meta::*};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum AnalyticsTrackingMtd {}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[build-dependencies]
|
||||
system-deps = "6"
|
||||
system-deps = "7"
|
||||
|
||||
[dependencies]
|
||||
libc = "0.2"
|
||||
|
@ -52,6 +52,10 @@ rustdoc-args = ["--cfg", "docsrs", "--generate-link-to-definition"]
|
|||
|
||||
[package.metadata.system-deps.gstreamer_analytics_1_0]
|
||||
name = "gstreamer-analytics-1.0"
|
||||
version = "1.23"
|
||||
version = "1.24"
|
||||
|
||||
[package.metadata.system-deps.gstreamer_analytics_1_0.v1_26]
|
||||
version = "1.25"
|
||||
|
||||
[features]
|
||||
v1_26 = []
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Generated by gir (https://github.com/gtk-rs/gir @ 0e476ab5c1de)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ cfc0305f903b)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ 39e21eeb5d10)
|
||||
Generated by gir (https://github.com/gtk-rs/gir @ a11b11f2e403)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ 62da9eb7c4bd)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ db97a3ad67f5)
|
||||
|
|
|
@ -15,10 +15,14 @@
|
|||
use glib_sys as glib;
|
||||
use gstreamer_sys as gst;
|
||||
|
||||
#[cfg(unix)]
|
||||
#[allow(unused_imports)]
|
||||
use libc::{
|
||||
use libc::{dev_t, gid_t, pid_t, socklen_t, uid_t};
|
||||
#[allow(unused_imports)]
|
||||
use libc::{intptr_t, off_t, size_t, ssize_t, time_t, uintptr_t, FILE};
|
||||
#[allow(unused_imports)]
|
||||
use std::ffi::{
|
||||
c_char, c_double, c_float, c_int, c_long, c_short, c_uchar, c_uint, c_ulong, c_ushort, c_void,
|
||||
intptr_t, size_t, ssize_t, uintptr_t, FILE,
|
||||
};
|
||||
|
||||
#[allow(unused_imports)]
|
||||
|
@ -28,7 +32,6 @@ use glib::{gboolean, gconstpointer, gpointer, GType};
|
|||
pub type GstAnalyticsMtdType = uintptr_t;
|
||||
|
||||
// Constants
|
||||
pub const GST_AN_RELATION_META_TAG: &[u8] = b"GST-ANALYSIS-RELATION-META-TAG\0";
|
||||
pub const GST_INF_RELATION_SPAN: c_int = -1;
|
||||
pub const GST_ANALYTICS_MTD_TYPE_ANY: c_int = 0;
|
||||
|
||||
|
@ -95,7 +98,6 @@ impl ::std::fmt::Debug for GstAnalyticsMtdImpl {
|
|||
f.debug_struct(&format!("GstAnalyticsMtdImpl @ {self:p}"))
|
||||
.field("name", &self.name)
|
||||
.field("mtd_meta_transform", &self.mtd_meta_transform)
|
||||
.field("_reserved", &self._reserved)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
@ -117,6 +119,7 @@ impl ::std::fmt::Debug for GstAnalyticsODMtd {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct _GstAnalyticsRelationMeta {
|
||||
_data: [u8; 0],
|
||||
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
|
||||
|
@ -156,7 +159,6 @@ impl ::std::fmt::Debug for GstAnalyticsTrackingMtd {
|
|||
}
|
||||
}
|
||||
|
||||
#[link(name = "gstanalytics-1.0")]
|
||||
extern "C" {
|
||||
|
||||
//=========================================================================
|
||||
|
|
|
@ -268,6 +268,5 @@ const RUST_CONSTANTS: &[(&str, &str)] = &[
|
|||
("(guint) GST_ANALYTICS_REL_TYPE_LAST", "16"),
|
||||
("(guint) GST_ANALYTICS_REL_TYPE_NONE", "0"),
|
||||
("(guint) GST_ANALYTICS_REL_TYPE_RELATE_TO", "8"),
|
||||
("GST_AN_RELATION_META_TAG", "GST-ANALYSIS-RELATION-META-TAG"),
|
||||
("GST_INF_RELATION_SPAN", "-1"),
|
||||
];
|
||||
|
|
|
@ -36,7 +36,6 @@ int main() {
|
|||
PRINT_CONSTANT((guint) GST_ANALYTICS_REL_TYPE_LAST);
|
||||
PRINT_CONSTANT((guint) GST_ANALYTICS_REL_TYPE_NONE);
|
||||
PRINT_CONSTANT((guint) GST_ANALYTICS_REL_TYPE_RELATE_TO);
|
||||
PRINT_CONSTANT(GST_AN_RELATION_META_TAG);
|
||||
PRINT_CONSTANT(GST_INF_RELATION_SPAN);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ rust-version.workspace = true
|
|||
futures-core = "0.3"
|
||||
futures-sink = "0.3"
|
||||
libc = "0.2"
|
||||
ffi = { package = "gstreamer-app-sys", path = "sys", version = "0.22" }
|
||||
gstreamer-app-sys.workspace = true
|
||||
glib.workspace = true
|
||||
gst.workspace = true
|
||||
gst-base.workspace = true
|
||||
|
@ -29,11 +29,12 @@ gir-format-check = "0.1"
|
|||
|
||||
[features]
|
||||
default = []
|
||||
v1_16 = ["gst/v1_16", "gst-base/v1_16", "ffi/v1_16"]
|
||||
v1_18 = ["gst/v1_18", "gst-base/v1_18", "ffi/v1_18", "v1_16"]
|
||||
v1_20 = ["gst/v1_20", "gst-base/v1_20", "ffi/v1_20", "v1_18"]
|
||||
v1_22 = ["gst/v1_22", "gst-base/v1_22", "ffi/v1_22", "v1_20"]
|
||||
v1_24 = ["gst/v1_24", "gst-base/v1_24", "ffi/v1_24", "v1_22"]
|
||||
v1_16 = ["gst/v1_16", "gst-base/v1_16", "gstreamer-app-sys/v1_16"]
|
||||
v1_18 = ["gst/v1_18", "gst-base/v1_18", "gstreamer-app-sys/v1_18", "v1_16"]
|
||||
v1_20 = ["gst/v1_20", "gst-base/v1_20", "gstreamer-app-sys/v1_20", "v1_18"]
|
||||
v1_22 = ["gst/v1_22", "gst-base/v1_22", "gstreamer-app-sys/v1_22", "v1_20"]
|
||||
v1_24 = ["gst/v1_24", "gst-base/v1_24", "gstreamer-app-sys/v1_24", "v1_22"]
|
||||
v1_26 = ["gst/v1_26", "gst-base/v1_26", "gstreamer-app-sys/v1_26", "v1_24"]
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
all-features = true
|
||||
|
|
|
@ -4,17 +4,17 @@ use std::{
|
|||
mem, panic,
|
||||
pin::Pin,
|
||||
ptr,
|
||||
sync::{
|
||||
atomic::{AtomicBool, Ordering},
|
||||
Arc, Mutex,
|
||||
},
|
||||
sync::{Arc, Mutex},
|
||||
task::{Context, Poll, Waker},
|
||||
};
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
|
||||
use futures_core::Stream;
|
||||
use glib::{ffi::gpointer, prelude::*, translate::*};
|
||||
|
||||
use crate::AppSink;
|
||||
use crate::{ffi, AppSink};
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub struct AppSinkCallbacks {
|
||||
|
@ -28,6 +28,7 @@ pub struct AppSinkCallbacks {
|
|||
new_event: Option<Box<dyn FnMut(&AppSink) -> bool + Send + 'static>>,
|
||||
propose_allocation:
|
||||
Option<Box<dyn FnMut(&AppSink, &mut gst::query::Allocation) -> bool + Send + 'static>>,
|
||||
#[cfg(not(panic = "abort"))]
|
||||
panicked: AtomicBool,
|
||||
callbacks: ffi::GstAppSinkCallbacks,
|
||||
}
|
||||
|
@ -71,6 +72,22 @@ impl AppSinkCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn eos_if<F: FnMut(&AppSink) + Send + 'static>(self, eos: F, predicate: bool) -> Self {
|
||||
if predicate {
|
||||
self.eos(eos)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn eos_if_some<F: FnMut(&AppSink) + Send + 'static>(self, eos: Option<F>) -> Self {
|
||||
if let Some(eos) = eos {
|
||||
self.eos(eos)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_preroll<
|
||||
F: FnMut(&AppSink) -> Result<gst::FlowSuccess, gst::FlowError> + Send + 'static,
|
||||
>(
|
||||
|
@ -83,6 +100,33 @@ impl AppSinkCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn new_preroll_if<
|
||||
F: FnMut(&AppSink) -> Result<gst::FlowSuccess, gst::FlowError> + Send + 'static,
|
||||
>(
|
||||
self,
|
||||
new_preroll: F,
|
||||
predicate: bool,
|
||||
) -> Self {
|
||||
if predicate {
|
||||
self.new_preroll(new_preroll)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_preroll_if_some<
|
||||
F: FnMut(&AppSink) -> Result<gst::FlowSuccess, gst::FlowError> + Send + 'static,
|
||||
>(
|
||||
self,
|
||||
new_preroll: Option<F>,
|
||||
) -> Self {
|
||||
if let Some(new_preroll) = new_preroll {
|
||||
self.new_preroll(new_preroll)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_sample<
|
||||
F: FnMut(&AppSink) -> Result<gst::FlowSuccess, gst::FlowError> + Send + 'static,
|
||||
>(
|
||||
|
@ -95,6 +139,33 @@ impl AppSinkCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn new_sample_if<
|
||||
F: FnMut(&AppSink) -> Result<gst::FlowSuccess, gst::FlowError> + Send + 'static,
|
||||
>(
|
||||
self,
|
||||
new_sample: F,
|
||||
predicate: bool,
|
||||
) -> Self {
|
||||
if predicate {
|
||||
self.new_sample(new_sample)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_sample_if_some<
|
||||
F: FnMut(&AppSink) -> Result<gst::FlowSuccess, gst::FlowError> + Send + 'static,
|
||||
>(
|
||||
self,
|
||||
new_sample: Option<F>,
|
||||
) -> Self {
|
||||
if let Some(new_sample) = new_sample {
|
||||
self.new_sample(new_sample)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "v1_20")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
pub fn new_event<F: FnMut(&AppSink) -> bool + Send + 'static>(self, new_event: F) -> Self {
|
||||
|
@ -104,6 +175,33 @@ impl AppSinkCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "v1_20")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
pub fn new_event_if<F: FnMut(&AppSink) -> bool + Send + 'static>(
|
||||
self,
|
||||
new_event: F,
|
||||
predicate: bool,
|
||||
) -> Self {
|
||||
if predicate {
|
||||
self.new_event(new_event)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "v1_20")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
pub fn new_event_if_some<F: FnMut(&AppSink) -> bool + Send + 'static>(
|
||||
self,
|
||||
new_event: Option<F>,
|
||||
) -> Self {
|
||||
if let Some(new_event) = new_event {
|
||||
self.new_event(new_event)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "v1_24")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
|
||||
pub fn propose_allocation<
|
||||
|
@ -118,6 +216,37 @@ impl AppSinkCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "v1_24")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
|
||||
pub fn propose_allocation_if<
|
||||
F: FnMut(&AppSink, &mut gst::query::Allocation) -> bool + Send + 'static,
|
||||
>(
|
||||
self,
|
||||
propose_allocation: F,
|
||||
predicate: bool,
|
||||
) -> Self {
|
||||
if predicate {
|
||||
self.propose_allocation(propose_allocation)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "v1_24")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
|
||||
pub fn propose_allocation_if_some<
|
||||
F: FnMut(&AppSink, &mut gst::query::Allocation) -> bool + Send + 'static,
|
||||
>(
|
||||
self,
|
||||
propose_allocation: Option<F>,
|
||||
) -> Self {
|
||||
if let Some(propose_allocation) = propose_allocation {
|
||||
self.propose_allocation(propose_allocation)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use = "Building the callbacks without using them has no effect"]
|
||||
pub fn build(self) -> AppSinkCallbacks {
|
||||
let have_eos = self.eos.is_some();
|
||||
|
@ -132,6 +261,7 @@ impl AppSinkCallbacksBuilder {
|
|||
new_sample: self.new_sample,
|
||||
new_event: self.new_event,
|
||||
propose_allocation: self.propose_allocation,
|
||||
#[cfg(not(panic = "abort"))]
|
||||
panicked: AtomicBool::new(false),
|
||||
callbacks: ffi::GstAppSinkCallbacks {
|
||||
eos: if have_eos { Some(trampoline_eos) } else { None },
|
||||
|
@ -165,6 +295,7 @@ unsafe extern "C" fn trampoline_eos(appsink: *mut ffi::GstAppSink, callbacks: gp
|
|||
let callbacks = callbacks as *mut AppSinkCallbacks;
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -176,12 +307,19 @@ unsafe extern "C" fn trampoline_eos(appsink: *mut ffi::GstAppSink, callbacks: gp
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -194,6 +332,7 @@ unsafe extern "C" fn trampoline_new_preroll(
|
|||
let callbacks = callbacks as *mut AppSinkCallbacks;
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -205,14 +344,21 @@ unsafe extern "C" fn trampoline_new_preroll(
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
|
||||
gst::FlowReturn::Error
|
||||
gst::FlowReturn::Error
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -229,6 +375,7 @@ unsafe extern "C" fn trampoline_new_sample(
|
|||
let callbacks = callbacks as *mut AppSinkCallbacks;
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -240,14 +387,21 @@ unsafe extern "C" fn trampoline_new_sample(
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
|
||||
gst::FlowReturn::Error
|
||||
gst::FlowReturn::Error
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -264,6 +418,7 @@ unsafe extern "C" fn trampoline_new_event(
|
|||
let callbacks = callbacks as *mut AppSinkCallbacks;
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -275,14 +430,21 @@ unsafe extern "C" fn trampoline_new_event(
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
|
||||
false
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -300,6 +462,7 @@ unsafe extern "C" fn trampoline_propose_allocation(
|
|||
let callbacks = callbacks as *mut AppSinkCallbacks;
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSink> = from_glib_borrow(appsink);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -317,14 +480,20 @@ unsafe extern "C" fn trampoline_propose_allocation(
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
|
||||
false
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -652,7 +821,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::async\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_async_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -680,7 +849,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::blocksize\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_blocksize_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -708,7 +877,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::enable-last-sample\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_enable_last_sample_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -736,7 +905,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::last-sample\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_last_sample_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -764,7 +933,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-bitrate\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_bitrate_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -792,7 +961,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-lateness\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_lateness_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -822,7 +991,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::processing-deadline\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_processing_deadline_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -848,7 +1017,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::qos\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_qos_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -876,7 +1045,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::render-delay\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_render_delay_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -904,7 +1073,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::stats\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_stats_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -930,7 +1099,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::sync\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_sync_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -958,7 +1127,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::throttle-time\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_throttle_time_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
@ -986,7 +1155,7 @@ impl AppSink {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::ts-offset\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_ts_offset_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
|
|
@ -4,13 +4,13 @@ use std::{
|
|||
mem, panic,
|
||||
pin::Pin,
|
||||
ptr,
|
||||
sync::{
|
||||
atomic::{AtomicBool, Ordering},
|
||||
Arc, Mutex,
|
||||
},
|
||||
sync::{Arc, Mutex},
|
||||
task::{Context, Poll, Waker},
|
||||
};
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
|
||||
use futures_sink::Sink;
|
||||
use glib::{
|
||||
ffi::{gboolean, gpointer},
|
||||
|
@ -18,13 +18,14 @@ use glib::{
|
|||
translate::*,
|
||||
};
|
||||
|
||||
use crate::AppSrc;
|
||||
use crate::{ffi, AppSrc};
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub struct AppSrcCallbacks {
|
||||
need_data: Option<Box<dyn FnMut(&AppSrc, u32) + Send + 'static>>,
|
||||
enough_data: Option<Box<dyn Fn(&AppSrc) + Send + Sync + 'static>>,
|
||||
seek_data: Option<Box<dyn Fn(&AppSrc, u64) -> bool + Send + Sync + 'static>>,
|
||||
#[cfg(not(panic = "abort"))]
|
||||
panicked: AtomicBool,
|
||||
callbacks: ffi::GstAppSrcCallbacks,
|
||||
}
|
||||
|
@ -60,6 +61,29 @@ impl AppSrcCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn need_data_if<F: FnMut(&AppSrc, u32) + Send + 'static>(
|
||||
self,
|
||||
need_data: F,
|
||||
predicate: bool,
|
||||
) -> Self {
|
||||
if predicate {
|
||||
self.need_data(need_data)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn need_data_if_some<F: FnMut(&AppSrc, u32) + Send + 'static>(
|
||||
self,
|
||||
need_data: Option<F>,
|
||||
) -> Self {
|
||||
if let Some(need_data) = need_data {
|
||||
self.need_data(need_data)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn enough_data<F: Fn(&AppSrc) + Send + Sync + 'static>(self, enough_data: F) -> Self {
|
||||
Self {
|
||||
enough_data: Some(Box::new(enough_data)),
|
||||
|
@ -67,6 +91,29 @@ impl AppSrcCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn enough_data_if<F: Fn(&AppSrc) + Send + Sync + 'static>(
|
||||
self,
|
||||
enough_data: F,
|
||||
predicate: bool,
|
||||
) -> Self {
|
||||
if predicate {
|
||||
self.enough_data(enough_data)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn enough_data_if_some<F: Fn(&AppSrc) + Send + Sync + 'static>(
|
||||
self,
|
||||
enough_data: Option<F>,
|
||||
) -> Self {
|
||||
if let Some(enough_data) = enough_data {
|
||||
self.enough_data(enough_data)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn seek_data<F: Fn(&AppSrc, u64) -> bool + Send + Sync + 'static>(
|
||||
self,
|
||||
seek_data: F,
|
||||
|
@ -77,6 +124,29 @@ impl AppSrcCallbacksBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn seek_data_if<F: Fn(&AppSrc, u64) -> bool + Send + Sync + 'static>(
|
||||
self,
|
||||
seek_data: F,
|
||||
predicate: bool,
|
||||
) -> Self {
|
||||
if predicate {
|
||||
self.seek_data(seek_data)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn seek_data_if_some<F: Fn(&AppSrc, u64) -> bool + Send + Sync + 'static>(
|
||||
self,
|
||||
seek_data: Option<F>,
|
||||
) -> Self {
|
||||
if let Some(seek_data) = seek_data {
|
||||
self.seek_data(seek_data)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use = "Building the callbacks without using them has no effect"]
|
||||
pub fn build(self) -> AppSrcCallbacks {
|
||||
let have_need_data = self.need_data.is_some();
|
||||
|
@ -87,6 +157,7 @@ impl AppSrcCallbacksBuilder {
|
|||
need_data: self.need_data,
|
||||
enough_data: self.enough_data,
|
||||
seek_data: self.seek_data,
|
||||
#[cfg(not(panic = "abort"))]
|
||||
panicked: AtomicBool::new(false),
|
||||
callbacks: ffi::GstAppSrcCallbacks {
|
||||
need_data: if have_need_data {
|
||||
|
@ -123,6 +194,7 @@ unsafe extern "C" fn trampoline_need_data(
|
|||
let callbacks = callbacks as *mut AppSrcCallbacks;
|
||||
let element: Borrowed<AppSrc> = from_glib_borrow(appsrc);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSrc> = from_glib_borrow(appsrc);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -134,12 +206,19 @@ unsafe extern "C" fn trampoline_need_data(
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -149,6 +228,7 @@ unsafe extern "C" fn trampoline_enough_data(appsrc: *mut ffi::GstAppSrc, callbac
|
|||
let callbacks = callbacks as *const AppSrcCallbacks;
|
||||
let element: Borrowed<AppSrc> = from_glib_borrow(appsrc);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSrc> = from_glib_borrow(appsrc);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -160,12 +240,19 @@ unsafe extern "C" fn trampoline_enough_data(appsrc: *mut ffi::GstAppSrc, callbac
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -179,6 +266,7 @@ unsafe extern "C" fn trampoline_seek_data(
|
|||
let callbacks = callbacks as *const AppSrcCallbacks;
|
||||
let element: Borrowed<AppSrc> = from_glib_borrow(appsrc);
|
||||
|
||||
#[cfg(not(panic = "abort"))]
|
||||
if (*callbacks).panicked.load(Ordering::Relaxed) {
|
||||
let element: Borrowed<AppSrc> = from_glib_borrow(appsrc);
|
||||
gst::subclass::post_panic_error_message(element.upcast_ref(), element.upcast_ref(), None);
|
||||
|
@ -190,14 +278,21 @@ unsafe extern "C" fn trampoline_seek_data(
|
|||
match result {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
#[cfg(panic = "abort")]
|
||||
{
|
||||
unreachable!("{err:?}");
|
||||
}
|
||||
#[cfg(not(panic = "abort"))]
|
||||
{
|
||||
(*callbacks).panicked.store(true, Ordering::Relaxed);
|
||||
gst::subclass::post_panic_error_message(
|
||||
element.upcast_ref(),
|
||||
element.upcast_ref(),
|
||||
Some(err),
|
||||
);
|
||||
|
||||
false
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -329,7 +424,7 @@ impl AppSrc {
|
|||
glib::signal::connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::do-timestamp\0".as_ptr() as *const _,
|
||||
Some(mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_do_timestamp_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{
|
||||
prelude::*,
|
||||
signal::{connect_raw, SignalHandlerId},
|
||||
|
@ -38,12 +39,14 @@ impl AppSink {
|
|||
|
||||
#[doc(alias = "gst_app_sink_get_drop")]
|
||||
#[doc(alias = "get_drop")]
|
||||
#[doc(alias = "drop")]
|
||||
pub fn is_drop(&self) -> bool {
|
||||
unsafe { from_glib(ffi::gst_app_sink_get_drop(self.to_glib_none().0)) }
|
||||
}
|
||||
|
||||
#[doc(alias = "gst_app_sink_get_max_buffers")]
|
||||
#[doc(alias = "get_max_buffers")]
|
||||
#[doc(alias = "max-buffers")]
|
||||
pub fn max_buffers(&self) -> u32 {
|
||||
unsafe { ffi::gst_app_sink_get_max_buffers(self.to_glib_none().0) }
|
||||
}
|
||||
|
@ -52,6 +55,7 @@ impl AppSink {
|
|||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
|
||||
#[doc(alias = "gst_app_sink_get_max_bytes")]
|
||||
#[doc(alias = "get_max_bytes")]
|
||||
#[doc(alias = "max-bytes")]
|
||||
pub fn max_bytes(&self) -> u64 {
|
||||
unsafe { ffi::gst_app_sink_get_max_bytes(self.to_glib_none().0) }
|
||||
}
|
||||
|
@ -60,12 +64,14 @@ impl AppSink {
|
|||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
|
||||
#[doc(alias = "gst_app_sink_get_max_time")]
|
||||
#[doc(alias = "get_max_time")]
|
||||
#[doc(alias = "max-time")]
|
||||
pub fn max_time(&self) -> Option<gst::ClockTime> {
|
||||
unsafe { from_glib(ffi::gst_app_sink_get_max_time(self.to_glib_none().0)) }
|
||||
}
|
||||
|
||||
#[doc(alias = "gst_app_sink_get_wait_on_eos")]
|
||||
#[doc(alias = "get_wait_on_eos")]
|
||||
#[doc(alias = "wait-on-eos")]
|
||||
pub fn is_wait_on_eos(&self) -> bool {
|
||||
unsafe { from_glib(ffi::gst_app_sink_get_wait_on_eos(self.to_glib_none().0)) }
|
||||
}
|
||||
|
@ -117,6 +123,7 @@ impl AppSink {
|
|||
//}
|
||||
|
||||
#[doc(alias = "gst_app_sink_set_caps")]
|
||||
#[doc(alias = "caps")]
|
||||
pub fn set_caps(&self, caps: Option<&gst::Caps>) {
|
||||
unsafe {
|
||||
ffi::gst_app_sink_set_caps(self.to_glib_none().0, caps.to_glib_none().0);
|
||||
|
@ -124,6 +131,7 @@ impl AppSink {
|
|||
}
|
||||
|
||||
#[doc(alias = "gst_app_sink_set_drop")]
|
||||
#[doc(alias = "drop")]
|
||||
pub fn set_drop(&self, drop: bool) {
|
||||
unsafe {
|
||||
ffi::gst_app_sink_set_drop(self.to_glib_none().0, drop.into_glib());
|
||||
|
@ -131,6 +139,7 @@ impl AppSink {
|
|||
}
|
||||
|
||||
#[doc(alias = "gst_app_sink_set_max_buffers")]
|
||||
#[doc(alias = "max-buffers")]
|
||||
pub fn set_max_buffers(&self, max: u32) {
|
||||
unsafe {
|
||||
ffi::gst_app_sink_set_max_buffers(self.to_glib_none().0, max);
|
||||
|
@ -140,6 +149,7 @@ impl AppSink {
|
|||
#[cfg(feature = "v1_24")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
|
||||
#[doc(alias = "gst_app_sink_set_max_bytes")]
|
||||
#[doc(alias = "max-bytes")]
|
||||
pub fn set_max_bytes(&self, max: u64) {
|
||||
unsafe {
|
||||
ffi::gst_app_sink_set_max_bytes(self.to_glib_none().0, max);
|
||||
|
@ -149,6 +159,7 @@ impl AppSink {
|
|||
#[cfg(feature = "v1_24")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
|
||||
#[doc(alias = "gst_app_sink_set_max_time")]
|
||||
#[doc(alias = "max-time")]
|
||||
pub fn set_max_time(&self, max: impl Into<Option<gst::ClockTime>>) {
|
||||
unsafe {
|
||||
ffi::gst_app_sink_set_max_time(self.to_glib_none().0, max.into().into_glib());
|
||||
|
@ -156,6 +167,7 @@ impl AppSink {
|
|||
}
|
||||
|
||||
#[doc(alias = "gst_app_sink_set_wait_on_eos")]
|
||||
#[doc(alias = "wait-on-eos")]
|
||||
pub fn set_wait_on_eos(&self, wait: bool) {
|
||||
unsafe {
|
||||
ffi::gst_app_sink_set_wait_on_eos(self.to_glib_none().0, wait.into_glib());
|
||||
|
@ -233,7 +245,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::buffer-list\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_buffer_list_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -259,7 +271,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::caps\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_caps_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -285,7 +297,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::drop\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_drop_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -311,7 +323,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::eos\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_eos_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -339,7 +351,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-buffers\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_buffers_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -369,7 +381,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-bytes\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_bytes_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -397,7 +409,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-time\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_time_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -425,7 +437,7 @@ impl AppSink {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::wait-on-eos\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_wait_on_eos_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#[cfg(feature = "v1_20")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
use crate::AppLeakyType;
|
||||
use crate::AppStreamType;
|
||||
use crate::{ffi, AppStreamType};
|
||||
use glib::{
|
||||
prelude::*,
|
||||
signal::{connect_raw, SignalHandlerId},
|
||||
|
@ -39,12 +39,14 @@ impl AppSrc {
|
|||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_get_current_level_buffers")]
|
||||
#[doc(alias = "get_current_level_buffers")]
|
||||
#[doc(alias = "current-level-buffers")]
|
||||
pub fn current_level_buffers(&self) -> u64 {
|
||||
unsafe { ffi::gst_app_src_get_current_level_buffers(self.to_glib_none().0) }
|
||||
}
|
||||
|
||||
#[doc(alias = "gst_app_src_get_current_level_bytes")]
|
||||
#[doc(alias = "get_current_level_bytes")]
|
||||
#[doc(alias = "current-level-bytes")]
|
||||
pub fn current_level_bytes(&self) -> u64 {
|
||||
unsafe { ffi::gst_app_src_get_current_level_bytes(self.to_glib_none().0) }
|
||||
}
|
||||
|
@ -53,6 +55,7 @@ impl AppSrc {
|
|||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_get_current_level_time")]
|
||||
#[doc(alias = "get_current_level_time")]
|
||||
#[doc(alias = "current-level-time")]
|
||||
pub fn current_level_time(&self) -> Option<gst::ClockTime> {
|
||||
unsafe {
|
||||
from_glib(ffi::gst_app_src_get_current_level_time(
|
||||
|
@ -71,6 +74,7 @@ impl AppSrc {
|
|||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_get_leaky_type")]
|
||||
#[doc(alias = "get_leaky_type")]
|
||||
#[doc(alias = "leaky-type")]
|
||||
pub fn leaky_type(&self) -> AppLeakyType {
|
||||
unsafe { from_glib(ffi::gst_app_src_get_leaky_type(self.to_glib_none().0)) }
|
||||
}
|
||||
|
@ -79,12 +83,14 @@ impl AppSrc {
|
|||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_get_max_buffers")]
|
||||
#[doc(alias = "get_max_buffers")]
|
||||
#[doc(alias = "max-buffers")]
|
||||
pub fn max_buffers(&self) -> u64 {
|
||||
unsafe { ffi::gst_app_src_get_max_buffers(self.to_glib_none().0) }
|
||||
}
|
||||
|
||||
#[doc(alias = "gst_app_src_get_max_bytes")]
|
||||
#[doc(alias = "get_max_bytes")]
|
||||
#[doc(alias = "max-bytes")]
|
||||
pub fn max_bytes(&self) -> u64 {
|
||||
unsafe { ffi::gst_app_src_get_max_bytes(self.to_glib_none().0) }
|
||||
}
|
||||
|
@ -93,6 +99,7 @@ impl AppSrc {
|
|||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_get_max_time")]
|
||||
#[doc(alias = "get_max_time")]
|
||||
#[doc(alias = "max-time")]
|
||||
pub fn max_time(&self) -> Option<gst::ClockTime> {
|
||||
unsafe { from_glib(ffi::gst_app_src_get_max_time(self.to_glib_none().0)) }
|
||||
}
|
||||
|
@ -105,6 +112,7 @@ impl AppSrc {
|
|||
|
||||
#[doc(alias = "gst_app_src_get_stream_type")]
|
||||
#[doc(alias = "get_stream_type")]
|
||||
#[doc(alias = "stream-type")]
|
||||
pub fn stream_type(&self) -> AppStreamType {
|
||||
unsafe { from_glib(ffi::gst_app_src_get_stream_type(self.to_glib_none().0)) }
|
||||
}
|
||||
|
@ -148,6 +156,7 @@ impl AppSrc {
|
|||
//}
|
||||
|
||||
#[doc(alias = "gst_app_src_set_caps")]
|
||||
#[doc(alias = "caps")]
|
||||
pub fn set_caps(&self, caps: Option<&gst::Caps>) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_caps(self.to_glib_none().0, caps.to_glib_none().0);
|
||||
|
@ -155,6 +164,7 @@ impl AppSrc {
|
|||
}
|
||||
|
||||
#[doc(alias = "gst_app_src_set_duration")]
|
||||
#[doc(alias = "duration")]
|
||||
pub fn set_duration(&self, duration: impl Into<Option<gst::ClockTime>>) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_duration(self.to_glib_none().0, duration.into().into_glib());
|
||||
|
@ -164,6 +174,7 @@ impl AppSrc {
|
|||
#[cfg(feature = "v1_20")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_set_leaky_type")]
|
||||
#[doc(alias = "leaky-type")]
|
||||
pub fn set_leaky_type(&self, leaky: AppLeakyType) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_leaky_type(self.to_glib_none().0, leaky.into_glib());
|
||||
|
@ -173,6 +184,7 @@ impl AppSrc {
|
|||
#[cfg(feature = "v1_20")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_set_max_buffers")]
|
||||
#[doc(alias = "max-buffers")]
|
||||
pub fn set_max_buffers(&self, max: u64) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_max_buffers(self.to_glib_none().0, max);
|
||||
|
@ -180,6 +192,7 @@ impl AppSrc {
|
|||
}
|
||||
|
||||
#[doc(alias = "gst_app_src_set_max_bytes")]
|
||||
#[doc(alias = "max-bytes")]
|
||||
pub fn set_max_bytes(&self, max: u64) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_max_bytes(self.to_glib_none().0, max);
|
||||
|
@ -189,6 +202,7 @@ impl AppSrc {
|
|||
#[cfg(feature = "v1_20")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
|
||||
#[doc(alias = "gst_app_src_set_max_time")]
|
||||
#[doc(alias = "max-time")]
|
||||
pub fn set_max_time(&self, max: impl Into<Option<gst::ClockTime>>) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_max_time(self.to_glib_none().0, max.into().into_glib());
|
||||
|
@ -196,6 +210,7 @@ impl AppSrc {
|
|||
}
|
||||
|
||||
#[doc(alias = "gst_app_src_set_size")]
|
||||
#[doc(alias = "size")]
|
||||
pub fn set_size(&self, size: i64) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_size(self.to_glib_none().0, size);
|
||||
|
@ -203,6 +218,7 @@ impl AppSrc {
|
|||
}
|
||||
|
||||
#[doc(alias = "gst_app_src_set_stream_type")]
|
||||
#[doc(alias = "stream-type")]
|
||||
pub fn set_stream_type(&self, type_: AppStreamType) {
|
||||
unsafe {
|
||||
ffi::gst_app_src_set_stream_type(self.to_glib_none().0, type_.into_glib());
|
||||
|
@ -297,7 +313,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::block\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_block_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -323,7 +339,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::caps\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_caps_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -353,7 +369,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::current-level-buffers\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_current_level_buffers_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -381,7 +397,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::current-level-bytes\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_current_level_bytes_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -411,7 +427,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::current-level-time\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_current_level_time_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -437,7 +453,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::duration\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_duration_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -463,7 +479,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::format\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_format_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -493,7 +509,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::handle-segment-change\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_handle_segment_change_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -519,7 +535,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::is-live\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_is_live_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -549,7 +565,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::leaky-type\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_leaky_type_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -579,7 +595,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-buffers\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_buffers_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -605,7 +621,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-bytes\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_bytes_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -633,7 +649,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-latency\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_latency_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -661,7 +677,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::max-time\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_max_time_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -689,7 +705,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::min-latency\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_min_latency_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -717,7 +733,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::min-percent\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_min_percent_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -743,7 +759,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::size\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_size_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
@ -771,7 +787,7 @@ impl AppSrc {
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::stream-type\0".as_ptr() as *const _,
|
||||
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_stream_type_trampoline::<F> as *const (),
|
||||
)),
|
||||
Box_::into_raw(f),
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
|
||||
// DO NOT EDIT
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{prelude::*, translate::*};
|
||||
|
||||
#[cfg(feature = "v1_20")]
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Generated by gir (https://github.com/gtk-rs/gir @ 0e476ab5c1de)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ cfc0305f903b)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ 39e21eeb5d10)
|
||||
Generated by gir (https://github.com/gtk-rs/gir @ a11b11f2e403)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ 62da9eb7c4bd)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ db97a3ad67f5)
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
#![allow(clippy::missing_safety_doc)]
|
||||
#![doc = include_str!("../README.md")]
|
||||
|
||||
pub use ffi;
|
||||
pub use glib;
|
||||
pub use gst;
|
||||
pub use gst_base;
|
||||
pub use gstreamer_app_sys as ffi;
|
||||
|
||||
macro_rules! assert_initialized_main_thread {
|
||||
() => {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[build-dependencies]
|
||||
system-deps = "6"
|
||||
system-deps = "7"
|
||||
|
||||
[dependencies]
|
||||
libc = "0.2"
|
||||
|
@ -23,6 +23,7 @@ v1_18 = ["v1_16"]
|
|||
v1_20 = ["v1_18"]
|
||||
v1_22 = ["v1_20"]
|
||||
v1_24 = ["v1_22"]
|
||||
v1_26 = ["v1_24"]
|
||||
|
||||
[lib]
|
||||
name = "gstreamer_app_sys"
|
||||
|
@ -77,4 +78,7 @@ version = "1.20"
|
|||
version = "1.22"
|
||||
|
||||
[package.metadata.system-deps.gstreamer_app_1_0.v1_24]
|
||||
version = "1.23"
|
||||
version = "1.24"
|
||||
|
||||
[package.metadata.system-deps.gstreamer_app_1_0.v1_26]
|
||||
version = "1.25"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Generated by gir (https://github.com/gtk-rs/gir @ 0e476ab5c1de)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ cfc0305f903b)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ 39e21eeb5d10)
|
||||
Generated by gir (https://github.com/gtk-rs/gir @ a11b11f2e403)
|
||||
from gir-files (https://github.com/gtk-rs/gir-files @ 62da9eb7c4bd)
|
||||
from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git @ db97a3ad67f5)
|
||||
|
|
|
@ -16,10 +16,14 @@ use glib_sys as glib;
|
|||
use gstreamer_base_sys as gst_base;
|
||||
use gstreamer_sys as gst;
|
||||
|
||||
#[cfg(unix)]
|
||||
#[allow(unused_imports)]
|
||||
use libc::{
|
||||
use libc::{dev_t, gid_t, pid_t, socklen_t, uid_t};
|
||||
#[allow(unused_imports)]
|
||||
use libc::{intptr_t, off_t, size_t, ssize_t, time_t, uintptr_t, FILE};
|
||||
#[allow(unused_imports)]
|
||||
use std::ffi::{
|
||||
c_char, c_double, c_float, c_int, c_long, c_short, c_uchar, c_uint, c_ulong, c_ushort, c_void,
|
||||
intptr_t, size_t, ssize_t, uintptr_t, FILE,
|
||||
};
|
||||
|
||||
#[allow(unused_imports)]
|
||||
|
@ -96,6 +100,7 @@ impl ::std::fmt::Debug for GstAppSinkClass {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct _GstAppSinkPrivate {
|
||||
_data: [u8; 0],
|
||||
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
|
||||
|
@ -155,6 +160,7 @@ impl ::std::fmt::Debug for GstAppSrcClass {
|
|||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct _GstAppSrcPrivate {
|
||||
_data: [u8; 0],
|
||||
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
|
||||
|
@ -195,7 +201,6 @@ impl ::std::fmt::Debug for GstAppSrc {
|
|||
}
|
||||
}
|
||||
|
||||
#[link(name = "gstapp-1.0")]
|
||||
extern "C" {
|
||||
|
||||
//=========================================================================
|
||||
|
|
|
@ -16,7 +16,7 @@ rust-version.workspace = true
|
|||
[dependencies]
|
||||
libc = "0.2"
|
||||
cfg-if = "1.0"
|
||||
ffi = { package = "gstreamer-audio-sys", path = "sys", version = "0.22" }
|
||||
gstreamer-audio-sys.workspace = true
|
||||
glib.workspace = true
|
||||
gst.workspace = true
|
||||
gst-base.workspace = true
|
||||
|
@ -25,17 +25,18 @@ smallvec = "1.0"
|
|||
once_cell = "1"
|
||||
|
||||
[dev-dependencies]
|
||||
itertools = "0.12"
|
||||
itertools = "0.13"
|
||||
serde_json = "1.0"
|
||||
gir-format-check = "0.1"
|
||||
|
||||
[features]
|
||||
default = []
|
||||
v1_16 = ["gst/v1_16", "gst-base/v1_16", "ffi/v1_16"]
|
||||
v1_18 = ["gst/v1_18", "gst-base/v1_18", "ffi/v1_18", "v1_16"]
|
||||
v1_20 = ["gst/v1_20", "gst-base/v1_20", "ffi/v1_20", "v1_18"]
|
||||
v1_22 = ["gst/v1_22", "gst-base/v1_22", "ffi/v1_22", "v1_20"]
|
||||
v1_24 = ["gst/v1_24", "gst-base/v1_24", "ffi/v1_24", "v1_22"]
|
||||
v1_16 = ["gst/v1_16", "gst-base/v1_16", "gstreamer-audio-sys/v1_16"]
|
||||
v1_18 = ["gst/v1_18", "gst-base/v1_18", "gstreamer-audio-sys/v1_18", "v1_16"]
|
||||
v1_20 = ["gst/v1_20", "gst-base/v1_20", "gstreamer-audio-sys/v1_20", "v1_18"]
|
||||
v1_22 = ["gst/v1_22", "gst-base/v1_22", "gstreamer-audio-sys/v1_22", "v1_20"]
|
||||
v1_24 = ["gst/v1_24", "gst-base/v1_24", "gstreamer-audio-sys/v1_24", "v1_22"]
|
||||
v1_26 = ["gst/v1_26", "gst-base/v1_26", "gstreamer-audio-sys/v1_26", "v1_24"]
|
||||
serde = ["dep:serde", "gst/serde"]
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
|
|
|
@ -327,6 +327,10 @@ status = "generate"
|
|||
# Platform dependant
|
||||
manual = true
|
||||
|
||||
[[object.member]]
|
||||
name = "last"
|
||||
ignore = true
|
||||
|
||||
[[object.function]]
|
||||
name = "to_string"
|
||||
# This has an Unknown field that may return NULL or "UNKNOWN"
|
||||
|
|
|
@ -8,7 +8,7 @@ use glib::signal::{connect_raw, SignalHandlerId};
|
|||
use glib::translate::*;
|
||||
use gst::prelude::*;
|
||||
|
||||
use crate::auto::{AudioAggregator, AudioAggregatorPad};
|
||||
use crate::{ffi, AudioAggregator, AudioAggregatorPad};
|
||||
|
||||
mod sealed {
|
||||
pub trait Sealed {}
|
||||
|
@ -68,7 +68,7 @@ pub trait AudioAggregatorExtManual: sealed::Sealed + IsA<AudioAggregator> + 'sta
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::output-buffer-duration-fraction\0".as_ptr() as *const _,
|
||||
Some(transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_output_buffer_duration_fraction_trampoline::<Self, F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
|
|
@ -6,7 +6,7 @@ use glib::{
|
|||
translate::*,
|
||||
};
|
||||
|
||||
use crate::auto::AudioAggregatorConvertPad;
|
||||
use crate::{ffi, AudioAggregatorConvertPad};
|
||||
|
||||
mod sealed {
|
||||
pub trait Sealed {}
|
||||
|
@ -52,7 +52,7 @@ pub trait AudioAggregatorConvertPadExtManual:
|
|||
connect_raw(
|
||||
self.as_ptr() as *mut _,
|
||||
b"notify::converter-config\0".as_ptr() as *const _,
|
||||
Some(transmute::<_, unsafe extern "C" fn()>(
|
||||
Some(transmute::<*const (), unsafe extern "C" fn()>(
|
||||
notify_converter_config_trampoline::<Self, F> as *const (),
|
||||
)),
|
||||
Box::into_raw(f),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use glib::{object::IsA, translate::*};
|
||||
use glib::translate::*;
|
||||
use gst::prelude::*;
|
||||
|
||||
use crate::auto::AudioAggregatorPad;
|
||||
use crate::{ffi, AudioAggregatorPad};
|
||||
|
||||
mod sealed {
|
||||
pub trait Sealed {}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use std::{fmt, marker::PhantomData, mem, ops, ptr, slice};
|
||||
|
||||
use crate::ffi;
|
||||
use glib::translate::*;
|
||||
|
||||
use smallvec::SmallVec;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use std::{mem, slice};
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{prelude::*, translate::*, value::FromValue, Type};
|
||||
|
||||
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
|
||||
|
|
|
@ -73,6 +73,30 @@ impl From<AudioConverterConfig> for gst::Structure {
|
|||
}
|
||||
}
|
||||
|
||||
impl glib::value::ToValue for AudioConverterConfig {
|
||||
fn to_value(&self) -> glib::Value {
|
||||
self.0.to_value()
|
||||
}
|
||||
|
||||
fn value_type(&self) -> glib::Type {
|
||||
self.0.value_type()
|
||||
}
|
||||
}
|
||||
|
||||
impl glib::value::ToValueOptional for AudioConverterConfig {
|
||||
fn to_value_optional(s: Option<&Self>) -> glib::Value {
|
||||
skip_assert_initialized!();
|
||||
s.map(|s| &s.0).to_value()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<AudioConverterConfig> for glib::Value {
|
||||
fn from(s: AudioConverterConfig) -> glib::Value {
|
||||
skip_assert_initialized!();
|
||||
s.0.into()
|
||||
}
|
||||
}
|
||||
|
||||
impl AudioConverterConfig {
|
||||
pub fn new() -> Self {
|
||||
Self(gst::Structure::new_empty("GstAudioConverter"))
|
||||
|
|
|
@ -4,7 +4,7 @@ use std::{mem, ptr};
|
|||
|
||||
use glib::{prelude::*, translate::*};
|
||||
|
||||
use crate::{AudioDecoder, AudioInfo};
|
||||
use crate::{ffi, AudioDecoder, AudioInfo};
|
||||
|
||||
extern "C" {
|
||||
fn _gst_audio_decoder_error(
|
||||
|
|
|
@ -4,7 +4,7 @@ use std::{mem, ptr};
|
|||
|
||||
use glib::{prelude::*, translate::*};
|
||||
|
||||
use crate::AudioEncoder;
|
||||
use crate::{ffi, AudioEncoder};
|
||||
|
||||
mod sealed {
|
||||
pub trait Sealed {}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
use glib::{prelude::*, translate::*};
|
||||
use gst_base::prelude::*;
|
||||
|
||||
use crate::{AudioFilter, AudioInfo};
|
||||
use crate::{ffi, AudioFilter, AudioInfo};
|
||||
|
||||
mod sealed {
|
||||
pub trait Sealed {}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use std::str;
|
||||
|
||||
use crate::ffi;
|
||||
use glib::translate::{from_glib, IntoGlib};
|
||||
use once_cell::sync::Lazy;
|
||||
|
||||
|
@ -364,7 +365,8 @@ mod tests {
|
|||
fn test_display() {
|
||||
gst::init().unwrap();
|
||||
|
||||
format!("{}", crate::AudioFormat::S16be);
|
||||
assert_eq!(format!("{}", crate::AudioFormat::S16be), "S16BE");
|
||||
assert_eq!(format!("{:?}", crate::AudioFormat::S16be), "S16be");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use std::{cmp::Ordering, fmt, marker::PhantomData, str};
|
||||
|
||||
use crate::ffi;
|
||||
use glib::{
|
||||
prelude::*,
|
||||
translate::{from_glib, from_glib_none, FromGlib, IntoGlib, ToGlibPtr, ToGlibPtrMut},
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use std::{fmt, marker::PhantomData, mem, ptr, slice};
|
||||
|
||||
use crate::ffi;
|
||||
use glib::translate::{
|
||||
from_glib, from_glib_full, from_glib_none, IntoGlib, ToGlibPtr, ToGlibPtrMut,
|
||||
};
|
||||
|
@ -96,6 +97,29 @@ impl<'a> AudioInfoBuilder<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn positions_if(
|
||||
self,
|
||||
positions: &'a [crate::AudioChannelPosition],
|
||||
predicate: bool,
|
||||
) -> AudioInfoBuilder<'a> {
|
||||
if predicate {
|
||||
self.positions(positions)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn positions_if_some(
|
||||
self,
|
||||
positions: Option<&'a [crate::AudioChannelPosition]>,
|
||||
) -> AudioInfoBuilder<'a> {
|
||||
if let Some(positions) = positions {
|
||||
self.positions(positions)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn flags(self, flags: crate::AudioFlags) -> Self {
|
||||
Self {
|
||||
flags: Some(flags),
|
||||
|
@ -103,12 +127,44 @@ impl<'a> AudioInfoBuilder<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn flags_if(self, flags: crate::AudioFlags, predicate: bool) -> Self {
|
||||
if predicate {
|
||||
self.flags(flags)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn flags_if_some(self, flags: Option<crate::AudioFlags>) -> Self {
|
||||
if let Some(flags) = flags {
|
||||
self.flags(flags)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn layout(self, layout: crate::AudioLayout) -> Self {
|
||||
Self {
|
||||
layout: Some(layout),
|
||||
..self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn layout_if(self, layout: crate::AudioLayout, predicate: bool) -> Self {
|
||||
if predicate {
|
||||
self.layout(layout)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn layout_if_some(self, layout: Option<crate::AudioLayout>) -> Self {
|
||||
if let Some(layout) = layout {
|
||||
self.layout(layout)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AudioInfo {
|
||||
|
|
|
@ -14,6 +14,8 @@ use glib::translate::{from_glib, IntoGlib};
|
|||
use glib::translate::{from_glib_none, ToGlibPtr};
|
||||
use gst::prelude::*;
|
||||
|
||||
use crate::ffi;
|
||||
|
||||
#[repr(transparent)]
|
||||
#[doc(alias = "GstAudioClippingMeta")]
|
||||
pub struct AudioClippingMeta(ffi::GstAudioClippingMeta);
|
||||
|
@ -294,6 +296,17 @@ impl fmt::Debug for AudioLevelMeta {
|
|||
}
|
||||
}
|
||||
|
||||
pub mod tags {
|
||||
gst::impl_meta_tag!(Audio, crate::ffi::GST_META_TAG_AUDIO_STR);
|
||||
gst::impl_meta_tag!(Channels, crate::ffi::GST_META_TAG_AUDIO_CHANNELS_STR);
|
||||
gst::impl_meta_tag!(Rate, crate::ffi::GST_META_TAG_AUDIO_RATE_STR);
|
||||
#[cfg(feature = "v1_24")]
|
||||
gst::impl_meta_tag!(
|
||||
DSDPlaneOffsets,
|
||||
crate::ffi::GST_META_TAG_DSD_PLANE_OFFSETS_STR
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
@ -319,6 +332,8 @@ mod tests {
|
|||
let cmeta = buffer.meta::<AudioClippingMeta>().unwrap();
|
||||
assert_eq!(cmeta.start().try_into(), Ok(Some(start)));
|
||||
assert_eq!(cmeta.end().try_into(), Ok(Some(stop)));
|
||||
|
||||
assert!(cmeta.has_tag::<tags::Audio>());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue