Add the OnAddTrack callback for Objective-C wrapper.
Created an Obj-C wrapper for the callback OnAddTrack in this CL since it has been added to native C++ API
The callback function is called when a track is signaled by remote side and a new RtpReceiver is created.
The application can tell when tracks are added to the streams by listening to this callback.
BUG=webrtc:6112
Review-Url: https://codereview.webrtc.org/2513063003
Cr-Commit-Position: refs/heads/master@{#16835}
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm
index de7608c..e9428d3 100644
--- a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm
+++ b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm
@@ -27,6 +27,7 @@
#include "webrtc/api/jsepicecandidate.h"
#include "webrtc/base/checks.h"
+#include "webrtc/sdk/objc/Framework/Classes/helpers.h"
NSString * const kRTCPeerConnectionErrorDomain =
@"org.webrtc.RTCPeerConnection";
@@ -127,9 +128,8 @@
void PeerConnectionDelegateAdapter::OnAddStream(
rtc::scoped_refptr<MediaStreamInterface> stream) {
- RTCMediaStream *mediaStream =
- [[RTCMediaStream alloc] initWithNativeMediaStream:stream];
RTCPeerConnection *peer_connection = peer_connection_;
+ RTCMediaStream *mediaStream = [peer_connection mediaStreamForNativeStream:stream];
[peer_connection.delegate peerConnection:peer_connection
didAddStream:mediaStream];
}
@@ -141,6 +141,7 @@
RTCPeerConnection *peer_connection = peer_connection_;
[peer_connection.delegate peerConnection:peer_connection
didRemoveStream:mediaStream];
+ [peer_connection removeNativeMediaStream:stream];
}
void PeerConnectionDelegateAdapter::OnDataChannel(
@@ -200,6 +201,28 @@
didRemoveIceCandidates:ice_candidates];
}
+void PeerConnectionDelegateAdapter::OnAddTrack(
+ rtc::scoped_refptr<RtpReceiverInterface> receiver,
+ const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
+ RTCRtpReceiver* rtpReceiver =
+ [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:receiver];
+ NSMutableArray* mediaStreams =
+ [NSMutableArray arrayWithCapacity:streams.size()];
+
+ RTCPeerConnection* peer_connection = peer_connection_;
+ for (const auto stream : streams) {
+ RTCMediaStream* mediaStream =
+ [peer_connection mediaStreamForNativeStream:stream];
+ [mediaStreams addObject:mediaStream];
+ }
+ if ([peer_connection.delegate
+ respondsToSelector:@selector(peerConnection:didAddTrack:streams:)]) {
+ [peer_connection.delegate peerConnection:peer_connection
+ didAddTrack:rtpReceiver
+ streams:mediaStreams];
+ }
+}
+
} // namespace webrtc
@@ -209,6 +232,7 @@
rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
std::unique_ptr<webrtc::MediaConstraints> _nativeConstraints;
BOOL _hasStartedRtcEventLog;
+ NSMutableDictionary<NSString *, RTCMediaStream *> *_mediaStreamsByStreamId;
}
@synthesize delegate = _delegate;
@@ -238,6 +262,7 @@
}
_localStreams = [[NSMutableArray alloc] init];
_delegate = delegate;
+ _mediaStreamsByStreamId = [NSMutableDictionary dictionary];
}
return self;
}
@@ -588,6 +613,21 @@
}
}
+- (RTCMediaStream *)mediaStreamForNativeStream:
+ (rtc::scoped_refptr<webrtc::MediaStreamInterface>)stream {
+ RTCMediaStream *mediaStream =
+ _mediaStreamsByStreamId[[NSString stringForStdString:stream->label()]];
+ if (!mediaStream) {
+ mediaStream = [[RTCMediaStream alloc] initWithNativeMediaStream:stream.get()];
+ _mediaStreamsByStreamId[[NSString stringForStdString:stream->label()]] = mediaStream;
+ }
+ return mediaStream;
+}
+
+- (void)removeNativeMediaStream:(rtc::scoped_refptr<webrtc::MediaStreamInterface>)stream {
+ [_mediaStreamsByStreamId removeObjectForKey:[NSString stringForStdString:stream->label()]];
+}
+
- (rtc::scoped_refptr<webrtc::PeerConnectionInterface>)nativePeerConnection {
return _peerConnection;
}