blob: 4bed3f81276b79da6ecea078acec87bd9ce108b1 [file] [log] [blame]
Magnus Jedvert9060eb12017-12-12 11:52:541/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 17:11:0011#include "sdk/android/src/jni/pc/rtp_parameters.h"
Magnus Jedvert9060eb12017-12-12 11:52:5412
Eric Stevenson0d65fb52019-06-24 17:09:5013#include "sdk/android/generated_peerconnection_jni/RtpParameters_jni.h"
Sami Kalliomäki82f96e62018-01-29 12:18:5714#include "sdk/android/native_api/jni/java_types.h"
Magnus Jedvert9060eb12017-12-12 11:52:5415#include "sdk/android/src/jni/jni_helpers.h"
Steve Anton10542f22019-01-11 17:11:0016#include "sdk/android/src/jni/pc/media_stream_track.h"
Magnus Jedvert9060eb12017-12-12 11:52:5417
18namespace webrtc {
19namespace jni {
20
21namespace {
22
Florent Castelli266021d2020-01-07 16:43:5223webrtc::DegradationPreference JavaToNativeDegradationPreference(
24 JNIEnv* jni,
25 const JavaRef<jobject>& j_degradation_preference) {
26 std::string enum_name = GetJavaEnumName(jni, j_degradation_preference);
27
28 if (enum_name == "DISABLED")
29 return webrtc::DegradationPreference::DISABLED;
30
31 if (enum_name == "MAINTAIN_FRAMERATE")
32 return webrtc::DegradationPreference::MAINTAIN_FRAMERATE;
33
34 if (enum_name == "MAINTAIN_RESOLUTION")
35 return webrtc::DegradationPreference::MAINTAIN_RESOLUTION;
36
37 if (enum_name == "BALANCED")
38 return webrtc::DegradationPreference::BALANCED;
39
40 RTC_CHECK(false) << "Unexpected DegradationPreference enum_name "
41 << enum_name;
42 return webrtc::DegradationPreference::DISABLED;
43}
44
Magnus Jedvert84d8ae52017-12-20 14:12:1045ScopedJavaLocalRef<jobject> NativeToJavaRtpEncodingParameter(
Magnus Jedvert9060eb12017-12-12 11:52:5446 JNIEnv* env,
47 const RtpEncodingParameters& encoding) {
48 return Java_Encoding_Constructor(
Amit Hilbuchae4b6232019-03-29 21:02:4249 env, NativeToJavaString(env, encoding.rid), encoding.active,
50 NativeToJavaInteger(env, encoding.max_bitrate_bps),
Åsa Persson613591a2018-05-29 07:21:3151 NativeToJavaInteger(env, encoding.min_bitrate_bps),
Åsa Persson4e5342f2018-08-13 14:46:5752 NativeToJavaInteger(env, encoding.max_framerate),
Åsa Persson23eba222018-10-02 12:47:0653 NativeToJavaInteger(env, encoding.num_temporal_layers),
Mirta Dvornicicd8b98042019-02-04 15:38:4654 NativeToJavaDouble(env, encoding.scale_resolution_down_by),
Magnus Jedvert9060eb12017-12-12 11:52:5455 encoding.ssrc ? NativeToJavaLong(env, *encoding.ssrc) : nullptr);
56}
57
Magnus Jedvert84d8ae52017-12-20 14:12:1058ScopedJavaLocalRef<jobject> NativeToJavaRtpCodecParameter(
59 JNIEnv* env,
60 const RtpCodecParameters& codec) {
Magnus Jedvert9060eb12017-12-12 11:52:5461 return Java_Codec_Constructor(env, codec.payload_type,
62 NativeToJavaString(env, codec.name),
63 NativeToJavaMediaType(env, codec.kind),
64 NativeToJavaInteger(env, codec.clock_rate),
Florent Castellib7d9d832018-05-15 16:14:1465 NativeToJavaInteger(env, codec.num_channels),
66 NativeToJavaStringMap(env, codec.parameters));
Magnus Jedvert9060eb12017-12-12 11:52:5467}
68
Florent Castellidacec712018-05-24 14:24:2169ScopedJavaLocalRef<jobject> NativeToJavaRtpRtcpParameters(
70 JNIEnv* env,
71 const RtcpParameters& rtcp) {
72 return Java_Rtcp_Constructor(env, NativeToJavaString(env, rtcp.cname),
73 rtcp.reduced_size);
74}
75
Florent Castelliabe301f2018-06-12 16:33:4976ScopedJavaLocalRef<jobject> NativeToJavaRtpHeaderExtensionParameter(
77 JNIEnv* env,
78 const RtpExtension& extension) {
79 return Java_HeaderExtension_Constructor(
80 env, NativeToJavaString(env, extension.uri), extension.id,
81 extension.encrypt);
82}
83
Magnus Jedvert9060eb12017-12-12 11:52:5484} // namespace
85
Seth Hampsonc384e142018-03-06 23:47:1086RtpEncodingParameters JavaToNativeRtpEncodingParameters(
87 JNIEnv* jni,
88 const JavaRef<jobject>& j_encoding_parameters) {
89 RtpEncodingParameters encoding;
Amit Hilbuchae4b6232019-03-29 21:02:4290 ScopedJavaLocalRef<jstring> j_rid =
91 Java_Encoding_getRid(jni, j_encoding_parameters);
92 if (!IsNull(jni, j_rid)) {
93 encoding.rid = JavaToNativeString(jni, j_rid);
94 }
Seth Hampsonc384e142018-03-06 23:47:1095 encoding.active = Java_Encoding_getActive(jni, j_encoding_parameters);
Åsa Persson613591a2018-05-29 07:21:3196 ScopedJavaLocalRef<jobject> j_max_bitrate =
Seth Hampsonc384e142018-03-06 23:47:1097 Java_Encoding_getMaxBitrateBps(jni, j_encoding_parameters);
Åsa Persson613591a2018-05-29 07:21:3198 encoding.max_bitrate_bps = JavaToNativeOptionalInt(jni, j_max_bitrate);
99 ScopedJavaLocalRef<jobject> j_min_bitrate =
100 Java_Encoding_getMinBitrateBps(jni, j_encoding_parameters);
101 encoding.min_bitrate_bps = JavaToNativeOptionalInt(jni, j_min_bitrate);
Åsa Persson4e5342f2018-08-13 14:46:57102 ScopedJavaLocalRef<jobject> j_max_framerate =
103 Java_Encoding_getMaxFramerate(jni, j_encoding_parameters);
104 encoding.max_framerate = JavaToNativeOptionalInt(jni, j_max_framerate);
Åsa Persson23eba222018-10-02 12:47:06105 ScopedJavaLocalRef<jobject> j_num_temporal_layers =
106 Java_Encoding_getNumTemporalLayers(jni, j_encoding_parameters);
107 encoding.num_temporal_layers =
108 JavaToNativeOptionalInt(jni, j_num_temporal_layers);
Mirta Dvornicicd8b98042019-02-04 15:38:46109 ScopedJavaLocalRef<jobject> j_scale_resolution_down_by =
110 Java_Encoding_getScaleResolutionDownBy(jni, j_encoding_parameters);
111 encoding.scale_resolution_down_by =
112 JavaToNativeOptionalDouble(jni, j_scale_resolution_down_by);
Seth Hampsonc384e142018-03-06 23:47:10113 ScopedJavaLocalRef<jobject> j_ssrc =
114 Java_Encoding_getSsrc(jni, j_encoding_parameters);
115 if (!IsNull(jni, j_ssrc))
116 encoding.ssrc = JavaToNativeLong(jni, j_ssrc);
117 return encoding;
118}
119
Magnus Jedvert84d8ae52017-12-20 14:12:10120RtpParameters JavaToNativeRtpParameters(JNIEnv* jni,
121 const JavaRef<jobject>& j_parameters) {
Magnus Jedvert9060eb12017-12-12 11:52:54122 RtpParameters parameters;
123
Florent Castellicebf50f2018-05-03 13:31:53124 ScopedJavaLocalRef<jstring> j_transaction_id =
125 Java_RtpParameters_getTransactionId(jni, j_parameters);
126 parameters.transaction_id = JavaToNativeString(jni, j_transaction_id);
127
Florent Castelli266021d2020-01-07 16:43:52128 ScopedJavaLocalRef<jobject> j_degradation_preference =
129 Java_RtpParameters_getDegradationPreference(jni, j_parameters);
130 if (!IsNull(jni, j_degradation_preference)) {
131 parameters.degradation_preference =
132 JavaToNativeDegradationPreference(jni, j_degradation_preference);
133 }
134
Florent Castellidacec712018-05-24 14:24:21135 ScopedJavaLocalRef<jobject> j_rtcp =
136 Java_RtpParameters_getRtcp(jni, j_parameters);
137 ScopedJavaLocalRef<jstring> j_rtcp_cname = Java_Rtcp_getCname(jni, j_rtcp);
138 jboolean j_rtcp_reduced_size = Java_Rtcp_getReducedSize(jni, j_rtcp);
139 parameters.rtcp.cname = JavaToNativeString(jni, j_rtcp_cname);
140 parameters.rtcp.reduced_size = j_rtcp_reduced_size;
141
Florent Castelliabe301f2018-06-12 16:33:49142 ScopedJavaLocalRef<jobject> j_header_extensions =
143 Java_RtpParameters_getHeaderExtensions(jni, j_parameters);
144 for (const JavaRef<jobject>& j_header_extension :
145 Iterable(jni, j_header_extensions)) {
146 RtpExtension header_extension;
147 header_extension.uri = JavaToStdString(
148 jni, Java_HeaderExtension_getUri(jni, j_header_extension));
149 header_extension.id = Java_HeaderExtension_getId(jni, j_header_extension);
150 header_extension.encrypt =
151 Java_HeaderExtension_getEncrypted(jni, j_header_extension);
152 parameters.header_extensions.push_back(header_extension);
153 }
154
Magnus Jedvert9060eb12017-12-12 11:52:54155 // Convert encodings.
Magnus Jedvert84d8ae52017-12-20 14:12:10156 ScopedJavaLocalRef<jobject> j_encodings =
157 Java_RtpParameters_getEncodings(jni, j_parameters);
158 for (const JavaRef<jobject>& j_encoding_parameters :
159 Iterable(jni, j_encodings)) {
Seth Hampsonc384e142018-03-06 23:47:10160 RtpEncodingParameters encoding =
161 JavaToNativeRtpEncodingParameters(jni, j_encoding_parameters);
Magnus Jedvert9060eb12017-12-12 11:52:54162 parameters.encodings.push_back(encoding);
163 }
164
165 // Convert codecs.
Magnus Jedvert84d8ae52017-12-20 14:12:10166 ScopedJavaLocalRef<jobject> j_codecs =
167 Java_RtpParameters_getCodecs(jni, j_parameters);
168 for (const JavaRef<jobject>& j_codec : Iterable(jni, j_codecs)) {
Magnus Jedvert9060eb12017-12-12 11:52:54169 RtpCodecParameters codec;
170 codec.payload_type = Java_Codec_getPayloadType(jni, j_codec);
171 codec.name = JavaToStdString(jni, Java_Codec_getName(jni, j_codec));
172 codec.kind = JavaToNativeMediaType(jni, Java_Codec_getKind(jni, j_codec));
173 codec.clock_rate =
174 JavaToNativeOptionalInt(jni, Java_Codec_getClockRate(jni, j_codec));
175 codec.num_channels =
176 JavaToNativeOptionalInt(jni, Java_Codec_getNumChannels(jni, j_codec));
Florent Castellib7d9d832018-05-15 16:14:14177 auto parameters_map =
178 JavaToNativeStringMap(jni, Java_Codec_getParameters(jni, j_codec));
179 codec.parameters.insert(parameters_map.begin(), parameters_map.end());
Magnus Jedvert9060eb12017-12-12 11:52:54180 parameters.codecs.push_back(codec);
181 }
182 return parameters;
183}
184
Magnus Jedvert84d8ae52017-12-20 14:12:10185ScopedJavaLocalRef<jobject> NativeToJavaRtpParameters(
186 JNIEnv* env,
187 const RtpParameters& parameters) {
Magnus Jedvert9060eb12017-12-12 11:52:54188 return Java_RtpParameters_Constructor(
Florent Castellicebf50f2018-05-03 13:31:53189 env, NativeToJavaString(env, parameters.transaction_id),
Florent Castelli266021d2020-01-07 16:43:52190 Java_DegradationPreference_fromNativeIndex(
191 env, static_cast<int>(parameters.degradation_preference)),
Florent Castellidacec712018-05-24 14:24:21192 NativeToJavaRtpRtcpParameters(env, parameters.rtcp),
Florent Castelliabe301f2018-06-12 16:33:49193 NativeToJavaList(env, parameters.header_extensions,
194 &NativeToJavaRtpHeaderExtensionParameter),
Magnus Jedvert9060eb12017-12-12 11:52:54195 NativeToJavaList(env, parameters.encodings,
196 &NativeToJavaRtpEncodingParameter),
197 NativeToJavaList(env, parameters.codecs, &NativeToJavaRtpCodecParameter));
198}
199
200} // namespace jni
201} // namespace webrtc