Fixed crash when PCF is destroyed before RTCRtpSender in ObjC
Bug: webrtc:9231 Change-Id: I3b90400bf619938817d7a04a7a1130ba86ad65df Reviewed-on: https://webrtc-review.googlesource.com/87623 Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Commit-Queue: Kári Helgason <kthelgason@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23896}
This commit is contained in:

committed by
Commit Bot

parent
bd216f2854
commit
ef43aafcf5
@ -386,7 +386,8 @@ void PeerConnectionDelegateAdapter::OnAddTrack(
|
|||||||
RTCLogError(@"Failed to add track %@: %s", track, nativeSenderOrError.error().message());
|
RTCLogError(@"Failed to add track %@: %s", track, nativeSenderOrError.error().message());
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
return [[RTCRtpSender alloc] initWithNativeRtpSender:nativeSenderOrError.MoveValue()];
|
return [[RTCRtpSender alloc] initWithFactory:self.factory
|
||||||
|
nativeRtpSender:nativeSenderOrError.MoveValue()];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)removeTrack:(RTCRtpSender *)sender {
|
- (BOOL)removeTrack:(RTCRtpSender *)sender {
|
||||||
@ -522,8 +523,8 @@ void PeerConnectionDelegateAdapter::OnAddTrack(
|
|||||||
rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeSender(
|
rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeSender(
|
||||||
_peerConnection->CreateSender(nativeKind, nativeStreamId));
|
_peerConnection->CreateSender(nativeKind, nativeStreamId));
|
||||||
return nativeSender ?
|
return nativeSender ?
|
||||||
[[RTCRtpSender alloc] initWithNativeRtpSender:nativeSender]
|
[[RTCRtpSender alloc] initWithFactory:self.factory nativeRtpSender:nativeSender] :
|
||||||
: nil;
|
nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSArray<RTCRtpSender *> *)senders {
|
- (NSArray<RTCRtpSender *> *)senders {
|
||||||
@ -532,7 +533,7 @@ void PeerConnectionDelegateAdapter::OnAddTrack(
|
|||||||
NSMutableArray *senders = [[NSMutableArray alloc] init];
|
NSMutableArray *senders = [[NSMutableArray alloc] init];
|
||||||
for (const auto &nativeSender : nativeSenders) {
|
for (const auto &nativeSender : nativeSenders) {
|
||||||
RTCRtpSender *sender =
|
RTCRtpSender *sender =
|
||||||
[[RTCRtpSender alloc] initWithNativeRtpSender:nativeSender];
|
[[RTCRtpSender alloc] initWithFactory:self.factory nativeRtpSender:nativeSender];
|
||||||
[senders addObject:sender];
|
[senders addObject:sender];
|
||||||
}
|
}
|
||||||
return senders;
|
return senders;
|
||||||
|
@ -14,13 +14,16 @@
|
|||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@class RTCPeerConnectionFactory;
|
||||||
|
|
||||||
@interface RTCRtpSender ()
|
@interface RTCRtpSender ()
|
||||||
|
|
||||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeRtpSender;
|
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeRtpSender;
|
||||||
|
|
||||||
/** Initialize an RTCRtpSender with a native RtpSenderInterface. */
|
/** Initialize an RTCRtpSender with a native RtpSenderInterface. */
|
||||||
- (instancetype)initWithNativeRtpSender:
|
- (instancetype)initWithFactory:(RTCPeerConnectionFactory*)factory
|
||||||
(rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender NS_DESIGNATED_INITIALIZER;
|
nativeRtpSender:(rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender
|
||||||
|
NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "api/mediastreaminterface.h"
|
#include "api/mediastreaminterface.h"
|
||||||
|
|
||||||
@implementation RTCRtpSender {
|
@implementation RTCRtpSender {
|
||||||
|
RTCPeerConnectionFactory *_factory;
|
||||||
rtc::scoped_refptr<webrtc::RtpSenderInterface> _nativeRtpSender;
|
rtc::scoped_refptr<webrtc::RtpSenderInterface> _nativeRtpSender;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,10 +85,12 @@
|
|||||||
return _nativeRtpSender;
|
return _nativeRtpSender;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)initWithNativeRtpSender:
|
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||||
(rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
|
nativeRtpSender:(rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
|
||||||
|
NSParameterAssert(factory);
|
||||||
NSParameterAssert(nativeRtpSender);
|
NSParameterAssert(nativeRtpSender);
|
||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
|
_factory = factory;
|
||||||
_nativeRtpSender = nativeRtpSender;
|
_nativeRtpSender = nativeRtpSender;
|
||||||
rtc::scoped_refptr<webrtc::DtmfSenderInterface> nativeDtmfSender(
|
rtc::scoped_refptr<webrtc::DtmfSenderInterface> nativeDtmfSender(
|
||||||
_nativeRtpSender->GetDtmfSender());
|
_nativeRtpSender->GetDtmfSender());
|
||||||
|
@ -129,7 +129,8 @@
|
|||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
_factory = factory;
|
_factory = factory;
|
||||||
_nativeRtpTransceiver = nativeRtpTransceiver;
|
_nativeRtpTransceiver = nativeRtpTransceiver;
|
||||||
_sender = [[RTCRtpSender alloc] initWithNativeRtpSender:nativeRtpTransceiver->sender()];
|
_sender = [[RTCRtpSender alloc] initWithFactory:_factory
|
||||||
|
nativeRtpSender:nativeRtpTransceiver->sender()];
|
||||||
_receiver = [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:nativeRtpTransceiver->receiver()];
|
_receiver = [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:nativeRtpTransceiver->receiver()];
|
||||||
RTCLogInfo(@"RTCRtpTransceiver(%p): created transceiver: %@", self, self.description);
|
RTCLogInfo(@"RTCRtpTransceiver(%p): created transceiver: %@", self, self.description);
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,10 @@
|
|||||||
#import <WebRTC/RTCDataChannel.h>
|
#import <WebRTC/RTCDataChannel.h>
|
||||||
#import <WebRTC/RTCDataChannelConfiguration.h>
|
#import <WebRTC/RTCDataChannelConfiguration.h>
|
||||||
#import <WebRTC/RTCMediaConstraints.h>
|
#import <WebRTC/RTCMediaConstraints.h>
|
||||||
|
#import <WebRTC/RTCMediaStreamTrack.h>
|
||||||
#import <WebRTC/RTCPeerConnection.h>
|
#import <WebRTC/RTCPeerConnection.h>
|
||||||
#import <WebRTC/RTCPeerConnectionFactory.h>
|
#import <WebRTC/RTCPeerConnectionFactory.h>
|
||||||
|
#import <WebRTC/RTCRtpSender.h>
|
||||||
#import <WebRTC/RTCRtpTransceiver.h>
|
#import <WebRTC/RTCRtpTransceiver.h>
|
||||||
|
|
||||||
#import <XCTest/XCTest.h>
|
#import <XCTest/XCTest.h>
|
||||||
@ -119,4 +121,30 @@
|
|||||||
XCTAssertTrue(true, "Expect test does not crash");
|
XCTAssertTrue(true, "Expect test does not crash");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)testRTCRtpSenderLifetime {
|
||||||
|
@autoreleasepool {
|
||||||
|
RTCConfiguration *config = [[RTCConfiguration alloc] init];
|
||||||
|
RTCMediaConstraints *contraints =
|
||||||
|
[[RTCMediaConstraints alloc] initWithMandatoryConstraints:@{} optionalConstraints:nil];
|
||||||
|
|
||||||
|
RTCPeerConnectionFactory *factory;
|
||||||
|
RTCPeerConnection *peerConnection;
|
||||||
|
RTCRtpSender *sender;
|
||||||
|
|
||||||
|
@autoreleasepool {
|
||||||
|
factory = [[RTCPeerConnectionFactory alloc] init];
|
||||||
|
peerConnection =
|
||||||
|
[factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
|
||||||
|
sender = [peerConnection senderWithKind:kRTCMediaStreamTrackKindVideo streamId:@"stream"];
|
||||||
|
XCTAssertTrue(sender != nil);
|
||||||
|
[peerConnection close];
|
||||||
|
peerConnection = nil;
|
||||||
|
factory = nil;
|
||||||
|
}
|
||||||
|
sender = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
XCTAssertTrue(true, "Expect test does not crash");
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
Reference in New Issue
Block a user