From 52dbf859eef42b54b2ec22be03df619f5133e2f9 Mon Sep 17 00:00:00 2001 From: Luca Date: Fri, 28 Feb 2025 21:53:25 +0100 Subject: [PATCH] feat: add boolean property for diff-only mode --- src/pingxelflutsink/imp.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/pingxelflutsink/imp.rs b/src/pingxelflutsink/imp.rs index 6cc2830..6587b12 100644 --- a/src/pingxelflutsink/imp.rs +++ b/src/pingxelflutsink/imp.rs @@ -1,4 +1,4 @@ -use gstreamer::glib::{self, ParamSpec, ParamSpecString, Value}; +use gstreamer::glib::{self, ParamSpec, ParamSpecBoolean, ParamSpecString, Value}; use gstreamer::prelude::*; use gstreamer::subclass::prelude::*; use gstreamer::subclass::ElementMetadata; @@ -7,7 +7,6 @@ use gstreamer::{ FlowSuccess, LoggableError, PadDirection, PadPresence, PadTemplate, ResourceError, }; -use gstreamer_base::prelude::*; use gstreamer_base::subclass::prelude::*; use gstreamer_video::prelude::*; @@ -34,6 +33,7 @@ static CAT: LazyLock = LazyLock::new(|| { #[derive(Default)] struct Settings { bind_address: Option, + diff_only: bool, prefix: Option, } @@ -71,6 +71,10 @@ impl ObjectImpl for PingxelflutSink { .nick("Bind address") .blurb("Local address to bind to") .build(), + ParamSpecBoolean::builder("diff-only") + .nick("Diff only") + .blurb("Only send pixels different from previous frame") + .build(), ParamSpecString::builder("prefix") .nick("Destination prefix") .blurb("Prefix of pingxelflut server") @@ -92,6 +96,9 @@ impl ObjectImpl for PingxelflutSink { .map(|s| s.parse().ok()) .unwrap_or(None); } + "diff-only" => { + settings.diff_only = value.get::().unwrap(); + } "prefix" => { settings.prefix = value .get::>() @@ -112,6 +119,7 @@ impl ObjectImpl for PingxelflutSink { .as_ref() .map(|addr| addr.to_string()) .to_value(), + "diff-only" => settings.diff_only.to_value(), "prefix" => settings .prefix .as_ref() @@ -244,11 +252,13 @@ impl VideoSinkImpl for PingxelflutSink { (y * frame.plane_stride()[0] as u32 + 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 prev_frame.as_ref().map_or(false, |f| { - f.plane_data(0).is_ok_and(|d| { - d[i] as u16 == r && d[i + 1] as u16 == g && d[i + 2] as u16 == b + if settings.diff_only + && prev_frame.as_ref().map_or(false, |f| { + f.plane_data(0).is_ok_and(|d| { + d[i] as u16 == r && d[i + 1] as u16 == g && d[i + 2] as u16 == b + }) }) - }) { + { continue; }