diff --git a/docs/plugins/gst_plugins_cache.json b/docs/plugins/gst_plugins_cache.json index 8eced897..50689988 100644 --- a/docs/plugins/gst_plugins_cache.json +++ b/docs/plugins/gst_plugins_cache.json @@ -4099,6 +4099,18 @@ "type": "guint64", "writable": true }, + "drop-buffer-for-datagram": { + "blurb": "Drop buffers when using datagram if buffer size > max datagram size", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, "initial-mtu": { "blurb": "Initial value to be used as the maximum UDP payload size", "conditionally-available": false, diff --git a/net/quinn/src/common.rs b/net/quinn/src/common.rs index 8f23dbb3..e2137997 100644 --- a/net/quinn/src/common.rs +++ b/net/quinn/src/common.rs @@ -20,6 +20,7 @@ pub(crate) static DEFAULT_MAX_UPPER_BOUND_MTU: u16 = 65527; pub(crate) static DEFAULT_UDP_PAYLOAD_SIZE: u16 = 1452; pub(crate) static DEFAULT_MIN_UDP_PAYLOAD_SIZE: u16 = 1200; pub(crate) static DEFAULT_MAX_UDP_PAYLOAD_SIZE: u16 = 65527; +pub(crate) static DEFAULT_DROP_BUFFER_FOR_DATAGRAM: bool = false; /* * For QUIC transport parameters diff --git a/net/quinn/src/quinnquicsink/imp.rs b/net/quinn/src/quinnquicsink/imp.rs index 2d9611a3..216dd6bb 100644 --- a/net/quinn/src/quinnquicsink/imp.rs +++ b/net/quinn/src/quinnquicsink/imp.rs @@ -59,6 +59,7 @@ struct Settings { certificate_file: Option, private_key_file: Option, transport_config: QuinnQuicTransportConfig, + drop_buffer_for_datagram: bool, } impl Default for Settings { @@ -78,6 +79,7 @@ impl Default for Settings { certificate_file: None, private_key_file: None, transport_config: QuinnQuicTransportConfig::default(), + drop_buffer_for_datagram: DEFAULT_DROP_BUFFER_FOR_DATAGRAM, } } } @@ -268,7 +270,12 @@ impl ObjectImpl for QuinnQuicSink { .nick("Connection statistics") .blurb("Connection statistics") .read_only() - .build() + .build(), + glib::ParamSpecBoolean::builder("drop-buffer-for-datagram") + .nick("Drop buffer for datagram") + .blurb("Drop buffers when using datagram if buffer size > max datagram size") + .default_value(DEFAULT_DROP_BUFFER_FOR_DATAGRAM) + .build(), ] }); @@ -356,6 +363,9 @@ impl ObjectImpl for QuinnQuicSink { let value = value.get::().expect("type checked upstream"); settings.transport_config.datagram_send_buffer_size = value as usize; } + "drop-buffer-for-datagram" => { + settings.drop_buffer_for_datagram = value.get().expect("type checked upstream"); + } _ => unimplemented!(), } } @@ -414,6 +424,7 @@ impl ObjectImpl for QuinnQuicSink { State::Stopped => get_stats(None).to_value(), } } + "drop-buffer-for-datagram" => settings.drop_buffer_for_datagram.to_value(), _ => unimplemented!(), } } @@ -569,6 +580,7 @@ impl QuinnQuicSink { let settings = self.settings.lock().unwrap(); let timeout = settings.timeout; let use_datagram = settings.use_datagram; + let drop_buffer_for_datagram = settings.drop_buffer_for_datagram; drop(settings); let mut state = self.state.lock().unwrap(); @@ -590,10 +602,15 @@ impl QuinnQuicSink { match conn.max_datagram_size() { Some(size) => { if src.len() > size { - return Err(Some(gst::error_msg!( - gst::ResourceError::Failed, - ["Sending data failed, current max datagram size: {size}, buffer size: {}", src.len()] - ))); + if drop_buffer_for_datagram { + gst::warning!(CAT, imp: self, "Buffer dropped, current max datagram size: {size} > buffer size: {}", src.len()); + return Ok(()); + } else { + return Err(Some(gst::error_msg!( + gst::ResourceError::Failed, + ["Sending data failed, current max datagram size: {size}, buffer size: {}", src.len()] + ))); + } } match conn.send_datagram(Bytes::copy_from_slice(src)) {