Retrieve IOSurface in Rust callback as opposed to doing so in delegate

Antonio Scandurra created

Change summary

crates/capture/src/main.rs | 46 ++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 25 deletions(-)

Detailed changes

crates/capture/src/main.rs 🔗

@@ -63,7 +63,24 @@ fn main() {
                 let output: id = msg_send![capture_output_class, alloc];
                 let output: id = msg_send![output, init];
                 let callback = Box::new(|buffer: CMSampleBufferRef| {
-                    dbg!("HEY!");
+                    let buffer = CMSampleBuffer::wrap_under_get_rule(buffer);
+                    let attachments = buffer.attachments();
+                    let attachments = attachments.first().expect("no attachments for sample");
+                    let string = bindings::SCStreamFrameInfoStatus.0 as CFStringRef;
+                    let status = core_foundation::number::CFNumber::wrap_under_get_rule(
+                        *attachments.get(string) as CFNumberRef,
+                    )
+                    .to_i64()
+                    .expect("invalid frame info status");
+
+                    if status != bindings::SCFrameStatus_SCFrameStatusComplete {
+                        println!("received incomplete frame");
+                        return;
+                    }
+
+                    let image_buffer = buffer.image_buffer();
+                    dbg!(image_buffer.width(), image_buffer.height());
+                    let io_surface = image_buffer.io_surface();
                 }) as Box<dyn FnMut(CMSampleBufferRef)>;
                 let callback = Box::into_raw(Box::new(callback));
                 (*output).set_ivar("callback", callback as *mut c_void);
@@ -159,32 +176,11 @@ extern "C" fn sample_output(
     buffer: id,
     _kind: SCStreamOutputType,
 ) {
-    let buffer = unsafe { CMSampleBuffer::wrap_under_get_rule(buffer as CMSampleBufferRef) };
-    let callback = unsafe { *this.get_ivar::<*mut c_void>("callback") };
-    let callback = callback as *mut Box<dyn FnMut(CMSampleBufferRef)>;
-    let x = unsafe { callback.as_mut().unwrap() };
-    (*x)(buffer.as_concrete_TypeRef());
-
-    let attachments = buffer.attachments();
-    let attachments = attachments.first().expect("no attachments for sample");
-
     unsafe {
-        let string = bindings::SCStreamFrameInfoStatus.0 as CFStringRef;
-        let status = core_foundation::number::CFNumber::wrap_under_get_rule(
-            *attachments.get(string) as CFNumberRef,
-        )
-        .to_i64()
-        .expect("invalid frame info status");
-
-        if status != bindings::SCFrameStatus_SCFrameStatusComplete {
-            println!("received incomplete frame");
-            return;
-        }
+        let callback = *this.get_ivar::<*mut c_void>("callback");
+        let callback = &mut *(callback as *mut Box<dyn FnMut(CMSampleBufferRef)>);
+        (*callback)(buffer as CMSampleBufferRef);
     }
-
-    let image_buffer = buffer.image_buffer();
-    dbg!(image_buffer.width(), image_buffer.height());
-    let io_surface = image_buffer.io_surface();
 }
 
 fn quit(_: &Quit, cx: &mut gpui::MutableAppContext) {