1use core::cell::UnsafeCell;
4use core::ffi::*;
5use core::marker::{PhantomData, PhantomPinned};
6use core::ptr::NonNull;
7#[cfg(feature = "objc2")]
8use objc2::__framework_prelude::*;
9use objc2_core_foundation::*;
10
11use crate::*;
12
13pub const kCMBufferQueueError_AllocationFailed: OSStatus = -12760;
15pub const kCMBufferQueueError_RequiredParameterMissing: OSStatus = -12761;
17pub const kCMBufferQueueError_InvalidCMBufferCallbacksStruct: OSStatus = -12762;
19pub const kCMBufferQueueError_EnqueueAfterEndOfData: OSStatus = -12763;
21pub const kCMBufferQueueError_QueueIsFull: OSStatus = -12764;
23pub const kCMBufferQueueError_BadTriggerDuration: OSStatus = -12765;
25pub const kCMBufferQueueError_CannotModifyQueueFromTriggerCallback: OSStatus = -12766;
27pub const kCMBufferQueueError_InvalidTriggerCondition: OSStatus = -12767;
29pub const kCMBufferQueueError_InvalidTriggerToken: OSStatus = -12768;
31pub const kCMBufferQueueError_InvalidBuffer: OSStatus = -12769;
33
34#[doc(alias = "CMBufferQueueRef")]
38#[repr(C)]
39pub struct CMBufferQueue {
40 inner: [u8; 0],
41 _p: UnsafeCell<PhantomData<(*const UnsafeCell<()>, PhantomPinned)>>,
42}
43
44cf_type!(
45 unsafe impl CMBufferQueue {}
46);
47#[cfg(feature = "objc2")]
48cf_objc2_type!(
49 unsafe impl RefEncode<"opaqueCMBufferQueue"> for CMBufferQueue {}
50);
51
52#[doc(alias = "CMBufferRef")]
59pub type CMBuffer = CFType;
60
61#[cfg(feature = "CMTime")]
68pub type CMBufferGetTimeCallback =
69 Option<unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void) -> CMTime>;
70
71#[cfg(all(feature = "CMTime", feature = "block2"))]
78pub type CMBufferGetTimeHandler = *mut block2::DynBlock<dyn Fn(NonNull<CMBuffer>) -> CMTime>;
79
80pub type CMBufferGetBooleanCallback =
86 Option<unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void) -> Boolean>;
87
88#[cfg(feature = "block2")]
94pub type CMBufferGetBooleanHandler = *mut block2::DynBlock<dyn Fn(NonNull<CMBuffer>) -> Boolean>;
95
96pub type CMBufferCompareCallback = Option<
102 unsafe extern "C-unwind" fn(
103 NonNull<CMBuffer>,
104 NonNull<CMBuffer>,
105 *mut c_void,
106 ) -> CFComparisonResult,
107>;
108
109#[cfg(feature = "block2")]
113pub type CMBufferCompareHandler =
114 *mut block2::DynBlock<dyn Fn(NonNull<CMBuffer>, NonNull<CMBuffer>) -> CFComparisonResult>;
115
116pub type CMBufferGetSizeCallback =
122 Option<unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void) -> usize>;
123
124#[cfg(feature = "block2")]
130pub type CMBufferGetSizeHandler = *mut block2::DynBlock<dyn Fn(NonNull<CMBuffer>) -> usize>;
131
132#[cfg(feature = "CMTime")]
141#[repr(C, packed(4))]
142#[allow(unpredictable_function_pointer_comparisons)]
143#[derive(Clone, Copy, Debug, PartialEq)]
144pub struct CMBufferCallbacks {
145 pub version: u32,
147 pub refcon: *mut c_void,
150 pub getDecodeTimeStamp: CMBufferGetTimeCallback,
157 pub getPresentationTimeStamp: CMBufferGetTimeCallback,
165 pub getDuration: CMBufferGetTimeCallback,
168 pub isDataReady: CMBufferGetBooleanCallback,
172 pub compare: CMBufferCompareCallback,
175 pub dataBecameReadyNotification: *const CFString,
179 pub getSize: CMBufferGetSizeCallback,
184}
185
186#[cfg(all(feature = "CMTime", feature = "objc2"))]
187unsafe impl Encode for CMBufferCallbacks {
188 const ENCODING: Encoding = Encoding::Struct(
189 "?",
190 &[
191 <u32>::ENCODING,
192 <*mut c_void>::ENCODING,
193 <CMBufferGetTimeCallback>::ENCODING,
194 <CMBufferGetTimeCallback>::ENCODING,
195 <CMBufferGetTimeCallback>::ENCODING,
196 <CMBufferGetBooleanCallback>::ENCODING,
197 <CMBufferCompareCallback>::ENCODING,
198 <*const CFString>::ENCODING,
199 <CMBufferGetSizeCallback>::ENCODING,
200 ],
201 );
202}
203
204#[cfg(all(feature = "CMTime", feature = "objc2"))]
205unsafe impl RefEncode for CMBufferCallbacks {
206 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
207}
208
209#[cfg(all(feature = "CMTime", feature = "block2"))]
211#[repr(C)]
212#[derive(Clone, Copy, Debug, PartialEq)]
213pub struct CMBufferHandlers {
214 pub version: usize,
216 pub getDecodeTimeStamp: CMBufferGetTimeHandler,
223 pub getPresentationTimeStamp: CMBufferGetTimeHandler,
231 pub getDuration: CMBufferGetTimeHandler,
234 pub isDataReady: CMBufferGetBooleanHandler,
238 pub compare: CMBufferCompareHandler,
241 pub dataBecameReadyNotification: *const CFString,
245 pub getSize: CMBufferGetSizeHandler,
248}
249
250#[cfg(all(feature = "CMTime", feature = "block2", feature = "objc2"))]
251unsafe impl Encode for CMBufferHandlers {
252 const ENCODING: Encoding = Encoding::Struct(
253 "?",
254 &[
255 <usize>::ENCODING,
256 <CMBufferGetTimeHandler>::ENCODING,
257 <CMBufferGetTimeHandler>::ENCODING,
258 <CMBufferGetTimeHandler>::ENCODING,
259 <CMBufferGetBooleanHandler>::ENCODING,
260 <CMBufferCompareHandler>::ENCODING,
261 <*const CFString>::ENCODING,
262 <CMBufferGetSizeHandler>::ENCODING,
263 ],
264 );
265}
266
267#[cfg(all(feature = "CMTime", feature = "block2", feature = "objc2"))]
268unsafe impl RefEncode for CMBufferHandlers {
269 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
270}
271
272impl CMBufferQueue {
273 #[doc(alias = "CMBufferQueueGetCallbacksForUnsortedSampleBuffers")]
275 #[cfg(feature = "CMTime")]
276 #[inline]
277 pub unsafe fn callbacks_for_unsorted_sample_buffers() -> NonNull<CMBufferCallbacks> {
278 extern "C-unwind" {
279 fn CMBufferQueueGetCallbacksForUnsortedSampleBuffers(
280 ) -> Option<NonNull<CMBufferCallbacks>>;
281 }
282 let ret = unsafe { CMBufferQueueGetCallbacksForUnsortedSampleBuffers() };
283 ret.expect("function was marked as returning non-null, but actually returned NULL")
284 }
285
286 #[doc(alias = "CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS")]
288 #[cfg(feature = "CMTime")]
289 #[inline]
290 pub unsafe fn callbacks_for_sample_buffers_sorted_by_output_pts() -> NonNull<CMBufferCallbacks>
291 {
292 extern "C-unwind" {
293 fn CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS(
294 ) -> Option<NonNull<CMBufferCallbacks>>;
295 }
296 let ret = unsafe { CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS() };
297 ret.expect("function was marked as returning non-null, but actually returned NULL")
298 }
299
300 #[doc(alias = "CMBufferQueueCreate")]
309 #[cfg(all(feature = "CMBase", feature = "CMTime"))]
310 #[inline]
311 pub unsafe fn create(
312 allocator: Option<&CFAllocator>,
313 capacity: CMItemCount,
314 callbacks: NonNull<CMBufferCallbacks>,
315 queue_out: NonNull<*mut CMBufferQueue>,
316 ) -> OSStatus {
317 extern "C-unwind" {
318 fn CMBufferQueueCreate(
319 allocator: Option<&CFAllocator>,
320 capacity: CMItemCount,
321 callbacks: NonNull<CMBufferCallbacks>,
322 queue_out: NonNull<*mut CMBufferQueue>,
323 ) -> OSStatus;
324 }
325 unsafe { CMBufferQueueCreate(allocator, capacity, callbacks, queue_out) }
326 }
327
328 #[doc(alias = "CMBufferQueueCreateWithHandlers")]
337 #[cfg(all(feature = "CMBase", feature = "CMTime", feature = "block2"))]
338 #[inline]
339 pub unsafe fn create_with_handlers(
340 allocator: Option<&CFAllocator>,
341 capacity: CMItemCount,
342 handlers: NonNull<CMBufferHandlers>,
343 queue_out: NonNull<*mut CMBufferQueue>,
344 ) -> OSStatus {
345 extern "C-unwind" {
346 fn CMBufferQueueCreateWithHandlers(
347 allocator: Option<&CFAllocator>,
348 capacity: CMItemCount,
349 handlers: NonNull<CMBufferHandlers>,
350 queue_out: NonNull<*mut CMBufferQueue>,
351 ) -> OSStatus;
352 }
353 unsafe { CMBufferQueueCreateWithHandlers(allocator, capacity, handlers, queue_out) }
354 }
355}
356
357unsafe impl ConcreteType for CMBufferQueue {
358 #[doc(alias = "CMBufferQueueGetTypeID")]
364 #[inline]
365 fn type_id() -> CFTypeID {
366 extern "C-unwind" {
367 fn CMBufferQueueGetTypeID() -> CFTypeID;
368 }
369 unsafe { CMBufferQueueGetTypeID() }
370 }
371}
372
373impl CMBufferQueue {
374 #[doc(alias = "CMBufferQueueEnqueue")]
385 #[inline]
386 pub unsafe fn enqueue(&self, buf: &CMBuffer) -> OSStatus {
387 extern "C-unwind" {
388 fn CMBufferQueueEnqueue(queue: &CMBufferQueue, buf: &CMBuffer) -> OSStatus;
389 }
390 unsafe { CMBufferQueueEnqueue(self, buf) }
391 }
392
393 #[doc(alias = "CMBufferQueueDequeueAndRetain")]
401 #[inline]
402 pub unsafe fn dequeue_and_retain(&self) -> Option<CFRetained<CMBuffer>> {
403 extern "C-unwind" {
404 fn CMBufferQueueDequeueAndRetain(queue: &CMBufferQueue) -> Option<NonNull<CMBuffer>>;
405 }
406 let ret = unsafe { CMBufferQueueDequeueAndRetain(self) };
407 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
408 }
409
410 #[doc(alias = "CMBufferQueueDequeueIfDataReadyAndRetain")]
418 #[inline]
419 pub unsafe fn dequeue_if_data_ready_and_retain(&self) -> Option<CFRetained<CMBuffer>> {
420 extern "C-unwind" {
421 fn CMBufferQueueDequeueIfDataReadyAndRetain(
422 queue: &CMBufferQueue,
423 ) -> Option<NonNull<CMBuffer>>;
424 }
425 let ret = unsafe { CMBufferQueueDequeueIfDataReadyAndRetain(self) };
426 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
427 }
428
429 #[doc(alias = "CMBufferQueueGetHead")]
440 #[deprecated]
441 #[inline]
442 pub unsafe fn get_head(&self) -> Option<CFRetained<CMBuffer>> {
443 extern "C-unwind" {
444 fn CMBufferQueueGetHead(queue: &CMBufferQueue) -> Option<NonNull<CMBuffer>>;
445 }
446 let ret = unsafe { CMBufferQueueGetHead(self) };
447 ret.map(|ret| unsafe { CFRetained::retain(ret) })
448 }
449
450 #[doc(alias = "CMBufferQueueCopyHead")]
460 #[inline]
461 pub unsafe fn head(&self) -> Option<CFRetained<CMBuffer>> {
462 extern "C-unwind" {
463 fn CMBufferQueueCopyHead(queue: &CMBufferQueue) -> Option<NonNull<CMBuffer>>;
464 }
465 let ret = unsafe { CMBufferQueueCopyHead(self) };
466 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
467 }
468
469 #[doc(alias = "CMBufferQueueIsEmpty")]
473 #[inline]
474 pub unsafe fn is_empty(&self) -> bool {
475 extern "C-unwind" {
476 fn CMBufferQueueIsEmpty(queue: &CMBufferQueue) -> Boolean;
477 }
478 let ret = unsafe { CMBufferQueueIsEmpty(self) };
479 ret != 0
480 }
481
482 #[doc(alias = "CMBufferQueueMarkEndOfData")]
487 #[inline]
488 pub unsafe fn mark_end_of_data(&self) -> OSStatus {
489 extern "C-unwind" {
490 fn CMBufferQueueMarkEndOfData(queue: &CMBufferQueue) -> OSStatus;
491 }
492 unsafe { CMBufferQueueMarkEndOfData(self) }
493 }
494
495 #[doc(alias = "CMBufferQueueContainsEndOfData")]
501 #[inline]
502 pub unsafe fn contains_end_of_data(&self) -> bool {
503 extern "C-unwind" {
504 fn CMBufferQueueContainsEndOfData(queue: &CMBufferQueue) -> Boolean;
505 }
506 let ret = unsafe { CMBufferQueueContainsEndOfData(self) };
507 ret != 0
508 }
509
510 #[doc(alias = "CMBufferQueueIsAtEndOfData")]
516 #[inline]
517 pub unsafe fn is_at_end_of_data(&self) -> bool {
518 extern "C-unwind" {
519 fn CMBufferQueueIsAtEndOfData(queue: &CMBufferQueue) -> Boolean;
520 }
521 let ret = unsafe { CMBufferQueueIsAtEndOfData(self) };
522 ret != 0
523 }
524
525 #[doc(alias = "CMBufferQueueReset")]
530 #[inline]
531 pub unsafe fn reset(&self) -> OSStatus {
532 extern "C-unwind" {
533 fn CMBufferQueueReset(queue: &CMBufferQueue) -> OSStatus;
534 }
535 unsafe { CMBufferQueueReset(self) }
536 }
537
538 #[doc(alias = "CMBufferQueueResetWithCallback")]
545 #[inline]
546 pub unsafe fn reset_with_callback(
547 &self,
548 callback: unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void),
549 refcon: *mut c_void,
550 ) -> OSStatus {
551 extern "C-unwind" {
552 fn CMBufferQueueResetWithCallback(
553 queue: &CMBufferQueue,
554 callback: unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void),
555 refcon: *mut c_void,
556 ) -> OSStatus;
557 }
558 unsafe { CMBufferQueueResetWithCallback(self, callback, refcon) }
559 }
560
561 #[doc(alias = "CMBufferQueueGetBufferCount")]
563 #[cfg(feature = "CMBase")]
564 #[inline]
565 pub unsafe fn buffer_count(&self) -> CMItemCount {
566 extern "C-unwind" {
567 fn CMBufferQueueGetBufferCount(queue: &CMBufferQueue) -> CMItemCount;
568 }
569 unsafe { CMBufferQueueGetBufferCount(self) }
570 }
571
572 #[doc(alias = "CMBufferQueueGetDuration")]
579 #[cfg(feature = "CMTime")]
580 #[inline]
581 pub unsafe fn duration(&self) -> CMTime {
582 extern "C-unwind" {
583 fn CMBufferQueueGetDuration(queue: &CMBufferQueue) -> CMTime;
584 }
585 unsafe { CMBufferQueueGetDuration(self) }
586 }
587
588 #[doc(alias = "CMBufferQueueGetMinDecodeTimeStamp")]
595 #[cfg(feature = "CMTime")]
596 #[inline]
597 pub unsafe fn min_decode_time_stamp(&self) -> CMTime {
598 extern "C-unwind" {
599 fn CMBufferQueueGetMinDecodeTimeStamp(queue: &CMBufferQueue) -> CMTime;
600 }
601 unsafe { CMBufferQueueGetMinDecodeTimeStamp(self) }
602 }
603
604 #[doc(alias = "CMBufferQueueGetFirstDecodeTimeStamp")]
611 #[cfg(feature = "CMTime")]
612 #[inline]
613 pub unsafe fn first_decode_time_stamp(&self) -> CMTime {
614 extern "C-unwind" {
615 fn CMBufferQueueGetFirstDecodeTimeStamp(queue: &CMBufferQueue) -> CMTime;
616 }
617 unsafe { CMBufferQueueGetFirstDecodeTimeStamp(self) }
618 }
619
620 #[doc(alias = "CMBufferQueueGetMinPresentationTimeStamp")]
628 #[cfg(feature = "CMTime")]
629 #[inline]
630 pub unsafe fn min_presentation_time_stamp(&self) -> CMTime {
631 extern "C-unwind" {
632 fn CMBufferQueueGetMinPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
633 }
634 unsafe { CMBufferQueueGetMinPresentationTimeStamp(self) }
635 }
636
637 #[doc(alias = "CMBufferQueueGetFirstPresentationTimeStamp")]
644 #[cfg(feature = "CMTime")]
645 #[inline]
646 pub unsafe fn first_presentation_time_stamp(&self) -> CMTime {
647 extern "C-unwind" {
648 fn CMBufferQueueGetFirstPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
649 }
650 unsafe { CMBufferQueueGetFirstPresentationTimeStamp(self) }
651 }
652
653 #[doc(alias = "CMBufferQueueGetMaxPresentationTimeStamp")]
658 #[cfg(feature = "CMTime")]
659 #[inline]
660 pub unsafe fn max_presentation_time_stamp(&self) -> CMTime {
661 extern "C-unwind" {
662 fn CMBufferQueueGetMaxPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
663 }
664 unsafe { CMBufferQueueGetMaxPresentationTimeStamp(self) }
665 }
666
667 #[doc(alias = "CMBufferQueueGetEndPresentationTimeStamp")]
673 #[cfg(feature = "CMTime")]
674 #[inline]
675 pub unsafe fn end_presentation_time_stamp(&self) -> CMTime {
676 extern "C-unwind" {
677 fn CMBufferQueueGetEndPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
678 }
679 unsafe { CMBufferQueueGetEndPresentationTimeStamp(self) }
680 }
681
682 #[doc(alias = "CMBufferQueueGetTotalSize")]
689 #[inline]
690 pub unsafe fn total_size(&self) -> usize {
691 extern "C-unwind" {
692 fn CMBufferQueueGetTotalSize(queue: &CMBufferQueue) -> usize;
693 }
694 unsafe { CMBufferQueueGetTotalSize(self) }
695 }
696}
697
698#[repr(C)]
700#[derive(Debug)]
701pub struct opaqueCMBufferQueueTriggerToken {
702 inner: [u8; 0],
703 _p: UnsafeCell<PhantomData<(*const UnsafeCell<()>, PhantomPinned)>>,
704}
705
706#[cfg(feature = "objc2")]
707unsafe impl RefEncode for opaqueCMBufferQueueTriggerToken {
708 const ENCODING_REF: Encoding =
709 Encoding::Pointer(&Encoding::Struct("opaqueCMBufferQueueTriggerToken", &[]));
710}
711
712pub type CMBufferQueueTriggerToken = *mut opaqueCMBufferQueueTriggerToken;
737
738pub type CMBufferQueueTriggerCallback =
742 Option<unsafe extern "C-unwind" fn(*mut c_void, CMBufferQueueTriggerToken)>;
743
744#[cfg(feature = "block2")]
746pub type CMBufferQueueTriggerHandler = *mut block2::DynBlock<dyn Fn(CMBufferQueueTriggerToken)>;
747
748pub type CMBufferQueueTriggerCondition = i32;
752
753pub const kCMBufferQueueTrigger_WhenDurationBecomesLessThan: CMBufferQueueTriggerCondition = 1;
755pub const kCMBufferQueueTrigger_WhenDurationBecomesLessThanOrEqualTo:
757 CMBufferQueueTriggerCondition = 2;
758pub const kCMBufferQueueTrigger_WhenDurationBecomesGreaterThan: CMBufferQueueTriggerCondition = 3;
760pub const kCMBufferQueueTrigger_WhenDurationBecomesGreaterThanOrEqualTo:
762 CMBufferQueueTriggerCondition = 4;
763pub const kCMBufferQueueTrigger_WhenMinPresentationTimeStampChanges: CMBufferQueueTriggerCondition =
765 5;
766pub const kCMBufferQueueTrigger_WhenMaxPresentationTimeStampChanges: CMBufferQueueTriggerCondition =
768 6;
769pub const kCMBufferQueueTrigger_WhenDataBecomesReady: CMBufferQueueTriggerCondition = 7;
771pub const kCMBufferQueueTrigger_WhenEndOfDataReached: CMBufferQueueTriggerCondition = 8;
773pub const kCMBufferQueueTrigger_WhenReset: CMBufferQueueTriggerCondition = 9;
775pub const kCMBufferQueueTrigger_WhenBufferCountBecomesLessThan: CMBufferQueueTriggerCondition = 10;
777pub const kCMBufferQueueTrigger_WhenBufferCountBecomesGreaterThan: CMBufferQueueTriggerCondition =
779 11;
780pub const kCMBufferQueueTrigger_WhenDurationBecomesGreaterThanOrEqualToAndBufferCountBecomesGreaterThan: CMBufferQueueTriggerCondition = 12;
782
783impl CMBufferQueue {
784 #[doc(alias = "CMBufferQueueInstallTrigger")]
800 #[cfg(feature = "CMTime")]
801 #[inline]
802 pub unsafe fn install_trigger(
803 &self,
804 callback: CMBufferQueueTriggerCallback,
805 refcon: *mut c_void,
806 condition: CMBufferQueueTriggerCondition,
807 time: CMTime,
808 trigger_token_out: *mut CMBufferQueueTriggerToken,
809 ) -> OSStatus {
810 extern "C-unwind" {
811 fn CMBufferQueueInstallTrigger(
812 queue: &CMBufferQueue,
813 callback: CMBufferQueueTriggerCallback,
814 refcon: *mut c_void,
815 condition: CMBufferQueueTriggerCondition,
816 time: CMTime,
817 trigger_token_out: *mut CMBufferQueueTriggerToken,
818 ) -> OSStatus;
819 }
820 unsafe {
821 CMBufferQueueInstallTrigger(self, callback, refcon, condition, time, trigger_token_out)
822 }
823 }
824
825 #[doc(alias = "CMBufferQueueInstallTriggerWithIntegerThreshold")]
836 #[cfg(feature = "CMBase")]
837 #[inline]
838 pub unsafe fn install_trigger_with_integer_threshold(
839 &self,
840 callback: CMBufferQueueTriggerCallback,
841 refcon: *mut c_void,
842 condition: CMBufferQueueTriggerCondition,
843 threshold: CMItemCount,
844 trigger_token_out: *mut CMBufferQueueTriggerToken,
845 ) -> OSStatus {
846 extern "C-unwind" {
847 fn CMBufferQueueInstallTriggerWithIntegerThreshold(
848 queue: &CMBufferQueue,
849 callback: CMBufferQueueTriggerCallback,
850 refcon: *mut c_void,
851 condition: CMBufferQueueTriggerCondition,
852 threshold: CMItemCount,
853 trigger_token_out: *mut CMBufferQueueTriggerToken,
854 ) -> OSStatus;
855 }
856 unsafe {
857 CMBufferQueueInstallTriggerWithIntegerThreshold(
858 self,
859 callback,
860 refcon,
861 condition,
862 threshold,
863 trigger_token_out,
864 )
865 }
866 }
867
868 #[doc(alias = "CMBufferQueueInstallTriggerHandler")]
883 #[cfg(all(feature = "CMTime", feature = "block2"))]
884 #[inline]
885 pub unsafe fn install_trigger_handler(
886 &self,
887 condition: CMBufferQueueTriggerCondition,
888 time: CMTime,
889 trigger_token_out: *mut CMBufferQueueTriggerToken,
890 handler: CMBufferQueueTriggerHandler,
891 ) -> OSStatus {
892 extern "C-unwind" {
893 fn CMBufferQueueInstallTriggerHandler(
894 queue: &CMBufferQueue,
895 condition: CMBufferQueueTriggerCondition,
896 time: CMTime,
897 trigger_token_out: *mut CMBufferQueueTriggerToken,
898 handler: CMBufferQueueTriggerHandler,
899 ) -> OSStatus;
900 }
901 unsafe {
902 CMBufferQueueInstallTriggerHandler(self, condition, time, trigger_token_out, handler)
903 }
904 }
905
906 #[doc(alias = "CMBufferQueueInstallTriggerHandlerWithIntegerThreshold")]
916 #[cfg(all(feature = "CMBase", feature = "block2"))]
917 #[inline]
918 pub unsafe fn install_trigger_handler_with_integer_threshold(
919 &self,
920 condition: CMBufferQueueTriggerCondition,
921 threshold: CMItemCount,
922 trigger_token_out: *mut CMBufferQueueTriggerToken,
923 handler: CMBufferQueueTriggerHandler,
924 ) -> OSStatus {
925 extern "C-unwind" {
926 fn CMBufferQueueInstallTriggerHandlerWithIntegerThreshold(
927 queue: &CMBufferQueue,
928 condition: CMBufferQueueTriggerCondition,
929 threshold: CMItemCount,
930 trigger_token_out: *mut CMBufferQueueTriggerToken,
931 handler: CMBufferQueueTriggerHandler,
932 ) -> OSStatus;
933 }
934 unsafe {
935 CMBufferQueueInstallTriggerHandlerWithIntegerThreshold(
936 self,
937 condition,
938 threshold,
939 trigger_token_out,
940 handler,
941 )
942 }
943 }
944
945 #[doc(alias = "CMBufferQueueRemoveTrigger")]
956 #[inline]
957 pub unsafe fn remove_trigger(&self, trigger_token: CMBufferQueueTriggerToken) -> OSStatus {
958 extern "C-unwind" {
959 fn CMBufferQueueRemoveTrigger(
960 queue: &CMBufferQueue,
961 trigger_token: CMBufferQueueTriggerToken,
962 ) -> OSStatus;
963 }
964 unsafe { CMBufferQueueRemoveTrigger(self, trigger_token) }
965 }
966
967 #[doc(alias = "CMBufferQueueTestTrigger")]
977 #[inline]
978 pub unsafe fn test_trigger(&self, trigger_token: CMBufferQueueTriggerToken) -> bool {
979 extern "C-unwind" {
980 fn CMBufferQueueTestTrigger(
981 queue: &CMBufferQueue,
982 trigger_token: CMBufferQueueTriggerToken,
983 ) -> Boolean;
984 }
985 let ret = unsafe { CMBufferQueueTestTrigger(self, trigger_token) };
986 ret != 0
987 }
988
989 #[doc(alias = "CMBufferQueueCallForEachBuffer")]
999 #[inline]
1000 pub unsafe fn call_for_each_buffer(
1001 &self,
1002 callback: unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void) -> OSStatus,
1003 refcon: *mut c_void,
1004 ) -> OSStatus {
1005 extern "C-unwind" {
1006 fn CMBufferQueueCallForEachBuffer(
1007 queue: &CMBufferQueue,
1008 callback: unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void) -> OSStatus,
1009 refcon: *mut c_void,
1010 ) -> OSStatus;
1011 }
1012 unsafe { CMBufferQueueCallForEachBuffer(self, callback, refcon) }
1013 }
1014}
1015
1016pub type CMBufferValidationCallback = Option<
1026 unsafe extern "C-unwind" fn(NonNull<CMBufferQueue>, NonNull<CMBuffer>, *mut c_void) -> OSStatus,
1027>;
1028
1029#[cfg(feature = "block2")]
1039pub type CMBufferValidationHandler =
1040 *mut block2::DynBlock<dyn Fn(NonNull<CMBufferQueue>, NonNull<CMBuffer>) -> OSStatus>;
1041
1042impl CMBufferQueue {
1043 #[doc(alias = "CMBufferQueueSetValidationCallback")]
1050 #[inline]
1051 pub unsafe fn set_validation_callback(
1052 &self,
1053 callback: CMBufferValidationCallback,
1054 refcon: *mut c_void,
1055 ) -> OSStatus {
1056 extern "C-unwind" {
1057 fn CMBufferQueueSetValidationCallback(
1058 queue: &CMBufferQueue,
1059 callback: CMBufferValidationCallback,
1060 refcon: *mut c_void,
1061 ) -> OSStatus;
1062 }
1063 unsafe { CMBufferQueueSetValidationCallback(self, callback, refcon) }
1064 }
1065
1066 #[doc(alias = "CMBufferQueueSetValidationHandler")]
1076 #[cfg(feature = "block2")]
1077 #[inline]
1078 pub unsafe fn set_validation_handler(&self, handler: CMBufferValidationHandler) -> OSStatus {
1079 extern "C-unwind" {
1080 fn CMBufferQueueSetValidationHandler(
1081 queue: &CMBufferQueue,
1082 handler: CMBufferValidationHandler,
1083 ) -> OSStatus;
1084 }
1085 unsafe { CMBufferQueueSetValidationHandler(self, handler) }
1086 }
1087}
1088
1089#[cfg(feature = "CMTime")]
1090#[deprecated = "renamed to `CMBufferQueue::callbacks_for_unsorted_sample_buffers`"]
1091#[inline]
1092pub unsafe extern "C-unwind" fn CMBufferQueueGetCallbacksForUnsortedSampleBuffers(
1093) -> NonNull<CMBufferCallbacks> {
1094 extern "C-unwind" {
1095 fn CMBufferQueueGetCallbacksForUnsortedSampleBuffers() -> Option<NonNull<CMBufferCallbacks>>;
1096 }
1097 let ret = unsafe { CMBufferQueueGetCallbacksForUnsortedSampleBuffers() };
1098 ret.expect("function was marked as returning non-null, but actually returned NULL")
1099}
1100
1101#[cfg(feature = "CMTime")]
1102#[deprecated = "renamed to `CMBufferQueue::callbacks_for_sample_buffers_sorted_by_output_pts`"]
1103#[inline]
1104pub unsafe extern "C-unwind" fn CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS(
1105) -> NonNull<CMBufferCallbacks> {
1106 extern "C-unwind" {
1107 fn CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS(
1108 ) -> Option<NonNull<CMBufferCallbacks>>;
1109 }
1110 let ret = unsafe { CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS() };
1111 ret.expect("function was marked as returning non-null, but actually returned NULL")
1112}
1113
1114extern "C-unwind" {
1115 #[cfg(all(feature = "CMBase", feature = "CMTime"))]
1116 #[deprecated = "renamed to `CMBufferQueue::create`"]
1117 pub fn CMBufferQueueCreate(
1118 allocator: Option<&CFAllocator>,
1119 capacity: CMItemCount,
1120 callbacks: NonNull<CMBufferCallbacks>,
1121 queue_out: NonNull<*mut CMBufferQueue>,
1122 ) -> OSStatus;
1123}
1124
1125extern "C-unwind" {
1126 #[cfg(all(feature = "CMBase", feature = "CMTime", feature = "block2"))]
1127 #[deprecated = "renamed to `CMBufferQueue::create_with_handlers`"]
1128 pub fn CMBufferQueueCreateWithHandlers(
1129 allocator: Option<&CFAllocator>,
1130 capacity: CMItemCount,
1131 handlers: NonNull<CMBufferHandlers>,
1132 queue_out: NonNull<*mut CMBufferQueue>,
1133 ) -> OSStatus;
1134}
1135
1136extern "C-unwind" {
1137 #[deprecated = "renamed to `CMBufferQueue::enqueue`"]
1138 pub fn CMBufferQueueEnqueue(queue: &CMBufferQueue, buf: &CMBuffer) -> OSStatus;
1139}
1140
1141#[deprecated = "renamed to `CMBufferQueue::dequeue_and_retain`"]
1142#[inline]
1143pub unsafe extern "C-unwind" fn CMBufferQueueDequeueAndRetain(
1144 queue: &CMBufferQueue,
1145) -> Option<CFRetained<CMBuffer>> {
1146 extern "C-unwind" {
1147 fn CMBufferQueueDequeueAndRetain(queue: &CMBufferQueue) -> Option<NonNull<CMBuffer>>;
1148 }
1149 let ret = unsafe { CMBufferQueueDequeueAndRetain(queue) };
1150 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
1151}
1152
1153#[deprecated = "renamed to `CMBufferQueue::dequeue_if_data_ready_and_retain`"]
1154#[inline]
1155pub unsafe extern "C-unwind" fn CMBufferQueueDequeueIfDataReadyAndRetain(
1156 queue: &CMBufferQueue,
1157) -> Option<CFRetained<CMBuffer>> {
1158 extern "C-unwind" {
1159 fn CMBufferQueueDequeueIfDataReadyAndRetain(
1160 queue: &CMBufferQueue,
1161 ) -> Option<NonNull<CMBuffer>>;
1162 }
1163 let ret = unsafe { CMBufferQueueDequeueIfDataReadyAndRetain(queue) };
1164 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
1165}
1166
1167#[deprecated = "renamed to `CMBufferQueue::get_head`"]
1168#[inline]
1169pub unsafe extern "C-unwind" fn CMBufferQueueGetHead(
1170 queue: &CMBufferQueue,
1171) -> Option<CFRetained<CMBuffer>> {
1172 extern "C-unwind" {
1173 fn CMBufferQueueGetHead(queue: &CMBufferQueue) -> Option<NonNull<CMBuffer>>;
1174 }
1175 let ret = unsafe { CMBufferQueueGetHead(queue) };
1176 ret.map(|ret| unsafe { CFRetained::retain(ret) })
1177}
1178
1179#[deprecated = "renamed to `CMBufferQueue::head`"]
1180#[inline]
1181pub unsafe extern "C-unwind" fn CMBufferQueueCopyHead(
1182 queue: &CMBufferQueue,
1183) -> Option<CFRetained<CMBuffer>> {
1184 extern "C-unwind" {
1185 fn CMBufferQueueCopyHead(queue: &CMBufferQueue) -> Option<NonNull<CMBuffer>>;
1186 }
1187 let ret = unsafe { CMBufferQueueCopyHead(queue) };
1188 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
1189}
1190
1191#[deprecated = "renamed to `CMBufferQueue::is_empty`"]
1192#[inline]
1193pub unsafe extern "C-unwind" fn CMBufferQueueIsEmpty(queue: &CMBufferQueue) -> bool {
1194 extern "C-unwind" {
1195 fn CMBufferQueueIsEmpty(queue: &CMBufferQueue) -> Boolean;
1196 }
1197 let ret = unsafe { CMBufferQueueIsEmpty(queue) };
1198 ret != 0
1199}
1200
1201extern "C-unwind" {
1202 #[deprecated = "renamed to `CMBufferQueue::mark_end_of_data`"]
1203 pub fn CMBufferQueueMarkEndOfData(queue: &CMBufferQueue) -> OSStatus;
1204}
1205
1206#[deprecated = "renamed to `CMBufferQueue::contains_end_of_data`"]
1207#[inline]
1208pub unsafe extern "C-unwind" fn CMBufferQueueContainsEndOfData(queue: &CMBufferQueue) -> bool {
1209 extern "C-unwind" {
1210 fn CMBufferQueueContainsEndOfData(queue: &CMBufferQueue) -> Boolean;
1211 }
1212 let ret = unsafe { CMBufferQueueContainsEndOfData(queue) };
1213 ret != 0
1214}
1215
1216#[deprecated = "renamed to `CMBufferQueue::is_at_end_of_data`"]
1217#[inline]
1218pub unsafe extern "C-unwind" fn CMBufferQueueIsAtEndOfData(queue: &CMBufferQueue) -> bool {
1219 extern "C-unwind" {
1220 fn CMBufferQueueIsAtEndOfData(queue: &CMBufferQueue) -> Boolean;
1221 }
1222 let ret = unsafe { CMBufferQueueIsAtEndOfData(queue) };
1223 ret != 0
1224}
1225
1226extern "C-unwind" {
1227 #[deprecated = "renamed to `CMBufferQueue::reset`"]
1228 pub fn CMBufferQueueReset(queue: &CMBufferQueue) -> OSStatus;
1229}
1230
1231extern "C-unwind" {
1232 #[deprecated = "renamed to `CMBufferQueue::reset_with_callback`"]
1233 pub fn CMBufferQueueResetWithCallback(
1234 queue: &CMBufferQueue,
1235 callback: unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void),
1236 refcon: *mut c_void,
1237 ) -> OSStatus;
1238}
1239
1240extern "C-unwind" {
1241 #[cfg(feature = "CMBase")]
1242 #[deprecated = "renamed to `CMBufferQueue::buffer_count`"]
1243 pub fn CMBufferQueueGetBufferCount(queue: &CMBufferQueue) -> CMItemCount;
1244}
1245
1246extern "C-unwind" {
1247 #[cfg(feature = "CMTime")]
1248 #[deprecated = "renamed to `CMBufferQueue::duration`"]
1249 pub fn CMBufferQueueGetDuration(queue: &CMBufferQueue) -> CMTime;
1250}
1251
1252extern "C-unwind" {
1253 #[cfg(feature = "CMTime")]
1254 #[deprecated = "renamed to `CMBufferQueue::min_decode_time_stamp`"]
1255 pub fn CMBufferQueueGetMinDecodeTimeStamp(queue: &CMBufferQueue) -> CMTime;
1256}
1257
1258extern "C-unwind" {
1259 #[cfg(feature = "CMTime")]
1260 #[deprecated = "renamed to `CMBufferQueue::first_decode_time_stamp`"]
1261 pub fn CMBufferQueueGetFirstDecodeTimeStamp(queue: &CMBufferQueue) -> CMTime;
1262}
1263
1264extern "C-unwind" {
1265 #[cfg(feature = "CMTime")]
1266 #[deprecated = "renamed to `CMBufferQueue::min_presentation_time_stamp`"]
1267 pub fn CMBufferQueueGetMinPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
1268}
1269
1270extern "C-unwind" {
1271 #[cfg(feature = "CMTime")]
1272 #[deprecated = "renamed to `CMBufferQueue::first_presentation_time_stamp`"]
1273 pub fn CMBufferQueueGetFirstPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
1274}
1275
1276extern "C-unwind" {
1277 #[cfg(feature = "CMTime")]
1278 #[deprecated = "renamed to `CMBufferQueue::max_presentation_time_stamp`"]
1279 pub fn CMBufferQueueGetMaxPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
1280}
1281
1282extern "C-unwind" {
1283 #[cfg(feature = "CMTime")]
1284 #[deprecated = "renamed to `CMBufferQueue::end_presentation_time_stamp`"]
1285 pub fn CMBufferQueueGetEndPresentationTimeStamp(queue: &CMBufferQueue) -> CMTime;
1286}
1287
1288extern "C-unwind" {
1289 #[deprecated = "renamed to `CMBufferQueue::total_size`"]
1290 pub fn CMBufferQueueGetTotalSize(queue: &CMBufferQueue) -> usize;
1291}
1292
1293extern "C-unwind" {
1294 #[cfg(feature = "CMTime")]
1295 #[deprecated = "renamed to `CMBufferQueue::install_trigger`"]
1296 pub fn CMBufferQueueInstallTrigger(
1297 queue: &CMBufferQueue,
1298 callback: CMBufferQueueTriggerCallback,
1299 refcon: *mut c_void,
1300 condition: CMBufferQueueTriggerCondition,
1301 time: CMTime,
1302 trigger_token_out: *mut CMBufferQueueTriggerToken,
1303 ) -> OSStatus;
1304}
1305
1306extern "C-unwind" {
1307 #[cfg(feature = "CMBase")]
1308 #[deprecated = "renamed to `CMBufferQueue::install_trigger_with_integer_threshold`"]
1309 pub fn CMBufferQueueInstallTriggerWithIntegerThreshold(
1310 queue: &CMBufferQueue,
1311 callback: CMBufferQueueTriggerCallback,
1312 refcon: *mut c_void,
1313 condition: CMBufferQueueTriggerCondition,
1314 threshold: CMItemCount,
1315 trigger_token_out: *mut CMBufferQueueTriggerToken,
1316 ) -> OSStatus;
1317}
1318
1319extern "C-unwind" {
1320 #[cfg(all(feature = "CMTime", feature = "block2"))]
1321 #[deprecated = "renamed to `CMBufferQueue::install_trigger_handler`"]
1322 pub fn CMBufferQueueInstallTriggerHandler(
1323 queue: &CMBufferQueue,
1324 condition: CMBufferQueueTriggerCondition,
1325 time: CMTime,
1326 trigger_token_out: *mut CMBufferQueueTriggerToken,
1327 handler: CMBufferQueueTriggerHandler,
1328 ) -> OSStatus;
1329}
1330
1331extern "C-unwind" {
1332 #[cfg(all(feature = "CMBase", feature = "block2"))]
1333 #[deprecated = "renamed to `CMBufferQueue::install_trigger_handler_with_integer_threshold`"]
1334 pub fn CMBufferQueueInstallTriggerHandlerWithIntegerThreshold(
1335 queue: &CMBufferQueue,
1336 condition: CMBufferQueueTriggerCondition,
1337 threshold: CMItemCount,
1338 trigger_token_out: *mut CMBufferQueueTriggerToken,
1339 handler: CMBufferQueueTriggerHandler,
1340 ) -> OSStatus;
1341}
1342
1343extern "C-unwind" {
1344 #[deprecated = "renamed to `CMBufferQueue::remove_trigger`"]
1345 pub fn CMBufferQueueRemoveTrigger(
1346 queue: &CMBufferQueue,
1347 trigger_token: CMBufferQueueTriggerToken,
1348 ) -> OSStatus;
1349}
1350
1351#[deprecated = "renamed to `CMBufferQueue::test_trigger`"]
1352#[inline]
1353pub unsafe extern "C-unwind" fn CMBufferQueueTestTrigger(
1354 queue: &CMBufferQueue,
1355 trigger_token: CMBufferQueueTriggerToken,
1356) -> bool {
1357 extern "C-unwind" {
1358 fn CMBufferQueueTestTrigger(
1359 queue: &CMBufferQueue,
1360 trigger_token: CMBufferQueueTriggerToken,
1361 ) -> Boolean;
1362 }
1363 let ret = unsafe { CMBufferQueueTestTrigger(queue, trigger_token) };
1364 ret != 0
1365}
1366
1367extern "C-unwind" {
1368 #[deprecated = "renamed to `CMBufferQueue::call_for_each_buffer`"]
1369 pub fn CMBufferQueueCallForEachBuffer(
1370 queue: &CMBufferQueue,
1371 callback: unsafe extern "C-unwind" fn(NonNull<CMBuffer>, *mut c_void) -> OSStatus,
1372 refcon: *mut c_void,
1373 ) -> OSStatus;
1374}
1375
1376extern "C-unwind" {
1377 #[deprecated = "renamed to `CMBufferQueue::set_validation_callback`"]
1378 pub fn CMBufferQueueSetValidationCallback(
1379 queue: &CMBufferQueue,
1380 callback: CMBufferValidationCallback,
1381 refcon: *mut c_void,
1382 ) -> OSStatus;
1383}
1384
1385extern "C-unwind" {
1386 #[cfg(feature = "block2")]
1387 #[deprecated = "renamed to `CMBufferQueue::set_validation_handler`"]
1388 pub fn CMBufferQueueSetValidationHandler(
1389 queue: &CMBufferQueue,
1390 handler: CMBufferValidationHandler,
1391 ) -> OSStatus;
1392}