Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: webrtc/sdk/android/src/jni/pc/peerconnectionobserver_jni.cc

Issue 3007543002: Add PeerConnectionObserver#onRemoveTrack to android sdk
Patch Set: review fixes Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/sdk/android/src/jni/pc/peerconnectionobserver_jni.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/sdk/android/src/jni/pc/peerconnectionobserver_jni.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698