screencapturekit/cm/
ffi.rs

1//! Raw FFI bindings for Core Media types.
2//!
3//! These are low-level bindings and are not intended for direct use.
4#![allow(missing_docs)]
5
6extern "C" {
7    pub fn cm_sample_buffer_get_image_buffer(
8        sample_buffer: *mut std::ffi::c_void,
9    ) -> *mut std::ffi::c_void;
10    pub fn cm_sample_buffer_get_frame_status(sample_buffer: *mut std::ffi::c_void) -> i32;
11
12    // Frame info accessors
13    pub fn cm_sample_buffer_get_display_time(
14        sample_buffer: *mut std::ffi::c_void,
15        out_value: *mut u64,
16    ) -> bool;
17    pub fn cm_sample_buffer_get_scale_factor(
18        sample_buffer: *mut std::ffi::c_void,
19        out_value: *mut f64,
20    ) -> bool;
21    pub fn cm_sample_buffer_get_content_scale(
22        sample_buffer: *mut std::ffi::c_void,
23        out_value: *mut f64,
24    ) -> bool;
25    pub fn cm_sample_buffer_get_content_rect(
26        sample_buffer: *mut std::ffi::c_void,
27        out_x: *mut f64,
28        out_y: *mut f64,
29        out_width: *mut f64,
30        out_height: *mut f64,
31    ) -> bool;
32    pub fn cm_sample_buffer_get_bounding_rect(
33        sample_buffer: *mut std::ffi::c_void,
34        out_x: *mut f64,
35        out_y: *mut f64,
36        out_width: *mut f64,
37        out_height: *mut f64,
38    ) -> bool;
39    pub fn cm_sample_buffer_get_screen_rect(
40        sample_buffer: *mut std::ffi::c_void,
41        out_x: *mut f64,
42        out_y: *mut f64,
43        out_width: *mut f64,
44        out_height: *mut f64,
45    ) -> bool;
46    pub fn cm_sample_buffer_get_dirty_rects(
47        sample_buffer: *mut std::ffi::c_void,
48        out_rects: *mut *mut std::ffi::c_void,
49        out_count: *mut usize,
50    ) -> bool;
51    pub fn cm_sample_buffer_free_dirty_rects(rects_ptr: *mut std::ffi::c_void);
52
53    pub fn cm_sample_buffer_get_presentation_timestamp(
54        sample_buffer: *mut std::ffi::c_void,
55        out_value: *mut i64,
56        out_timescale: *mut i32,
57        out_flags: *mut u32,
58        out_epoch: *mut i64,
59    );
60    pub fn cm_sample_buffer_get_duration(
61        sample_buffer: *mut std::ffi::c_void,
62        out_value: *mut i64,
63        out_timescale: *mut i32,
64        out_flags: *mut u32,
65        out_epoch: *mut i64,
66    );
67    pub fn cm_sample_buffer_release(sample_buffer: *mut std::ffi::c_void);
68    pub fn cm_sample_buffer_retain(sample_buffer: *mut std::ffi::c_void);
69    pub fn cm_sample_buffer_is_valid(sample_buffer: *mut std::ffi::c_void) -> bool;
70    pub fn cm_sample_buffer_get_num_samples(sample_buffer: *mut std::ffi::c_void) -> usize;
71    pub fn cm_sample_buffer_get_audio_buffer_list(
72        sample_buffer: *mut std::ffi::c_void,
73        out_num_buffers: *mut u32,
74        out_buffers_ptr: *mut *mut std::ffi::c_void,
75        out_buffers_len: *mut usize,
76        out_block_buffer: *mut *mut std::ffi::c_void,
77    );
78    pub fn cm_block_buffer_release(block_buffer: *mut std::ffi::c_void);
79    pub fn cm_block_buffer_retain(block_buffer: *mut std::ffi::c_void) -> *mut std::ffi::c_void;
80    pub fn cm_block_buffer_get_data_length(block_buffer: *mut std::ffi::c_void) -> usize;
81    pub fn cm_block_buffer_is_empty(block_buffer: *mut std::ffi::c_void) -> bool;
82    pub fn cm_block_buffer_is_range_contiguous(
83        block_buffer: *mut std::ffi::c_void,
84        offset: usize,
85        length: usize,
86    ) -> bool;
87    pub fn cm_block_buffer_get_data_pointer(
88        block_buffer: *mut std::ffi::c_void,
89        offset: usize,
90        out_length_at_offset: *mut usize,
91        out_total_length: *mut usize,
92        out_data_pointer: *mut *mut std::ffi::c_void,
93    ) -> i32;
94    pub fn cm_block_buffer_copy_data_bytes(
95        block_buffer: *mut std::ffi::c_void,
96        offset_to_data: usize,
97        data_length: usize,
98        destination: *mut std::ffi::c_void,
99    ) -> i32;
100    pub fn cm_sample_buffer_get_data_buffer(
101        sample_buffer: *mut std::ffi::c_void,
102    ) -> *mut std::ffi::c_void;
103
104    pub fn cm_sample_buffer_get_decode_timestamp(
105        sample_buffer: *mut std::ffi::c_void,
106        out_value: *mut i64,
107        out_timescale: *mut i32,
108        out_flags: *mut u32,
109        out_epoch: *mut i64,
110    );
111    pub fn cm_sample_buffer_get_output_presentation_timestamp(
112        sample_buffer: *mut std::ffi::c_void,
113        out_value: *mut i64,
114        out_timescale: *mut i32,
115        out_flags: *mut u32,
116        out_epoch: *mut i64,
117    );
118    pub fn cm_sample_buffer_set_output_presentation_timestamp(
119        sample_buffer: *mut std::ffi::c_void,
120        value: i64,
121        timescale: i32,
122        flags: u32,
123        epoch: i64,
124    ) -> i32;
125    pub fn cm_sample_buffer_get_sample_size(
126        sample_buffer: *mut std::ffi::c_void,
127        sample_index: usize,
128    ) -> usize;
129    pub fn cm_sample_buffer_get_total_sample_size(sample_buffer: *mut std::ffi::c_void) -> usize;
130    pub fn cm_sample_buffer_is_ready_for_data_access(sample_buffer: *mut std::ffi::c_void) -> bool;
131    pub fn cm_sample_buffer_make_data_ready(sample_buffer: *mut std::ffi::c_void) -> i32;
132
133    // New CMSampleBuffer APIs
134    pub fn cm_sample_buffer_get_format_description(
135        sample_buffer: *mut std::ffi::c_void,
136    ) -> *mut std::ffi::c_void;
137    pub fn cm_sample_buffer_get_sample_timing_info(
138        sample_buffer: *mut std::ffi::c_void,
139        sample_index: usize,
140        out_duration_value: *mut i64,
141        out_duration_timescale: *mut i32,
142        out_duration_flags: *mut u32,
143        out_duration_epoch: *mut i64,
144        out_pts_value: *mut i64,
145        out_pts_timescale: *mut i32,
146        out_pts_flags: *mut u32,
147        out_pts_epoch: *mut i64,
148        out_dts_value: *mut i64,
149        out_dts_timescale: *mut i32,
150        out_dts_flags: *mut u32,
151        out_dts_epoch: *mut i64,
152    ) -> i32;
153    pub fn cm_sample_buffer_invalidate(sample_buffer: *mut std::ffi::c_void) -> i32;
154    pub fn cm_sample_buffer_create_copy_with_new_timing(
155        sample_buffer: *mut std::ffi::c_void,
156        num_timing_infos: usize,
157        timing_info_array: *const std::ffi::c_void,
158        sample_buffer_out: *mut *mut std::ffi::c_void,
159    ) -> i32;
160    pub fn cm_sample_buffer_copy_pcm_data_into_audio_buffer_list(
161        sample_buffer: *mut std::ffi::c_void,
162        frame_offset: i32,
163        num_frames: i32,
164        buffer_list: *mut std::ffi::c_void,
165    ) -> i32;
166
167    // CMFormatDescription APIs
168    pub fn cm_format_description_get_media_type(format_description: *mut std::ffi::c_void) -> u32;
169    pub fn cm_format_description_get_media_subtype(
170        format_description: *mut std::ffi::c_void,
171    ) -> u32;
172    pub fn cm_format_description_get_extensions(
173        format_description: *mut std::ffi::c_void,
174    ) -> *const std::ffi::c_void;
175    pub fn cm_format_description_retain(
176        format_description: *mut std::ffi::c_void,
177    ) -> *mut std::ffi::c_void;
178    pub fn cm_format_description_release(format_description: *mut std::ffi::c_void);
179
180    // CMFormatDescription Audio APIs
181    pub fn cm_format_description_get_audio_sample_rate(
182        format_description: *mut std::ffi::c_void,
183    ) -> f64;
184    pub fn cm_format_description_get_audio_channel_count(
185        format_description: *mut std::ffi::c_void,
186    ) -> u32;
187    pub fn cm_format_description_get_audio_bits_per_channel(
188        format_description: *mut std::ffi::c_void,
189    ) -> u32;
190    pub fn cm_format_description_get_audio_bytes_per_frame(
191        format_description: *mut std::ffi::c_void,
192    ) -> u32;
193    pub fn cm_format_description_get_audio_format_flags(
194        format_description: *mut std::ffi::c_void,
195    ) -> u32;
196
197    // Hash functions
198    pub fn cm_sample_buffer_hash(sample_buffer: *mut std::ffi::c_void) -> usize;
199    pub fn cv_pixel_buffer_hash(pixel_buffer: *mut std::ffi::c_void) -> usize;
200    pub fn cv_pixel_buffer_pool_hash(pool: *mut std::ffi::c_void) -> usize;
201    pub fn cm_block_buffer_hash(block_buffer: *mut std::ffi::c_void) -> usize;
202    pub fn cm_format_description_hash(format_description: *mut std::ffi::c_void) -> usize;
203    pub fn io_surface_hash(surface: *mut std::ffi::c_void) -> usize;
204
205    pub fn cv_pixel_buffer_get_width(pixel_buffer: *mut std::ffi::c_void) -> usize;
206    pub fn cv_pixel_buffer_get_height(pixel_buffer: *mut std::ffi::c_void) -> usize;
207    pub fn cv_pixel_buffer_get_pixel_format_type(pixel_buffer: *mut std::ffi::c_void) -> u32;
208    pub fn cv_pixel_buffer_get_bytes_per_row(pixel_buffer: *mut std::ffi::c_void) -> usize;
209    pub fn cv_pixel_buffer_lock_base_address(
210        pixel_buffer: *mut std::ffi::c_void,
211        flags: u32,
212    ) -> i32;
213    pub fn cv_pixel_buffer_unlock_base_address(
214        pixel_buffer: *mut std::ffi::c_void,
215        flags: u32,
216    ) -> i32;
217    pub fn cv_pixel_buffer_get_base_address(
218        pixel_buffer: *mut std::ffi::c_void,
219    ) -> *mut std::ffi::c_void;
220    pub fn cv_pixel_buffer_get_io_surface(
221        pixel_buffer: *mut std::ffi::c_void,
222    ) -> *mut std::ffi::c_void;
223    pub fn cv_pixel_buffer_release(pixel_buffer: *mut std::ffi::c_void);
224    pub fn cv_pixel_buffer_retain(pixel_buffer: *mut std::ffi::c_void) -> *mut std::ffi::c_void;
225    pub fn cv_pixel_buffer_create(
226        width: usize,
227        height: usize,
228        pixel_format_type: u32,
229        pixel_buffer_out: *mut *mut std::ffi::c_void,
230    ) -> i32;
231    pub fn cv_pixel_buffer_create_with_bytes(
232        width: usize,
233        height: usize,
234        pixel_format_type: u32,
235        base_address: *mut std::ffi::c_void,
236        bytes_per_row: usize,
237        pixel_buffer_out: *mut *mut std::ffi::c_void,
238    ) -> i32;
239    pub fn cv_pixel_buffer_fill_extended_pixels(pixel_buffer: *mut std::ffi::c_void) -> i32;
240
241    // New CVPixelBuffer APIs
242    pub fn cv_pixel_buffer_create_with_planar_bytes(
243        width: usize,
244        height: usize,
245        pixel_format_type: u32,
246        num_planes: usize,
247        plane_base_addresses: *const *mut std::ffi::c_void,
248        plane_widths: *const usize,
249        plane_heights: *const usize,
250        plane_bytes_per_row: *const usize,
251        pixel_buffer_out: *mut *mut std::ffi::c_void,
252    ) -> i32;
253    pub fn cv_pixel_buffer_create_with_io_surface(
254        io_surface: *mut std::ffi::c_void,
255        pixel_buffer_out: *mut *mut std::ffi::c_void,
256    ) -> i32;
257    pub fn cv_pixel_buffer_get_type_id() -> usize;
258
259    // CVPixelBufferPool APIs
260    pub fn cv_pixel_buffer_pool_create(
261        width: usize,
262        height: usize,
263        pixel_format_type: u32,
264        max_buffers: usize,
265        pool_out: *mut *mut std::ffi::c_void,
266    ) -> i32;
267    pub fn cv_pixel_buffer_pool_create_pixel_buffer(
268        pool: *mut std::ffi::c_void,
269        pixel_buffer_out: *mut *mut std::ffi::c_void,
270    ) -> i32;
271    pub fn cv_pixel_buffer_pool_flush(pool: *mut std::ffi::c_void);
272    pub fn cv_pixel_buffer_pool_get_type_id() -> usize;
273    pub fn cv_pixel_buffer_pool_retain(pool: *mut std::ffi::c_void) -> *mut std::ffi::c_void;
274    pub fn cv_pixel_buffer_pool_release(pool: *mut std::ffi::c_void);
275
276    // Additional pool APIs
277    pub fn cv_pixel_buffer_pool_get_attributes(
278        pool: *mut std::ffi::c_void,
279    ) -> *const std::ffi::c_void;
280    pub fn cv_pixel_buffer_pool_get_pixel_buffer_attributes(
281        pool: *mut std::ffi::c_void,
282    ) -> *const std::ffi::c_void;
283
284    pub fn cv_pixel_buffer_get_data_size(pixel_buffer: *mut std::ffi::c_void) -> usize;
285    pub fn cv_pixel_buffer_is_planar(pixel_buffer: *mut std::ffi::c_void) -> bool;
286    pub fn cv_pixel_buffer_get_plane_count(pixel_buffer: *mut std::ffi::c_void) -> usize;
287    pub fn cv_pixel_buffer_get_width_of_plane(
288        pixel_buffer: *mut std::ffi::c_void,
289        plane_index: usize,
290    ) -> usize;
291    pub fn cv_pixel_buffer_get_height_of_plane(
292        pixel_buffer: *mut std::ffi::c_void,
293        plane_index: usize,
294    ) -> usize;
295    pub fn cv_pixel_buffer_get_base_address_of_plane(
296        pixel_buffer: *mut std::ffi::c_void,
297        plane_index: usize,
298    ) -> *mut std::ffi::c_void;
299    pub fn cv_pixel_buffer_get_bytes_per_row_of_plane(
300        pixel_buffer: *mut std::ffi::c_void,
301        plane_index: usize,
302    ) -> usize;
303    pub fn cv_pixel_buffer_get_extended_pixels(
304        pixel_buffer: *mut std::ffi::c_void,
305        extra_columns_on_left: *mut usize,
306        extra_columns_on_right: *mut usize,
307        extra_rows_on_top: *mut usize,
308        extra_rows_on_bottom: *mut usize,
309    );
310
311    pub fn cm_sample_buffer_create_for_image_buffer(
312        image_buffer: *mut std::ffi::c_void,
313        presentation_time_value: i64,
314        presentation_time_scale: i32,
315        duration_value: i64,
316        duration_scale: i32,
317        sample_buffer_out: *mut *mut std::ffi::c_void,
318    ) -> i32;
319
320    // IOSurface functions
321    pub fn io_surface_get_width(surface: *mut std::ffi::c_void) -> usize;
322    pub fn io_surface_get_height(surface: *mut std::ffi::c_void) -> usize;
323    pub fn io_surface_get_bytes_per_row(surface: *mut std::ffi::c_void) -> usize;
324    pub fn io_surface_get_alloc_size(surface: *mut std::ffi::c_void) -> usize;
325    pub fn io_surface_get_pixel_format(surface: *mut std::ffi::c_void) -> u32;
326    pub fn io_surface_get_id(surface: *mut std::ffi::c_void) -> u32;
327    pub fn io_surface_get_seed(surface: *mut std::ffi::c_void) -> u32;
328    pub fn io_surface_get_plane_count(surface: *mut std::ffi::c_void) -> usize;
329    pub fn io_surface_get_width_of_plane(
330        surface: *mut std::ffi::c_void,
331        plane_index: usize,
332    ) -> usize;
333    pub fn io_surface_get_height_of_plane(
334        surface: *mut std::ffi::c_void,
335        plane_index: usize,
336    ) -> usize;
337    pub fn io_surface_get_bytes_per_row_of_plane(
338        surface: *mut std::ffi::c_void,
339        plane_index: usize,
340    ) -> usize;
341    pub fn io_surface_get_base_address_of_plane(
342        surface: *mut std::ffi::c_void,
343        plane_index: usize,
344    ) -> *mut std::ffi::c_void;
345    pub fn io_surface_get_base_address(surface: *mut std::ffi::c_void) -> *mut std::ffi::c_void;
346    pub fn io_surface_get_bytes_per_element(surface: *mut std::ffi::c_void) -> usize;
347    pub fn io_surface_get_element_width(surface: *mut std::ffi::c_void) -> usize;
348    pub fn io_surface_get_element_height(surface: *mut std::ffi::c_void) -> usize;
349    pub fn io_surface_is_in_use(surface: *mut std::ffi::c_void) -> bool;
350    pub fn io_surface_increment_use_count(surface: *mut std::ffi::c_void);
351    pub fn io_surface_decrement_use_count(surface: *mut std::ffi::c_void);
352    pub fn io_surface_lock(surface: *mut std::ffi::c_void, options: u32, seed: *mut u32) -> i32;
353    pub fn io_surface_unlock(surface: *mut std::ffi::c_void, options: u32, seed: *mut u32) -> i32;
354    pub fn io_surface_release(surface: *mut std::ffi::c_void);
355    pub fn io_surface_retain(surface: *mut std::ffi::c_void) -> *mut std::ffi::c_void;
356
357    // CMBlockBuffer creation (for testing)
358    pub fn cm_block_buffer_create_with_data(
359        data: *const std::ffi::c_void,
360        data_length: usize,
361        block_buffer_out: *mut *mut std::ffi::c_void,
362    ) -> i32;
363    pub fn cm_block_buffer_create_empty(block_buffer_out: *mut *mut std::ffi::c_void) -> i32;
364}