| 1 | // Take a look at the license at the top of the repository in the LICENSE file. |
| 2 | |
| 3 | use std::ptr; |
| 4 | |
| 5 | use glib::translate::*; |
| 6 | |
| 7 | #[cfg (feature = "v1_18" )] |
| 8 | #[cfg_attr (docsrs, doc(cfg(feature = "v1_18" )))] |
| 9 | use crate::Tracer; |
| 10 | |
| 11 | // import only functions which do not have their own module as namespace |
| 12 | pub use crate::auto::functions::{ |
| 13 | main_executable_path, util_get_timestamp as get_timestamp, version, version_string, |
| 14 | }; |
| 15 | use crate::ffi; |
| 16 | |
| 17 | #[doc (alias = "gst_calculate_linear_regression" )] |
| 18 | pub fn calculate_linear_regression( |
| 19 | xy: &[(u64, u64)], |
| 20 | temp: Option<&mut [(u64, u64)]>, |
| 21 | ) -> Option<(u64, u64, u64, u64, f64)> { |
| 22 | skip_assert_initialized!(); |
| 23 | use std::mem; |
| 24 | |
| 25 | unsafe { |
| 26 | assert_eq!(mem::size_of::<u64>() * 2, mem::size_of::<(u64, u64)>()); |
| 27 | assert_eq!(mem::align_of::<u64>(), mem::align_of::<(u64, u64)>()); |
| 28 | assert!( |
| 29 | temp.as_ref() |
| 30 | .map(|temp| temp.len()) |
| 31 | .unwrap_or_else(|| xy.len()) |
| 32 | >= xy.len() |
| 33 | ); |
| 34 | |
| 35 | let mut m_num = mem::MaybeUninit::uninit(); |
| 36 | let mut m_denom = mem::MaybeUninit::uninit(); |
| 37 | let mut b = mem::MaybeUninit::uninit(); |
| 38 | let mut xbase = mem::MaybeUninit::uninit(); |
| 39 | let mut r_squared = mem::MaybeUninit::uninit(); |
| 40 | |
| 41 | let res = from_glib(ffi::gst_calculate_linear_regression( |
| 42 | xy.as_ptr() as *const u64, |
| 43 | temp.map(|temp| temp.as_mut_ptr() as *mut u64) |
| 44 | .unwrap_or(ptr::null_mut()), |
| 45 | xy.len() as u32, |
| 46 | m_num.as_mut_ptr(), |
| 47 | m_denom.as_mut_ptr(), |
| 48 | b.as_mut_ptr(), |
| 49 | xbase.as_mut_ptr(), |
| 50 | r_squared.as_mut_ptr(), |
| 51 | )); |
| 52 | if res { |
| 53 | Some(( |
| 54 | m_num.assume_init(), |
| 55 | m_denom.assume_init(), |
| 56 | b.assume_init(), |
| 57 | xbase.assume_init(), |
| 58 | r_squared.assume_init(), |
| 59 | )) |
| 60 | } else { |
| 61 | None |
| 62 | } |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | #[cfg (feature = "v1_18" )] |
| 67 | #[cfg_attr (docsrs, doc(cfg(feature = "v1_18" )))] |
| 68 | #[doc (alias = "gst_tracing_get_active_tracers" )] |
| 69 | pub fn active_tracers() -> glib::List<Tracer> { |
| 70 | assert_initialized_main_thread!(); |
| 71 | unsafe { FromGlibPtrContainer::from_glib_full(ffi::gst_tracing_get_active_tracers()) } |
| 72 | } |
| 73 | |
| 74 | #[cfg (feature = "v1_24" )] |
| 75 | #[cfg_attr (docsrs, doc(cfg(feature = "v1_24" )))] |
| 76 | #[doc (alias = "gst_util_filename_compare" )] |
| 77 | pub fn filename_compare(a: &std::path::Path, b: &std::path::Path) -> std::cmp::Ordering { |
| 78 | skip_assert_initialized!(); |
| 79 | unsafe { |
| 80 | from_glib(ffi::gst_util_filename_compare( |
| 81 | a.to_glib_none().0, |
| 82 | b.to_glib_none().0, |
| 83 | )) |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | #[cfg (test)] |
| 88 | mod tests { |
| 89 | use super::*; |
| 90 | |
| 91 | #[test ] |
| 92 | fn test_calculate_linear_regression() { |
| 93 | crate::init().unwrap(); |
| 94 | |
| 95 | let values = [(0, 0), (1, 1), (2, 2), (3, 3)]; |
| 96 | |
| 97 | let (m_num, m_denom, b, xbase, _) = calculate_linear_regression(&values, None).unwrap(); |
| 98 | assert_eq!((m_num, m_denom, b, xbase), (10, 10, 3, 3)); |
| 99 | |
| 100 | let mut temp = [(0, 0); 4]; |
| 101 | let (m_num, m_denom, b, xbase, _) = |
| 102 | calculate_linear_regression(&values, Some(&mut temp)).unwrap(); |
| 103 | assert_eq!((m_num, m_denom, b, xbase), (10, 10, 3, 3)); |
| 104 | } |
| 105 | } |
| 106 | |