mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-25 19:11:06 +00:00
net: Add various static PTP clock API
This allows initializing the PTP clock infrastructure, deinitializing it, checking the current status and adding statistics callbacks.
This commit is contained in:
parent
ba25d7ea90
commit
c651d96c49
2 changed files with 103 additions and 1 deletions
|
@ -31,11 +31,13 @@ pub use crate::auto::*;
|
||||||
mod net_client_clock;
|
mod net_client_clock;
|
||||||
mod net_time_provider;
|
mod net_time_provider;
|
||||||
mod ntp_clock;
|
mod ntp_clock;
|
||||||
mod ptp_clock;
|
|
||||||
|
|
||||||
pub use crate::net_address_meta::*;
|
pub use crate::net_address_meta::*;
|
||||||
mod net_address_meta;
|
mod net_address_meta;
|
||||||
|
|
||||||
|
mod ptp_clock;
|
||||||
|
pub use ptp_clock::PtpStatisticsCallback;
|
||||||
|
|
||||||
// Re-export all the traits in a prelude module, so that applications
|
// Re-export all the traits in a prelude module, so that applications
|
||||||
// can always "use gst_net::prelude::*" without getting conflicts
|
// can always "use gst_net::prelude::*" without getting conflicts
|
||||||
pub mod prelude {
|
pub mod prelude {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// Take a look at the license at the top of the repository in the LICENSE file.
|
// Take a look at the license at the top of the repository in the LICENSE file.
|
||||||
|
|
||||||
|
use std::num::NonZeroU64;
|
||||||
|
|
||||||
use crate::PtpClock;
|
use crate::PtpClock;
|
||||||
|
|
||||||
use glib::prelude::*;
|
use glib::prelude::*;
|
||||||
|
@ -22,4 +24,102 @@ impl PtpClock {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rustdoc-stripper-ignore-next
|
||||||
|
/// Initialize GStreamer PTP clock support
|
||||||
|
///
|
||||||
|
/// This is automatically called once the first PTP clock instance is created.
|
||||||
|
#[doc(alias = "gst_ptp_init")]
|
||||||
|
pub fn init(clock_id: Option<u64>, interfaces: &[&str]) -> Result<(), glib::BoolError> {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
unsafe {
|
||||||
|
let res: bool = from_glib(ffi::gst_ptp_init(
|
||||||
|
clock_id.unwrap_or(u64::MAX),
|
||||||
|
interfaces.to_glib_none().0,
|
||||||
|
));
|
||||||
|
|
||||||
|
if res {
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(glib::bool_error!("Failed to initialize PTP subsystem"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// rustdoc-stripper-ignore-next
|
||||||
|
/// Deinitialize GStreamer PTP clock support
|
||||||
|
///
|
||||||
|
/// Any PTP clocks that are still running will not receive any updates anymore.
|
||||||
|
#[doc(alias = "gst_ptp_deinit")]
|
||||||
|
pub fn deinit() {
|
||||||
|
unsafe {
|
||||||
|
ffi::gst_ptp_deinit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// rustdoc-stripper-ignore-next
|
||||||
|
/// Check if the GStreamer PTP clock support is initialized
|
||||||
|
#[doc(alias = "gst_ptp_is_initialized")]
|
||||||
|
pub fn is_initialized() -> bool {
|
||||||
|
unsafe { from_glib(ffi::gst_ptp_is_initialized()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// rustdoc-stripper-ignore-next
|
||||||
|
/// Check if GStreamer PTP clocks are supported
|
||||||
|
#[doc(alias = "gst_ptp_is_supported")]
|
||||||
|
pub fn is_supported() -> bool {
|
||||||
|
unsafe { from_glib(ffi::gst_ptp_is_supported()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// rustdoc-stripper-ignore-next
|
||||||
|
/// Add a PTP clock statistics callback
|
||||||
|
#[doc(alias = "gst_ptp_statistics_callback_add")]
|
||||||
|
pub fn add_statistics_callback<
|
||||||
|
F: Fn(u8, &gst::StructureRef) -> glib::Continue + 'static + Send + Sync,
|
||||||
|
>(
|
||||||
|
func: F,
|
||||||
|
) -> PtpStatisticsCallback {
|
||||||
|
unsafe {
|
||||||
|
unsafe extern "C" fn trampoline<
|
||||||
|
F: Fn(u8, &gst::StructureRef) -> glib::Continue + 'static + Send + Sync,
|
||||||
|
>(
|
||||||
|
domain: u8,
|
||||||
|
stats: *const gst::ffi::GstStructure,
|
||||||
|
user_data: glib::ffi::gpointer,
|
||||||
|
) -> glib::ffi::gboolean {
|
||||||
|
let callback = &*(user_data as *const F);
|
||||||
|
callback(domain, gst::StructureRef::from_glib_borrow(stats)).into_glib()
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe extern "C" fn destroy<
|
||||||
|
F: Fn(u8, &gst::StructureRef) -> glib::Continue + 'static + Send + Sync,
|
||||||
|
>(
|
||||||
|
user_data: glib::ffi::gpointer,
|
||||||
|
) {
|
||||||
|
let _ = Box::from_raw(user_data as *mut F);
|
||||||
|
}
|
||||||
|
|
||||||
|
let user_data = Box::new(func);
|
||||||
|
let id = ffi::gst_ptp_statistics_callback_add(
|
||||||
|
Some(trampoline::<F>),
|
||||||
|
Box::into_raw(user_data) as glib::ffi::gpointer,
|
||||||
|
Some(destroy::<F>),
|
||||||
|
);
|
||||||
|
assert_ne!(id, 0);
|
||||||
|
|
||||||
|
PtpStatisticsCallback(NonZeroU64::new_unchecked(id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct PtpStatisticsCallback(NonZeroU64);
|
||||||
|
|
||||||
|
impl PtpStatisticsCallback {
|
||||||
|
#[doc(alias = "gst_ptp_statistics_callback_remove")]
|
||||||
|
pub fn remove(self) {
|
||||||
|
unsafe {
|
||||||
|
ffi::gst_ptp_statistics_callback_remove(self.0.get() as _);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue