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