objc2_av_foundation/generated/AVSampleBufferDisplayLayer.rs
1//! This file has been automatically generated by `objc2`'s `header-translator`.
2//! DO NOT EDIT
3use core::ffi::*;
4use core::ptr::NonNull;
5#[cfg(feature = "dispatch2")]
6use dispatch2::*;
7use objc2::__framework_prelude::*;
8#[cfg(feature = "objc2-core-media")]
9use objc2_core_media::*;
10use objc2_foundation::*;
11#[cfg(feature = "objc2-quartz-core")]
12#[cfg(not(target_os = "watchos"))]
13use objc2_quartz_core::*;
14
15use crate::*;
16
17extern "C" {
18 /// [Apple's documentation](https://developer.apple.com/documentation/avfoundation/avsamplebufferdisplaylayerfailedtodecodenotification?language=objc)
19 pub static AVSampleBufferDisplayLayerFailedToDecodeNotification: &'static NSString;
20}
21
22extern "C" {
23 /// [Apple's documentation](https://developer.apple.com/documentation/avfoundation/avsamplebufferdisplaylayerfailedtodecodenotificationerrorkey?language=objc)
24 pub static AVSampleBufferDisplayLayerFailedToDecodeNotificationErrorKey: &'static NSString;
25}
26
27extern "C" {
28 /// [Apple's documentation](https://developer.apple.com/documentation/avfoundation/avsamplebufferdisplaylayerrequiresflushtoresumedecodingdidchangenotification?language=objc)
29 pub static AVSampleBufferDisplayLayerRequiresFlushToResumeDecodingDidChangeNotification:
30 &'static NSNotificationName;
31}
32
33extern "C" {
34 /// [Apple's documentation](https://developer.apple.com/documentation/avfoundation/avsamplebufferdisplaylayeroutputobscuredduetoinsufficientexternalprotectiondidchangenotification?language=objc)
35 pub static AVSampleBufferDisplayLayerOutputObscuredDueToInsufficientExternalProtectionDidChangeNotification:
36 &'static NSNotificationName;
37}
38
39extern "C" {
40 /// [Apple's documentation](https://developer.apple.com/documentation/avfoundation/avsamplebufferdisplaylayerreadyfordisplaydidchangenotification?language=objc)
41 pub static AVSampleBufferDisplayLayerReadyForDisplayDidChangeNotification:
42 &'static NSNotificationName;
43}
44
45extern_class!(
46 /// [Apple's documentation](https://developer.apple.com/documentation/avfoundation/avsamplebufferdisplaylayer?language=objc)
47 #[unsafe(super(CALayer, NSObject))]
48 #[derive(Debug, PartialEq, Eq, Hash)]
49 #[cfg(feature = "objc2-quartz-core")]
50 #[cfg(not(target_os = "watchos"))]
51 pub struct AVSampleBufferDisplayLayer;
52);
53
54#[cfg(feature = "objc2-quartz-core")]
55#[cfg(not(target_os = "watchos"))]
56extern_conformance!(
57 unsafe impl CAMediaTiming for AVSampleBufferDisplayLayer {}
58);
59
60#[cfg(feature = "objc2-quartz-core")]
61#[cfg(not(target_os = "watchos"))]
62extern_conformance!(
63 unsafe impl NSCoding for AVSampleBufferDisplayLayer {}
64);
65
66#[cfg(feature = "objc2-quartz-core")]
67#[cfg(not(target_os = "watchos"))]
68extern_conformance!(
69 unsafe impl NSObjectProtocol for AVSampleBufferDisplayLayer {}
70);
71
72#[cfg(feature = "objc2-quartz-core")]
73#[cfg(not(target_os = "watchos"))]
74extern_conformance!(
75 unsafe impl NSSecureCoding for AVSampleBufferDisplayLayer {}
76);
77
78#[cfg(feature = "objc2-quartz-core")]
79#[cfg(not(target_os = "watchos"))]
80impl AVSampleBufferDisplayLayer {
81 extern_methods!(
82 #[cfg(feature = "objc2-core-media")]
83 /// The layer's control timebase, which governs how time stamps are interpreted.
84 ///
85 /// By default, this property is NULL, in which case time stamps will be interpreted
86 /// according to the host time clock (mach_absolute_time with the appropriate timescale
87 /// conversion; this is the same as Core Animation's CACurrentMediaTime). With no
88 /// control timebase, once frames are enqueued, it is not possible to adjust exactly
89 /// when they are displayed.
90 ///
91 /// If a non-NULL control timebase is set, it will be used to interpret time stamps.
92 /// You can control the timing of frame display by setting the rate and time of the
93 /// control timebase.
94 /// If you are synchronizing video to audio, you can use a timebase whose source clock
95 /// is a CMAudioDeviceClock for the appropriate audio device to prevent drift.
96 ///
97 /// Note that prior to OSX 10.10 and iOS 8.0, the control timebase could not be changed after enqueueSampleBuffer: was called. As of OSX 10.10 and iOS 8.0, the control timebase may be changed at any time.
98 #[unsafe(method(controlTimebase))]
99 #[unsafe(method_family = none)]
100 pub unsafe fn controlTimebase(&self) -> Option<Retained<CMTimebase>>;
101
102 #[cfg(feature = "objc2-core-media")]
103 /// Setter for [`controlTimebase`][Self::controlTimebase].
104 #[unsafe(method(setControlTimebase:))]
105 #[unsafe(method_family = none)]
106 pub unsafe fn setControlTimebase(&self, control_timebase: Option<&CMTimebase>);
107
108 #[cfg(feature = "AVAnimation")]
109 /// A string defining how the video is displayed within an AVSampleBufferDisplayLayer bounds rect.
110 ///
111 /// Options are AVLayerVideoGravityResizeAspect, AVLayerVideoGravityResizeAspectFill
112 /// and AVLayerVideoGravityResize. AVLayerVideoGravityResizeAspect is default.
113 /// See
114 /// <AVFoundation
115 /// /AVAnimation.h> for a description of these options.
116 #[unsafe(method(videoGravity))]
117 #[unsafe(method_family = none)]
118 pub unsafe fn videoGravity(&self) -> Retained<AVLayerVideoGravity>;
119
120 #[cfg(feature = "AVAnimation")]
121 /// Setter for [`videoGravity`][Self::videoGravity].
122 ///
123 /// This is [copied][objc2_foundation::NSCopying::copy] when set.
124 #[unsafe(method(setVideoGravity:))]
125 #[unsafe(method_family = none)]
126 pub unsafe fn setVideoGravity(&self, video_gravity: &AVLayerVideoGravity);
127
128 /// Boolean indicating that the first video frame has been made ready for display.
129 ///
130 /// Use this property as an indicator of when best to show or animate-in an AVSampleBufferDisplayLayer into view.
131 /// An AVSampleBufferDisplayLayer may be displayed, or made visible, while this property is NO, however the layer will not have any user-visible content until the value becomes YES. Note that if an animation is added to an AVSampleBufferDisplayLayer before it becomes readyForDisplay the video image displayed inside might not animate with the receiver.
132 /// readyForDisplay will change to NO when the layer can no longer display frames. readyForDisplay will be YES when the first video frame has been made ready for display.
133 /// This property is not key-value observable. AVSampleBufferDisplayLayerReadyForDisplayDidChangeNotification is posted when this value changes.
134 #[unsafe(method(isReadyForDisplay))]
135 #[unsafe(method_family = none)]
136 pub unsafe fn isReadyForDisplay(&self) -> bool;
137 );
138}
139
140/// Methods declared on superclass `CALayer`.
141#[cfg(feature = "objc2-quartz-core")]
142#[cfg(not(target_os = "watchos"))]
143impl AVSampleBufferDisplayLayer {
144 extern_methods!(
145 /// Layer creation and initialization. *
146 #[unsafe(method(layer))]
147 #[unsafe(method_family = none)]
148 pub unsafe fn layer() -> Retained<Self>;
149
150 #[unsafe(method(init))]
151 #[unsafe(method_family = init)]
152 pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;
153
154 /// # Safety
155 ///
156 /// `layer` should be of the correct type.
157 #[unsafe(method(initWithLayer:))]
158 #[unsafe(method_family = init)]
159 pub unsafe fn initWithLayer(this: Allocated<Self>, layer: &AnyObject) -> Retained<Self>;
160 );
161}
162
163/// Methods declared on superclass `NSObject`.
164#[cfg(feature = "objc2-quartz-core")]
165#[cfg(not(target_os = "watchos"))]
166impl AVSampleBufferDisplayLayer {
167 extern_methods!(
168 #[unsafe(method(new))]
169 #[unsafe(method_family = new)]
170 pub unsafe fn new() -> Retained<Self>;
171 );
172}
173
174/// AVSampleBufferDisplayLayerQueueManagement.
175#[cfg(feature = "objc2-quartz-core")]
176#[cfg(not(target_os = "watchos"))]
177impl AVSampleBufferDisplayLayer {
178 extern_methods!(
179 #[cfg(feature = "objc2-core-media")]
180 /// The renderer's timebase, which governs how time stamps are interpreted.
181 ///
182 /// The timebase is used to interpret time stamps.
183 ///
184 /// The timebase is read-only. Use the AVSampleBufferRenderSynchronizer to set the rate or time.
185 #[deprecated = "Use sampleBufferRenderer's timebase instead"]
186 #[unsafe(method(timebase))]
187 #[unsafe(method_family = none)]
188 pub unsafe fn timebase(&self) -> Retained<CMTimebase>;
189
190 #[cfg(feature = "AVQueuedSampleBufferRendering")]
191 /// The ability of the display layer to be used for enqueuing sample buffers.
192 ///
193 /// The value of this property is an AVQueuedSampleBufferRenderingStatus that indicates whether the receiver can be used for enqueuing and rendering sample buffers. When the value of this property is AVQueuedSampleBufferRenderingStatusFailed, clients can check the value of the error property to determine the failure. To resume rendering sample buffers using the display layer after a failure, clients must first reset the status to AVQueuedSampleBufferRenderingStatusUnknown. This can be achieved by invoking -flush on the display layer.
194 ///
195 /// This property is key value observable.
196 #[deprecated = "Use sampleBufferRenderer's status instead"]
197 #[unsafe(method(status))]
198 #[unsafe(method_family = none)]
199 pub unsafe fn status(&self) -> AVQueuedSampleBufferRenderingStatus;
200
201 /// If the display layer's status is AVQueuedSampleBufferRenderingStatusFailed, this describes the error that caused the failure.
202 ///
203 /// The value of this property is an NSError that describes what caused the display layer to no longer be able to enqueue sample buffers. If the status is not AVQueuedSampleBufferRenderingStatusFailed, the value of this property is nil.
204 #[deprecated = "Use sampleBufferRenderer's error instead"]
205 #[unsafe(method(error))]
206 #[unsafe(method_family = none)]
207 pub unsafe fn error(&self) -> Option<Retained<NSError>>;
208
209 #[cfg(feature = "objc2-core-media")]
210 /// Sends a sample buffer for display.
211 ///
212 /// If sampleBuffer has the kCMSampleAttachmentKey_DoNotDisplay attachment set to
213 /// kCFBooleanTrue, the frame will be decoded but not displayed.
214 /// Otherwise, if sampleBuffer has the kCMSampleAttachmentKey_DisplayImmediately
215 /// attachment set to kCFBooleanTrue, the decoded image will be displayed as soon
216 /// as possible, replacing all previously enqueued images regardless of their timestamps.
217 /// Otherwise, the decoded image will be displayed at sampleBuffer's output presentation
218 /// timestamp, as interpreted by the control timebase (or the mach_absolute_time timeline
219 /// if there is no control timebase).
220 ///
221 /// To schedule the removal of previous images at a specific timestamp, enqueue
222 /// a marker sample buffer containing no samples, with the
223 /// kCMSampleBufferAttachmentKey_EmptyMedia attachment set to kCFBooleanTrue.
224 ///
225 /// IMPORTANT NOTE: attachments with the kCMSampleAttachmentKey_ prefix must be set via
226 /// CMSampleBufferGetSampleAttachmentsArray and CFDictionarySetValue.
227 /// Attachments with the kCMSampleBufferAttachmentKey_ prefix must be set via
228 /// CMSetAttachment.
229 ///
230 /// IMPORTANT NOTE: When using CMSampleBuffers that wrap CVPixelBuffer, it is important that such CVPixelBuffers be IOSurface-backed.
231 /// CoreVideo allocates IOSurface-backed CVPixelBuffers when the pixel buffer attribute dictionary passed to CVPixelBufferPoolCreate contains
232 /// an entry with key kCVPixelBufferIOSurfacePropertiesKey and value being a dictionary (which can be an empty dictionary).
233 ///
234 /// The combination of either a non-NULL controlTimebase or an AVSampleBufferRenderSynchronizer with the use of kCMSampleAttachmentKey_DisplayImmediately as an attachment to the CMSampleBuffers that are enqueued for display is not recommended.
235 #[deprecated = "Use sampleBufferRenderer's enqueueSampleBuffer: instead"]
236 #[unsafe(method(enqueueSampleBuffer:))]
237 #[unsafe(method_family = none)]
238 pub unsafe fn enqueueSampleBuffer(&self, sample_buffer: &CMSampleBuffer);
239
240 /// Instructs the layer to discard pending enqueued sample buffers.
241 ///
242 /// It is not possible to determine which sample buffers have been decoded,
243 /// so the next frame passed to enqueueSampleBuffer: should be an IDR frame
244 /// (also known as a key frame or sync sample).
245 #[deprecated = "Use sampleBufferRenderer's flush instead"]
246 #[unsafe(method(flush))]
247 #[unsafe(method_family = none)]
248 pub unsafe fn flush(&self);
249
250 /// Instructs the layer to discard pending enqueued sample buffers and remove any
251 /// currently displayed image.
252 ///
253 /// It is not possible to determine which sample buffers have been decoded,
254 /// so the next frame passed to enqueueSampleBuffer: should be an IDR frame
255 /// (also known as a key frame or sync sample).
256 #[deprecated = "Use sampleBufferRenderer's flushWithRemovalOfDisplayedImage:completionHandler: instead"]
257 #[unsafe(method(flushAndRemoveImage))]
258 #[unsafe(method_family = none)]
259 pub unsafe fn flushAndRemoveImage(&self);
260
261 /// Indicates that the receiver is in a state where it requires a call to -flush to continue decoding frames.
262 ///
263 /// When the application enters a state where use of video decoder resources is not permissible, the value of this property changes to YES along with the display layer's status changing to AVQueuedSampleBufferRenderingStatusFailed.
264 /// To resume rendering sample buffers using the display layer after this property's value is YES, clients must first reset the display layer's status to AVQueuedSampleBufferRenderingStatusUnknown. This can be achieved by invoking -flush on the display layer.
265 /// Clients can track changes to this property via AVSampleBufferDisplayLayerRequiresFlushToResumeDecodingDidChangeNotification.
266 /// This property is not key value observable.
267 #[deprecated = "Use sampleBufferRenderer's requiresFlushToResumeDecoding instead"]
268 #[unsafe(method(requiresFlushToResumeDecoding))]
269 #[unsafe(method_family = none)]
270 pub unsafe fn requiresFlushToResumeDecoding(&self) -> bool;
271
272 /// Indicates the readiness of the layer to accept more sample buffers.
273 ///
274 /// AVSampleBufferDisplayLayer keeps track of the occupancy levels of its internal queues
275 /// for the benefit of clients that enqueue sample buffers from non-real-time sources --
276 /// i.e., clients that can supply sample buffers faster than they are consumed, and so
277 /// need to decide when to hold back.
278 ///
279 /// Clients enqueueing sample buffers from non-real-time sources may hold off from
280 /// generating or obtaining more sample buffers to enqueue when the value of
281 /// readyForMoreMediaData is NO.
282 ///
283 /// It is safe to call enqueueSampleBuffer: when readyForMoreMediaData is NO, but
284 /// it is a bad idea to enqueue sample buffers without bound.
285 ///
286 /// To help with control of the non-real-time supply of sample buffers, such clients can use
287 /// -requestMediaDataWhenReadyOnQueue:usingBlock
288 /// in order to specify a block that the layer should invoke whenever it's ready for
289 /// sample buffers to be appended.
290 ///
291 /// The value of readyForMoreMediaData will often change from NO to YES asynchronously,
292 /// as previously supplied sample buffers are decoded and displayed.
293 ///
294 /// This property is not key value observable.
295 #[deprecated = "Use sampleBufferRenderer's readyForMoreMediaData instead"]
296 #[unsafe(method(isReadyForMoreMediaData))]
297 #[unsafe(method_family = none)]
298 pub unsafe fn isReadyForMoreMediaData(&self) -> bool;
299
300 #[cfg(all(feature = "block2", feature = "dispatch2"))]
301 /// Instructs the target to invoke a client-supplied block repeatedly,
302 /// at its convenience, in order to gather sample buffers for display.
303 ///
304 /// The block should enqueue sample buffers to the layer either until the layer's
305 /// readyForMoreMediaData property becomes NO or until there is no more data
306 /// to supply. When the layer has decoded enough of the media data it has received
307 /// that it becomes ready for more media data again, it will invoke the block again
308 /// in order to obtain more.
309 /// If this function is called multiple times, only the last call is effective.
310 /// Call stopRequestingMediaData to cancel this request.
311 /// Each call to requestMediaDataWhenReadyOnQueue:usingBlock: should be paired
312 /// with a corresponding call to stopRequestingMediaData:. Releasing the
313 /// AVSampleBufferDisplayLayer without a call to stopRequestingMediaData will result
314 /// in undefined behavior.
315 ///
316 /// # Safety
317 ///
318 /// - `queue` possibly has additional threading requirements.
319 /// - `block` block must be sendable.
320 #[deprecated = "Use sampleBufferRenderer's requestMediaDataWhenReadyOnQueue:usingBlock: instead"]
321 #[unsafe(method(requestMediaDataWhenReadyOnQueue:usingBlock:))]
322 #[unsafe(method_family = none)]
323 pub unsafe fn requestMediaDataWhenReadyOnQueue_usingBlock(
324 &self,
325 queue: &DispatchQueue,
326 block: &block2::DynBlock<dyn Fn()>,
327 );
328
329 /// Cancels any current requestMediaDataWhenReadyOnQueue:usingBlock: call.
330 ///
331 /// This method may be called from outside the block or from within the block.
332 #[deprecated = "Use sampleBufferRenderer's stopRequestingMediaData instead"]
333 #[unsafe(method(stopRequestingMediaData))]
334 #[unsafe(method_family = none)]
335 pub unsafe fn stopRequestingMediaData(&self);
336
337 /// Indicates whether the enqueued media data meets the renderer's preroll level.
338 ///
339 /// Clients should fetch the value of this property to learn if the renderer has had enough media data enqueued to start playback reliably. Starting playback when this property is NO may prevent smooth playback following an immediate start.
340 #[deprecated = "Use sampleBufferRenderer's hasSufficientMediaDataForReliablePlaybackStart instead"]
341 #[unsafe(method(hasSufficientMediaDataForReliablePlaybackStart))]
342 #[unsafe(method_family = none)]
343 pub unsafe fn hasSufficientMediaDataForReliablePlaybackStart(&self) -> bool;
344 );
345}
346
347#[cfg(all(
348 feature = "AVQueuedSampleBufferRendering",
349 feature = "objc2-quartz-core"
350))]
351#[cfg(not(target_os = "watchos"))]
352extern_conformance!(
353 unsafe impl AVQueuedSampleBufferRendering for AVSampleBufferDisplayLayer {}
354);
355
356/// AVSampleBufferDisplayLayerImageProtection.
357#[cfg(feature = "objc2-quartz-core")]
358#[cfg(not(target_os = "watchos"))]
359impl AVSampleBufferDisplayLayer {
360 extern_methods!(
361 /// Indicates that image data should be protected from capture.
362 #[unsafe(method(preventsCapture))]
363 #[unsafe(method_family = none)]
364 pub unsafe fn preventsCapture(&self) -> bool;
365
366 /// Setter for [`preventsCapture`][Self::preventsCapture].
367 #[unsafe(method(setPreventsCapture:))]
368 #[unsafe(method_family = none)]
369 pub unsafe fn setPreventsCapture(&self, prevents_capture: bool);
370 );
371}
372
373/// AVSampleBufferDisplayLayerVideoDisplaySleepPrevention.
374#[cfg(feature = "objc2-quartz-core")]
375#[cfg(not(target_os = "watchos"))]
376impl AVSampleBufferDisplayLayer {
377 extern_methods!(
378 /// Indicates whether video playback prevents display and device sleep.
379 ///
380 /// Default is YES on iOS, tvOS and in Mac Catalyst apps. Default is NO on macOS.
381 /// Setting this property to NO does not force the display to sleep, it simply stops preventing display sleep. Other apps or frameworks within your app may still be preventing display sleep for various reasons.
382 /// Note: If sample buffers are being enqueued for playback at the user's request, you should ensure that the value of this property is set to YES. If video is not being displayed as part of the user's primary focus, you should ensure that the value of this property is set to NO.
383 #[unsafe(method(preventsDisplaySleepDuringVideoPlayback))]
384 #[unsafe(method_family = none)]
385 pub unsafe fn preventsDisplaySleepDuringVideoPlayback(&self) -> bool;
386
387 /// Setter for [`preventsDisplaySleepDuringVideoPlayback`][Self::preventsDisplaySleepDuringVideoPlayback].
388 #[unsafe(method(setPreventsDisplaySleepDuringVideoPlayback:))]
389 #[unsafe(method_family = none)]
390 pub unsafe fn setPreventsDisplaySleepDuringVideoPlayback(
391 &self,
392 prevents_display_sleep_during_video_playback: bool,
393 );
394 );
395}
396
397/// AVSampleBufferDisplayLayerAutomaticBackgroundPrevention.
398#[cfg(feature = "objc2-quartz-core")]
399#[cfg(not(target_os = "watchos"))]
400impl AVSampleBufferDisplayLayer {
401 extern_methods!(
402 /// Indicates whether video playback prevents the app from automatically getting backgrounded.
403 ///
404 /// Default is YES.
405 /// Setting this property to YES prevents an application that is playing video from automatically getting backgrounded. This property does not prevent the user from backgrounding the application.
406 /// Note: If sample buffers are being enqueued for playback at the user's request, you should ensure that the value of this property is set to YES. If video is not being displayed as part of the user's primary focus, you should ensure that the value of this property is set to NO.
407 #[unsafe(method(preventsAutomaticBackgroundingDuringVideoPlayback))]
408 #[unsafe(method_family = none)]
409 pub unsafe fn preventsAutomaticBackgroundingDuringVideoPlayback(&self) -> bool;
410
411 /// Setter for [`preventsAutomaticBackgroundingDuringVideoPlayback`][Self::preventsAutomaticBackgroundingDuringVideoPlayback].
412 #[unsafe(method(setPreventsAutomaticBackgroundingDuringVideoPlayback:))]
413 #[unsafe(method_family = none)]
414 pub unsafe fn setPreventsAutomaticBackgroundingDuringVideoPlayback(
415 &self,
416 prevents_automatic_backgrounding_during_video_playback: bool,
417 );
418 );
419}
420
421/// ProtectedContent.
422#[cfg(feature = "objc2-quartz-core")]
423#[cfg(not(target_os = "watchos"))]
424impl AVSampleBufferDisplayLayer {
425 extern_methods!(
426 /// Whether or not decoded output is being obscured due to insufficient external protection.
427 ///
428 ///
429 /// The value of this property indicates whether the layer is purposefully obscuring its visual output
430 /// because the requirement for an external protection mechanism is not met by the current device
431 /// configuration. The change of this property can be observed through AVSampleBufferDisplayLayerOutputObscuredDueToInsufficientExternalProtectionDidChangeNotification
432 ///
433 /// It is highly recommended that clients whose content requires external
434 /// protection observe this property and set the playback rate to zero and display an appropriate user
435 /// interface when the value changes to YES.
436 ///
437 /// Note that the value of this property is dependent on the external protection requirements of the
438 /// media being displayed by the layer. These requirements are inherent to the content itself and cannot
439 /// be externally specified. If the content does not require external protection, the value of this
440 /// property will be NO.
441 #[unsafe(method(outputObscuredDueToInsufficientExternalProtection))]
442 #[unsafe(method_family = none)]
443 pub unsafe fn outputObscuredDueToInsufficientExternalProtection(&self) -> bool;
444 );
445}
446
447/// AVSampleBufferDisplayLayerRenderer.
448#[cfg(feature = "objc2-quartz-core")]
449#[cfg(not(target_os = "watchos"))]
450impl AVSampleBufferDisplayLayer {
451 extern_methods!(
452 #[cfg(feature = "AVSampleBufferVideoRenderer")]
453 /// An AVSampleBufferVideoRenderer instance that allows enqueuing sample buffers for rendering.
454 ///
455 /// Although AVSampleBufferDisplayLayer conforms to the AVQueuedSampleBufferRendering protocol, the sampleBufferRenderer should be used to enqueue sample buffers. sampleBufferRenderer allows the client to safely enqueue sample buffers from a background thread. NOTE: Do not use AVSampleBufferDisplayLayer's AVQueuedSampleBufferRendering functions when using sampleBufferRenderer.
456 #[unsafe(method(sampleBufferRenderer))]
457 #[unsafe(method_family = none)]
458 pub unsafe fn sampleBufferRenderer(&self) -> Retained<AVSampleBufferVideoRenderer>;
459 );
460}