xref: /aosp_15_r20/external/webrtc/sdk/android/src/jni/pc/rtp_parameters.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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