pub struct AVCaptureDataOutputSynchronizer { /* private fields */ }AVCaptureDataOutputSynchronizer only.Expand description
AVCaptureDataOutputSynchronizer synchronizes the delivery of data from multiple capture data outputs (AVCaptureVideoDataOutput, AVCaptureDepthDataOutput, AVCaptureMetadataOutput, AVCaptureAudioDataOutput) to a single delegate callback.
AVCaptureDataOutputSynchronizer is initialized with an array of data outputs (AVCaptureVideoDataOutput, AVCaptureDepthDataOutput, AVCaptureMetadataOutput, or AVCaptureAudioDataOutput) from which you’d like to receive a single, synchronized delegate callback. The first output in the array acts as the primary data output and determines when the synchronized callback is delivered. When data is received for the primary data output, it is held until all other data outputs have received data with an equal or later presentation time stamp, or it has been determined that there is no data for a particular output at the primary data output’s pts. Once all other outputs are ready, a single delegate callback is sent with all the data aligned with the primary data output’s data. Separate delegate callbacks are sent for any other data received with presentation time stamps earlier than the next primary data output time.
For instance, if you specify a video data output as your first (primary) output and a metadata output for detected faces as your second output, your data callback will not be called until there is face data ready for a video frame, or it is assured that there is no face metadata for that particular video frame.
Note that the AVCaptureDataOutputSynchronizer overrides each data output’s -setSampleBufferDelegate:queue:, -setDepthDataDelegate:queue:, or -setMetadataObjectsDelegate:queue: method call. -[AVCaptureVideoDataOutput alwaysDiscardsLateVideoFrames] and -[AVCaptureDepthDataOutput alwaysDiscardsLateDepthData] properties are honored.
See also Apple’s documentation
Implementations§
Source§impl AVCaptureDataOutputSynchronizer
impl AVCaptureDataOutputSynchronizer
pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>
pub unsafe fn new() -> Retained<Self>
Sourcepub unsafe fn initWithDataOutputs(
this: Allocated<Self>,
data_outputs: &NSArray<AVCaptureOutput>,
) -> Retained<Self>
Available on crate feature AVCaptureOutputBase only.
pub unsafe fn initWithDataOutputs( this: Allocated<Self>, data_outputs: &NSArray<AVCaptureOutput>, ) -> Retained<Self>
AVCaptureOutputBase only.Instantiates an AVCaptureDataOutputSynchronizer from one or more capture data outputs.
Parameter dataOutputs: An array of capture data outputs where the first is the primary output.
Returns: A newly initialized AVCaptureDataOutputSynchronizer instance.
Sourcepub unsafe fn dataOutputs(&self) -> Retained<NSArray<AVCaptureOutput>>
Available on crate feature AVCaptureOutputBase only.
pub unsafe fn dataOutputs(&self) -> Retained<NSArray<AVCaptureOutput>>
AVCaptureOutputBase only.The data outputs provided in the initializer method.
Sourcepub unsafe fn setDelegate_queue(
&self,
delegate: Option<&ProtocolObject<dyn AVCaptureDataOutputSynchronizerDelegate>>,
delegate_callback_queue: Option<&DispatchQueue>,
)
Available on crate feature dispatch2 only.
pub unsafe fn setDelegate_queue( &self, delegate: Option<&ProtocolObject<dyn AVCaptureDataOutputSynchronizerDelegate>>, delegate_callback_queue: Option<&DispatchQueue>, )
dispatch2 only.Sets the receiver’s delegate that will accept synchronized data and the dispatch queue on which the delegate will be called.
Parameter delegate: An object conforming to the AVCaptureDataOutputSynchronizerDelegate protocol that will receive synchronized data from the provided data outputs.
Parameter delegateCallbackQueue: A dispatch queue on which all AVCaptureDataOutputSynchronizerDelegate methods will be called.
AVCaptureDataOutputSynchronizer gathers data from its dataOutputs, and when it determines that all data has been received for a given timestamp, it calls the specified delegate on the specified delegateCallbackQueue. AVCaptureDataOutputSynchronizer overrides all the data outputs’ delegates and callbacks. Data outputs under the control of AVCaptureDataOutputSynchronizer do not fire delegate callbacks. Delegate callbacks are restored to individual data outputs when you call this method with nil as your delegate and NULL as your delegateCallbackQueue.
A serial dispatch queue must be used to guarantee that synchronized data will be delivered in order. The delegateCallbackQueue parameter may not be NULL, except when setting the delegate to nil otherwise -setDelegate:queue: throws an NSInvalidArgumentException.
§Safety
delegate_callback_queue possibly has additional threading requirements.
Sourcepub unsafe fn delegate(
&self,
) -> Option<Retained<ProtocolObject<dyn AVCaptureDataOutputSynchronizerDelegate>>>
pub unsafe fn delegate( &self, ) -> Option<Retained<ProtocolObject<dyn AVCaptureDataOutputSynchronizerDelegate>>>
The receiver’s delegate.
The value of this property is an object conforming to the AVCaptureDataOutputSynchronizerDelegate protocol that will receive synchronized data output. The delegate is set using the -setDelegate:queue: method. This property is key-value observable.
Sourcepub unsafe fn delegateCallbackQueue(&self) -> Option<Retained<DispatchQueue>>
Available on crate feature dispatch2 only.
pub unsafe fn delegateCallbackQueue(&self) -> Option<Retained<DispatchQueue>>
dispatch2 only.The dispatch queue on which all AVCaptureDataOutputSynchronizerDelegate methods will be called.
The value of this property is a dispatch_queue_t. The queue is set using the -setDelegate:queue: method.
Methods from Deref<Target = NSObject>§
Sourcepub fn doesNotRecognizeSelector(&self, sel: Sel) -> !
pub fn doesNotRecognizeSelector(&self, sel: Sel) -> !
Handle messages the object doesn’t recognize.
See Apple’s documentation for details.
Methods from Deref<Target = AnyObject>§
Sourcepub fn class(&self) -> &'static AnyClass
pub fn class(&self) -> &'static AnyClass
Dynamically find the class of this object.
§Panics
May panic if the object is invalid (which may be the case for objects
returned from unavailable init/new methods).
§Example
Check that an instance of NSObject has the precise class NSObject.
use objc2::ClassType;
use objc2::runtime::NSObject;
let obj = NSObject::new();
assert_eq!(obj.class(), NSObject::class());Sourcepub unsafe fn get_ivar<T>(&self, name: &str) -> &Twhere
T: Encode,
👎Deprecated: this is difficult to use correctly, use Ivar::load instead.
pub unsafe fn get_ivar<T>(&self, name: &str) -> &Twhere
T: Encode,
Ivar::load instead.Use Ivar::load instead.
§Safety
The object must have an instance variable with the given name, and it
must be of type T.
See Ivar::load_ptr for details surrounding this.
Sourcepub fn downcast_ref<T>(&self) -> Option<&T>where
T: DowncastTarget,
pub fn downcast_ref<T>(&self) -> Option<&T>where
T: DowncastTarget,
Attempt to downcast the object to a class of type T.
This is the reference-variant. Use Retained::downcast if you want
to convert a retained object to another type.
§Mutable classes
Some classes have immutable and mutable variants, such as NSString
and NSMutableString.
When some Objective-C API signature says it gives you an immutable class, it generally expects you to not mutate that, even though it may technically be mutable “under the hood”.
So using this method to convert a NSString to a NSMutableString,
while not unsound, is generally frowned upon unless you created the
string yourself, or the API explicitly documents the string to be
mutable.
See Apple’s documentation on mutability and on
isKindOfClass: for more details.
§Generic classes
Objective-C generics are called “lightweight generics”, and that’s because they aren’t exposed in the runtime. This makes it impossible to safely downcast to generic collections, so this is disallowed by this method.
You can, however, safely downcast to generic collections where all the
type-parameters are AnyObject.
§Panics
This works internally by calling isKindOfClass:. That means that the
object must have the instance method of that name, and an exception
will be thrown (if CoreFoundation is linked) or the process will abort
if that is not the case. In the vast majority of cases, you don’t need
to worry about this, since both root objects NSObject and
NSProxy implement this method.
§Examples
Cast an NSString back and forth from NSObject.
use objc2::rc::Retained;
use objc2_foundation::{NSObject, NSString};
let obj: Retained<NSObject> = NSString::new().into_super();
let string = obj.downcast_ref::<NSString>().unwrap();
// Or with `downcast`, if we do not need the object afterwards
let string = obj.downcast::<NSString>().unwrap();Try (and fail) to cast an NSObject to an NSString.
use objc2_foundation::{NSObject, NSString};
let obj = NSObject::new();
assert!(obj.downcast_ref::<NSString>().is_none());Try to cast to an array of strings.
use objc2_foundation::{NSArray, NSObject, NSString};
let arr = NSArray::from_retained_slice(&[NSObject::new()]);
// This is invalid and doesn't type check.
let arr = arr.downcast_ref::<NSArray<NSString>>();This fails to compile, since it would require enumerating over the array to ensure that each element is of the desired type, which is a performance pitfall.
Downcast when processing each element instead.
use objc2_foundation::{NSArray, NSObject, NSString};
let arr = NSArray::from_retained_slice(&[NSObject::new()]);
for elem in arr {
if let Some(data) = elem.downcast_ref::<NSString>() {
// handle `data`
}
}Trait Implementations§
Source§impl ClassType for AVCaptureDataOutputSynchronizer
impl ClassType for AVCaptureDataOutputSynchronizer
Source§const NAME: &'static str = "AVCaptureDataOutputSynchronizer"
const NAME: &'static str = "AVCaptureDataOutputSynchronizer"
Source§type ThreadKind = <<AVCaptureDataOutputSynchronizer as ClassType>::Super as ClassType>::ThreadKind
type ThreadKind = <<AVCaptureDataOutputSynchronizer as ClassType>::Super as ClassType>::ThreadKind
Source§impl NSObjectProtocol for AVCaptureDataOutputSynchronizer
impl NSObjectProtocol for AVCaptureDataOutputSynchronizer
Source§fn isEqual(&self, other: Option<&AnyObject>) -> bool
fn isEqual(&self, other: Option<&AnyObject>) -> bool
Source§fn hash(&self) -> usize
fn hash(&self) -> usize
Source§fn isKindOfClass(&self, cls: &AnyClass) -> bool
fn isKindOfClass(&self, cls: &AnyClass) -> bool
Source§fn is_kind_of<T>(&self) -> bool
fn is_kind_of<T>(&self) -> bool
isKindOfClass directly, or cast your objects with AnyObject::downcast_ref