Add new PeerConnection APIs to the ObjC SDK
This CL adds wrappers for the following PeerConnection native APIs to the Objective C API: - SdpSemantics enum added to the RTCConfiguration - RTCRtpTransceiver - RTCPeerConnection.addTrack - RTCPeerConnection.removeTrack - RTCPeerConnection.addTransceiver - RTCPeerConnection.transceivers Bug: webrtc:8870 Change-Id: I9449df9742a59e90894712dc7749ca30b569d94b Reviewed-on: https://webrtc-review.googlesource.com/54780 Commit-Queue: Steve Anton <steveanton@webrtc.org> Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22214}
This commit is contained in:
@ -17,10 +17,12 @@
|
||||
#import "RTCLegacyStatsReport+Private.h"
|
||||
#import "RTCMediaConstraints+Private.h"
|
||||
#import "RTCMediaStream+Private.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCPeerConnection+Native.h"
|
||||
#import "RTCPeerConnectionFactory+Private.h"
|
||||
#import "RTCRtpReceiver+Private.h"
|
||||
#import "RTCRtpSender+Private.h"
|
||||
#import "RTCRtpTransceiver+Private.h"
|
||||
#import "RTCSessionDescription+Private.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
@ -144,6 +146,18 @@ void PeerConnectionDelegateAdapter::OnRemoveStream(
|
||||
didRemoveStream:mediaStream];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnTrack(
|
||||
rtc::scoped_refptr<RtpTransceiverInterface> nativeTransceiver) {
|
||||
RTCRtpTransceiver *transceiver =
|
||||
[[RTCRtpTransceiver alloc] initWithNativeRtpTransceiver:nativeTransceiver];
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
if ([peer_connection.delegate
|
||||
respondsToSelector:@selector(peerConnection:didStartReceivingOnTransceiver:)]) {
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didStartReceivingOnTransceiver:transceiver];
|
||||
}
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnDataChannel(
|
||||
rtc::scoped_refptr<DataChannelInterface> data_channel) {
|
||||
RTCDataChannel *dataChannel =
|
||||
@ -334,6 +348,65 @@ void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
|
||||
[_localStreams removeObject:stream];
|
||||
}
|
||||
|
||||
- (RTCRtpSender *)addTrack:(RTCMediaStreamTrack *)track
|
||||
streamLabels:(NSArray<NSString *> *)streamLabels {
|
||||
std::vector<std::string> nativeStreamLabels;
|
||||
for (NSString *label in streamLabels) {
|
||||
nativeStreamLabels.push_back([label UTF8String]);
|
||||
}
|
||||
webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpSenderInterface>> nativeSenderOrError =
|
||||
_peerConnection->AddTrack(track.nativeTrack, nativeStreamLabels);
|
||||
if (!nativeSenderOrError.ok()) {
|
||||
RTCLogError(@"Failed to add track %@: %s", track, nativeSenderOrError.error().message());
|
||||
return nil;
|
||||
}
|
||||
return [[RTCRtpSender alloc] initWithNativeRtpSender:nativeSenderOrError.MoveValue()];
|
||||
}
|
||||
|
||||
- (BOOL)removeTrack:(RTCRtpSender *)sender {
|
||||
bool result = _peerConnection->RemoveTrack(sender.nativeRtpSender);
|
||||
if (!result) {
|
||||
RTCLogError(@"Failed to remote track %@", sender);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverWithTrack:(RTCMediaStreamTrack *)track {
|
||||
return [self addTransceiverWithTrack:track init:[[RTCRtpTransceiverInit alloc] init]];
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverWithTrack:(RTCMediaStreamTrack *)track
|
||||
init:(RTCRtpTransceiverInit *)init {
|
||||
webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceiverOrError =
|
||||
_peerConnection->AddTransceiver(track.nativeTrack, init.nativeInit);
|
||||
if (!nativeTransceiverOrError.ok()) {
|
||||
RTCLogError(
|
||||
@"Failed to add transceiver %@: %s", track, nativeTransceiverOrError.error().message());
|
||||
return nil;
|
||||
}
|
||||
return
|
||||
[[RTCRtpTransceiver alloc] initWithNativeRtpTransceiver:nativeTransceiverOrError.MoveValue()];
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverOfType:(RTCRtpMediaType)mediaType {
|
||||
return [self addTransceiverOfType:mediaType init:[[RTCRtpTransceiverInit alloc] init]];
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverOfType:(RTCRtpMediaType)mediaType
|
||||
init:(RTCRtpTransceiverInit *)init {
|
||||
webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceiverOrError =
|
||||
_peerConnection->AddTransceiver([RTCRtpReceiver nativeMediaTypeForMediaType:mediaType],
|
||||
init.nativeInit);
|
||||
if (!nativeTransceiverOrError.ok()) {
|
||||
RTCLogError(@"Failed to add transceiver %@: %s",
|
||||
[RTCRtpReceiver stringForMediaType:mediaType],
|
||||
nativeTransceiverOrError.error().message());
|
||||
return nil;
|
||||
}
|
||||
return
|
||||
[[RTCRtpTransceiver alloc] initWithNativeRtpTransceiver:nativeTransceiverOrError.MoveValue()];
|
||||
}
|
||||
|
||||
- (void)offerForConstraints:(RTCMediaConstraints *)constraints
|
||||
completionHandler:
|
||||
(void (^)(RTCSessionDescription *sessionDescription,
|
||||
@ -451,6 +524,18 @@ void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
|
||||
return receivers;
|
||||
}
|
||||
|
||||
- (NSArray<RTCRtpTransceiver *> *)transceivers {
|
||||
std::vector<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceivers(
|
||||
_peerConnection->GetTransceivers());
|
||||
NSMutableArray *transceivers = [[NSMutableArray alloc] init];
|
||||
for (auto nativeTransceiver : nativeTransceivers) {
|
||||
RTCRtpTransceiver *transceiver =
|
||||
[[RTCRtpTransceiver alloc] initWithNativeRtpTransceiver:nativeTransceiver];
|
||||
[transceivers addObject:transceiver];
|
||||
}
|
||||
return transceivers;
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
|
||||
|
||||
Reference in New Issue
Block a user