mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-04-17 17:21:29 +03:00
implement RGB0 #2608
This commit is contained in:
@@ -117,6 +117,7 @@ impl Capturable for PipeWireCapturable {
|
||||
pub struct PipeWireRecorder {
|
||||
buffer: Option<gst::MappedBuffer<gst::buffer::Readable>>,
|
||||
buffer_cropped: Vec<u8>,
|
||||
pix_fmt: String,
|
||||
is_cropped: bool,
|
||||
pipeline: gst::Pipeline,
|
||||
appsink: AppSink,
|
||||
@@ -144,19 +145,27 @@ impl PipeWireRecorder {
|
||||
|
||||
pipeline.add_many(&[&src, &sink])?;
|
||||
src.link(&sink)?;
|
||||
|
||||
let appsink = sink
|
||||
.dynamic_cast::<AppSink>()
|
||||
.map_err(|_| GStreamerError("Sink element is expected to be an appsink!".into()))?;
|
||||
appsink.set_caps(Some(&gst::Caps::new_simple(
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
caps.merge_structure(gst::structure::Structure::new(
|
||||
"video/x-raw",
|
||||
&[("format", &"BGRx")],
|
||||
)));
|
||||
));
|
||||
caps.merge_structure(gst::structure::Structure::new(
|
||||
"video/x-raw",
|
||||
&[("format", &"RGBx")],
|
||||
));
|
||||
appsink.set_caps(Some(&caps));
|
||||
|
||||
pipeline.set_state(gst::State::Playing)?;
|
||||
Ok(Self {
|
||||
pipeline,
|
||||
appsink,
|
||||
buffer: None,
|
||||
pix_fmt: "".into(),
|
||||
width: 0,
|
||||
height: 0,
|
||||
buffer_cropped: vec![],
|
||||
@@ -179,6 +188,7 @@ impl Recorder for PipeWireRecorder {
|
||||
.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 = w as usize;
|
||||
let h = h as usize;
|
||||
let buf = sample
|
||||
@@ -241,15 +251,16 @@ impl Recorder for PipeWireRecorder {
|
||||
if self.buffer.is_none() {
|
||||
return Err(Box::new(GStreamerError("No buffer available!".into())));
|
||||
}
|
||||
Ok(PixelProvider::BGR0(
|
||||
self.width,
|
||||
self.height,
|
||||
if self.is_cropped {
|
||||
self.buffer_cropped.as_slice()
|
||||
} else {
|
||||
self.buffer.as_ref().unwrap().as_slice()
|
||||
},
|
||||
))
|
||||
let buf = if self.is_cropped {
|
||||
self.buffer_cropped.as_slice()
|
||||
} else {
|
||||
self.buffer.as_ref().unwrap().as_slice()
|
||||
};
|
||||
match self.pix_fmt.as_str() {
|
||||
"BGRx" => Ok(PixelProvider::BGR0(self.width, self.height, buf)),
|
||||
"RGBx" => Ok(PixelProvider::RGB0(self.width, self.height, buf)),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user