camera: Auto flip the video stream

We could make this better by using glvideoflip but that is someone else's task
This commit is contained in:
Bilal Elmoussaoui 2023-04-22 13:30:50 +02:00 committed by Bilal Elmoussaoui
parent ff0fd34c4b
commit 3a3b9cc8f3
3 changed files with 10 additions and 2 deletions

1
Cargo.lock generated
View file

@ -159,6 +159,7 @@ dependencies = [
"gettext-rs", "gettext-rs",
"gst-plugin-gtk4", "gst-plugin-gtk4",
"gstreamer", "gstreamer",
"gstreamer-video",
"gtk4", "gtk4",
"hex", "hex",
"image 0.24.6", "image 0.24.6",

View file

@ -17,6 +17,7 @@ futures-executor = "0.3"
futures-util = "0.3" futures-util = "0.3"
gettext-rs = {version = "0.7", features = ["gettext-system"]} gettext-rs = {version = "0.7", features = ["gettext-system"]}
gst = {package = "gstreamer", version = "0.20"} gst = {package = "gstreamer", version = "0.20"}
gst_video = { package = "gstreamer-video", version = "0.20"}
gst4gtk = {package = "gst-plugin-gtk4", version = "0.10", features = ["wayland", "x11egl", "x11glx"]} gst4gtk = {package = "gst-plugin-gtk4", version = "0.10", features = ["wayland", "x11egl", "x11glx"]}
gtk = {package = "gtk4", version = "0.6", features = ["v4_10"]} gtk = {package = "gtk4", version = "0.6", features = ["v4_10"]}
hex = {version = "0.4.3", features = ["serde"]} hex = {version = "0.4.3", features = ["serde"]}

View file

@ -19,7 +19,7 @@ static PIPELINE_NAME: Lazy<glib::GString> = Lazy::new(|| glib::GString::from("ca
/// / /// /
/// pipewiresrc -- tee /// pipewiresrc -- tee
/// \ /// \
/// queue -- glsinkbin /// queue -- videoflip - glsinkbin
mod imp { mod imp {
use std::cell::RefCell; use std::cell::RefCell;
@ -148,6 +148,11 @@ impl CameraPaintable {
let queue2 = 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 zbar = gst::ElementFactory::make_with_name("zbar", None)?;
let fakesink = gst::ElementFactory::make_with_name("fakesink", None)?; let fakesink = gst::ElementFactory::make_with_name("fakesink", None)?;
let videoflip = gst::ElementFactory::make("videoflip")
.property("video-direction", gst_video::VideoOrientationMethod::Auto)
.build()?;
let sink = if paintable let sink = if paintable
.property::<Option<gdk::GLContext>>("gl-context") .property::<Option<gdk::GLContext>>("gl-context")
.is_some() .is_some()
@ -180,12 +185,13 @@ impl CameraPaintable {
&zbar, &zbar,
&fakesink, &fakesink,
&queue2, &queue2,
&videoflip,
&sink, &sink,
])?; ])?;
gst::Element::link_many(&[pipewire_src, &tee, &queue1, &videoconvert, &zbar, &fakesink])?; gst::Element::link_many(&[pipewire_src, &tee, &queue1, &videoconvert, &zbar, &fakesink])?;
tee.link_pads(None, &queue2, None)?; tee.link_pads(None, &queue2, None)?;
gst::Element::link_many(&[&queue2, &sink])?; gst::Element::link_many(&[&queue2, &videoflip, &sink])?;
let bus = pipeline.bus().unwrap(); let bus = pipeline.bus().unwrap();
bus.add_watch_local( bus.add_watch_local(