mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-06-07 07:58:53 +00:00
threadshare/udpsink: Remove host/port properties
In combination with the clients property and the add/remove signals this behaves very inconsistent as there are multiple ways to do the same.
This commit is contained in:
parent
b4f6e7186a
commit
e1784ea01b
2 changed files with 8 additions and 127 deletions
|
@ -71,8 +71,6 @@ const DEFAULT_CONTEXT_WAIT: u32 = 0;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct Settings {
|
struct Settings {
|
||||||
host: Option<String>,
|
|
||||||
port: i32,
|
|
||||||
sync: bool,
|
sync: bool,
|
||||||
bind_address: String,
|
bind_address: String,
|
||||||
bind_port: i32,
|
bind_port: i32,
|
||||||
|
@ -94,8 +92,6 @@ struct Settings {
|
||||||
impl Default for Settings {
|
impl Default for Settings {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Settings {
|
Settings {
|
||||||
host: DEFAULT_HOST.map(Into::into),
|
|
||||||
port: DEFAULT_PORT,
|
|
||||||
sync: DEFAULT_SYNC,
|
sync: DEFAULT_SYNC,
|
||||||
bind_address: DEFAULT_BIND_ADDRESS.into(),
|
bind_address: DEFAULT_BIND_ADDRESS.into(),
|
||||||
bind_port: DEFAULT_BIND_PORT,
|
bind_port: DEFAULT_BIND_PORT,
|
||||||
|
@ -124,27 +120,7 @@ lazy_static! {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PROPERTIES: [subclass::Property; 19] = [
|
static PROPERTIES: [subclass::Property; 17] = [
|
||||||
subclass::Property("host", |name| {
|
|
||||||
glib::ParamSpec::string(
|
|
||||||
name,
|
|
||||||
"Host",
|
|
||||||
"The host/IP/Multicast group to send the packets to",
|
|
||||||
DEFAULT_HOST,
|
|
||||||
glib::ParamFlags::READWRITE,
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
subclass::Property("port", |name| {
|
|
||||||
glib::ParamSpec::int(
|
|
||||||
name,
|
|
||||||
"Port",
|
|
||||||
"The port to send the packets to",
|
|
||||||
0,
|
|
||||||
u16::MAX as i32,
|
|
||||||
DEFAULT_PORT,
|
|
||||||
glib::ParamFlags::READWRITE,
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
subclass::Property("sync", |name| {
|
subclass::Property("sync", |name| {
|
||||||
glib::ParamSpec::boolean(
|
glib::ParamSpec::boolean(
|
||||||
name,
|
name,
|
||||||
|
@ -383,21 +359,6 @@ impl UdpSinkPadHandlerInner {
|
||||||
self.clients_to_configure.retain(|addr2| addr != *addr2);
|
self.clients_to_configure.retain(|addr2| addr != *addr2);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace_client(
|
|
||||||
&mut self,
|
|
||||||
gst_pad: &gst::Pad,
|
|
||||||
addr: Option<SocketAddr>,
|
|
||||||
new_addr: Option<SocketAddr>,
|
|
||||||
) {
|
|
||||||
if let Some(addr) = addr {
|
|
||||||
self.remove_client(gst_pad, addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(new_addr) = new_addr {
|
|
||||||
self.add_client(gst_pad, new_addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_client(&mut self, gst_pad: &gst::Pad, addr: SocketAddr) {
|
fn add_client(&mut self, gst_pad: &gst::Pad, addr: SocketAddr) {
|
||||||
if self.clients.contains(&addr) {
|
if self.clients.contains(&addr) {
|
||||||
gst_warning!(CAT, obj: gst_pad, "Not adding client {:?} again", &addr);
|
gst_warning!(CAT, obj: gst_pad, "Not adding client {:?} again", &addr);
|
||||||
|
@ -461,18 +422,6 @@ impl UdpSinkPadHandler {
|
||||||
self.0.write().unwrap().remove_client(gst_pad, addr);
|
self.0.write().unwrap().remove_client(gst_pad, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace_client(
|
|
||||||
&self,
|
|
||||||
gst_pad: &gst::Pad,
|
|
||||||
addr: Option<SocketAddr>,
|
|
||||||
new_addr: Option<SocketAddr>,
|
|
||||||
) {
|
|
||||||
self.0
|
|
||||||
.write()
|
|
||||||
.unwrap()
|
|
||||||
.replace_client(gst_pad, addr, new_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_client(&self, gst_pad: &gst::Pad, addr: SocketAddr) {
|
fn add_client(&self, gst_pad: &gst::Pad, addr: SocketAddr) {
|
||||||
self.0.write().unwrap().add_client(gst_pad, addr);
|
self.0.write().unwrap().add_client(gst_pad, addr);
|
||||||
}
|
}
|
||||||
|
@ -1144,11 +1093,6 @@ impl UdpSink {
|
||||||
.remove_client(&self.sink_pad.gst_pad(), addr);
|
.remove_client(&self.sink_pad.gst_pad(), addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace_client(&self, addr: Option<SocketAddr>, new_addr: Option<SocketAddr>) {
|
|
||||||
self.sink_pad_handler
|
|
||||||
.replace_client(&self.sink_pad.gst_pad(), addr, new_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_client(&self, addr: SocketAddr) {
|
fn add_client(&self, addr: SocketAddr) {
|
||||||
self.sink_pad_handler
|
self.sink_pad_handler
|
||||||
.add_client(&self.sink_pad.gst_pad(), addr);
|
.add_client(&self.sink_pad.gst_pad(), addr);
|
||||||
|
@ -1249,12 +1193,9 @@ impl ObjectSubclass for UdpSink {
|
||||||
.expect("missing signal arg");
|
.expect("missing signal arg");
|
||||||
|
|
||||||
let udpsink = Self::from_instance(&element);
|
let udpsink = Self::from_instance(&element);
|
||||||
let settings = udpsink.settings.lock().unwrap();
|
|
||||||
|
|
||||||
if Some(&host) != settings.host.as_ref() || port != settings.port {
|
if let Ok(addr) = try_into_socket_addr(&element, &host, port) {
|
||||||
if let Ok(addr) = try_into_socket_addr(&element, &host, port) {
|
udpsink.remove_client(addr);
|
||||||
udpsink.remove_client(addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
None
|
None
|
||||||
|
@ -1273,13 +1214,7 @@ impl ObjectSubclass for UdpSink {
|
||||||
.expect("missing signal arg");
|
.expect("missing signal arg");
|
||||||
|
|
||||||
let udpsink = Self::from_instance(&element);
|
let udpsink = Self::from_instance(&element);
|
||||||
let settings = udpsink.settings.lock().unwrap();
|
udpsink.clear_clients(std::iter::empty());
|
||||||
let current_client = settings
|
|
||||||
.host
|
|
||||||
.iter()
|
|
||||||
.filter_map(|host| try_into_socket_addr(&element, host, settings.port).ok());
|
|
||||||
|
|
||||||
udpsink.clear_clients(current_client);
|
|
||||||
|
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
|
@ -1311,38 +1246,6 @@ impl ObjectImpl for UdpSink {
|
||||||
|
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
match *prop {
|
match *prop {
|
||||||
subclass::Property("host", ..) => {
|
|
||||||
let current_client = settings
|
|
||||||
.host
|
|
||||||
.as_ref()
|
|
||||||
.and_then(|host| try_into_socket_addr(&element, host, settings.port).ok());
|
|
||||||
|
|
||||||
let new_host = value.get().expect("type checked upstream");
|
|
||||||
|
|
||||||
let new_client = new_host
|
|
||||||
.and_then(|host| try_into_socket_addr(&element, host, settings.port).ok());
|
|
||||||
|
|
||||||
self.replace_client(current_client, new_client);
|
|
||||||
|
|
||||||
settings.host = new_host.map(ToString::to_string);
|
|
||||||
}
|
|
||||||
subclass::Property("port", ..) => {
|
|
||||||
let current_client = settings
|
|
||||||
.host
|
|
||||||
.as_ref()
|
|
||||||
.and_then(|host| try_into_socket_addr(&element, host, settings.port).ok());
|
|
||||||
|
|
||||||
let new_port = value.get_some().expect("type checked upstream");
|
|
||||||
|
|
||||||
let new_client = settings
|
|
||||||
.host
|
|
||||||
.as_ref()
|
|
||||||
.and_then(|host| try_into_socket_addr(&element, host, new_port).ok());
|
|
||||||
|
|
||||||
self.replace_client(current_client, new_client);
|
|
||||||
|
|
||||||
settings.port = new_port;
|
|
||||||
}
|
|
||||||
subclass::Property("sync", ..) => {
|
subclass::Property("sync", ..) => {
|
||||||
settings.sync = value.get_some().expect("type checked upstream");
|
settings.sync = value.get_some().expect("type checked upstream");
|
||||||
}
|
}
|
||||||
|
@ -1403,14 +1306,7 @@ impl ObjectImpl for UdpSink {
|
||||||
.expect("type checked upstream")
|
.expect("type checked upstream")
|
||||||
.unwrap_or_else(|| "".into());
|
.unwrap_or_else(|| "".into());
|
||||||
|
|
||||||
let host = settings.host.clone();
|
let clients_iter = clients.split(',').filter_map(|client| {
|
||||||
let port = settings.port;
|
|
||||||
|
|
||||||
let current_client = host
|
|
||||||
.iter()
|
|
||||||
.filter_map(|host| try_into_socket_addr(&element, &host, port).ok());
|
|
||||||
|
|
||||||
let clients_iter = current_client.chain(clients.split(',').filter_map(|client| {
|
|
||||||
let rsplit: Vec<&str> = client.rsplitn(2, ':').collect();
|
let rsplit: Vec<&str> = client.rsplitn(2, ':').collect();
|
||||||
|
|
||||||
if rsplit.len() == 2 {
|
if rsplit.len() == 2 {
|
||||||
|
@ -1430,7 +1326,7 @@ impl ObjectImpl for UdpSink {
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
drop(settings);
|
drop(settings);
|
||||||
|
|
||||||
self.clear_clients(clients_iter);
|
self.clear_clients(clients_iter);
|
||||||
|
@ -1453,8 +1349,6 @@ impl ObjectImpl for UdpSink {
|
||||||
|
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
match *prop {
|
match *prop {
|
||||||
subclass::Property("host", ..) => Ok(settings.host.to_value()),
|
|
||||||
subclass::Property("port", ..) => Ok(settings.port.to_value()),
|
|
||||||
subclass::Property("sync", ..) => Ok(settings.sync.to_value()),
|
subclass::Property("sync", ..) => Ok(settings.sync.to_value()),
|
||||||
subclass::Property("bind-address", ..) => Ok(settings.bind_address.to_value()),
|
subclass::Property("bind-address", ..) => Ok(settings.bind_address.to_value()),
|
||||||
subclass::Property("bind-port", ..) => Ok(settings.bind_port.to_value()),
|
subclass::Property("bind-port", ..) => Ok(settings.bind_port.to_value()),
|
||||||
|
|
|
@ -83,21 +83,8 @@ fn test_client_management() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(clients, "127.0.0.1:5004");
|
assert_eq!(clients, "127.0.0.1:5004");
|
||||||
|
|
||||||
/* While the default host:address client is listed in clients,
|
/* Removing the default client is possible */
|
||||||
* it can't be removed with the remove signal */
|
|
||||||
udpsink.emit("remove", &[&"127.0.0.1", &5004i32]).unwrap();
|
udpsink.emit("remove", &[&"127.0.0.1", &5004i32]).unwrap();
|
||||||
let clients = udpsink
|
|
||||||
.get_property("clients")
|
|
||||||
.unwrap()
|
|
||||||
.get::<String>()
|
|
||||||
.unwrap()
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(clients, "127.0.0.1:5004");
|
|
||||||
|
|
||||||
/* It is however possible to remove the default client by setting
|
|
||||||
* host to None */
|
|
||||||
let host: Option<String> = None;
|
|
||||||
udpsink.set_property("host", &host).unwrap();
|
|
||||||
let clients = udpsink
|
let clients = udpsink
|
||||||
.get_property("clients")
|
.get_property("clients")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -136,7 +123,7 @@ fn test_chain() {
|
||||||
h.set_src_caps_str(&"foo/bar");
|
h.set_src_caps_str(&"foo/bar");
|
||||||
{
|
{
|
||||||
let udpsink = h.get_element().unwrap();
|
let udpsink = h.get_element().unwrap();
|
||||||
udpsink.set_property("port", &5005i32).unwrap();
|
udpsink.set_property("clients", &"127.0.0.1:5005").unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
|
|
Loading…
Reference in a new issue