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

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

Issue 2651883010: Adding C++ versions of currently spec'd "RtpParameters" structs. (Closed)
Patch Set: Making Objective-C changes. Created 3 years, 10 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
OLDNEW
1 /* 1 /*
2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2013 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
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 init.maxRetransmitTime = GetIntField(jni, j_init, max_retransmit_time_id); 150 init.maxRetransmitTime = GetIntField(jni, j_init, max_retransmit_time_id);
151 init.maxRetransmits = GetIntField(jni, j_init, max_retransmits_id); 151 init.maxRetransmits = GetIntField(jni, j_init, max_retransmits_id);
152 init.protocol = JavaToStdString( 152 init.protocol = JavaToStdString(
153 jni, GetStringField(jni, j_init, protocol_id)); 153 jni, GetStringField(jni, j_init, protocol_id));
154 init.negotiated = GetBooleanField(jni, j_init, negotiated_id); 154 init.negotiated = GetBooleanField(jni, j_init, negotiated_id);
155 init.id = GetIntField(jni, j_init, id_id); 155 init.id = GetIntField(jni, j_init, id_id);
156 156
157 return init; 157 return init;
158 } 158 }
159 159
160 static cricket::MediaType JavaMediaTypeToJsepMediaType(JNIEnv* jni,
magjed_webrtc 2017/01/26 09:48:06 Can you keep this code in the existing position du
Taylor Brandstetter 2017/01/26 19:08:20 Done; sorry about that.
161 jobject j_media_type) {
162 jclass j_media_type_class =
163 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
164 jmethodID j_name_id =
165 GetMethodID(jni, j_media_type_class, "name", "()Ljava/lang/String;");
166 jstring j_type_string =
167 (jstring)jni->CallObjectMethod(j_media_type, j_name_id);
168 CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
169 std::string type_string = JavaToStdString(jni, j_type_string);
170
171 RTC_DCHECK(type_string == "MEDIA_TYPE_AUDIO" ||
172 type_string == "MEDIA_TYPE_VIDEO")
173 << "Media type: " << type_string;
174 return type_string == "MEDIA_TYPE_AUDIO" ? cricket::MEDIA_TYPE_AUDIO
175 : cricket::MEDIA_TYPE_VIDEO;
176 }
177
178 static jobject JsepMediaTypeToJavaMediaType(JNIEnv* jni,
179 cricket::MediaType media_type) {
180 jclass j_media_type_class =
181 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
182
183 RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO ||
184 media_type == cricket::MEDIA_TYPE_VIDEO)
185 << "Media type: " << media_type;
186 const char* media_type_str = media_type == cricket::MEDIA_TYPE_AUDIO
187 ? "MEDIA_TYPE_AUDIO"
188 : "MEDIA_TYPE_VIDEO";
189 jfieldID j_media_type_fid =
190 GetStaticFieldID(jni, j_media_type_class, media_type_str,
191 "Lorg/webrtc/MediaStreamTrack$MediaType;");
192 return GetStaticObjectField(jni, j_media_type_class, j_media_type_fid);
193 }
194
195 static void JavaRtpParametersToJsepRtpParameters(
196 JNIEnv* jni,
197 jobject j_parameters,
198 webrtc::RtpParameters* parameters) {
199 RTC_CHECK(parameters != nullptr);
200 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
201 jfieldID encodings_id =
202 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
203 jfieldID codecs_id =
204 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
205
206 // Convert encodings.
207 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
208 jclass j_encoding_parameters_class =
209 jni->FindClass("org/webrtc/RtpParameters$Encoding");
210 jfieldID active_id =
211 GetFieldID(jni, j_encoding_parameters_class, "active", "Z");
212 jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class,
213 "maxBitrateBps", "Ljava/lang/Integer;");
214 jfieldID ssrc_id =
215 GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;");
216 jclass j_integer_class = jni->FindClass("java/lang/Integer");
217 jclass j_long_class = jni->FindClass("java/lang/Long");
218 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I");
219 jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J");
220
221 for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) {
222 webrtc::RtpEncodingParameters encoding;
223 encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id);
224 jobject j_bitrate =
225 GetNullableObjectField(jni, j_encoding_parameters, bitrate_id);
226 if (!IsNull(jni, j_bitrate)) {
227 int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id);
228 CHECK_EXCEPTION(jni) << "error during CallIntMethod";
229 encoding.max_bitrate_bps = rtc::Optional<int>(bitrate_value);
230 }
231 jobject j_ssrc =
232 GetNullableObjectField(jni, j_encoding_parameters, ssrc_id);
233 if (!IsNull(jni, j_ssrc)) {
234 jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id);
235 CHECK_EXCEPTION(jni) << "error during CallLongMethod";
236 encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value);
237 }
238 parameters->encodings.push_back(encoding);
239 }
240
241 // Convert codecs.
242 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
243 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
244 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I");
245 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;");
246 jfieldID kind_id = GetFieldID(jni, codec_class, "kind",
247 "Lorg/webrtc/MediaStreamTrack$MediaType;");
248 jfieldID clock_rate_id =
249 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;");
250 jfieldID num_channels_id =
251 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;");
252
253 for (jobject j_codec : Iterable(jni, j_codecs)) {
254 webrtc::RtpCodecParameters codec;
255 codec.payload_type = GetIntField(jni, j_codec, payload_type_id);
256 codec.name = JavaToStdString(jni, GetStringField(jni, j_codec, name_id));
257 codec.kind = JavaMediaTypeToJsepMediaType(
258 jni, GetObjectField(jni, j_codec, kind_id));
259 jobject j_clock_rate = GetNullableObjectField(jni, j_codec, clock_rate_id);
260 if (!IsNull(jni, j_clock_rate)) {
261 int clock_rate_value = jni->CallIntMethod(j_clock_rate, int_value_id);
262 CHECK_EXCEPTION(jni) << "error during CallIntMethod";
263 codec.clock_rate = rtc::Optional<int>(clock_rate_value);
264 }
265 jobject j_num_channels =
266 GetNullableObjectField(jni, j_codec, num_channels_id);
267 if (!IsNull(jni, j_num_channels)) {
268 int num_channels_value = jni->CallIntMethod(j_num_channels, int_value_id);
269 CHECK_EXCEPTION(jni) << "error during CallIntMethod";
270 codec.num_channels = rtc::Optional<int>(num_channels_value);
271 }
272 parameters->codecs.push_back(codec);
273 }
274 }
275
276 static jobject JsepRtpParametersToJavaRtpParameters(
277 JNIEnv* jni,
278 const webrtc::RtpParameters& parameters) {
279 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
280 jmethodID parameters_ctor =
281 GetMethodID(jni, parameters_class, "<init>", "()V");
282 jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor);
283 CHECK_EXCEPTION(jni) << "error during NewObject";
284
285 // Add encodings.
286 jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding");
287 jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V");
288 jfieldID encodings_id =
289 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
290 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
291 jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings),
292 "add", "(Ljava/lang/Object;)Z");
293 jfieldID active_id = GetFieldID(jni, encoding_class, "active", "Z");
294 jfieldID bitrate_id =
295 GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;");
296 jfieldID ssrc_id =
297 GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;");
298
299 jclass integer_class = jni->FindClass("java/lang/Integer");
300 jclass long_class = jni->FindClass("java/lang/Long");
301 jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V");
302 jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V");
303
304 for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) {
305 jobject j_encoding_parameters =
306 jni->NewObject(encoding_class, encoding_ctor);
307 CHECK_EXCEPTION(jni) << "error during NewObject";
308 jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active);
309 CHECK_EXCEPTION(jni) << "error during SetBooleanField";
310 if (encoding.max_bitrate_bps) {
311 jobject j_bitrate_value = jni->NewObject(integer_class, integer_ctor,
312 *(encoding.max_bitrate_bps));
313 CHECK_EXCEPTION(jni) << "error during NewObject";
314 jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value);
315 CHECK_EXCEPTION(jni) << "error during SetObjectField";
316 }
317 if (encoding.ssrc) {
318 jobject j_ssrc_value = jni->NewObject(long_class, long_ctor,
319 static_cast<jlong>(*encoding.ssrc));
320 CHECK_EXCEPTION(jni) << "error during NewObject";
321 jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value);
322 CHECK_EXCEPTION(jni) << "error during SetObjectField";
323 }
324 jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add,
325 j_encoding_parameters);
326 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
327 RTC_CHECK(added);
328 }
329
330 // Add codecs.
331 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
332 jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V");
333 jfieldID codecs_id =
334 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
335 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
336 jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), "add",
337 "(Ljava/lang/Object;)Z");
338 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I");
339 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;");
340 jfieldID kind_id = GetFieldID(jni, codec_class, "kind",
341 "Lorg/webrtc/MediaStreamTrack$MediaType;");
342 jfieldID clock_rate_id =
343 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;");
344 jfieldID num_channels_id =
345 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;");
346
347 for (const webrtc::RtpCodecParameters& codec : parameters.codecs) {
348 jobject j_codec = jni->NewObject(codec_class, codec_ctor);
349 CHECK_EXCEPTION(jni) << "error during NewObject";
350 jni->SetIntField(j_codec, payload_type_id, codec.payload_type);
351 CHECK_EXCEPTION(jni) << "error during SetIntField";
352 jni->SetObjectField(j_codec, name_id,
353 JavaStringFromStdString(jni, codec.name));
354 CHECK_EXCEPTION(jni) << "error during SetObjectField";
355 jni->SetObjectField(j_codec, kind_id,
356 JsepMediaTypeToJavaMediaType(jni, codec.kind));
357 CHECK_EXCEPTION(jni) << "error during SetObjectField";
358 if (codec.clock_rate) {
359 jobject j_clock_rate_value =
360 jni->NewObject(integer_class, integer_ctor, *(codec.clock_rate));
361 CHECK_EXCEPTION(jni) << "error during NewObject";
362 jni->SetObjectField(j_codec, clock_rate_id, j_clock_rate_value);
363 CHECK_EXCEPTION(jni) << "error during SetObjectField";
364 }
365 if (codec.num_channels) {
366 jobject j_num_channels_value =
367 jni->NewObject(integer_class, integer_ctor, *(codec.num_channels));
368 CHECK_EXCEPTION(jni) << "error during NewObject";
369 jni->SetObjectField(j_codec, num_channels_id, j_num_channels_value);
370 CHECK_EXCEPTION(jni) << "error during SetObjectField";
371 }
372 jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec);
373 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
374 RTC_CHECK(added);
375 }
376
377 return j_parameters;
378 }
379
160 class ConstraintsWrapper; 380 class ConstraintsWrapper;
161 381
162 // Adapter between the C++ PeerConnectionObserver interface and the Java 382 // Adapter between the C++ PeerConnectionObserver interface and the Java
163 // PeerConnection.Observer interface. Wraps an instance of the Java interface 383 // PeerConnection.Observer interface. Wraps an instance of the Java interface
164 // and dispatches C++ callbacks to Java. 384 // and dispatches C++ callbacks to Java.
165 class PCOJava : public PeerConnectionObserver { 385 class PCOJava : public PeerConnectionObserver {
166 public: 386 public:
167 // We need these using declarations because there are two versions of each of 387 // We need these using declarations because there are two versions of each of
168 // the below methods and we only override one of them. 388 // the below methods and we only override one of them.
169 // TODO(deadbeef): Remove once there's only one version of the methods. 389 // TODO(deadbeef): Remove once there's only one version of the methods.
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 1129
910 ~RtpReceiverObserver() override {} 1130 ~RtpReceiverObserver() override {}
911 1131
912 void OnFirstPacketReceived(cricket::MediaType media_type) override { 1132 void OnFirstPacketReceived(cricket::MediaType media_type) override {
913 JNIEnv* const jni = AttachCurrentThreadIfNeeded(); 1133 JNIEnv* const jni = AttachCurrentThreadIfNeeded();
914 1134
915 jmethodID j_on_first_packet_received_mid = GetMethodID( 1135 jmethodID j_on_first_packet_received_mid = GetMethodID(
916 jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived", 1136 jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived",
917 "(Lorg/webrtc/MediaStreamTrack$MediaType;)V"); 1137 "(Lorg/webrtc/MediaStreamTrack$MediaType;)V");
918 // Get the Java version of media type. 1138 // Get the Java version of media type.
919 jclass j_media_type_class = 1139 jobject JavaMediaType = JsepMediaTypeToJavaMediaType(jni, media_type);
920 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
921
922 RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO ||
923 media_type == cricket::MEDIA_TYPE_VIDEO)
924 << "Media type: " << media_type;
925 const char* media_type_str = media_type == cricket::MEDIA_TYPE_AUDIO
926 ? "MEDIA_TYPE_AUDIO"
927 : "MEDIA_TYPE_VIDEO";
928 jfieldID j_media_type_fid =
929 GetStaticFieldID(jni, j_media_type_class, media_type_str,
930 "Lorg/webrtc/MediaStreamTrack$MediaType;");
931 jobject JavaMediaType =
932 GetStaticObjectField(jni, j_media_type_class, j_media_type_fid);
933 // Trigger the callback function. 1140 // Trigger the callback function.
934 jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid, 1141 jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid,
935 JavaMediaType); 1142 JavaMediaType);
936 CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; 1143 CHECK_EXCEPTION(jni) << "error during CallVoidMethod";
937 } 1144 }
938 1145
939 private: 1146 private:
940 const ScopedGlobalRef<jobject> j_observer_global_; 1147 const ScopedGlobalRef<jobject> j_observer_global_;
941 }; 1148 };
942 1149
(...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after
2360 JOW(jlong, RtpSender_nativeGetTrack)(JNIEnv* jni, 2567 JOW(jlong, RtpSender_nativeGetTrack)(JNIEnv* jni,
2361 jclass, 2568 jclass,
2362 jlong j_rtp_sender_pointer, 2569 jlong j_rtp_sender_pointer,
2363 jlong j_track_pointer) { 2570 jlong j_track_pointer) {
2364 return jlongFromPointer( 2571 return jlongFromPointer(
2365 reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer) 2572 reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
2366 ->track() 2573 ->track()
2367 .release()); 2574 .release());
2368 } 2575 }
2369 2576
2370 static void JavaRtpParametersToJsepRtpParameters(
2371 JNIEnv* jni,
2372 jobject j_parameters,
2373 webrtc::RtpParameters* parameters) {
2374 RTC_CHECK(parameters != nullptr);
2375 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
2376 jfieldID encodings_id =
2377 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
2378 jfieldID codecs_id =
2379 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
2380
2381 // Convert encodings.
2382 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
2383 const int kBitrateUnlimited = -1;
2384 jclass j_encoding_parameters_class =
2385 jni->FindClass("org/webrtc/RtpParameters$Encoding");
2386 jfieldID active_id =
2387 GetFieldID(jni, j_encoding_parameters_class, "active", "Z");
2388 jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class,
2389 "maxBitrateBps", "Ljava/lang/Integer;");
2390 jfieldID ssrc_id =
2391 GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;");
2392 jclass j_integer_class = jni->FindClass("java/lang/Integer");
2393 jclass j_long_class = jni->FindClass("java/lang/Long");
2394 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I");
2395 jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J");
2396
2397 for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) {
2398 webrtc::RtpEncodingParameters encoding;
2399 encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id);
2400 jobject j_bitrate =
2401 GetNullableObjectField(jni, j_encoding_parameters, bitrate_id);
2402 if (!IsNull(jni, j_bitrate)) {
2403 int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id);
2404 CHECK_EXCEPTION(jni) << "error during CallIntMethod";
2405 encoding.max_bitrate_bps = bitrate_value;
2406 } else {
2407 encoding.max_bitrate_bps = kBitrateUnlimited;
2408 }
2409 jobject j_ssrc =
2410 GetNullableObjectField(jni, j_encoding_parameters, ssrc_id);
2411 if (!IsNull(jni, j_ssrc)) {
2412 jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id);
2413 CHECK_EXCEPTION(jni) << "error during CallLongMethod";
2414 encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value);
2415 }
2416 parameters->encodings.push_back(encoding);
2417 }
2418
2419 // Convert codecs.
2420 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
2421 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
2422 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I");
2423 jfieldID mime_type_id =
2424 GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;");
2425 jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I");
2426 jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I");
2427
2428 for (jobject j_codec : Iterable(jni, j_codecs)) {
2429 webrtc::RtpCodecParameters codec;
2430 codec.payload_type = GetIntField(jni, j_codec, payload_type_id);
2431 codec.mime_type =
2432 JavaToStdString(jni, GetStringField(jni, j_codec, mime_type_id));
2433 codec.clock_rate = GetIntField(jni, j_codec, clock_rate_id);
2434 codec.channels = GetIntField(jni, j_codec, channels_id);
2435 parameters->codecs.push_back(codec);
2436 }
2437 }
2438
2439 static jobject JsepRtpParametersToJavaRtpParameters(
2440 JNIEnv* jni,
2441 const webrtc::RtpParameters& parameters) {
2442 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
2443 jmethodID parameters_ctor =
2444 GetMethodID(jni, parameters_class, "<init>", "()V");
2445 jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor);
2446 CHECK_EXCEPTION(jni) << "error during NewObject";
2447
2448 // Add encodings.
2449 jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding");
2450 jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V");
2451 jfieldID encodings_id =
2452 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
2453 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
2454 jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings),
2455 "add", "(Ljava/lang/Object;)Z");
2456 jfieldID active_id =
2457 GetFieldID(jni, encoding_class, "active", "Z");
2458 jfieldID bitrate_id =
2459 GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;");
2460 jfieldID ssrc_id =
2461 GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;");
2462
2463 jclass integer_class = jni->FindClass("java/lang/Integer");
2464 jclass long_class = jni->FindClass("java/lang/Long");
2465 jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V");
2466 jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V");
2467
2468 for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) {
2469 jobject j_encoding_parameters =
2470 jni->NewObject(encoding_class, encoding_ctor);
2471 CHECK_EXCEPTION(jni) << "error during NewObject";
2472 jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active);
2473 CHECK_EXCEPTION(jni) << "error during SetBooleanField";
2474 if (encoding.max_bitrate_bps > 0) {
2475 jobject j_bitrate_value =
2476 jni->NewObject(integer_class, integer_ctor, encoding.max_bitrate_bps);
2477 CHECK_EXCEPTION(jni) << "error during NewObject";
2478 jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value);
2479 CHECK_EXCEPTION(jni) << "error during SetObjectField";
2480 }
2481 if (encoding.ssrc) {
2482 jobject j_ssrc_value = jni->NewObject(long_class, long_ctor,
2483 static_cast<jlong>(*encoding.ssrc));
2484 CHECK_EXCEPTION(jni) << "error during NewObject";
2485 jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value);
2486 CHECK_EXCEPTION(jni) << "error during SetObjectField";
2487 }
2488 jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add,
2489 j_encoding_parameters);
2490 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
2491 RTC_CHECK(added);
2492 }
2493
2494 // Add codecs.
2495 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
2496 jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V");
2497 jfieldID codecs_id =
2498 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
2499 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
2500 jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs),
2501 "add", "(Ljava/lang/Object;)Z");
2502 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I");
2503 jfieldID mime_type_id =
2504 GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;");
2505 jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I");
2506 jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I");
2507
2508 for (const webrtc::RtpCodecParameters& codec : parameters.codecs) {
2509 jobject j_codec = jni->NewObject(codec_class, codec_ctor);
2510 CHECK_EXCEPTION(jni) << "error during NewObject";
2511 jni->SetIntField(j_codec, payload_type_id, codec.payload_type);
2512 CHECK_EXCEPTION(jni) << "error during SetIntField";
2513 jni->SetObjectField(j_codec, mime_type_id,
2514 JavaStringFromStdString(jni, codec.mime_type));
2515 CHECK_EXCEPTION(jni) << "error during SetObjectField";
2516 jni->SetIntField(j_codec, clock_rate_id, codec.clock_rate);
2517 CHECK_EXCEPTION(jni) << "error during SetIntField";
2518 jni->SetIntField(j_codec, channels_id, codec.channels);
2519 CHECK_EXCEPTION(jni) << "error during SetIntField";
2520 jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec);
2521 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
2522 RTC_CHECK(added);
2523 }
2524
2525 return j_parameters;
2526 }
2527
2528 JOW(jboolean, RtpSender_nativeSetParameters) 2577 JOW(jboolean, RtpSender_nativeSetParameters)
2529 (JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) { 2578 (JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) {
2530 if (IsNull(jni, j_parameters)) { 2579 if (IsNull(jni, j_parameters)) {
2531 return false; 2580 return false;
2532 } 2581 }
2533 webrtc::RtpParameters parameters; 2582 webrtc::RtpParameters parameters;
2534 JavaRtpParametersToJsepRtpParameters(jni, j_parameters, &parameters); 2583 JavaRtpParametersToJsepRtpParameters(jni, j_parameters, &parameters);
2535 return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer) 2584 return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
2536 ->SetParameters(parameters); 2585 ->SetParameters(parameters);
2537 } 2586 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) 2658 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
2610 ->SetObserver(nullptr); 2659 ->SetObserver(nullptr);
2611 RtpReceiverObserver* observer = 2660 RtpReceiverObserver* observer =
2612 reinterpret_cast<RtpReceiverObserver*>(j_observer_pointer); 2661 reinterpret_cast<RtpReceiverObserver*>(j_observer_pointer);
2613 if (observer) { 2662 if (observer) {
2614 delete observer; 2663 delete observer;
2615 } 2664 }
2616 } 2665 }
2617 2666
2618 } // namespace webrtc_jni 2667 } // namespace webrtc_jni
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698