1 /*
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
11 #include "sdk/android/src/jni/pc/rtp_parameters.h"
12
13 #include "sdk/android/generated_peerconnection_jni/RtpParameters_jni.h"
14 #include "sdk/android/native_api/jni/java_types.h"
15 #include "sdk/android/src/jni/jni_helpers.h"
16 #include "sdk/android/src/jni/pc/media_stream_track.h"
17
18 namespace webrtc {
19 namespace jni {
20
21 namespace {
22
JavaToNativeDegradationPreference(JNIEnv * jni,const JavaRef<jobject> & j_degradation_preference)23 webrtc::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
NativeToJavaRtpEncodingParameter(JNIEnv * env,const RtpEncodingParameters & encoding)45 ScopedJavaLocalRef<jobject> NativeToJavaRtpEncodingParameter(
46 JNIEnv* env,
47 const RtpEncodingParameters& encoding) {
48 return Java_Encoding_Constructor(
49 env, NativeToJavaString(env, encoding.rid), encoding.active,
50 encoding.bitrate_priority, static_cast<int>(encoding.network_priority),
51 NativeToJavaInteger(env, encoding.max_bitrate_bps),
52 NativeToJavaInteger(env, encoding.min_bitrate_bps),
53 NativeToJavaInteger(env, encoding.max_framerate),
54 NativeToJavaInteger(env, encoding.num_temporal_layers),
55 NativeToJavaDouble(env, encoding.scale_resolution_down_by),
56 encoding.ssrc ? NativeToJavaLong(env, *encoding.ssrc) : nullptr,
57 encoding.adaptive_ptime);
58 }
59
NativeToJavaRtpCodecParameter(JNIEnv * env,const RtpCodecParameters & codec)60 ScopedJavaLocalRef<jobject> NativeToJavaRtpCodecParameter(
61 JNIEnv* env,
62 const RtpCodecParameters& codec) {
63 return Java_Codec_Constructor(env, codec.payload_type,
64 NativeToJavaString(env, codec.name),
65 NativeToJavaMediaType(env, codec.kind),
66 NativeToJavaInteger(env, codec.clock_rate),
67 NativeToJavaInteger(env, codec.num_channels),
68 NativeToJavaStringMap(env, codec.parameters));
69 }
70
NativeToJavaRtpRtcpParameters(JNIEnv * env,const RtcpParameters & rtcp)71 ScopedJavaLocalRef<jobject> NativeToJavaRtpRtcpParameters(
72 JNIEnv* env,
73 const RtcpParameters& rtcp) {
74 return Java_Rtcp_Constructor(env, NativeToJavaString(env, rtcp.cname),
75 rtcp.reduced_size);
76 }
77
NativeToJavaRtpHeaderExtensionParameter(JNIEnv * env,const RtpExtension & extension)78 ScopedJavaLocalRef<jobject> NativeToJavaRtpHeaderExtensionParameter(
79 JNIEnv* env,
80 const RtpExtension& extension) {
81 return Java_HeaderExtension_Constructor(
82 env, NativeToJavaString(env, extension.uri), extension.id,
83 extension.encrypt);
84 }
85
86 } // namespace
87
JavaToNativeRtpEncodingParameters(JNIEnv * jni,const JavaRef<jobject> & j_encoding_parameters)88 RtpEncodingParameters JavaToNativeRtpEncodingParameters(
89 JNIEnv* jni,
90 const JavaRef<jobject>& j_encoding_parameters) {
91 RtpEncodingParameters encoding;
92 ScopedJavaLocalRef<jstring> j_rid =
93 Java_Encoding_getRid(jni, j_encoding_parameters);
94 if (!IsNull(jni, j_rid)) {
95 encoding.rid = JavaToNativeString(jni, j_rid);
96 }
97 encoding.active = Java_Encoding_getActive(jni, j_encoding_parameters);
98 ScopedJavaLocalRef<jobject> j_max_bitrate =
99 Java_Encoding_getMaxBitrateBps(jni, j_encoding_parameters);
100 encoding.bitrate_priority =
101 Java_Encoding_getBitratePriority(jni, j_encoding_parameters);
102 encoding.network_priority = static_cast<webrtc::Priority>(
103 Java_Encoding_getNetworkPriority(jni, j_encoding_parameters));
104 encoding.max_bitrate_bps = JavaToNativeOptionalInt(jni, j_max_bitrate);
105 ScopedJavaLocalRef<jobject> j_min_bitrate =
106 Java_Encoding_getMinBitrateBps(jni, j_encoding_parameters);
107 encoding.min_bitrate_bps = JavaToNativeOptionalInt(jni, j_min_bitrate);
108 ScopedJavaLocalRef<jobject> j_max_framerate =
109 Java_Encoding_getMaxFramerate(jni, j_encoding_parameters);
110 encoding.max_framerate = JavaToNativeOptionalInt(jni, j_max_framerate);
111 ScopedJavaLocalRef<jobject> j_num_temporal_layers =
112 Java_Encoding_getNumTemporalLayers(jni, j_encoding_parameters);
113 encoding.num_temporal_layers =
114 JavaToNativeOptionalInt(jni, j_num_temporal_layers);
115 ScopedJavaLocalRef<jobject> j_scale_resolution_down_by =
116 Java_Encoding_getScaleResolutionDownBy(jni, j_encoding_parameters);
117 encoding.scale_resolution_down_by =
118 JavaToNativeOptionalDouble(jni, j_scale_resolution_down_by);
119 encoding.adaptive_ptime =
120 Java_Encoding_getAdaptivePTime(jni, j_encoding_parameters);
121 ScopedJavaLocalRef<jobject> j_ssrc =
122 Java_Encoding_getSsrc(jni, j_encoding_parameters);
123 if (!IsNull(jni, j_ssrc))
124 encoding.ssrc = JavaToNativeLong(jni, j_ssrc);
125 return encoding;
126 }
127
JavaToNativeRtpParameters(JNIEnv * jni,const JavaRef<jobject> & j_parameters)128 RtpParameters JavaToNativeRtpParameters(JNIEnv* jni,
129 const JavaRef<jobject>& j_parameters) {
130 RtpParameters parameters;
131
132 ScopedJavaLocalRef<jstring> j_transaction_id =
133 Java_RtpParameters_getTransactionId(jni, j_parameters);
134 parameters.transaction_id = JavaToNativeString(jni, j_transaction_id);
135
136 ScopedJavaLocalRef<jobject> j_degradation_preference =
137 Java_RtpParameters_getDegradationPreference(jni, j_parameters);
138 if (!IsNull(jni, j_degradation_preference)) {
139 parameters.degradation_preference =
140 JavaToNativeDegradationPreference(jni, j_degradation_preference);
141 }
142
143 ScopedJavaLocalRef<jobject> j_rtcp =
144 Java_RtpParameters_getRtcp(jni, j_parameters);
145 ScopedJavaLocalRef<jstring> j_rtcp_cname = Java_Rtcp_getCname(jni, j_rtcp);
146 jboolean j_rtcp_reduced_size = Java_Rtcp_getReducedSize(jni, j_rtcp);
147 parameters.rtcp.cname = JavaToNativeString(jni, j_rtcp_cname);
148 parameters.rtcp.reduced_size = j_rtcp_reduced_size;
149
150 ScopedJavaLocalRef<jobject> j_header_extensions =
151 Java_RtpParameters_getHeaderExtensions(jni, j_parameters);
152 for (const JavaRef<jobject>& j_header_extension :
153 Iterable(jni, j_header_extensions)) {
154 RtpExtension header_extension;
155 header_extension.uri = JavaToStdString(
156 jni, Java_HeaderExtension_getUri(jni, j_header_extension));
157 header_extension.id = Java_HeaderExtension_getId(jni, j_header_extension);
158 header_extension.encrypt =
159 Java_HeaderExtension_getEncrypted(jni, j_header_extension);
160 parameters.header_extensions.push_back(header_extension);
161 }
162
163 // Convert encodings.
164 ScopedJavaLocalRef<jobject> j_encodings =
165 Java_RtpParameters_getEncodings(jni, j_parameters);
166 for (const JavaRef<jobject>& j_encoding_parameters :
167 Iterable(jni, j_encodings)) {
168 RtpEncodingParameters encoding =
169 JavaToNativeRtpEncodingParameters(jni, j_encoding_parameters);
170 parameters.encodings.push_back(encoding);
171 }
172
173 // Convert codecs.
174 ScopedJavaLocalRef<jobject> j_codecs =
175 Java_RtpParameters_getCodecs(jni, j_parameters);
176 for (const JavaRef<jobject>& j_codec : Iterable(jni, j_codecs)) {
177 RtpCodecParameters codec;
178 codec.payload_type = Java_Codec_getPayloadType(jni, j_codec);
179 codec.name = JavaToStdString(jni, Java_Codec_getName(jni, j_codec));
180 codec.kind = JavaToNativeMediaType(jni, Java_Codec_getKind(jni, j_codec));
181 codec.clock_rate =
182 JavaToNativeOptionalInt(jni, Java_Codec_getClockRate(jni, j_codec));
183 codec.num_channels =
184 JavaToNativeOptionalInt(jni, Java_Codec_getNumChannels(jni, j_codec));
185 auto parameters_map =
186 JavaToNativeStringMap(jni, Java_Codec_getParameters(jni, j_codec));
187 codec.parameters.insert(parameters_map.begin(), parameters_map.end());
188 parameters.codecs.push_back(codec);
189 }
190 return parameters;
191 }
192
NativeToJavaRtpParameters(JNIEnv * env,const RtpParameters & parameters)193 ScopedJavaLocalRef<jobject> NativeToJavaRtpParameters(
194 JNIEnv* env,
195 const RtpParameters& parameters) {
196 return Java_RtpParameters_Constructor(
197 env, NativeToJavaString(env, parameters.transaction_id),
198 parameters.degradation_preference.has_value()
199 ? Java_DegradationPreference_fromNativeIndex(
200 env, static_cast<int>(*parameters.degradation_preference))
201 : nullptr,
202 NativeToJavaRtpRtcpParameters(env, parameters.rtcp),
203 NativeToJavaList(env, parameters.header_extensions,
204 &NativeToJavaRtpHeaderExtensionParameter),
205 NativeToJavaList(env, parameters.encodings,
206 &NativeToJavaRtpEncodingParameter),
207 NativeToJavaList(env, parameters.codecs, &NativeToJavaRtpCodecParameter));
208 }
209
210 } // namespace jni
211 } // namespace webrtc
212