Merge branch 'master' of github.com-rustdesk:rustdesk/rustdesk

This commit is contained in:
Huabing Zhou
2022-12-23 22:02:06 +08:00
7 changed files with 285 additions and 136 deletions

View File

@@ -48,9 +48,9 @@ bindgen = "0.59"
[target.'cfg(target_os = "linux")'.dependencies]
dbus = { version = "0.9", optional = true }
tracing = { version = "0.1", optional = true }
gstreamer = { version = "0.19", optional = true }
gstreamer-app = { version = "0.19", features = ["v1_16"], optional = true }
gstreamer-video = { version = "0.19", optional = true }
gstreamer = { version = "0.16", optional = true }
gstreamer-app = { version = "0.16", features = ["v1_10"], optional = true }
gstreamer-video = { version = "0.16", optional = true }
[target.'cfg(any(target_os = "windows", target_os = "linux"))'.dependencies]
hwcodec = { git = "https://github.com/21pages/hwcodec", optional = true }

View File

@@ -130,18 +130,18 @@ impl PipeWireRecorder {
pub fn new(capturable: PipeWireCapturable) -> Result<Self, Box<dyn Error>> {
let pipeline = gst::Pipeline::new(None);
let src = gst::ElementFactory::make_with_name("pipewiresrc", None)?;
src.set_property("fd", &capturable.fd.as_raw_fd());
src.set_property("path", &format!("{}", capturable.path));
src.set_property("keepalive_time", &1_000.as_raw_fd());
let src = gst::ElementFactory::make("pipewiresrc", None)?;
src.set_property("fd", &capturable.fd.as_raw_fd())?;
src.set_property("path", &format!("{}", capturable.path))?;
src.set_property("keepalive_time", &1_000.as_raw_fd())?;
// For some reason pipewire blocks on destruction of AppSink if this is not set to true,
// see: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/982
src.set_property("always-copy", &true);
src.set_property("always-copy", &true)?;
let sink = gst::ElementFactory::make_with_name("appsink", None)?;
sink.set_property("drop", &true);
sink.set_property("max-buffers", &1u32);
let sink = gst::ElementFactory::make("appsink", None)?;
sink.set_property("drop", &true)?;
sink.set_property("max-buffers", &1u32)?;
pipeline.add_many(&[&src, &sink])?;
src.link(&sink)?;
@@ -182,21 +182,25 @@ impl Recorder for PipeWireRecorder {
.try_pull_sample(gst::ClockTime::from_mseconds(timeout_ms))
{
let cap = sample
.caps()
.get_caps()
.ok_or("Failed get caps")?
.structure(0)
.get_structure(0)
.ok_or("Failed to get structure")?;
let w: i32 = cap.value("width")?.get()?;
let h: i32 = cap.value("height")?.get()?;
self.pix_fmt = cap.value("format")?.get()?;
let w: i32 = cap.get_value("width")?.get_some()?;
let h: i32 = cap.get_value("height")?.get_some()?;
let w = w as usize;
let h = h as usize;
self.pix_fmt = cap
.get::<&str>("format")?
.ok_or("Failed to get pixel format")?
.to_string();
let buf = sample
.buffer_owned()
.get_buffer_owned()
.ok_or_else(|| GStreamerError("Failed to get owned buffer.".into()))?;
let mut crop = buf
.meta::<gstreamer_video::VideoCropMeta>()
.map(|m| m.rect());
.get_meta::<gstreamer_video::VideoCropMeta>()
.map(|m| m.get_rect());
// only crop if necessary
if Some((0, 0, w as u32, h as u32)) == crop {
crop = None;
@@ -207,7 +211,7 @@ impl Recorder for PipeWireRecorder {
if let Err(..) = crate::would_block_if_equal(&mut self.saved_raw_data, buf.as_slice()) {
return Ok(PixelProvider::NONE);
}
let buf_size = buf.size();
let buf_size = buf.get_size();
// BGRx is 4 bytes per pixel
if buf_size != (w * h * 4) {
// for some reason the width and height of the caps do not guarantee correct buffer