mirror of
https://gitlab.gnome.org/World/Authenticator.git
synced 2025-03-04 08:44:40 +01:00
camera: Use a GL sink when possible
This commit is contained in:
parent
0990194677
commit
db3afdc7b9
3 changed files with 156 additions and 30 deletions
147
Cargo.lock
generated
147
Cargo.lock
generated
|
@ -978,12 +978,6 @@ dependencies = [
|
|||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fragile"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
|
||||
|
||||
[[package]]
|
||||
name = "futures"
|
||||
version = "0.3.25"
|
||||
|
@ -1412,14 +1406,19 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gst-plugin-gtk4"
|
||||
version = "0.9.3"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f40988bfe4d324150d2cea1f3b5489d1aa47efcba85df81ec6affb04deac37ef"
|
||||
checksum = "55df4500c2530e85a75dfd8637349c10ca68d20b5c1bbf36cd3fa3615dd510c5"
|
||||
dependencies = [
|
||||
"fragile",
|
||||
"gdk4-wayland",
|
||||
"gdk4-x11",
|
||||
"gst-plugin-version-helper",
|
||||
"gstreamer",
|
||||
"gstreamer-base",
|
||||
"gstreamer-gl",
|
||||
"gstreamer-gl-egl",
|
||||
"gstreamer-gl-wayland",
|
||||
"gstreamer-gl-x11",
|
||||
"gstreamer-video",
|
||||
"gtk4",
|
||||
"once_cell",
|
||||
|
@ -1436,9 +1435,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer"
|
||||
version = "0.19.4"
|
||||
version = "0.19.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87a7570ad1d3c1cbf64561ada514fe0c03cf834f2076b85ffc616756c840b665"
|
||||
checksum = "238e5f8624f9256985505232c7499aa7927198ace20ec100990af00b5c5008c8"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cfg-if 1.0.0",
|
||||
|
@ -1486,6 +1485,112 @@ dependencies = [
|
|||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl"
|
||||
version = "0.19.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf71417e113a9d6c15f8a7e370e78dee44bf2e084e2ba9db009902b2b972dd2b"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"glib",
|
||||
"gstreamer",
|
||||
"gstreamer-base",
|
||||
"gstreamer-gl-sys",
|
||||
"gstreamer-video",
|
||||
"libc",
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl-egl"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c231d35df818cc3c99b88a6296bee730d38349a33b53dad9ec460276acc5a64e"
|
||||
dependencies = [
|
||||
"glib",
|
||||
"gstreamer",
|
||||
"gstreamer-gl",
|
||||
"gstreamer-gl-egl-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl-egl-sys"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8197da370a7fbdce967f9ca52b6b64affa39c29ab9a91cba95a11fbb1f74f2ee"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gstreamer-gl-sys",
|
||||
"libc",
|
||||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl-sys"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b21f1634e2a7ba365b5df00e5c4c5077c1d624ef7ad7adbba74df648459dcf3"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
"gstreamer-base-sys",
|
||||
"gstreamer-sys",
|
||||
"gstreamer-video-sys",
|
||||
"libc",
|
||||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl-wayland"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "44cf204c98f3e9bef47a7d62a8c01aa97c3d2e443bf27af3b8548f65e8e7bbfa"
|
||||
dependencies = [
|
||||
"glib",
|
||||
"gstreamer",
|
||||
"gstreamer-gl",
|
||||
"gstreamer-gl-wayland-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl-wayland-sys"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "156bbb8915c654e4d4ea56f0dda3a3168091911a0231b3178a6d1941c0b1389e"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gstreamer-gl-sys",
|
||||
"libc",
|
||||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl-x11"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08bae59810226654ba39ef9da23a09f1b16a1e341ab42017cba722c56ed55504"
|
||||
dependencies = [
|
||||
"glib",
|
||||
"gstreamer",
|
||||
"gstreamer-gl",
|
||||
"gstreamer-gl-x11-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-gl-x11-sys"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc123fb91aa35bd41183ea23ab8292ac11c3dc567e286a0ecb34b3a7a5e22e96"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gstreamer-gl-sys",
|
||||
"libc",
|
||||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-sys"
|
||||
version = "0.19.4"
|
||||
|
@ -1500,9 +1605,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer-video"
|
||||
version = "0.19.4"
|
||||
version = "0.19.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e99623fb99436c4b2da66ae94b25881c94db5144afc1bd7c84cee5cabb72f18"
|
||||
checksum = "eb19dcbdd5436483e764318bef157070f192acc5b1199e85878723a9ce33d4e3"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cfg-if 1.0.0",
|
||||
|
@ -1517,9 +1622,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer-video-sys"
|
||||
version = "0.19.4"
|
||||
version = "0.19.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9206e9df0ed84824bfe4cc13e3359154ad7624221c7d3d6242585db3f19a15d9"
|
||||
checksum = "7546bc798c898f2083330d81a7efff48f65a31b03873f410538032d26ec0cdc7"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
|
@ -1965,9 +2070,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "libsqlite3-sys"
|
||||
version = "0.22.2"
|
||||
version = "0.25.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d"
|
||||
checksum = "29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa"
|
||||
dependencies = [
|
||||
"pkg-config",
|
||||
"vcpkg",
|
||||
|
@ -3023,18 +3128,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.151"
|
||||
version = "1.0.152"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0"
|
||||
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.151"
|
||||
version = "1.0.152"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8"
|
||||
checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
|
@ -12,7 +12,7 @@ diesel = {version = "2.0", features = ["sqlite", "r2d2"]}
|
|||
diesel_migrations = {version = "2.0", features = ["sqlite"]}
|
||||
gettext-rs = {version = "0.7", features = ["gettext-system"]}
|
||||
gst = {package = "gstreamer", version = "0.19"}
|
||||
gst4gtk = { package = "gst-plugin-gtk4", version = "0.9"}
|
||||
gst4gtk = { package = "gst-plugin-gtk4", version = "0.9", features = ["wayland", "x11egl", "x11glx"]}
|
||||
gtk = {package = "gtk4", version = "0.5", features = ["v4_10"]}
|
||||
gtk-macros = "0.3"
|
||||
search-provider = "0.4"
|
||||
|
|
|
@ -141,26 +141,47 @@ impl CameraPaintable {
|
|||
}));
|
||||
|
||||
paintable.connect_invalidate_size(clone!(@weak self as pt => move |_| {
|
||||
pt.invalidate_size ();
|
||||
pt.invalidate_size();
|
||||
}));
|
||||
imp.sink_paintable.replace(Some(paintable));
|
||||
let tee = gst::ElementFactory::make_with_name("tee", None)?;
|
||||
let videoconvert1 = gst::ElementFactory::make_with_name("videoconvert", None)?;
|
||||
let videoconvert2 = gst::ElementFactory::make_with_name("videoconvert", None)?;
|
||||
let videoconvert = gst::ElementFactory::make_with_name("videoconvert", None)?;
|
||||
let queue1 = gst::ElementFactory::make_with_name("queue", None)?;
|
||||
let queue2 = gst::ElementFactory::make_with_name("queue", None)?;
|
||||
let zbar = gst::ElementFactory::make_with_name("zbar", None)?;
|
||||
let fakesink = gst::ElementFactory::make_with_name("fakesink", None)?;
|
||||
let sink = if paintable
|
||||
.property::<Option<gdk::GLContext>>("gl-context")
|
||||
.is_some()
|
||||
{
|
||||
gst::ElementFactory::make("glsinkbin")
|
||||
.property("sink", &sink)
|
||||
.build()
|
||||
.unwrap()
|
||||
} else {
|
||||
let bin = gst::Bin::default();
|
||||
let convert = gst::ElementFactory::make_with_name("videoconvert", None)?;
|
||||
|
||||
bin.add(&convert)?;
|
||||
bin.add(&sink)?;
|
||||
convert.link(&sink)?;
|
||||
|
||||
bin.add_pad(&gst::GhostPad::with_target(
|
||||
Some("sink"),
|
||||
&convert.static_pad("sink").unwrap(),
|
||||
)?)?;
|
||||
|
||||
bin.upcast()
|
||||
};
|
||||
imp.sink_paintable.replace(Some(paintable));
|
||||
|
||||
pipeline.add_many(&[
|
||||
&pipewire_src,
|
||||
&tee,
|
||||
&queue1,
|
||||
&videoconvert1,
|
||||
&videoconvert,
|
||||
&zbar,
|
||||
&fakesink,
|
||||
&queue2,
|
||||
&videoconvert2,
|
||||
&sink,
|
||||
])?;
|
||||
|
||||
|
@ -168,12 +189,12 @@ impl CameraPaintable {
|
|||
&pipewire_src,
|
||||
&tee,
|
||||
&queue1,
|
||||
&videoconvert1,
|
||||
&videoconvert,
|
||||
&zbar,
|
||||
&fakesink,
|
||||
])?;
|
||||
tee.link_pads(None, &queue2, None)?;
|
||||
gst::Element::link_many(&[&queue2, &videoconvert2, &sink])?;
|
||||
gst::Element::link_many(&[&queue2, &sink])?;
|
||||
|
||||
let bus = pipeline.bus().unwrap();
|
||||
bus.add_watch_local(
|
||||
|
|
Loading…
Add table
Reference in a new issue