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 | |