public class AVSampleBufferDisplayLayer extends CALayer implements AVQueuedSampleBufferRendering
NSObject.Function_instanceMethodForSelector_ret, NSObject.Function_methodForSelector_retAVQueuedSampleBufferRendering.Block_requestMediaDataWhenReadyOnQueueUsingBlock| Modifier | Constructor and Description |
|---|---|
protected |
AVSampleBufferDisplayLayer(org.moe.natj.general.Pointer peer) |
| Modifier and Type | Method and Description |
|---|---|
boolean |
_supportsSecureCoding()
This property must return YES on all classes that allow secure coding.
|
static boolean |
accessInstanceVariablesDirectly() |
static AVSampleBufferDisplayLayer |
alloc() |
static AVSampleBufferDisplayLayer |
allocWithZone(org.moe.natj.general.ptr.VoidPtr zone) |
static boolean |
automaticallyNotifiesObserversForKey(java.lang.String key) |
static void |
cancelPreviousPerformRequestsWithTarget(java.lang.Object aTarget) |
static void |
cancelPreviousPerformRequestsWithTargetSelectorObject(java.lang.Object aTarget,
org.moe.natj.objc.SEL aSelector,
java.lang.Object anArgument) |
static NSArray<java.lang.String> |
classFallbacksForKeyedArchiver() |
static org.moe.natj.objc.Class |
classForKeyedUnarchiver() |
CMTimebaseRef |
controlTimebase()
[@property] controlTimebase
|
static double |
cornerCurveExpansionFactor(java.lang.String curve) |
static java.lang.String |
debugDescription_static() |
static CAAction |
defaultActionForKey(java.lang.String event) |
static java.lang.Object |
defaultValueForKey(java.lang.String key) |
static java.lang.String |
description_static() |
void |
enqueueSampleBuffer(CMSampleBufferRef sampleBuffer)
enqueueSampleBuffer:
|
NSError |
error()
[@property] error
|
void |
flush()
flush
|
void |
flushAndRemoveImage()
flushAndRemoveImage
|
static long |
hash_static() |
boolean |
hasSufficientMediaDataForReliablePlaybackStart()
[@property] hasSufficientMediaDataForReliablePlaybackStart
|
AVSampleBufferDisplayLayer |
init()
The designated initializer.
|
AVSampleBufferDisplayLayer |
initWithCoder(NSCoder coder)
NS_DESIGNATED_INITIALIZER
|
AVSampleBufferDisplayLayer |
initWithLayer(java.lang.Object layer)
This initializer is used by CoreAnimation to create shadow copies of
layers, e.g.
|
static NSObject.Function_instanceMethodForSelector_ret |
instanceMethodForSelector(org.moe.natj.objc.SEL aSelector) |
static NSMethodSignature |
instanceMethodSignatureForSelector(org.moe.natj.objc.SEL aSelector) |
static boolean |
instancesRespondToSelector(org.moe.natj.objc.SEL aSelector) |
boolean |
isReadyForMoreMediaData()
[@property] readyForMoreMediaData
|
static boolean |
isSubclassOfClass(org.moe.natj.objc.Class aClass) |
static NSSet<java.lang.String> |
keyPathsForValuesAffectingValueForKey(java.lang.String key) |
static AVSampleBufferDisplayLayer |
layer() |
static boolean |
needsDisplayForKey(java.lang.String key) |
static AVSampleBufferDisplayLayer |
new_objc() |
boolean |
outputObscuredDueToInsufficientExternalProtection()
[@property] outputObscuredDueToInsufficientExternalProtection
|
boolean |
preventsCapture()
[@property] preventsCapture
|
boolean |
preventsDisplaySleepDuringVideoPlayback()
[@property] preventsDisplaySleepDuringVideoPlayback
|
void |
requestMediaDataWhenReadyOnQueueUsingBlock(NSObject queue,
AVQueuedSampleBufferRendering.Block_requestMediaDataWhenReadyOnQueueUsingBlock block)
requestMediaDataWhenReadyOnQueue:usingBlock:
|
boolean |
requiresFlushToResumeDecoding()
[@property] requiresFlushToResumeDecoding
|
static boolean |
resolveClassMethod(org.moe.natj.objc.SEL sel) |
static boolean |
resolveInstanceMethod(org.moe.natj.objc.SEL sel) |
void |
setControlTimebase(CMTimebaseRef value)
[@property] controlTimebase
|
void |
setPreventsCapture(boolean value)
[@property] preventsCapture
|
void |
setPreventsDisplaySleepDuringVideoPlayback(boolean value)
[@property] preventsDisplaySleepDuringVideoPlayback
|
static void |
setVersion_static(long aVersion) |
void |
setVideoGravity(java.lang.String value)
[@property] videoGravity
|
long |
status()
[@property] status
|
void |
stopRequestingMediaData()
stopRequestingMediaData
|
static org.moe.natj.objc.Class |
superclass_static() |
static boolean |
supportsSecureCoding() |
CMTimebaseRef |
timebase()
[@property] timebase
|
static long |
version_static() |
java.lang.String |
videoGravity()
[@property] videoGravity
|
actionForKey, actions, addAnimationForKey, addSublayer, affineTransform, allowsEdgeAntialiasing, allowsGroupOpacity, anchorPoint, anchorPointZ, animationForKey, animationKeys, autoreverses, backgroundColor, backgroundFilters, beginTime, borderColor, borderWidth, bounds, compositingFilter, containsPoint, contents, contentsAreFlipped, contentsCenter, contentsFormat, contentsGravity, contentsRect, contentsScale, convertPointFromLayer, convertPointToLayer, convertRectFromLayer, convertRectToLayer, convertTimeFromLayer, convertTimeToLayer, cornerCurve, cornerRadius, delegate, display, displayIfNeeded, drawInContext, drawsAsynchronously, duration, edgeAntialiasingMask, encodeWithCoder, fillMode, filters, frame, hitTest, insertSublayerAbove, insertSublayerAtIndex, insertSublayerBelow, isDoubleSided, isGeometryFlipped, isHidden, isOpaque, layoutIfNeeded, layoutSublayers, magnificationFilter, mask, maskedCorners, masksToBounds, minificationFilter, minificationFilterBias, modelLayer, name, needsDisplay, needsDisplayOnBoundsChange, needsLayout, opacity, position, preferredFrameSize, presentationLayer, rasterizationScale, removeAllAnimations, removeAnimationForKey, removeFromSuperlayer, renderInContext, repeatCount, repeatDuration, replaceSublayerWith, scrollPoint, scrollRectToVisible, setActions, setAffineTransform, setAllowsEdgeAntialiasing, setAllowsGroupOpacity, setAnchorPoint, setAnchorPointZ, setAutoreverses, setBackgroundColor, setBackgroundFilters, setBeginTime, setBorderColor, setBorderWidth, setBounds, setCompositingFilter, setContents, setContentsCenter, setContentsFormat, setContentsGravity, setContentsRect, setContentsScale, setCornerCurve, setCornerRadius, setDelegate_unsafe, setDelegate, setDoubleSided, setDrawsAsynchronously, setDuration, setEdgeAntialiasingMask, setFillMode, setFilters, setFrame, setGeometryFlipped, setHidden, setMagnificationFilter, setMask, setMaskedCorners, setMasksToBounds, setMinificationFilter, setMinificationFilterBias, setName, setNeedsDisplay, setNeedsDisplayInRect, setNeedsDisplayOnBoundsChange, setNeedsLayout, setOpacity, setOpaque, setPosition, setRasterizationScale, setRepeatCount, setRepeatDuration, setShadowColor, setShadowOffset, setShadowOpacity, setShadowPath, setShadowRadius, setShouldRasterize, setSpeed, setStyle, setSublayers, setSublayerTransform, setTimeOffset, setTransform, setZPosition, shadowColor, shadowOffset, shadowOpacity, shadowPath, shadowRadius, shouldArchiveValueForKey, shouldRasterize, speed, style, sublayers, sublayerTransform, superlayer, timeOffset, transform, visibleRect, zPositionaccessibilityActivate, accessibilityActivationPoint, accessibilityAssistiveTechnologyFocusedIdentifiers, accessibilityAttributedHint, accessibilityAttributedLabel, accessibilityAttributedUserInputLabels, accessibilityAttributedValue, accessibilityContainerType, accessibilityCustomActions, accessibilityCustomRotors, accessibilityDecrement, accessibilityDragSourceDescriptors, accessibilityDropPointDescriptors, accessibilityElementAtIndex, accessibilityElementCount, accessibilityElementDidBecomeFocused, accessibilityElementDidLoseFocus, accessibilityElementIsFocused, accessibilityElements, accessibilityElementsHidden, accessibilityFrame, accessibilityHint, accessibilityIncrement, accessibilityLabel, accessibilityLanguage, accessibilityNavigationStyle, accessibilityPath, accessibilityPerformEscape, accessibilityPerformMagicTap, accessibilityRespondsToUserInteraction, accessibilityScroll, accessibilityTextualContext, accessibilityTraits, accessibilityUserInputLabels, accessibilityValue, accessibilityViewIsModal, addObserverForKeyPathOptionsContext, attemptRecoveryFromErrorOptionIndex, attemptRecoveryFromErrorOptionIndexDelegateDidRecoverSelectorContextInfo, autoContentAccessingProxy, awakeAfterUsingCoder, awakeFromNib, class_objc, classForCoder, classForKeyedArchiver, copy, dealloc, debugDescription, description, dictionaryWithValuesForKeys, didChangeValueForKey, didChangeValueForKeyWithSetMutationUsingObjects, didChangeValuesAtIndexesForKey, doesNotRecognizeSelector, fileManagerShouldProceedAfterError, fileManagerWillProcessPath, finalize_objc, forwardingTargetForSelector, forwardInvocation, hash, indexOfAccessibilityElement, isAccessibilityElement, isEqual, isKindOfClass, isMemberOfClass, isProxy, methodForSelector, methodSignatureForSelector, mutableArrayValueForKey, mutableArrayValueForKeyPath, mutableCopy, mutableOrderedSetValueForKey, mutableOrderedSetValueForKeyPath, mutableSetValueForKey, mutableSetValueForKeyPath, observationInfo, observeValueForKeyPathOfObjectChangeContext, performSelector, performSelectorInBackgroundWithObject, performSelectorOnMainThreadWithObjectWaitUntilDone, performSelectorOnMainThreadWithObjectWaitUntilDoneModes, performSelectorOnThreadWithObjectWaitUntilDone, performSelectorOnThreadWithObjectWaitUntilDoneModes, performSelectorWithObject, performSelectorWithObjectAfterDelay, performSelectorWithObjectAfterDelayInModes, performSelectorWithObjectWithObject, prepareForInterfaceBuilder, provideImageDataBytesPerRowOrigin_Size_UserInfo, removeObserverForKeyPath, removeObserverForKeyPathContext, replacementObjectForCoder, replacementObjectForKeyedArchiver, respondsToSelector, self, setAccessibilityActivationPoint, setAccessibilityAttributedHint, setAccessibilityAttributedLabel, setAccessibilityAttributedUserInputLabels, setAccessibilityAttributedValue, setAccessibilityContainerType, setAccessibilityCustomActions, setAccessibilityCustomRotors, setAccessibilityDragSourceDescriptors, setAccessibilityDropPointDescriptors, setAccessibilityElements, setAccessibilityElementsHidden, setAccessibilityFrame, setAccessibilityHint, setAccessibilityLabel, setAccessibilityLanguage, setAccessibilityNavigationStyle, setAccessibilityPath, setAccessibilityRespondsToUserInteraction, setAccessibilityTextualContext, setAccessibilityTraits, setAccessibilityUserInputLabels, setAccessibilityValue, setAccessibilityViewIsModal, setIsAccessibilityElement, setNilValueForKey, setObservationInfo, setShouldGroupAccessibilityChildren, setValueForKey, setValueForKeyPath, setValueForUndefinedKey, setValuesForKeysWithDictionary, shouldGroupAccessibilityChildren, superclass, validateValueForKeyError, validateValueForKeyPathError, valueForKey, valueForKeyPath, valueForUndefinedKey, willChangeValueForKey, willChangeValueForKeyWithSetMutationUsingObjects, willChangeValuesAtIndexesForKeyprotected AVSampleBufferDisplayLayer(org.moe.natj.general.Pointer peer)
public static boolean accessInstanceVariablesDirectly()
public static AVSampleBufferDisplayLayer alloc()
public static AVSampleBufferDisplayLayer allocWithZone(org.moe.natj.general.ptr.VoidPtr zone)
public static boolean automaticallyNotifiesObserversForKey(java.lang.String key)
public static void cancelPreviousPerformRequestsWithTarget(java.lang.Object aTarget)
public static void cancelPreviousPerformRequestsWithTargetSelectorObject(java.lang.Object aTarget,
org.moe.natj.objc.SEL aSelector,
java.lang.Object anArgument)
public static NSArray<java.lang.String> classFallbacksForKeyedArchiver()
public static org.moe.natj.objc.Class classForKeyedUnarchiver()
public static java.lang.String debugDescription_static()
public static CAAction defaultActionForKey(java.lang.String event)
public static java.lang.Object defaultValueForKey(java.lang.String key)
public static java.lang.String description_static()
public static long hash_static()
public static NSObject.Function_instanceMethodForSelector_ret instanceMethodForSelector(org.moe.natj.objc.SEL aSelector)
public static NSMethodSignature instanceMethodSignatureForSelector(org.moe.natj.objc.SEL aSelector)
public static boolean instancesRespondToSelector(org.moe.natj.objc.SEL aSelector)
public static boolean isSubclassOfClass(org.moe.natj.objc.Class aClass)
public static NSSet<java.lang.String> keyPathsForValuesAffectingValueForKey(java.lang.String key)
public static AVSampleBufferDisplayLayer layer()
public static boolean needsDisplayForKey(java.lang.String key)
public static AVSampleBufferDisplayLayer new_objc()
public static boolean resolveClassMethod(org.moe.natj.objc.SEL sel)
public static boolean resolveInstanceMethod(org.moe.natj.objc.SEL sel)
public static void setVersion_static(long aVersion)
public static org.moe.natj.objc.Class superclass_static()
public static long version_static()
public CMTimebaseRef controlTimebase()
The layer's control timebase, which governs how time stamps are interpreted.
By default, this property is NULL, in which case time stamps will be interpreted according to the host time clock (mach_absolute_time with the appropriate timescale conversion; this is the same as Core Animation's CACurrentMediaTime). With no control timebase, once frames are enqueued, it is not possible to adjust exactly when they are displayed.
If a non-NULL control timebase is set, it will be used to interpret time stamps. You can control the timing of frame display by setting the rate and time of the control timebase. If you are synchronizing video to audio, you can use a timebase whose source clock is a CMAudioDeviceClock for the appropriate audio device to prevent drift.
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.
public void enqueueSampleBuffer(CMSampleBufferRef sampleBuffer)
AVQueuedSampleBufferRenderingSends a sample buffer in order to render its contents.
Video-specific notes:
If sampleBuffer has the kCMSampleAttachmentKey_DoNotDisplay attachment set to kCFBooleanTrue, the frame will be decoded but not displayed. Otherwise, if sampleBuffer has the kCMSampleAttachmentKey_DisplayImmediately attachment set to kCFBooleanTrue, the decoded image will be displayed as soon as possible, replacing all previously enqueued images regardless of their timestamps. Otherwise, the decoded image will be displayed at sampleBuffer's output presentation timestamp, as interpreted by the timebase.
To schedule the removal of previous images at a specific timestamp, enqueue a marker sample buffer containing no samples, with the kCMSampleBufferAttachmentKey_EmptyMedia attachment set to kCFBooleanTrue.
IMPORTANT NOTE: attachments with the kCMSampleAttachmentKey_ prefix must be set via CMSampleBufferGetSampleAttachmentsArray and CFDictionarySetValue. Attachments with the kCMSampleBufferAttachmentKey_ prefix must be set via CMSetAttachment.
enqueueSampleBuffer in interface AVQueuedSampleBufferRenderingpublic NSError error()
If the display layer's status is AVQueuedSampleBufferRenderingStatusFailed, this describes the error that caused the failure.
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.
public void flush()
AVQueuedSampleBufferRenderingInstructs the receiver to discard pending enqueued sample buffers.
Additional sample buffers can be appended after -flush.
Video-specific notes:
It is not possible to determine which sample buffers have been decoded, so the next frame passed to enqueueSampleBuffer: should be an IDR frame (also known as a key frame or sync sample).
flush in interface AVQueuedSampleBufferRenderingpublic void flushAndRemoveImage()
Instructs the layer to discard pending enqueued sample buffers and remove any currently displayed image.
It is not possible to determine which sample buffers have been decoded, so the next frame passed to enqueueSampleBuffer: should be an IDR frame (also known as a key frame or sync sample).
public AVSampleBufferDisplayLayer init()
CALayerpublic AVSampleBufferDisplayLayer initWithCoder(NSCoder coder)
NSCodinginitWithCoder in interface NSCodinginitWithCoder in class CALayerpublic AVSampleBufferDisplayLayer initWithLayer(java.lang.Object layer)
CALayerinitWithLayer in class CALayerpublic boolean isReadyForMoreMediaData()
AVQueuedSampleBufferRenderingIndicates the readiness of the receiver to accept more sample buffers.
An object conforming to AVQueuedSampleBufferRendering keeps track of the occupancy levels of its internal queues for the benefit of clients that enqueue sample buffers from non-real-time sources -- i.e., clients that can supply sample buffers faster than they are consumed, and so need to decide when to hold back.
Clients enqueueing sample buffers from non-real-time sources may hold off from generating or obtaining more sample buffers to enqueue when the value of readyForMoreMediaData is NO.
It is safe to call enqueueSampleBuffer: when readyForMoreMediaData is NO, but it is a bad idea to enqueue sample buffers without bound.
To help with control of the non-real-time supply of sample buffers, such clients can use -requestMediaDataWhenReadyOnQueue:usingBlock in order to specify a block that the receiver should invoke whenever it's ready for sample buffers to be appended.
The value of readyForMoreMediaData will often change from NO to YES asynchronously, as previously supplied sample buffers are decoded and rendered.
This property is not key value observable.
isReadyForMoreMediaData in interface AVQueuedSampleBufferRenderingpublic void requestMediaDataWhenReadyOnQueueUsingBlock(NSObject queue, AVQueuedSampleBufferRendering.Block_requestMediaDataWhenReadyOnQueueUsingBlock block)
AVQueuedSampleBufferRenderingInstructs the target to invoke a client-supplied block repeatedly, at its convenience, in order to gather sample buffers for playback.
The block should enqueue sample buffers to the receiver either until the receiver's readyForMoreMediaData property becomes NO or until there is no more data to supply. When the receiver has decoded enough of the media data it has received that it becomes ready for more media data again, it will invoke the block again in order to obtain more.
If this method is called multiple times, only the last call is effective. Call stopRequestingMediaData to cancel this request.
Each call to requestMediaDataWhenReadyOnQueue:usingBlock: should be paired with a corresponding call to stopRequestingMediaData:. Releasing the AVQueuedSampleBufferRendering object without a call to stopRequestingMediaData will result in undefined behavior.
requestMediaDataWhenReadyOnQueueUsingBlock in interface AVQueuedSampleBufferRenderingpublic void setControlTimebase(CMTimebaseRef value)
The layer's control timebase, which governs how time stamps are interpreted.
By default, this property is NULL, in which case time stamps will be interpreted according to the host time clock (mach_absolute_time with the appropriate timescale conversion; this is the same as Core Animation's CACurrentMediaTime). With no control timebase, once frames are enqueued, it is not possible to adjust exactly when they are displayed.
If a non-NULL control timebase is set, it will be used to interpret time stamps. You can control the timing of frame display by setting the rate and time of the control timebase. If you are synchronizing video to audio, you can use a timebase whose source clock is a CMAudioDeviceClock for the appropriate audio device to prevent drift.
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.
public void setVideoGravity(java.lang.String value)
A string defining how the video is displayed within an AVSampleBufferDisplayLayer bounds rect.
[@discusssion] Options are AVLayerVideoGravityResizeAspect, AVLayerVideoGravityResizeAspectFill
and AVLayerVideoGravityResize. AVLayerVideoGravityResizeAspect is default.
See
public long status()
The ability of the display layer to be used for enqueuing sample buffers.
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.
This property is key value observable.
public void stopRequestingMediaData()
AVQueuedSampleBufferRenderingCancels any current requestMediaDataWhenReadyOnQueue:usingBlock: call.
This method may be called from outside the block or from within the block.
stopRequestingMediaData in interface AVQueuedSampleBufferRenderingpublic java.lang.String videoGravity()
A string defining how the video is displayed within an AVSampleBufferDisplayLayer bounds rect.
[@discusssion] Options are AVLayerVideoGravityResizeAspect, AVLayerVideoGravityResizeAspectFill
and AVLayerVideoGravityResize. AVLayerVideoGravityResizeAspect is default.
See
public static boolean supportsSecureCoding()
public boolean _supportsSecureCoding()
NSSecureCoding_supportsSecureCoding in interface NSSecureCoding_supportsSecureCoding in class CALayerpublic CMTimebaseRef timebase()
AVQueuedSampleBufferRenderingThe renderer's timebase, which governs how time stamps are interpreted.
The timebase is used to interpret time stamps.
The timebase is read-only. Use the AVSampleBufferRenderSynchronizer to set the rate or time.
timebase in interface AVQueuedSampleBufferRenderingpublic static double cornerCurveExpansionFactor(java.lang.String curve)
public boolean preventsCapture()
Indicates that image data should be protected from capture.
public boolean preventsDisplaySleepDuringVideoPlayback()
Indicates whether video playback prevents display and device sleep.
Default is YES on iOS, tvOS and in Mac Catalyst apps. Default is NO on macOS. 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. 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.
public void setPreventsCapture(boolean value)
Indicates that image data should be protected from capture.
public void setPreventsDisplaySleepDuringVideoPlayback(boolean value)
Indicates whether video playback prevents display and device sleep.
Default is YES on iOS, tvOS and in Mac Catalyst apps. Default is NO on macOS. 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. 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.
public boolean requiresFlushToResumeDecoding()
Indicates that the receiver is in a state where it requires a call to -flush to continue decoding frames.
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. 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. Clients can track changes to this property via AVSampleBufferDisplayLayerRequiresFlushToResumeDecodingDidChangeNotification. This property is not key value observable.
public boolean hasSufficientMediaDataForReliablePlaybackStart()
AVQueuedSampleBufferRenderingIndicates whether the enqueued media data meets the renderer's preroll level.
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.
hasSufficientMediaDataForReliablePlaybackStart in interface AVQueuedSampleBufferRenderingpublic boolean outputObscuredDueToInsufficientExternalProtection()
Whether or not decoded output is being obscured due to insufficient external protection.
The value of this property indicates whether the layer is purposefully obscuring its visual output because the requirement for an external protection mechanism is not met by the current device configuration. The change of this property can be observed through AVSampleBufferDisplayLayerOutputObscuredDueToInsufficientExternalProtectionDidChangeNotification
It is highly recommended that clients whose content requires external protection observe this property and set the playback rate to zero and display an appropriate user interface when the value changes to YES.
Note that the value of this property is dependent on the external protection requirements of the media being displayed by the layer. These requirements are inherent to the content itself and cannot be externally specified. If the content does not require external protection, the value of this property will be NO.