Do not create DtmfSender for video sender.
On Android bindings, do not build a DtmfSender instance in a
RtpSender if its video kind is Video.
This will prevent showing an error when trying to access
that DtmfSender instance that has no native reference
Bug: webrtc:14680
Change-Id: Iba67a12cae8604c032915156b581af269f6ed265
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/283742
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38724}
diff --git a/sdk/android/api/org/webrtc/RtpSender.java b/sdk/android/api/org/webrtc/RtpSender.java
index b78bbf6..2d0bc6c 100644
--- a/sdk/android/api/org/webrtc/RtpSender.java
+++ b/sdk/android/api/org/webrtc/RtpSender.java
@@ -12,6 +12,7 @@
import androidx.annotation.Nullable;
import java.util.List;
+import org.webrtc.MediaStreamTrack;
/** Java wrapper for a C++ RtpSenderInterface. */
public class RtpSender {
@@ -27,8 +28,12 @@
long nativeTrack = nativeGetTrack(nativeRtpSender);
cachedTrack = MediaStreamTrack.createMediaStreamTrack(nativeTrack);
- long nativeDtmfSender = nativeGetDtmfSender(nativeRtpSender);
- dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
+ if (nativeGetMediaType(nativeRtpSender).equalsIgnoreCase(MediaStreamTrack.AUDIO_TRACK_KIND)) {
+ long nativeDtmfSender = nativeGetDtmfSender(nativeRtpSender);
+ dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
+ } else {
+ dtmfSender = null;
+ }
}
/**
@@ -143,4 +148,6 @@
private static native String nativeGetId(long rtpSender);
private static native void nativeSetFrameEncryptor(long rtpSender, long nativeFrameEncryptor);
+
+ private static native String nativeGetMediaType(long rtpSender);
};
diff --git a/sdk/android/src/jni/pc/rtp_sender.cc b/sdk/android/src/jni/pc/rtp_sender.cc
index 233a353..fc83862 100644
--- a/sdk/android/src/jni/pc/rtp_sender.cc
+++ b/sdk/android/src/jni/pc/rtp_sender.cc
@@ -110,5 +110,15 @@
j_frame_encryptor_pointer)));
}
+static ScopedJavaLocalRef<jstring> JNI_RtpSender_GetMediaType(
+ JNIEnv* jni,
+ jlong j_rtp_sender_pointer) {
+ cricket::MediaType media_type =
+ reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)->media_type();
+ return media_type == cricket::MEDIA_TYPE_AUDIO
+ ? NativeToJavaString(jni, "audio")
+ : NativeToJavaString(jni, "video");
+}
+
} // namespace jni
} // namespace webrtc