From b82a7ff370573e23b1cb931d44eea734cbd463b8 Mon Sep 17 00:00:00 2001 From: Jules Youngberg Date: Wed, 15 Jun 2022 20:01:41 -0700 Subject: [PATCH] embrace raw pointers for ffi --- src/bindings.rs | 74 ++----------------------------------------------- src/lib.rs | 33 +++++++++++----------- 2 files changed, 20 insertions(+), 87 deletions(-) diff --git a/src/bindings.rs b/src/bindings.rs index 28a0b60..e3ad258 100644 --- a/src/bindings.rs +++ b/src/bindings.rs @@ -116,75 +116,6 @@ fn bindgen_test_layout_mediagraph_Output() { ); } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mediagraph_Feature { - pub data: *mut mediagraph_Landmark, -} -#[test] -fn bindgen_test_layout_mediagraph_Feature() { - assert_eq!( - ::std::mem::size_of::(), - 8usize, - concat!("Size of: ", stringify!(mediagraph_Feature)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(mediagraph_Feature)) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(mediagraph_Feature), - "::", - stringify!(data) - ) - ); -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mediagraph_FeatureList { - pub num_features: u8, - pub features: *mut mediagraph_Feature, -} -#[test] -fn bindgen_test_layout_mediagraph_FeatureList() { - assert_eq!( - ::std::mem::size_of::(), - 16usize, - concat!("Size of: ", stringify!(mediagraph_FeatureList)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(mediagraph_FeatureList)) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).num_features as *const _ as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(mediagraph_FeatureList), - "::", - stringify!(num_features) - ) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).features as *const _ as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(mediagraph_FeatureList), - "::", - stringify!(features) - ) - ); -} -#[repr(C)] pub struct mediagraph_Detector__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug)] @@ -227,13 +158,14 @@ extern "C" { pub fn mediagraph_Detector_Detector_destructor(this: *mut mediagraph_Detector); } extern "C" { - #[link_name = "\u{1}__ZN10mediagraph8Detector7ProcessEPhii"] + #[link_name = "\u{1}__ZN10mediagraph8Detector7ProcessEPhiiS1_"] pub fn mediagraph_Detector_Process( this: *mut ::std::os::raw::c_void, data: *mut u8, width: ::std::os::raw::c_int, height: ::std::os::raw::c_int, - ) -> *mut mediagraph_FeatureList; + num_features: *mut u8, + ) -> *mut mediagraph_Landmark; } #[repr(C)] pub struct mediagraph_Effect__bindgen_vtable(::std::os::raw::c_void); diff --git a/src/lib.rs b/src/lib.rs index a5bd362..14d7e15 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,8 +24,6 @@ use bindings::*; type mFeatureType = mediagraph_FeatureType; type mOutput = mediagraph_Output; -type mFeature = mediagraph_Feature; -type mFeatureList = mediagraph_FeatureList; /// The type of visual feature made up of landmarks. #[derive(Debug, Clone, Copy)] @@ -161,33 +159,36 @@ impl Detector { /// Processes the input frame, returns a slice of landmarks if any are detected. pub fn process(&mut self, input: &Mat) -> Vec>> { let mut data = input.clone(); + let mut num_features = vec![0; self.outputs.len()]; + let results = unsafe { + let nf_data = num_features.as_mut_slice(); mediagraph_Detector_Process( self.graph as *mut std::ffi::c_void, data.data_mut(), data.cols(), data.rows(), + nf_data.as_mut_ptr(), ) }; let mut landmarks = vec![]; + let mut data_index = 0; - let feature_lists = - unsafe { std::slice::from_raw_parts(results, self.outputs.len() as usize) }; - - for (i, feature_list) in feature_lists.iter().enumerate() { - let num_landmarks = self.outputs[i].type_.num_landmarks(); + for (i, &count) in num_features.iter().enumerate() { let mut fl = vec![]; - let features = unsafe { - std::slice::from_raw_parts( - feature_list.features, - feature_list.num_features as usize, - ) - }; + if count == 0 { + landmarks.push(fl); + continue; + } - for feature in features.iter() { - let landmarks = unsafe { std::slice::from_raw_parts(feature.data, num_landmarks) }; - fl.push(landmarks.to_vec()); + let num_landmarks = self.outputs[i].type_.num_landmarks(); + + for _ in 0..count { + let l = + unsafe { std::slice::from_raw_parts(results.add(data_index), num_landmarks) }; + data_index += num_landmarks; + fl.push(l.to_vec()); } landmarks.push(fl);