Fixed crash when PCF is destroyed before MediaStream in ObjC

Bug: webrtc:9231
Change-Id: I04e76172dd0d5ee5e9040e773e63fd4df0c797ce
Reviewed-on: https://webrtc-review.googlesource.com/84580
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23699}
This commit is contained in:
Yura Yaroshevich
2018-06-21 12:51:11 +03:00
committed by Commit Bot
parent 8b23dba0e5
commit c806c1d337
5 changed files with 45 additions and 17 deletions

View File

@ -26,8 +26,8 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory streamId:(NSString *)streamId; - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory streamId:(NSString *)streamId;
/** Initialize an RTCMediaStream from a native MediaStreamInterface. */ /** Initialize an RTCMediaStream from a native MediaStreamInterface. */
- (instancetype)initWithNativeMediaStream: - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
(rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream; nativeMediaStream:(rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream;
@end @end

View File

@ -19,6 +19,7 @@
#import "RTCVideoTrack+Private.h" #import "RTCVideoTrack+Private.h"
@implementation RTCMediaStream { @implementation RTCMediaStream {
RTCPeerConnectionFactory *_factory;
NSMutableArray *_audioTracks; NSMutableArray *_audioTracks;
NSMutableArray *_videoTracks; NSMutableArray *_videoTracks;
rtc::scoped_refptr<webrtc::MediaStreamInterface> _nativeMediaStream; rtc::scoped_refptr<webrtc::MediaStreamInterface> _nativeMediaStream;
@ -31,7 +32,7 @@
std::string nativeId = [NSString stdStringForString:streamId]; std::string nativeId = [NSString stdStringForString:streamId];
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream = rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
factory.nativeFactory->CreateLocalMediaStream(nativeId); factory.nativeFactory->CreateLocalMediaStream(nativeId);
return [self initWithNativeMediaStream:stream]; return [self initWithFactory:factory nativeMediaStream:stream];
} }
- (NSArray<RTCAudioTrack *> *)audioTracks { - (NSArray<RTCAudioTrack *> *)audioTracks {
@ -91,10 +92,13 @@
return _nativeMediaStream; return _nativeMediaStream;
} }
- (instancetype)initWithNativeMediaStream: - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
nativeMediaStream:
(rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream { (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
NSParameterAssert(nativeMediaStream); NSParameterAssert(nativeMediaStream);
if (self = [super init]) { if (self = [super init]) {
_factory = factory;
webrtc::AudioTrackVector audioTracks = nativeMediaStream->GetAudioTracks(); webrtc::AudioTrackVector audioTracks = nativeMediaStream->GetAudioTracks();
webrtc::VideoTrackVector videoTracks = nativeMediaStream->GetVideoTracks(); webrtc::VideoTrackVector videoTracks = nativeMediaStream->GetVideoTracks();

View File

@ -56,6 +56,9 @@ class PeerConnectionDelegateAdapter : public PeerConnectionObserver {
@interface RTCPeerConnection () @interface RTCPeerConnection ()
/** The factory used to create this RTCPeerConnection */
@property(nonatomic, readonly) RTCPeerConnectionFactory *factory;
/** The native PeerConnectionInterface created during construction. */ /** The native PeerConnectionInterface created during construction. */
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::PeerConnectionInterface> @property(nonatomic, readonly) rtc::scoped_refptr<webrtc::PeerConnectionInterface>
nativePeerConnection; nativePeerConnection;

View File

@ -132,18 +132,19 @@ void PeerConnectionDelegateAdapter::OnSignalingChange(
void PeerConnectionDelegateAdapter::OnAddStream( void PeerConnectionDelegateAdapter::OnAddStream(
rtc::scoped_refptr<MediaStreamInterface> stream) { rtc::scoped_refptr<MediaStreamInterface> stream) {
RTCMediaStream *mediaStream =
[[RTCMediaStream alloc] initWithNativeMediaStream:stream];
RTCPeerConnection *peer_connection = peer_connection_; RTCPeerConnection *peer_connection = peer_connection_;
RTCMediaStream *mediaStream =
[[RTCMediaStream alloc] initWithFactory:peer_connection.factory nativeMediaStream:stream];
[peer_connection.delegate peerConnection:peer_connection [peer_connection.delegate peerConnection:peer_connection
didAddStream:mediaStream]; didAddStream:mediaStream];
} }
void PeerConnectionDelegateAdapter::OnRemoveStream( void PeerConnectionDelegateAdapter::OnRemoveStream(
rtc::scoped_refptr<MediaStreamInterface> stream) { rtc::scoped_refptr<MediaStreamInterface> stream) {
RTCMediaStream *mediaStream =
[[RTCMediaStream alloc] initWithNativeMediaStream:stream];
RTCPeerConnection *peer_connection = peer_connection_; RTCPeerConnection *peer_connection = peer_connection_;
RTCMediaStream *mediaStream =
[[RTCMediaStream alloc] initWithFactory:peer_connection.factory nativeMediaStream:stream];
[peer_connection.delegate peerConnection:peer_connection [peer_connection.delegate peerConnection:peer_connection
didRemoveStream:mediaStream]; didRemoveStream:mediaStream];
} }
@ -225,7 +226,8 @@ void PeerConnectionDelegateAdapter::OnAddTrack(
respondsToSelector:@selector(peerConnection:didAddReceiver:streams:)]) { respondsToSelector:@selector(peerConnection:didAddReceiver:streams:)]) {
NSMutableArray *mediaStreams = [NSMutableArray arrayWithCapacity:streams.size()]; NSMutableArray *mediaStreams = [NSMutableArray arrayWithCapacity:streams.size()];
for (const auto& nativeStream : streams) { for (const auto& nativeStream : streams) {
RTCMediaStream *mediaStream = [[RTCMediaStream alloc] initWithNativeMediaStream:nativeStream]; RTCMediaStream *mediaStream = [[RTCMediaStream alloc] initWithFactory:peer_connection.factory
nativeMediaStream:nativeStream];
[mediaStreams addObject:mediaStream]; [mediaStreams addObject:mediaStream];
} }
RTCRtpReceiver *rtpReceiver = [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:receiver]; RTCRtpReceiver *rtpReceiver = [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:receiver];
@ -249,6 +251,7 @@ void PeerConnectionDelegateAdapter::OnAddTrack(
} }
@synthesize delegate = _delegate; @synthesize delegate = _delegate;
@synthesize factory = _factory;
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
configuration:(RTCConfiguration *)configuration configuration:(RTCConfiguration *)configuration

View File

@ -28,18 +28,36 @@
RTCMediaConstraints *contraints = RTCMediaConstraints *contraints =
[[RTCMediaConstraints alloc] initWithMandatoryConstraints:@{} optionalConstraints:nil]; [[RTCMediaConstraints alloc] initWithMandatoryConstraints:@{} optionalConstraints:nil];
RTCPeerConnectionFactory *factory = [[RTCPeerConnectionFactory alloc] init]; RTCPeerConnectionFactory *factory;
RTCPeerConnection *peerConnection;
RTCPeerConnection *peerConnection = @autoreleasepool {
factory = [[RTCPeerConnectionFactory alloc] init];
peerConnection =
[factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil]; [factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
[peerConnection close]; [peerConnection close];
factory = nil; factory = nil;
}
peerConnection = nil; peerConnection = nil;
} }
XCTAssertTrue(true, @"Expect test does not crash"); XCTAssertTrue(true, @"Expect test does not crash");
} }
- (void)testMediaStreamLifetime {
@autoreleasepool {
RTCPeerConnectionFactory *factory;
RTCMediaStream *mediaStream;
@autoreleasepool {
factory = [[RTCPeerConnectionFactory alloc] init];
mediaStream = [factory mediaStreamWithStreamId:@"mediaStream"];
factory = nil;
}
mediaStream = nil;
}
XCTAssertTrue(true, "Expect test does not crash");
}
@end @end