OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/sdk/android/src/jni/pc/peerconnectionobserver_jni.h" | 11 #include "webrtc/sdk/android/src/jni/pc/peerconnectionobserver_jni.h" |
12 | 12 |
| 13 #include <webrtc/pc/mediastreamobserver.h> |
13 #include <string> | 14 #include <string> |
14 | 15 |
15 #include "webrtc/sdk/android/src/jni/classreferenceholder.h" | 16 #include "webrtc/sdk/android/src/jni/classreferenceholder.h" |
16 #include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h" | 17 #include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h" |
17 | 18 |
18 namespace webrtc_jni { | 19 namespace webrtc_jni { |
19 | 20 |
20 // Convenience, used since callbacks occur on the signaling thread, which may | 21 // Convenience, used since callbacks occur on the signaling thread, which may |
21 // be a non-Java thread. | 22 // be a non-Java thread. |
22 static JNIEnv* jni() { | 23 static JNIEnv* jni() { |
(...skipping 15 matching lines...) Expand all Loading... |
38 GetMethodID(jni, *j_video_track_class_, "<init>", "(J)V")), | 39 GetMethodID(jni, *j_video_track_class_, "<init>", "(J)V")), |
39 j_data_channel_class_(jni, FindClass(jni, "org/webrtc/DataChannel")), | 40 j_data_channel_class_(jni, FindClass(jni, "org/webrtc/DataChannel")), |
40 j_data_channel_ctor_( | 41 j_data_channel_ctor_( |
41 GetMethodID(jni, *j_data_channel_class_, "<init>", "(J)V")), | 42 GetMethodID(jni, *j_data_channel_class_, "<init>", "(J)V")), |
42 j_rtp_receiver_class_(jni, FindClass(jni, "org/webrtc/RtpReceiver")), | 43 j_rtp_receiver_class_(jni, FindClass(jni, "org/webrtc/RtpReceiver")), |
43 j_rtp_receiver_ctor_( | 44 j_rtp_receiver_ctor_( |
44 GetMethodID(jni, *j_rtp_receiver_class_, "<init>", "(J)V")) {} | 45 GetMethodID(jni, *j_rtp_receiver_class_, "<init>", "(J)V")) {} |
45 | 46 |
46 PeerConnectionObserverJni::~PeerConnectionObserverJni() { | 47 PeerConnectionObserverJni::~PeerConnectionObserverJni() { |
47 ScopedLocalRefFrame local_ref_frame(jni()); | 48 ScopedLocalRefFrame local_ref_frame(jni()); |
| 49 stream_observers_.clear(); |
| 50 while (!remote_tracks_.empty()) { |
| 51 NativeToJavaMediaTrackMap::iterator it = remote_tracks_.begin(); |
| 52 DeleteGlobalRef(jni(), it->second); |
| 53 remote_tracks_.erase(it); |
| 54 } |
48 while (!remote_streams_.empty()) | 55 while (!remote_streams_.empty()) |
49 DisposeRemoteStream(remote_streams_.begin()); | 56 DisposeRemoteStream(remote_streams_.begin()); |
50 while (!rtp_receivers_.empty()) | 57 while (!rtp_receivers_.empty()) |
51 DisposeRtpReceiver(rtp_receivers_.begin()); | 58 DisposeRtpReceiver(rtp_receivers_.begin()); |
52 } | 59 } |
53 | 60 |
54 void PeerConnectionObserverJni::OnIceCandidate( | 61 void PeerConnectionObserverJni::OnIceCandidate( |
55 const webrtc::IceCandidateInterface* candidate) { | 62 const webrtc::IceCandidateInterface* candidate) { |
56 ScopedLocalRefFrame local_ref_frame(jni()); | 63 ScopedLocalRefFrame local_ref_frame(jni()); |
57 std::string sdp; | 64 std::string sdp; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; | 131 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
125 } | 132 } |
126 | 133 |
127 void PeerConnectionObserverJni::OnAddStream( | 134 void PeerConnectionObserverJni::OnAddStream( |
128 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) { | 135 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) { |
129 ScopedLocalRefFrame local_ref_frame(jni()); | 136 ScopedLocalRefFrame local_ref_frame(jni()); |
130 // The stream could be added into the remote_streams_ map when calling | 137 // The stream could be added into the remote_streams_ map when calling |
131 // OnAddTrack. | 138 // OnAddTrack. |
132 jobject j_stream = GetOrCreateJavaStream(stream); | 139 jobject j_stream = GetOrCreateJavaStream(stream); |
133 | 140 |
134 for (const auto& track : stream->GetAudioTracks()) { | |
135 jstring id = JavaStringFromStdString(jni(), track->id()); | |
136 // Java AudioTrack holds one reference. Corresponding Release() is in | |
137 // MediaStreamTrack_free, triggered by AudioTrack.dispose(). | |
138 track->AddRef(); | |
139 jobject j_track = | |
140 jni()->NewObject(*j_audio_track_class_, j_audio_track_ctor_, | |
141 reinterpret_cast<jlong>(track.get()), id); | |
142 CHECK_EXCEPTION(jni()) << "error during NewObject"; | |
143 jfieldID audio_tracks_id = GetFieldID( | |
144 jni(), *j_media_stream_class_, "audioTracks", "Ljava/util/LinkedList;"); | |
145 jobject audio_tracks = GetObjectField(jni(), j_stream, audio_tracks_id); | |
146 jmethodID add = GetMethodID(jni(), GetObjectClass(jni(), audio_tracks), | |
147 "add", "(Ljava/lang/Object;)Z"); | |
148 jboolean added = jni()->CallBooleanMethod(audio_tracks, add, j_track); | |
149 CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod"; | |
150 RTC_CHECK(added); | |
151 } | |
152 | |
153 for (const auto& track : stream->GetVideoTracks()) { | |
154 jstring id = JavaStringFromStdString(jni(), track->id()); | |
155 // Java VideoTrack holds one reference. Corresponding Release() is in | |
156 // MediaStreamTrack_free, triggered by VideoTrack.dispose(). | |
157 track->AddRef(); | |
158 jobject j_track = | |
159 jni()->NewObject(*j_video_track_class_, j_video_track_ctor_, | |
160 reinterpret_cast<jlong>(track.get()), id); | |
161 CHECK_EXCEPTION(jni()) << "error during NewObject"; | |
162 jfieldID video_tracks_id = GetFieldID( | |
163 jni(), *j_media_stream_class_, "videoTracks", "Ljava/util/LinkedList;"); | |
164 jobject video_tracks = GetObjectField(jni(), j_stream, video_tracks_id); | |
165 jmethodID add = GetMethodID(jni(), GetObjectClass(jni(), video_tracks), | |
166 "add", "(Ljava/lang/Object;)Z"); | |
167 jboolean added = jni()->CallBooleanMethod(video_tracks, add, j_track); | |
168 CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod"; | |
169 RTC_CHECK(added); | |
170 } | |
171 | |
172 jmethodID m = GetMethodID(jni(), *j_observer_class_, "onAddStream", | 141 jmethodID m = GetMethodID(jni(), *j_observer_class_, "onAddStream", |
173 "(Lorg/webrtc/MediaStream;)V"); | 142 "(Lorg/webrtc/MediaStream;)V"); |
174 jni()->CallVoidMethod(*j_observer_global_, m, j_stream); | 143 jni()->CallVoidMethod(*j_observer_global_, m, j_stream); |
175 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; | 144 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
| 145 |
| 146 webrtc::MediaStreamObserver* observer = |
| 147 new webrtc::MediaStreamObserver(stream); |
| 148 observer->SignalAudioTrackRemoved.connect( |
| 149 this, &PeerConnectionObserverJni::OnAudioTrackRemoved); |
| 150 observer->SignalVideoTrackRemoved.connect( |
| 151 this, &PeerConnectionObserverJni::OnVideoTrackRemoved); |
| 152 stream_observers_.push_back( |
| 153 std::unique_ptr<webrtc::MediaStreamObserver>(observer)); |
| 154 } |
| 155 |
| 156 void PeerConnectionObserverJni::OnAudioTrackAdded( |
| 157 webrtc::AudioTrackInterface* track, |
| 158 webrtc::MediaStreamInterface* stream) { |
| 159 ScopedLocalRefFrame local_ref_frame(jni()); |
| 160 jstring id = JavaStringFromStdString(jni(), track->id()); |
| 161 jobject j_stream = GetOrCreateJavaStream(stream); |
| 162 // Java AudioTrack holds one reference. Corresponding Release() is in |
| 163 // MediaStreamTrack_free, triggered by AudioTrack.dispose(). |
| 164 track->AddRef(); |
| 165 jobject j_track = jni()->NewObject(*j_audio_track_class_, j_audio_track_ctor_, |
| 166 reinterpret_cast<jlong>(track), id); |
| 167 CHECK_EXCEPTION(jni()) << "error during NewObject"; |
| 168 remote_tracks_[track] = NewGlobalRef(jni(), j_track); |
| 169 jfieldID audio_tracks_id = GetFieldID( |
| 170 jni(), *j_media_stream_class_, "audioTracks", "Ljava/util/LinkedList;"); |
| 171 jobject audio_tracks = GetObjectField(jni(), j_stream, audio_tracks_id); |
| 172 jmethodID add = GetMethodID(jni(), GetObjectClass(jni(), audio_tracks), "add", |
| 173 "(Ljava/lang/Object;)Z"); |
| 174 jboolean added = jni()->CallBooleanMethod(audio_tracks, add, j_track); |
| 175 CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod"; |
| 176 RTC_CHECK(added); |
| 177 } |
| 178 |
| 179 void PeerConnectionObserverJni::OnVideoTrackAdded( |
| 180 webrtc::VideoTrackInterface* track, |
| 181 webrtc::MediaStreamInterface* stream) { |
| 182 ScopedLocalRefFrame local_ref_frame(jni()); |
| 183 jobject j_stream = GetOrCreateJavaStream(stream); |
| 184 |
| 185 jstring id = JavaStringFromStdString(jni(), track->id()); |
| 186 // Java VideoTrack holds one reference. Corresponding Release() is in |
| 187 // MediaStreamTrack_free, triggered by VideoTrack.dispose(). |
| 188 track->AddRef(); |
| 189 jobject j_track = jni()->NewObject(*j_video_track_class_, j_video_track_ctor_, |
| 190 reinterpret_cast<jlong>(track), id); |
| 191 CHECK_EXCEPTION(jni()) << "error during NewObject"; |
| 192 remote_tracks_[track] = NewGlobalRef(jni(), j_track); |
| 193 jfieldID video_tracks_id = GetFieldID( |
| 194 jni(), *j_media_stream_class_, "videoTracks", "Ljava/util/LinkedList;"); |
| 195 jobject video_tracks = GetObjectField(jni(), j_stream, video_tracks_id); |
| 196 jmethodID add = GetMethodID(jni(), GetObjectClass(jni(), video_tracks), "add", |
| 197 "(Ljava/lang/Object;)Z"); |
| 198 jboolean added = jni()->CallBooleanMethod(video_tracks, add, j_track); |
| 199 CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod"; |
| 200 RTC_CHECK(added); |
| 201 } |
| 202 |
| 203 void PeerConnectionObserverJni::OnAudioTrackRemoved( |
| 204 webrtc::AudioTrackInterface* track, |
| 205 webrtc::MediaStreamInterface* stream) { |
| 206 ScopedLocalRefFrame local_ref_frame(jni()); |
| 207 jobject j_stream = GetOrCreateJavaStream(stream); |
| 208 NativeToJavaMediaTrackMap::iterator track_it = remote_tracks_.find(track); |
| 209 RTC_CHECK(track_it != remote_tracks_.end()); |
| 210 NativeMediaStreamTrackToNativeRtpReceiver::iterator receiver_it = |
| 211 track_to_receiver_.find(track); |
| 212 RTC_CHECK(receiver_it != track_to_receiver_.end()); |
| 213 NativeToJavaRtpReceiverMap::iterator j_receiver_it = |
| 214 rtp_receivers_.find(receiver_it->second); |
| 215 RTC_CHECK(j_receiver_it != rtp_receivers_.end()); |
| 216 |
| 217 jobject j_track = track_it->second; |
| 218 jobject j_receiver = j_receiver_it->second; |
| 219 |
| 220 jfieldID audio_tracks_id = GetFieldID( |
| 221 jni(), *j_media_stream_class_, "audioTracks", "Ljava/util/LinkedList;"); |
| 222 jobject video_tracks = GetObjectField(jni(), j_stream, audio_tracks_id); |
| 223 jmethodID remove = GetMethodID(jni(), GetObjectClass(jni(), video_tracks), |
| 224 "remove", "(Ljava/lang/Object;)Z"); |
| 225 jboolean removed = jni()->CallBooleanMethod(video_tracks, remove, j_track); |
| 226 CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod"; |
| 227 RTC_CHECK(removed); |
| 228 |
| 229 std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> streams; |
| 230 streams.push_back(rtc::scoped_refptr<webrtc::MediaStreamInterface>(stream)); |
| 231 jobjectArray j_stream_array = NativeToJavaMediaStreamArray(jni(), streams); |
| 232 jmethodID m = |
| 233 GetMethodID(jni(), *j_observer_class_, "onRemoveTrack", |
| 234 "(Lorg/webrtc/RtpReceiver;[Lorg/webrtc/MediaStream;)V"); |
| 235 jni()->CallVoidMethod(*j_observer_global_, m, j_receiver, j_stream_array); |
| 236 CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod"; |
| 237 |
| 238 DisposeRemoteTrack(track_it); |
| 239 DisposeRtpReceiver(j_receiver_it); |
| 240 } |
| 241 |
| 242 void PeerConnectionObserverJni::OnVideoTrackRemoved( |
| 243 webrtc::VideoTrackInterface* track, |
| 244 webrtc::MediaStreamInterface* stream) { |
| 245 ScopedLocalRefFrame local_ref_frame(jni()); |
| 246 jobject j_stream = GetOrCreateJavaStream(stream); |
| 247 NativeToJavaMediaTrackMap::iterator track_it = remote_tracks_.find(track); |
| 248 RTC_CHECK(track_it != remote_tracks_.end()); |
| 249 NativeMediaStreamTrackToNativeRtpReceiver::iterator receiver_it = |
| 250 track_to_receiver_.find(track); |
| 251 RTC_CHECK(receiver_it != track_to_receiver_.end()); |
| 252 NativeToJavaRtpReceiverMap::iterator j_receiver_it = |
| 253 rtp_receivers_.find(receiver_it->second); |
| 254 RTC_CHECK(j_receiver_it != rtp_receivers_.end()); |
| 255 |
| 256 jobject j_track = track_it->second; |
| 257 jobject j_receiver = j_receiver_it->second; |
| 258 |
| 259 jfieldID video_tracks_id = GetFieldID( |
| 260 jni(), *j_media_stream_class_, "videoTracks", "Ljava/util/LinkedList;"); |
| 261 jobject video_tracks = GetObjectField(jni(), j_stream, video_tracks_id); |
| 262 jmethodID remove = GetMethodID(jni(), GetObjectClass(jni(), video_tracks), |
| 263 "remove", "(Ljava/lang/Object;)Z"); |
| 264 jboolean removed = jni()->CallBooleanMethod(video_tracks, remove, j_track); |
| 265 CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod"; |
| 266 RTC_CHECK(removed); |
| 267 |
| 268 std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> streams; |
| 269 streams.push_back(rtc::scoped_refptr<webrtc::MediaStreamInterface>(stream)); |
| 270 jobjectArray j_stream_array = NativeToJavaMediaStreamArray(jni(), streams); |
| 271 jmethodID m = |
| 272 GetMethodID(jni(), *j_observer_class_, "onRemoveTrack", |
| 273 "(Lorg/webrtc/RtpReceiver;[Lorg/webrtc/MediaStream;)V"); |
| 274 jni()->CallVoidMethod(*j_observer_global_, m, j_receiver, j_stream_array); |
| 275 CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod"; |
| 276 |
| 277 DisposeRemoteTrack(track_it); |
| 278 DisposeRtpReceiver(j_receiver_it); |
176 } | 279 } |
177 | 280 |
178 void PeerConnectionObserverJni::OnRemoveStream( | 281 void PeerConnectionObserverJni::OnRemoveStream( |
179 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) { | 282 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) { |
180 ScopedLocalRefFrame local_ref_frame(jni()); | 283 ScopedLocalRefFrame local_ref_frame(jni()); |
181 NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream); | 284 NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream); |
182 RTC_CHECK(it != remote_streams_.end()) | 285 RTC_CHECK(it != remote_streams_.end()) |
183 << "unexpected stream: " << std::hex << stream; | 286 << "unexpected stream: " << std::hex << stream; |
184 jobject j_stream = it->second; | 287 jobject j_stream = it->second; |
185 jmethodID m = GetMethodID(jni(), *j_observer_class_, "onRemoveStream", | 288 jmethodID m = GetMethodID(jni(), *j_observer_class_, "onRemoveStream", |
186 "(Lorg/webrtc/MediaStream;)V"); | 289 "(Lorg/webrtc/MediaStream;)V"); |
187 jni()->CallVoidMethod(*j_observer_global_, m, j_stream); | 290 jni()->CallVoidMethod(*j_observer_global_, m, j_stream); |
188 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; | 291 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
| 292 |
| 293 stream_observers_.erase( |
| 294 std::remove_if( |
| 295 stream_observers_.begin(), stream_observers_.end(), |
| 296 [stream]( |
| 297 const std::unique_ptr<webrtc::MediaStreamObserver>& observer) { |
| 298 return observer->stream() == stream; |
| 299 }), |
| 300 stream_observers_.end()); |
| 301 |
189 // Release the refptr reference so that DisposeRemoteStream can assert | 302 // Release the refptr reference so that DisposeRemoteStream can assert |
190 // it removes the final reference. | 303 // it removes the final reference. |
191 stream = nullptr; | 304 stream = nullptr; |
192 DisposeRemoteStream(it); | 305 DisposeRemoteStream(it); |
193 } | 306 } |
194 | 307 |
195 void PeerConnectionObserverJni::OnDataChannel( | 308 void PeerConnectionObserverJni::OnDataChannel( |
196 rtc::scoped_refptr<webrtc::DataChannelInterface> channel) { | 309 rtc::scoped_refptr<webrtc::DataChannelInterface> channel) { |
197 ScopedLocalRefFrame local_ref_frame(jni()); | 310 ScopedLocalRefFrame local_ref_frame(jni()); |
198 jobject j_channel = | 311 jobject j_channel = |
(...skipping 27 matching lines...) Expand all Loading... |
226 rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver, | 339 rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver, |
227 const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& | 340 const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& |
228 streams) { | 341 streams) { |
229 ScopedLocalRefFrame local_ref_frame(jni()); | 342 ScopedLocalRefFrame local_ref_frame(jni()); |
230 jobject j_rtp_receiver = | 343 jobject j_rtp_receiver = |
231 jni()->NewObject(*j_rtp_receiver_class_, j_rtp_receiver_ctor_, | 344 jni()->NewObject(*j_rtp_receiver_class_, j_rtp_receiver_ctor_, |
232 jlongFromPointer(receiver.get())); | 345 jlongFromPointer(receiver.get())); |
233 CHECK_EXCEPTION(jni()) << "error during NewObject"; | 346 CHECK_EXCEPTION(jni()) << "error during NewObject"; |
234 receiver->AddRef(); | 347 receiver->AddRef(); |
235 rtp_receivers_[receiver] = NewGlobalRef(jni(), j_rtp_receiver); | 348 rtp_receivers_[receiver] = NewGlobalRef(jni(), j_rtp_receiver); |
| 349 track_to_receiver_[receiver->track()] = receiver; |
| 350 for (auto stream : streams) { |
| 351 if (receiver->media_type() == cricket::MediaType::MEDIA_TYPE_AUDIO) { |
| 352 webrtc::AudioTrackInterface* track = |
| 353 reinterpret_cast<webrtc::AudioTrackInterface*>( |
| 354 receiver->track().get()); |
| 355 OnAudioTrackAdded(track, stream); |
| 356 } else if (receiver->media_type() == cricket::MediaType::MEDIA_TYPE_VIDEO) { |
| 357 webrtc::VideoTrackInterface* track = |
| 358 reinterpret_cast<webrtc::VideoTrackInterface*>( |
| 359 receiver->track().get()); |
| 360 OnVideoTrackAdded(track, stream); |
| 361 } else { |
| 362 RTC_NOTREACHED(); |
| 363 } |
| 364 } |
236 | 365 |
237 jobjectArray j_stream_array = NativeToJavaMediaStreamArray(jni(), streams); | 366 jobjectArray j_stream_array = NativeToJavaMediaStreamArray(jni(), streams); |
238 jmethodID m = | 367 jmethodID m = |
239 GetMethodID(jni(), *j_observer_class_, "onAddTrack", | 368 GetMethodID(jni(), *j_observer_class_, "onAddTrack", |
240 "(Lorg/webrtc/RtpReceiver;[Lorg/webrtc/MediaStream;)V"); | 369 "(Lorg/webrtc/RtpReceiver;[Lorg/webrtc/MediaStream;)V"); |
241 jni()->CallVoidMethod(*j_observer_global_, m, j_rtp_receiver, j_stream_array); | 370 jni()->CallVoidMethod(*j_observer_global_, m, j_rtp_receiver, j_stream_array); |
242 CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod"; | 371 CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod"; |
243 } | 372 } |
244 | 373 |
245 void PeerConnectionObserverJni::SetConstraints( | 374 void PeerConnectionObserverJni::SetConstraints( |
(...skipping 16 matching lines...) Expand all Loading... |
262 const NativeToJavaRtpReceiverMap::iterator& it) { | 391 const NativeToJavaRtpReceiverMap::iterator& it) { |
263 jobject j_rtp_receiver = it->second; | 392 jobject j_rtp_receiver = it->second; |
264 rtp_receivers_.erase(it); | 393 rtp_receivers_.erase(it); |
265 jni()->CallVoidMethod( | 394 jni()->CallVoidMethod( |
266 j_rtp_receiver, | 395 j_rtp_receiver, |
267 GetMethodID(jni(), *j_rtp_receiver_class_, "dispose", "()V")); | 396 GetMethodID(jni(), *j_rtp_receiver_class_, "dispose", "()V")); |
268 CHECK_EXCEPTION(jni()) << "error during RtpReceiver.dispose()"; | 397 CHECK_EXCEPTION(jni()) << "error during RtpReceiver.dispose()"; |
269 DeleteGlobalRef(jni(), j_rtp_receiver); | 398 DeleteGlobalRef(jni(), j_rtp_receiver); |
270 } | 399 } |
271 | 400 |
| 401 void PeerConnectionObserverJni::DisposeRemoteTrack( |
| 402 const NativeToJavaMediaTrackMap::iterator& it) { |
| 403 RTC_CHECK(it != remote_tracks_.end()); |
| 404 webrtc::MediaStreamTrackInterface* track = it->first; |
| 405 jobject j_track = it->second; |
| 406 remote_tracks_.erase(it); |
| 407 jmethodID dispose; |
| 408 if (track->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) { |
| 409 dispose = GetMethodID(jni(), *j_video_track_class_, "dispose", "()V"); |
| 410 } else { |
| 411 dispose = GetMethodID(jni(), *j_audio_track_class_, "dispose", "()V"); |
| 412 } |
| 413 jni()->CallVoidMethod(j_track, dispose); |
| 414 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
| 415 DeleteGlobalRef(jni(), j_track); |
| 416 } |
| 417 |
272 // If the NativeToJavaStreamsMap contains the stream, return it. | 418 // If the NativeToJavaStreamsMap contains the stream, return it. |
273 // Otherwise, create a new Java MediaStream. | 419 // Otherwise, create a new Java MediaStream. |
274 jobject PeerConnectionObserverJni::GetOrCreateJavaStream( | 420 jobject PeerConnectionObserverJni::GetOrCreateJavaStream( |
275 const rtc::scoped_refptr<webrtc::MediaStreamInterface>& stream) { | 421 const rtc::scoped_refptr<webrtc::MediaStreamInterface>& stream) { |
276 NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream); | 422 NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream); |
277 if (it != remote_streams_.end()) { | 423 if (it != remote_streams_.end()) { |
278 return it->second; | 424 return it->second; |
279 } | 425 } |
280 | |
281 // Java MediaStream holds one reference. Corresponding Release() is in | 426 // Java MediaStream holds one reference. Corresponding Release() is in |
282 // MediaStream_free, triggered by MediaStream.dispose(). | 427 // MediaStream_free, triggered by MediaStream.dispose(). |
283 stream->AddRef(); | 428 stream->AddRef(); |
284 jobject j_stream = | 429 jobject j_stream = |
285 jni()->NewObject(*j_media_stream_class_, j_media_stream_ctor_, | 430 jni()->NewObject(*j_media_stream_class_, j_media_stream_ctor_, |
286 reinterpret_cast<jlong>(stream.get())); | 431 reinterpret_cast<jlong>(stream.get())); |
287 CHECK_EXCEPTION(jni()) << "error during NewObject"; | 432 CHECK_EXCEPTION(jni()) << "error during NewObject"; |
288 | 433 |
289 remote_streams_[stream] = NewGlobalRef(jni(), j_stream); | 434 remote_streams_[stream] = NewGlobalRef(jni(), j_stream); |
290 return j_stream; | 435 return j_stream; |
291 } | 436 } |
292 | 437 |
293 jobjectArray PeerConnectionObserverJni::NativeToJavaMediaStreamArray( | 438 jobjectArray PeerConnectionObserverJni::NativeToJavaMediaStreamArray( |
294 JNIEnv* jni, | 439 JNIEnv* jni, |
295 const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& | 440 const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& |
296 streams) { | 441 streams) { |
297 jobjectArray java_streams = | 442 jobjectArray java_streams = |
298 jni->NewObjectArray(streams.size(), *j_media_stream_class_, nullptr); | 443 jni->NewObjectArray(streams.size(), *j_media_stream_class_, nullptr); |
299 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | 444 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; |
300 for (size_t i = 0; i < streams.size(); ++i) { | 445 for (size_t i = 0; i < streams.size(); ++i) { |
301 jobject j_stream = GetOrCreateJavaStream(streams[i]); | 446 jobject j_stream = GetOrCreateJavaStream(streams[i]); |
302 jni->SetObjectArrayElement(java_streams, i, j_stream); | 447 jni->SetObjectArrayElement(java_streams, i, j_stream); |
303 } | 448 } |
304 return java_streams; | 449 return java_streams; |
305 } | 450 } |
306 | 451 |
307 } // namespace webrtc_jni | 452 } // namespace webrtc_jni |
OLD | NEW |