core_media_sys/
buffer_queue.rs

1use crate::libc::{c_void, size_t};
2use crate::core_foundation_sys::base::{OSStatus, Boolean, CFAllocatorRef, CFTypeID, CFTypeRef, CFComparisonResult};
3use crate::core_foundation_sys::dictionary::CFDictionaryRef;
4use crate::core_foundation_sys::string::CFStringRef;
5
6use crate::base::CMItemCount;
7use crate::sync::CMClockRef;
8use crate::time::CMTime;
9
10
11pub const kCMBufferQueueError_AllocationFailed: OSStatus                        = -12760;
12pub const kCMBufferQueueError_RequiredParameterMissing: OSStatus                = -12761;
13pub const kCMBufferQueueError_InvalidCMBufferCallbacksStruct: OSStatus          = -12762;
14pub const kCMBufferQueueError_EnqueueAfterEndOfData: OSStatus                   = -12763;
15pub const kCMBufferQueueError_QueueIsFull: OSStatus                             = -12764;
16pub const kCMBufferQueueError_BadTriggerDuration: OSStatus                      = -12765;
17pub const kCMBufferQueueError_CannotModifyQueueFromTriggerCallback: OSStatus    = -12766;
18pub const kCMBufferQueueError_InvalidTriggerCondition: OSStatus                 = -12767;
19pub const kCMBufferQueueError_InvalidTriggerToken: OSStatus                     = -12768;
20pub const kCMBufferQueueError_InvalidBuffer: OSStatus                           = -12769;
21
22
23pub type CMBufferQueueRef = *mut c_void;
24pub type CMBufferRef = CFTypeRef;
25
26pub type CMBufferGetTimeCallback = extern "C" fn (buf: CMBufferRef, refcon: *mut c_void) -> CMTime;
27pub type CMBufferGetBooleanCallback = extern "C" fn (buf: CMBufferRef, refcon: *mut c_void) -> Boolean;
28pub type CMBufferCompareCallback = extern "C" fn (buf1: CMBufferRef,
29                                                  buf2: CMBufferRef,
30                                                  refcon: *mut c_void) -> CFComparisonResult;
31pub type CMBufferGetSizeCallback = extern "C" fn (buf: CMBufferRef, refcon: *mut c_void) -> size_t;
32
33
34#[repr(C)]
35#[derive(Debug, Copy, Clone)]
36pub struct CMBufferCallbacks {
37    pub version: u32,
38    pub refcon: *mut c_void,
39    pub getDecodeTimeStamp: CMBufferGetTimeCallback,
40    pub getPresentationTimeStamp: CMBufferGetTimeCallback,
41    pub getDuration: CMBufferGetTimeCallback,
42    pub isDataReady: CMBufferGetBooleanCallback,
43    pub compare: CMBufferCompareCallback,
44    pub dataBecameReadyNotification: CFStringRef,
45    pub getSize: CMBufferGetSizeCallback
46}
47
48
49pub type CMBufferQueueTriggerToken = *mut c_void;
50pub type CMBufferQueueTriggerCallback = extern "C" fn (triggerRefcon: *mut c_void,
51                                                       triggerToken: CMBufferQueueTriggerToken);
52pub type CMBufferQueueTriggerCondition = i32;
53pub const kCMBufferQueueTrigger_WhenDurationBecomesLessThan: CMBufferQueueTriggerCondition = 1;
54pub const kCMBufferQueueTrigger_WhenDurationBecomesLessThanOrEqualTo: CMBufferQueueTriggerCondition = 2;
55pub const kCMBufferQueueTrigger_WhenDurationBecomesGreaterThan: CMBufferQueueTriggerCondition = 3;
56pub const kCMBufferQueueTrigger_WhenDurationBecomesGreaterThanOrEqualTo: CMBufferQueueTriggerCondition = 4;
57pub const kCMBufferQueueTrigger_WhenMinPresentationTimeStampChanges: CMBufferQueueTriggerCondition = 5;
58pub const kCMBufferQueueTrigger_WhenMaxPresentationTimeStampChanges: CMBufferQueueTriggerCondition = 6;
59pub const kCMBufferQueueTrigger_WhenDataBecomesReady: CMBufferQueueTriggerCondition = 7;
60pub const kCMBufferQueueTrigger_WhenEndOfDataReached: CMBufferQueueTriggerCondition = 8;
61pub const kCMBufferQueueTrigger_WhenReset: CMBufferQueueTriggerCondition = 9;
62pub const kCMBufferQueueTrigger_WhenBufferCountBecomesLessThan: CMBufferQueueTriggerCondition = 10;
63pub const kCMBufferQueueTrigger_WhenBufferCountBecomesGreaterThan: CMBufferQueueTriggerCondition = 11;
64pub const kCMBufferQueueTrigger_WhenDurationBecomesGreaterThanOrEqualToAndBufferCountBecomesGreaterThan: CMBufferQueueTriggerCondition = 12;
65
66pub type CMBufferValidationCallback = extern "C" fn (queue: CMBufferQueueRef,
67                                                     buf: CMBufferRef,
68                                                     validationRefCon: *mut c_void) -> OSStatus;
69
70
71extern "C" {
72    pub fn CMBufferQueueGetCallbacksForUnsortedSampleBuffers() -> *const CMBufferCallbacks;
73    pub fn CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS() -> *const CMBufferCallbacks;
74    pub fn CMBufferQueueCreate(allocator: CFAllocatorRef,
75                               capacity: CMItemCount,
76                               callbacks: *const CMBufferCallbacks,
77                               queueOut: *mut CMBufferQueueRef) -> OSStatus;
78    pub fn CMBufferQueueGetTypeID() -> CFTypeID;
79    pub fn CMBufferQueueEnqueue(queue: CMBufferQueueRef,
80                                buf: CMBufferRef) -> OSStatus;
81    pub fn CMBufferQueueDequeueAndRetain(queue: CMBufferQueueRef) -> CMBufferRef;
82    pub fn CMBufferQueueDequeueIfDataReadyAndRetain(queue: CMBufferQueueRef) -> CMBufferRef;
83    pub fn CMBufferQueueGetHead(queue: CMBufferQueueRef) -> CMBufferRef;
84    pub fn CMBufferQueueIsEmpty(queue: CMBufferQueueRef) -> Boolean;
85    pub fn CMBufferQueueMarkEndOfData(queue: CMBufferQueueRef) -> OSStatus;
86    pub fn CMBufferQueueContainsEndOfData(queue: CMBufferQueueRef) -> Boolean;
87    pub fn CMBufferQueueIsAtEndOfData(queue: CMBufferQueueRef) -> Boolean;
88    pub fn CMBufferQueueReset(queue: CMBufferQueueRef) -> OSStatus;
89    pub fn CMBufferQueueResetWithCallback(queue: CMBufferQueueRef,
90                                          callback: extern "C" fn (buffer: CMBufferRef, refcon: *mut c_void),
91                                          refcon: *mut c_void) -> OSStatus;
92    pub fn CMBufferQueueGetBufferCount(queue: CMBufferQueueRef) -> CMItemCount;
93    pub fn CMBufferQueueGetDuration(queue: CMBufferQueueRef) -> CMTime;
94    pub fn CMBufferQueueGetMinDecodeTimeStamp(queue: CMBufferQueueRef) -> CMTime;
95    pub fn CMBufferQueueGetFirstDecodeTimeStamp(queue: CMBufferQueueRef) -> CMTime;
96    pub fn CMBufferQueueGetMinPresentationTimeStamp(queue: CMBufferQueueRef) -> CMTime;
97    pub fn CMBufferQueueGetFirstPresentationTimeStamp(queue: CMBufferQueueRef) -> CMTime;
98    pub fn CMBufferQueueGetMaxPresentationTimeStamp(queue: CMBufferQueueRef) -> CMTime;
99    pub fn CMBufferQueueGetEndPresentationTimeStamp(queue: CMBufferQueueRef) -> CMTime;
100    pub fn CMBufferQueueGetTotalSize(queue: CMBufferQueueRef) -> size_t;
101
102
103    pub fn CMBufferQueueInstallTrigger(queue: CMBufferQueueRef,
104                                       triggerCallback: CMBufferQueueTriggerCallback,
105                                       triggerRefcon: *mut c_void,
106                                       triggerCondition: CMBufferQueueTriggerCondition,
107                                       triggerTime: CMTime,
108                                       triggerTokenOut: *mut CMBufferQueueTriggerToken) -> OSStatus;
109    pub fn CMBufferQueueInstallTriggerWithIntegerThreshold(queue: CMBufferQueueRef,
110                                                           triggerCallback: CMBufferQueueTriggerCallback,
111                                                           triggerRefcon: *mut c_void,
112                                                           triggerCondition: CMBufferQueueTriggerCondition,
113                                                           triggerThreshold: CMItemCount,
114                                                           triggerTokenOut: *mut CMBufferQueueTriggerToken) -> OSStatus;
115    pub fn CMBufferQueueRemoveTrigger(queue: CMBufferQueueRef,
116                                      triggerToken: CMBufferQueueTriggerToken) -> OSStatus;
117    pub fn CMBufferQueueTestTrigger(queue: CMBufferQueueRef,
118                                    triggerToken: CMBufferQueueTriggerToken) -> Boolean;
119    pub fn CMBufferQueueCallForEachBuffer(queue: CMBufferQueueRef,
120                                          callback: extern "C" fn (buffer: CMBufferRef,
121                                                                   refcon: *mut c_void) -> OSStatus,
122                                          refcon: *mut c_void) -> OSStatus;
123
124
125    pub fn CMBufferQueueSetValidationCallback(queue: CMBufferQueueRef,
126                                              validationCallback: CMBufferValidationCallback,
127                                              validationRefCon: *mut c_void) -> OSStatus;
128}