Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 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 | |
Steve Anton | 10542f2 | 2019-01-11 17:11:00 | [diff] [blame] | 11 | #include "sdk/android/src/jni/pc/rtp_parameters.h" |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 12 | |
Eric Stevenson | 0d65fb5 | 2019-06-24 17:09:50 | [diff] [blame] | 13 | #include "sdk/android/generated_peerconnection_jni/RtpParameters_jni.h" |
Sami Kalliomäki | 82f96e6 | 2018-01-29 12:18:57 | [diff] [blame] | 14 | #include "sdk/android/native_api/jni/java_types.h" |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 15 | #include "sdk/android/src/jni/jni_helpers.h" |
Steve Anton | 10542f2 | 2019-01-11 17:11:00 | [diff] [blame] | 16 | #include "sdk/android/src/jni/pc/media_stream_track.h" |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 17 | |
| 18 | namespace webrtc { |
| 19 | namespace jni { |
| 20 | |
| 21 | namespace { |
| 22 | |
Florent Castelli | 266021d | 2020-01-07 16:43:52 | [diff] [blame^] | 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 | |
Magnus Jedvert | 84d8ae5 | 2017-12-20 14:12:10 | [diff] [blame] | 45 | ScopedJavaLocalRef<jobject> NativeToJavaRtpEncodingParameter( |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 46 | JNIEnv* env, |
| 47 | const RtpEncodingParameters& encoding) { |
| 48 | return Java_Encoding_Constructor( |
Amit Hilbuch | ae4b623 | 2019-03-29 21:02:42 | [diff] [blame] | 49 | env, NativeToJavaString(env, encoding.rid), encoding.active, |
| 50 | NativeToJavaInteger(env, encoding.max_bitrate_bps), |
Åsa Persson | 613591a | 2018-05-29 07:21:31 | [diff] [blame] | 51 | NativeToJavaInteger(env, encoding.min_bitrate_bps), |
Åsa Persson | 4e5342f | 2018-08-13 14:46:57 | [diff] [blame] | 52 | NativeToJavaInteger(env, encoding.max_framerate), |
Åsa Persson | 23eba22 | 2018-10-02 12:47:06 | [diff] [blame] | 53 | NativeToJavaInteger(env, encoding.num_temporal_layers), |
Mirta Dvornicic | d8b9804 | 2019-02-04 15:38:46 | [diff] [blame] | 54 | NativeToJavaDouble(env, encoding.scale_resolution_down_by), |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 55 | encoding.ssrc ? NativeToJavaLong(env, *encoding.ssrc) : nullptr); |
| 56 | } |
| 57 | |
Magnus Jedvert | 84d8ae5 | 2017-12-20 14:12:10 | [diff] [blame] | 58 | ScopedJavaLocalRef<jobject> NativeToJavaRtpCodecParameter( |
| 59 | JNIEnv* env, |
| 60 | const RtpCodecParameters& codec) { |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 61 | 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 Castelli | b7d9d83 | 2018-05-15 16:14:14 | [diff] [blame] | 65 | NativeToJavaInteger(env, codec.num_channels), |
| 66 | NativeToJavaStringMap(env, codec.parameters)); |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 67 | } |
| 68 | |
Florent Castelli | dacec71 | 2018-05-24 14:24:21 | [diff] [blame] | 69 | ScopedJavaLocalRef<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 Castelli | abe301f | 2018-06-12 16:33:49 | [diff] [blame] | 76 | ScopedJavaLocalRef<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 Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 84 | } // namespace |
| 85 | |
Seth Hampson | c384e14 | 2018-03-06 23:47:10 | [diff] [blame] | 86 | RtpEncodingParameters JavaToNativeRtpEncodingParameters( |
| 87 | JNIEnv* jni, |
| 88 | const JavaRef<jobject>& j_encoding_parameters) { |
| 89 | RtpEncodingParameters encoding; |
Amit Hilbuch | ae4b623 | 2019-03-29 21:02:42 | [diff] [blame] | 90 | 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 Hampson | c384e14 | 2018-03-06 23:47:10 | [diff] [blame] | 95 | encoding.active = Java_Encoding_getActive(jni, j_encoding_parameters); |
Åsa Persson | 613591a | 2018-05-29 07:21:31 | [diff] [blame] | 96 | ScopedJavaLocalRef<jobject> j_max_bitrate = |
Seth Hampson | c384e14 | 2018-03-06 23:47:10 | [diff] [blame] | 97 | Java_Encoding_getMaxBitrateBps(jni, j_encoding_parameters); |
Åsa Persson | 613591a | 2018-05-29 07:21:31 | [diff] [blame] | 98 | 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 Persson | 4e5342f | 2018-08-13 14:46:57 | [diff] [blame] | 102 | ScopedJavaLocalRef<jobject> j_max_framerate = |
| 103 | Java_Encoding_getMaxFramerate(jni, j_encoding_parameters); |
| 104 | encoding.max_framerate = JavaToNativeOptionalInt(jni, j_max_framerate); |
Åsa Persson | 23eba22 | 2018-10-02 12:47:06 | [diff] [blame] | 105 | 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 Dvornicic | d8b9804 | 2019-02-04 15:38:46 | [diff] [blame] | 109 | 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 Hampson | c384e14 | 2018-03-06 23:47:10 | [diff] [blame] | 113 | 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 Jedvert | 84d8ae5 | 2017-12-20 14:12:10 | [diff] [blame] | 120 | RtpParameters JavaToNativeRtpParameters(JNIEnv* jni, |
| 121 | const JavaRef<jobject>& j_parameters) { |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 122 | RtpParameters parameters; |
| 123 | |
Florent Castelli | cebf50f | 2018-05-03 13:31:53 | [diff] [blame] | 124 | ScopedJavaLocalRef<jstring> j_transaction_id = |
| 125 | Java_RtpParameters_getTransactionId(jni, j_parameters); |
| 126 | parameters.transaction_id = JavaToNativeString(jni, j_transaction_id); |
| 127 | |
Florent Castelli | 266021d | 2020-01-07 16:43:52 | [diff] [blame^] | 128 | 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 Castelli | dacec71 | 2018-05-24 14:24:21 | [diff] [blame] | 135 | 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 Castelli | abe301f | 2018-06-12 16:33:49 | [diff] [blame] | 142 | 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 Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 155 | // Convert encodings. |
Magnus Jedvert | 84d8ae5 | 2017-12-20 14:12:10 | [diff] [blame] | 156 | 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 Hampson | c384e14 | 2018-03-06 23:47:10 | [diff] [blame] | 160 | RtpEncodingParameters encoding = |
| 161 | JavaToNativeRtpEncodingParameters(jni, j_encoding_parameters); |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 162 | parameters.encodings.push_back(encoding); |
| 163 | } |
| 164 | |
| 165 | // Convert codecs. |
Magnus Jedvert | 84d8ae5 | 2017-12-20 14:12:10 | [diff] [blame] | 166 | ScopedJavaLocalRef<jobject> j_codecs = |
| 167 | Java_RtpParameters_getCodecs(jni, j_parameters); |
| 168 | for (const JavaRef<jobject>& j_codec : Iterable(jni, j_codecs)) { |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 169 | 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 Castelli | b7d9d83 | 2018-05-15 16:14:14 | [diff] [blame] | 177 | auto parameters_map = |
| 178 | JavaToNativeStringMap(jni, Java_Codec_getParameters(jni, j_codec)); |
| 179 | codec.parameters.insert(parameters_map.begin(), parameters_map.end()); |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 180 | parameters.codecs.push_back(codec); |
| 181 | } |
| 182 | return parameters; |
| 183 | } |
| 184 | |
Magnus Jedvert | 84d8ae5 | 2017-12-20 14:12:10 | [diff] [blame] | 185 | ScopedJavaLocalRef<jobject> NativeToJavaRtpParameters( |
| 186 | JNIEnv* env, |
| 187 | const RtpParameters& parameters) { |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 188 | return Java_RtpParameters_Constructor( |
Florent Castelli | cebf50f | 2018-05-03 13:31:53 | [diff] [blame] | 189 | env, NativeToJavaString(env, parameters.transaction_id), |
Florent Castelli | 266021d | 2020-01-07 16:43:52 | [diff] [blame^] | 190 | Java_DegradationPreference_fromNativeIndex( |
| 191 | env, static_cast<int>(parameters.degradation_preference)), |
Florent Castelli | dacec71 | 2018-05-24 14:24:21 | [diff] [blame] | 192 | NativeToJavaRtpRtcpParameters(env, parameters.rtcp), |
Florent Castelli | abe301f | 2018-06-12 16:33:49 | [diff] [blame] | 193 | NativeToJavaList(env, parameters.header_extensions, |
| 194 | &NativeToJavaRtpHeaderExtensionParameter), |
Magnus Jedvert | 9060eb1 | 2017-12-12 11:52:54 | [diff] [blame] | 195 | NativeToJavaList(env, parameters.encodings, |
| 196 | &NativeToJavaRtpEncodingParameter), |
| 197 | NativeToJavaList(env, parameters.codecs, &NativeToJavaRtpCodecParameter)); |
| 198 | } |
| 199 | |
| 200 | } // namespace jni |
| 201 | } // namespace webrtc |