|
| 1 | +/* |
| 2 | + * Copyright 2023 LiveKit |
| 3 | + * |
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | + * you may not use this file except in compliance with the License. |
| 6 | + * You may obtain a copy of the License at |
| 7 | + * |
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | + * |
| 10 | + * Unless required by applicable law or agreed to in writing, software |
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | + * See the License for the specific language governing permissions and |
| 14 | + * limitations under the License. |
| 15 | + */ |
| 16 | + |
| 17 | +#include "sdk/android/src/jni/pc/rtp_capabilities.h" |
| 18 | + |
| 19 | +#include "sdk/android/generated_peerconnection_jni/RtpCapabilities_jni.h" |
| 20 | +#include "sdk/android/native_api/jni/java_types.h" |
| 21 | +#include "sdk/android/src/jni/jni_helpers.h" |
| 22 | +#include "sdk/android/src/jni/pc/media_stream_track.h" |
| 23 | + |
| 24 | +namespace webrtc { |
| 25 | +namespace jni { |
| 26 | + |
| 27 | +namespace { |
| 28 | + |
| 29 | +ScopedJavaLocalRef<jobject> NativeToJavaRtpCodecParameter( |
| 30 | + JNIEnv* env, |
| 31 | + const RtpCodecCapability& codec) { |
| 32 | + return Java_CodecCapability_Constructor(env, codec.preferred_payload_type.value(), |
| 33 | + NativeToJavaString(env, codec.name), |
| 34 | + NativeToJavaMediaType(env, codec.kind), |
| 35 | + NativeToJavaInteger(env, codec.clock_rate), |
| 36 | + NativeToJavaInteger(env, codec.num_channels), |
| 37 | + NativeToJavaString(env, codec.mime_type()), |
| 38 | + NativeToJavaStringMap(env, codec.parameters)); |
| 39 | +} |
| 40 | + |
| 41 | +ScopedJavaLocalRef<jobject> NativeToJavaRtpHeaderExtensionParameter( |
| 42 | + JNIEnv* env, |
| 43 | + const RtpHeaderExtensionCapability& extension) { |
| 44 | + return Java_HeaderExtensionCapability_Constructor( |
| 45 | + env, NativeToJavaString(env, extension.uri), extension.preferred_id.value(), |
| 46 | + extension.preferred_encrypt); |
| 47 | +} |
| 48 | +} // namespace |
| 49 | + |
| 50 | +RtpCapabilities JavaToNativeRtpCapabilities(JNIEnv* jni, |
| 51 | + const JavaRef<jobject>& j_capabilities) { |
| 52 | + RtpCapabilities capabilities; |
| 53 | + |
| 54 | + ScopedJavaLocalRef<jobject> j_header_extensions = |
| 55 | + Java_RtpCapabilities_getHeaderExtensions(jni, j_capabilities); |
| 56 | + for (const JavaRef<jobject>& j_header_extension : |
| 57 | + Iterable(jni, j_header_extensions)) { |
| 58 | + RtpHeaderExtensionCapability header_extension; |
| 59 | + header_extension.uri = JavaToStdString( |
| 60 | + jni, Java_HeaderExtensionCapability_getUri(jni, j_header_extension)); |
| 61 | + header_extension.preferred_id = Java_HeaderExtensionCapability_getPreferredId(jni, j_header_extension); |
| 62 | + header_extension.preferred_encrypt = |
| 63 | + Java_HeaderExtensionCapability_getPreferredEncrypted(jni, j_header_extension); |
| 64 | + capabilities.header_extensions.push_back(header_extension); |
| 65 | + } |
| 66 | + |
| 67 | + // Convert codecs. |
| 68 | + ScopedJavaLocalRef<jobject> j_codecs = |
| 69 | + Java_RtpCapabilities_getCodecs(jni, j_capabilities); |
| 70 | + for (const JavaRef<jobject>& j_codec : Iterable(jni, j_codecs)) { |
| 71 | + RtpCodecCapability codec; |
| 72 | + codec.preferred_payload_type = Java_CodecCapability_getPreferredPayloadType(jni, j_codec); |
| 73 | + codec.name = JavaToStdString(jni, Java_CodecCapability_getName(jni, j_codec)); |
| 74 | + codec.kind = JavaToNativeMediaType(jni, Java_CodecCapability_getKind(jni, j_codec)); |
| 75 | + codec.clock_rate = |
| 76 | + JavaToNativeOptionalInt(jni, Java_CodecCapability_getClockRate(jni, j_codec)); |
| 77 | + codec.num_channels = |
| 78 | + JavaToNativeOptionalInt(jni, Java_CodecCapability_getNumChannels(jni, j_codec)); |
| 79 | + auto parameters_map = |
| 80 | + JavaToNativeStringMap(jni, Java_CodecCapability_getParameters(jni, j_codec)); |
| 81 | + codec.parameters.insert(parameters_map.begin(), parameters_map.end()); |
| 82 | + capabilities.codecs.push_back(codec); |
| 83 | + } |
| 84 | + return capabilities; |
| 85 | +} |
| 86 | + |
| 87 | +ScopedJavaLocalRef<jobject> NativeToJavaRtpCapabilities( |
| 88 | + JNIEnv* env, |
| 89 | + const RtpCapabilities& capabilities) { |
| 90 | + return Java_RtpCapabilities_Constructor( |
| 91 | + env, NativeToJavaList(env, capabilities.codecs, &NativeToJavaRtpCodecParameter), |
| 92 | + NativeToJavaList(env, capabilities.header_extensions, |
| 93 | + &NativeToJavaRtpHeaderExtensionParameter) |
| 94 | + ); |
| 95 | +} |
| 96 | + |
| 97 | +RtpCodecCapability JavaToNativeRtpCodecCapability(JNIEnv* jni, |
| 98 | + const JavaRef<jobject>& j_codec) { |
| 99 | + RtpCodecCapability codec; |
| 100 | + codec.preferred_payload_type = Java_CodecCapability_getPreferredPayloadType(jni, j_codec); |
| 101 | + codec.name = JavaToStdString(jni, Java_CodecCapability_getName(jni, j_codec)); |
| 102 | + codec.kind = JavaToNativeMediaType(jni, Java_CodecCapability_getKind(jni, j_codec)); |
| 103 | + codec.clock_rate = |
| 104 | + JavaToNativeOptionalInt(jni, Java_CodecCapability_getClockRate(jni, j_codec)); |
| 105 | + codec.num_channels = |
| 106 | + JavaToNativeOptionalInt(jni, Java_CodecCapability_getNumChannels(jni, j_codec)); |
| 107 | + auto parameters_map = |
| 108 | + JavaToNativeStringMap(jni, Java_CodecCapability_getParameters(jni, j_codec)); |
| 109 | + codec.parameters.insert(parameters_map.begin(), parameters_map.end()); |
| 110 | + return codec; |
| 111 | +} |
| 112 | + |
| 113 | +} // namespace jni |
| 114 | +} // namespace webrtc |
0 commit comments