From 504ad3ae03b828775f18295ca4b3f7fc686b6e1c Mon Sep 17 00:00:00 2001 From: Luca Date: Sun, 2 Mar 2025 00:31:45 +0100 Subject: [PATCH] feat: add properties to offset frame --- src/pingxelflutsink/imp.rs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/pingxelflutsink/imp.rs b/src/pingxelflutsink/imp.rs index 6587b12..44c2b3c 100644 --- a/src/pingxelflutsink/imp.rs +++ b/src/pingxelflutsink/imp.rs @@ -1,4 +1,4 @@ -use gstreamer::glib::{self, ParamSpec, ParamSpecBoolean, ParamSpecString, Value}; +use gstreamer::glib::{self, ParamSpec, ParamSpecBoolean, ParamSpecString, ParamSpecUInt, Value}; use gstreamer::prelude::*; use gstreamer::subclass::prelude::*; use gstreamer::subclass::ElementMetadata; @@ -35,6 +35,8 @@ struct Settings { bind_address: Option, diff_only: bool, prefix: Option, + x: u32, + y: u32, } #[derive(Default)] @@ -79,6 +81,14 @@ impl ObjectImpl for PingxelflutSink { .nick("Destination prefix") .blurb("Prefix of pingxelflut server") .build(), + ParamSpecUInt::builder("x") + .nick("X offset") + .blurb("Offset along X axis") + .build(), + ParamSpecUInt::builder("y") + .nick("Y offset") + .blurb("Offset along Y axis") + .build(), ] }); @@ -106,6 +116,12 @@ impl ObjectImpl for PingxelflutSink { .map(|s| s.parse().ok()) .unwrap_or(None); } + "x" => { + settings.x = value.get::().unwrap(); + } + "y" => { + settings.y = value.get::().unwrap(); + } _ => unimplemented!(), } } @@ -125,6 +141,8 @@ impl ObjectImpl for PingxelflutSink { .as_ref() .map(|addr| addr.to_string()) .to_value(), + "x" => settings.x.to_value(), + "y" => settings.y.to_value(), _ => unimplemented!(), } } @@ -246,10 +264,11 @@ impl VideoSinkImpl for PingxelflutSink { let prefix = settings.prefix.as_ref().unwrap(); if let State::Started { ref socket } = *self.state.lock().unwrap() { - for y in 0..cmp::min(frame.height(), HEIGHT) { - for x in 0..cmp::min(frame.width(), WIDTH) { - let i = - (y * frame.plane_stride()[0] as u32 + x * frame.n_components()) as usize; + for y in settings.y..cmp::min(settings.y + frame.height(), HEIGHT) { + for x in settings.x..cmp::min(settings.x + frame.width(), WIDTH) { + let i = ((y - settings.y) * frame.plane_stride()[0] as u32 + + (x - settings.x) * frame.n_components()) + as usize; let (r, g, b) = (data[i] as u16, data[i + 1] as u16, data[i + 2] as u16); if settings.diff_only