From 4de9ea5fb19388c25150b49369af95a537f47cf6 Mon Sep 17 00:00:00 2001 From: SnirDecartAI <187955124+SnirDecartAI@users.noreply.github.com> Date: Mon, 4 Aug 2025 23:59:48 +0300 Subject: [PATCH] fix: made RTCRtpCodecCapability's int fields optional --- .../cpp/src/api/RTCRtpCodecCapability.cpp | 32 ++++++++++++++----- .../onvoid/webrtc/RTCRtpCodecCapability.java | 6 ++-- .../onvoid/webrtc/RTCRtpTransceiverTests.java | 2 +- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/webrtc-jni/src/main/cpp/src/api/RTCRtpCodecCapability.cpp b/webrtc-jni/src/main/cpp/src/api/RTCRtpCodecCapability.cpp index 1d05c4a1..b9b386e6 100644 --- a/webrtc-jni/src/main/cpp/src/api/RTCRtpCodecCapability.cpp +++ b/webrtc-jni/src/main/cpp/src/api/RTCRtpCodecCapability.cpp @@ -18,6 +18,7 @@ #include "JavaEnums.h" #include "JavaHashMap.h" #include "JavaObject.h" +#include "JavaPrimitive.h" #include "JavaString.h" #include "JavaUtils.h" #include "JNI_WebRTC.h" @@ -30,8 +31,8 @@ namespace jni { JavaLocalRef mediaType = JavaEnums::toJava(env, capability.kind); JavaLocalRef codecName = JavaString::toJava(env, capability.name); - jint clockRate = static_cast(capability.clock_rate.value_or(0)); - jint channels = static_cast(capability.num_channels.value_or(0)); + JavaLocalRef clockRate = nullptr; + JavaLocalRef channels = nullptr; JavaHashMap paramMap(env); @@ -42,12 +43,19 @@ namespace jni paramMap.put(key, value); } + if (capability.clock_rate.has_value()) { + clockRate = Integer::create(env, capability.clock_rate.value()); + } + if (capability.num_channels.has_value()) { + channels = Integer::create(env, capability.num_channels.value()); + } + const auto javaClass = JavaClasses::get(env); JavaLocalRef fmtMap = paramMap; jobject object = env->NewObject(javaClass->cls, javaClass->ctor, - mediaType.get(), codecName.get(), clockRate, channels, fmtMap.get()); + mediaType.get(), codecName.get(), clockRate.get(), channels.get(), fmtMap.get()); ExceptionCheck(env); @@ -64,8 +72,6 @@ namespace jni codecCapability.kind = JavaEnums::toNative(env, obj.getObject(javaClass->mediaType)); codecCapability.name = JavaString::toNative(env, obj.getString(javaClass->name)); - codecCapability.clock_rate = obj.getInt(javaClass->clockRate); - codecCapability.num_channels = obj.getInt(javaClass->channels); for (const auto & entry : JavaHashMap(env, obj.getObject(javaClass->sdpFmtp))) { std::string key = JavaString::toNative(env, static_java_ref_cast(env, entry.first)); @@ -74,6 +80,16 @@ namespace jni codecCapability.parameters.emplace(key, value); } + auto clockRate = obj.getObject(javaClass->clockRate); + auto channels = obj.getObject(javaClass->channels); + + if (clockRate.get()) { + codecCapability.clock_rate = Integer::getValue(env, clockRate); + } + if (channels.get()) { + codecCapability.num_channels = Integer::getValue(env, channels); + } + return codecCapability; } @@ -81,12 +97,12 @@ namespace jni { cls = FindClass(env, PKG"RTCRtpCodecCapability"); - ctor = GetMethod(env, cls, "", "(L" PKG_MEDIA "MediaType;" STRING_SIG "II" MAP_SIG ")V"); + ctor = GetMethod(env, cls, "", "(L" PKG_MEDIA "MediaType;" STRING_SIG INTEGER_SIG INTEGER_SIG MAP_SIG ")V"); mediaType = GetFieldID(env, cls, "mediaType", "L" PKG_MEDIA "MediaType;"); name = GetFieldID(env, cls, "name", STRING_SIG); - clockRate = GetFieldID(env, cls, "clockRate", "I"); - channels = GetFieldID(env, cls, "channels", "I"); + clockRate = GetFieldID(env, cls, "clockRate", INTEGER_SIG); + channels = GetFieldID(env, cls, "channels", INTEGER_SIG); sdpFmtp = GetFieldID(env, cls, "sdpFmtp", MAP_SIG); } } diff --git a/webrtc/src/main/java/dev/onvoid/webrtc/RTCRtpCodecCapability.java b/webrtc/src/main/java/dev/onvoid/webrtc/RTCRtpCodecCapability.java index 5b129142..545df5b9 100644 --- a/webrtc/src/main/java/dev/onvoid/webrtc/RTCRtpCodecCapability.java +++ b/webrtc/src/main/java/dev/onvoid/webrtc/RTCRtpCodecCapability.java @@ -41,14 +41,14 @@ public class RTCRtpCodecCapability { /** * The codec clock rate expressed in Hertz. */ - private final int clockRate; + private final Integer clockRate; /** * When present, indicates the number of audio channels (mono=1, stereo=2). *

* Unused for video codecs. */ - private final int channels; + private final Integer channels; /** * The "format specific parameters" from the "a=fmtp" line in the SDP @@ -70,7 +70,7 @@ public class RTCRtpCodecCapability { * @param sdpFmtp The "a=fmtp" parameters in the SDP. */ public RTCRtpCodecCapability(MediaType mediaType, String name, - int clockRate, int channels, Map sdpFmtp) { + Integer clockRate, Integer channels, Map sdpFmtp) { this.mediaType = mediaType; this.name = name; this.clockRate = clockRate; diff --git a/webrtc/src/test/java/dev/onvoid/webrtc/RTCRtpTransceiverTests.java b/webrtc/src/test/java/dev/onvoid/webrtc/RTCRtpTransceiverTests.java index d3e08ab1..a743e5a5 100644 --- a/webrtc/src/test/java/dev/onvoid/webrtc/RTCRtpTransceiverTests.java +++ b/webrtc/src/test/java/dev/onvoid/webrtc/RTCRtpTransceiverTests.java @@ -55,7 +55,7 @@ void setCodecCapabilities() { new RTCRtpTransceiverInit()); audioTransceiver.setCodecPreferences(audioPreferences); -// videoTransceiver.setCodecPreferences(videoPreferences); + videoTransceiver.setCodecPreferences(videoPreferences); } }