gstreamer_net/
net_address_meta.rs
1use std::fmt;
4
5use crate::ffi;
6use glib::translate::*;
7use gst::prelude::*;
8
9#[repr(transparent)]
10#[doc(alias = "GstNetAddressMeta")]
11pub struct NetAddressMeta(ffi::GstNetAddressMeta);
12
13unsafe impl Send for NetAddressMeta {}
14unsafe impl Sync for NetAddressMeta {}
15
16impl NetAddressMeta {
17 #[doc(alias = "gst_buffer_add_net_address_meta")]
18 pub fn add<'a, A: IsA<gio::SocketAddress>>(
19 buffer: &'a mut gst::BufferRef,
20 addr: &A,
21 ) -> gst::MetaRefMut<'a, Self, gst::meta::Standalone> {
22 skip_assert_initialized!();
23 unsafe {
24 let meta = ffi::gst_buffer_add_net_address_meta(
25 buffer.as_mut_ptr(),
26 addr.as_ref().to_glib_none().0,
27 );
28 Self::from_mut_ptr(buffer, meta)
29 }
30 }
31
32 #[doc(alias = "get_addr")]
33 #[inline]
34 pub fn addr(&self) -> gio::SocketAddress {
35 unsafe { from_glib_none(self.0.addr) }
36 }
37
38 #[inline]
39 pub fn set_addr(&mut self, addr: impl IsA<gio::SocketAddress>) {
40 #![allow(clippy::cast_ptr_alignment)]
41 unsafe {
42 glib::gobject_ffi::g_object_unref(self.0.addr as *mut _);
43 self.0.addr = addr.upcast().into_glib_ptr();
44 }
45 }
46}
47
48unsafe impl MetaAPI for NetAddressMeta {
49 type GstType = ffi::GstNetAddressMeta;
50
51 #[doc(alias = "gst_net_address_meta_api_get_type")]
52 #[inline]
53 fn meta_api() -> glib::Type {
54 unsafe { from_glib(ffi::gst_net_address_meta_api_get_type()) }
55 }
56}
57
58impl fmt::Debug for NetAddressMeta {
59 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
60 f.debug_struct("NetAddressMeta")
61 .field("addr", &self.addr())
62 .finish()
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use gio::prelude::*;
69
70 use super::*;
71
72 #[test]
73 fn test_add_get_meta() {
74 gst::init().unwrap();
75
76 let mut buffer = gst::Buffer::new();
77 let port = 5000;
78 let inet_addr = gio::InetAddress::from_string("127.0.0.1").unwrap();
79
80 let expected_addr = &gio::InetSocketAddress::new(&inet_addr, port);
81
82 let expected_inet_addr = expected_addr.address();
83
84 {
85 let meta = NetAddressMeta::add(
86 buffer.get_mut().unwrap(),
87 &gio::InetSocketAddress::new(&inet_addr, port),
88 );
89
90 let actual_addr = meta.addr().downcast::<gio::InetSocketAddress>().unwrap();
91
92 assert_eq!(actual_addr.port(), expected_addr.port());
93
94 let actual_inet_addr = actual_addr.address();
95
96 assert!(actual_inet_addr.equal(&expected_inet_addr));
97 }
98
99 {
100 let meta = buffer.meta::<NetAddressMeta>().unwrap();
101 let actual_addr = meta.addr().downcast::<gio::InetSocketAddress>().unwrap();
102
103 assert_eq!(actual_addr.port(), expected_addr.port());
104
105 let actual_inet_addr = actual_addr.address();
106
107 assert!(actual_inet_addr.equal(&expected_inet_addr));
108 }
109 }
110}