Index: webrtc/sdk/android/src/jni/peerconnection_jni.cc |
diff --git a/webrtc/sdk/android/src/jni/peerconnection_jni.cc b/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
index 6a6ba25c9635995042f4e122bf04ef4b79487d89..d3f23445d615e708049db976c0e6c8b9b50f3790 100644 |
--- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
+++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
@@ -158,6 +158,47 @@ static DataChannelInit JavaDataChannelInitToNative( |
return init; |
} |
+static cricket::MediaType JavaMediaTypeToJsepMediaType(JNIEnv* jni, |
+ jobject j_media_type) { |
+ jclass j_media_type_class = |
+ FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); |
+ jmethodID j_name_id = |
+ GetMethodID(jni, j_media_type_class, "name", "()Ljava/lang/String;"); |
+ jstring j_type_string = |
+ (jstring)jni->CallObjectMethod(j_media_type, j_name_id); |
+ CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; |
+ std::string type_string = JavaToStdString(jni, j_type_string); |
+ |
+ RTC_DCHECK(type_string == "MEDIA_TYPE_AUDIO" || |
+ type_string == "MEDIA_TYPE_VIDEO") |
+ << "Media type: " << type_string; |
+ return type_string == "MEDIA_TYPE_AUDIO" ? cricket::MEDIA_TYPE_AUDIO |
+ : cricket::MEDIA_TYPE_VIDEO; |
+} |
+ |
+static jobject JsepMediaTypeToJavaMediaType(JNIEnv* jni, |
+ cricket::MediaType media_type) { |
+ jclass j_media_type_class = |
+ FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); |
+ |
+ const char* media_type_str = nullptr; |
+ switch (media_type) { |
+ case cricket::MEDIA_TYPE_AUDIO: |
+ media_type_str = "MEDIA_TYPE_AUDIO"; |
+ break; |
+ case cricket::MEDIA_TYPE_VIDEO: |
+ media_type_str = "MEDIA_TYPE_VIDEO"; |
+ break; |
+ case cricket::MEDIA_TYPE_DATA: |
+ RTC_NOTREACHED(); |
+ break; |
+ } |
+ jfieldID j_media_type_fid = |
+ GetStaticFieldID(jni, j_media_type_class, media_type_str, |
+ "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
+ return GetStaticObjectField(jni, j_media_type_class, j_media_type_fid); |
+} |
+ |
class ConstraintsWrapper; |
// Adapter between the C++ PeerConnectionObserver interface and the Java |
@@ -917,20 +958,7 @@ class RtpReceiverObserver : public RtpReceiverObserverInterface { |
jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived", |
"(Lorg/webrtc/MediaStreamTrack$MediaType;)V"); |
// Get the Java version of media type. |
- jclass j_media_type_class = |
- FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); |
- |
- RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO || |
- media_type == cricket::MEDIA_TYPE_VIDEO) |
- << "Media type: " << media_type; |
- const char* media_type_str = media_type == cricket::MEDIA_TYPE_AUDIO |
- ? "MEDIA_TYPE_AUDIO" |
- : "MEDIA_TYPE_VIDEO"; |
- jfieldID j_media_type_fid = |
- GetStaticFieldID(jni, j_media_type_class, media_type_str, |
- "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
- jobject JavaMediaType = |
- GetStaticObjectField(jni, j_media_type_class, j_media_type_fid); |
+ jobject JavaMediaType = JsepMediaTypeToJavaMediaType(jni, media_type); |
// Trigger the callback function. |
jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid, |
JavaMediaType); |
@@ -2400,7 +2428,6 @@ static void JavaRtpParametersToJsepRtpParameters( |
// Convert encodings. |
jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); |
- const int kBitrateUnlimited = -1; |
jclass j_encoding_parameters_class = |
jni->FindClass("org/webrtc/RtpParameters$Encoding"); |
jfieldID active_id = |
@@ -2422,9 +2449,7 @@ static void JavaRtpParametersToJsepRtpParameters( |
if (!IsNull(jni, j_bitrate)) { |
int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id); |
CHECK_EXCEPTION(jni) << "error during CallIntMethod"; |
- encoding.max_bitrate_bps = bitrate_value; |
- } else { |
- encoding.max_bitrate_bps = kBitrateUnlimited; |
+ encoding.max_bitrate_bps = rtc::Optional<int>(bitrate_value); |
} |
jobject j_ssrc = |
GetNullableObjectField(jni, j_encoding_parameters, ssrc_id); |
@@ -2440,18 +2465,33 @@ static void JavaRtpParametersToJsepRtpParameters( |
jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); |
jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); |
jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); |
- jfieldID mime_type_id = |
- GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;"); |
- jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I"); |
- jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I"); |
+ jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); |
+ jfieldID kind_id = GetFieldID(jni, codec_class, "kind", |
+ "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
+ jfieldID clock_rate_id = |
+ GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); |
+ jfieldID num_channels_id = |
+ GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); |
for (jobject j_codec : Iterable(jni, j_codecs)) { |
webrtc::RtpCodecParameters codec; |
codec.payload_type = GetIntField(jni, j_codec, payload_type_id); |
- codec.mime_type = |
- JavaToStdString(jni, GetStringField(jni, j_codec, mime_type_id)); |
- codec.clock_rate = GetIntField(jni, j_codec, clock_rate_id); |
- codec.channels = GetIntField(jni, j_codec, channels_id); |
+ codec.name = JavaToStdString(jni, GetStringField(jni, j_codec, name_id)); |
+ codec.kind = JavaMediaTypeToJsepMediaType( |
+ jni, GetObjectField(jni, j_codec, kind_id)); |
+ jobject j_clock_rate = GetNullableObjectField(jni, j_codec, clock_rate_id); |
+ if (!IsNull(jni, j_clock_rate)) { |
+ int clock_rate_value = jni->CallIntMethod(j_clock_rate, int_value_id); |
+ CHECK_EXCEPTION(jni) << "error during CallIntMethod"; |
+ codec.clock_rate = rtc::Optional<int>(clock_rate_value); |
+ } |
+ jobject j_num_channels = |
+ GetNullableObjectField(jni, j_codec, num_channels_id); |
+ if (!IsNull(jni, j_num_channels)) { |
+ int num_channels_value = jni->CallIntMethod(j_num_channels, int_value_id); |
+ CHECK_EXCEPTION(jni) << "error during CallIntMethod"; |
+ codec.num_channels = rtc::Optional<int>(num_channels_value); |
+ } |
parameters->codecs.push_back(codec); |
} |
} |
@@ -2473,8 +2513,7 @@ static jobject JsepRtpParametersToJavaRtpParameters( |
jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); |
jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings), |
"add", "(Ljava/lang/Object;)Z"); |
- jfieldID active_id = |
- GetFieldID(jni, encoding_class, "active", "Z"); |
+ jfieldID active_id = GetFieldID(jni, encoding_class, "active", "Z"); |
jfieldID bitrate_id = |
GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;"); |
jfieldID ssrc_id = |
@@ -2491,9 +2530,9 @@ static jobject JsepRtpParametersToJavaRtpParameters( |
CHECK_EXCEPTION(jni) << "error during NewObject"; |
jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active); |
CHECK_EXCEPTION(jni) << "error during SetBooleanField"; |
- if (encoding.max_bitrate_bps > 0) { |
- jobject j_bitrate_value = |
- jni->NewObject(integer_class, integer_ctor, encoding.max_bitrate_bps); |
+ if (encoding.max_bitrate_bps) { |
+ jobject j_bitrate_value = jni->NewObject(integer_class, integer_ctor, |
+ *(encoding.max_bitrate_bps)); |
CHECK_EXCEPTION(jni) << "error during NewObject"; |
jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value); |
CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
@@ -2517,26 +2556,42 @@ static jobject JsepRtpParametersToJavaRtpParameters( |
jfieldID codecs_id = |
GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); |
jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); |
- jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), |
- "add", "(Ljava/lang/Object;)Z"); |
+ jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), "add", |
+ "(Ljava/lang/Object;)Z"); |
jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); |
- jfieldID mime_type_id = |
- GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;"); |
- jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I"); |
- jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I"); |
+ jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); |
+ jfieldID kind_id = GetFieldID(jni, codec_class, "kind", |
+ "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
+ jfieldID clock_rate_id = |
+ GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); |
+ jfieldID num_channels_id = |
+ GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); |
for (const webrtc::RtpCodecParameters& codec : parameters.codecs) { |
jobject j_codec = jni->NewObject(codec_class, codec_ctor); |
CHECK_EXCEPTION(jni) << "error during NewObject"; |
jni->SetIntField(j_codec, payload_type_id, codec.payload_type); |
CHECK_EXCEPTION(jni) << "error during SetIntField"; |
- jni->SetObjectField(j_codec, mime_type_id, |
- JavaStringFromStdString(jni, codec.mime_type)); |
+ jni->SetObjectField(j_codec, name_id, |
+ JavaStringFromStdString(jni, codec.name)); |
CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
- jni->SetIntField(j_codec, clock_rate_id, codec.clock_rate); |
- CHECK_EXCEPTION(jni) << "error during SetIntField"; |
- jni->SetIntField(j_codec, channels_id, codec.channels); |
- CHECK_EXCEPTION(jni) << "error during SetIntField"; |
+ jni->SetObjectField(j_codec, kind_id, |
+ JsepMediaTypeToJavaMediaType(jni, codec.kind)); |
+ CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
+ if (codec.clock_rate) { |
+ jobject j_clock_rate_value = |
+ jni->NewObject(integer_class, integer_ctor, *(codec.clock_rate)); |
+ CHECK_EXCEPTION(jni) << "error during NewObject"; |
+ jni->SetObjectField(j_codec, clock_rate_id, j_clock_rate_value); |
+ CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
+ } |
+ if (codec.num_channels) { |
+ jobject j_num_channels_value = |
+ jni->NewObject(integer_class, integer_ctor, *(codec.num_channels)); |
+ CHECK_EXCEPTION(jni) << "error during NewObject"; |
+ jni->SetObjectField(j_codec, num_channels_id, j_num_channels_value); |
+ CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
+ } |
jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec); |
CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; |
RTC_CHECK(added); |