Modified: trunk/Source/WebCore/ChangeLog (237080 => 237081)
--- trunk/Source/WebCore/ChangeLog 2018-10-12 21:42:23 UTC (rev 237080)
+++ trunk/Source/WebCore/ChangeLog 2018-10-12 21:43:01 UTC (rev 237081)
@@ -1,3 +1,21 @@
+2018-10-12 Jer Noble <jer.no...@apple.com>
+
+ WebAVSampleBufferErrorListener's parent should be a WeakPtr.
+ https://bugs.webkit.org/show_bug.cgi?id=190524
+ <rdar://problem/44359307>
+
+ Reviewed by Eric Carlson.
+
+ Once WebAVSampleBufferErrorListener's parent is a WeakPtr, we no longer need to pass
+ protectedSelf into the callOnMainThread lambdas; we can pass in the parent itself.
+
+ * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
+ (-[WebAVSampleBufferErrorListener initWithParent:]):
+ (-[WebAVSampleBufferErrorListener observeValueForKeyPath:ofObject:change:context:]):
+ (-[WebAVSampleBufferErrorListener layerFailedToDecode:]):
+ (WebCore::SourceBufferPrivateAVFObjC::SourceBufferPrivateAVFObjC):
+ (WebCore::SourceBufferPrivateAVFObjC::destroyRenderers):
+
2018-10-12 Ryosuke Niwa <rn...@webkit.org>
Address the review comment which was meant to be addressed in r237025.
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm (237080 => 237081)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm 2018-10-12 21:42:23 UTC (rev 237080)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm 2018-10-12 21:43:01 UTC (rev 237081)
@@ -244,7 +244,7 @@
@end
@interface WebAVSampleBufferErrorListener : NSObject {
- WebCore::SourceBufferPrivateAVFObjC* _parent;
+ WeakPtr<WebCore::SourceBufferPrivateAVFObjC> _parent;
Vector<RetainPtr<AVSampleBufferDisplayLayer>> _layers;
ALLOW_NEW_API_WITHOUT_GUARDS_BEGIN
Vector<RetainPtr<AVSampleBufferAudioRenderer>> _renderers;
@@ -251,7 +251,7 @@
ALLOW_NEW_API_WITHOUT_GUARDS_END
}
-- (id)initWithParent:(WebCore::SourceBufferPrivateAVFObjC*)parent;
+- (id)initWithParent:(WeakPtr<WebCore::SourceBufferPrivateAVFObjC>&&)parent;
- (void)invalidate;
- (void)beginObservingLayer:(AVSampleBufferDisplayLayer *)layer;
- (void)stopObservingLayer:(AVSampleBufferDisplayLayer *)layer;
@@ -263,12 +263,12 @@
@implementation WebAVSampleBufferErrorListener
-- (id)initWithParent:(WebCore::SourceBufferPrivateAVFObjC*)parent
+- (id)initWithParent:(WeakPtr<WebCore::SourceBufferPrivateAVFObjC>&&)parent
{
if (!(self = [super init]))
return nil;
- _parent = parent;
+ _parent = WTFMove(parent);
return self;
}
@@ -349,7 +349,6 @@
UNUSED_PARAM(keyPath);
ASSERT(_parent);
- RetainPtr<WebAVSampleBufferErrorListener> protectedSelf = self;
if ([object isKindOfClass:getAVSampleBufferDisplayLayerClass()]) {
RetainPtr<AVSampleBufferDisplayLayer> layer = (AVSampleBufferDisplayLayer *)object;
ASSERT(_layers.contains(layer.get()));
@@ -356,12 +355,14 @@
if ([keyPath isEqualTo:@"error"]) {
RetainPtr<NSError> error = [change valueForKey:NSKeyValueChangeNewKey];
- callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
- protectedSelf->_parent->layerDidReceiveError(layer.get(), error.get());
+ callOnMainThread([parent = _parent, layer = WTFMove(layer), error = WTFMove(error)] {
+ if (parent)
+ parent->layerDidReceiveError(layer.get(), error.get());
});
} else if ([keyPath isEqualTo:@"outputObscuredDueToInsufficientExternalProtection"]) {
- callOnMainThread([protectedSelf = WTFMove(protectedSelf), obscured = [[change valueForKey:NSKeyValueChangeNewKey] boolValue]] {
- protectedSelf->_parent->outputObscuredDueToInsufficientExternalProtectionChanged(obscured);
+ callOnMainThread([parent = _parent, obscured = [[change valueForKey:NSKeyValueChangeNewKey] boolValue]] {
+ if (parent)
+ parent->outputObscuredDueToInsufficientExternalProtectionChanged(obscured);
});
} else
ASSERT_NOT_REACHED();
@@ -375,8 +376,9 @@
ASSERT(_renderers.contains(renderer.get()));
ASSERT([keyPath isEqualTo:@"error"]);
- callOnMainThread([protectedSelf = WTFMove(protectedSelf), renderer = WTFMove(renderer), error = WTFMove(error)] {
- protectedSelf->_parent->rendererDidReceiveError(renderer.get(), error.get());
+ callOnMainThread([parent = _parent, renderer = WTFMove(renderer), error = WTFMove(error)] {
+ if (parent)
+ parent->rendererDidReceiveError(renderer.get(), error.get());
});
} else
ASSERT_NOT_REACHED();
@@ -385,13 +387,12 @@
- (void)layerFailedToDecode:(NSNotification*)note
{
RetainPtr<AVSampleBufferDisplayLayer> layer = (AVSampleBufferDisplayLayer *)[note object];
- RetainPtr<NSError> error = [[note userInfo] valueForKey:AVSampleBufferDisplayLayerFailedToDecodeNotificationErrorKey];
+ if (!_layers.contains(layer.get()))
+ return;
- RetainPtr<WebAVSampleBufferErrorListener> protectedSelf = self;
- callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
- if (!protectedSelf->_parent || !protectedSelf->_layers.contains(layer.get()))
- return;
- protectedSelf->_parent->layerDidReceiveError(layer.get(), error.get());
+ callOnMainThread([parent = _parent, layer = WTFMove(layer), error = retainPtr([[note userInfo] valueForKey:AVSampleBufferDisplayLayerFailedToDecodeNotificationErrorKey])] {
+ if (parent)
+ parent->layerDidReceiveError(layer.get(), error.get());
});
}
@end
@@ -490,7 +491,7 @@
SourceBufferPrivateAVFObjC::SourceBufferPrivateAVFObjC(MediaSourcePrivateAVFObjC* parent)
: m_parser(adoptNS([allocAVStreamDataParserInstance() init]))
, m_delegate(adoptNS([[WebAVStreamDataParserListener alloc] initWithParser:m_parser.get() parent:createWeakPtr()]))
- , m_errorListener(adoptNS([[WebAVSampleBufferErrorListener alloc] initWithParent:this]))
+ , m_errorListener(adoptNS([[WebAVSampleBufferErrorListener alloc] initWithParent:createWeakPtr()]))
, m_isAppendingGroup(adoptOSObject(dispatch_group_create()))
, m_mediaSource(parent)
{
@@ -782,6 +783,9 @@
[m_errorListener stopObservingRenderer:renderer.get()];
}
+ [m_errorListener invalidate];
+ m_errorListener = nullptr;
+
m_audioRenderers.clear();
}