mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-18 16:17:50 +01:00

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}
153 lines
4.9 KiB
Java
153 lines
4.9 KiB
Java
/*
|
|
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
package org.webrtc;
|
|
|
|
import androidx.annotation.Nullable;
|
|
import java.util.List;
|
|
import org.webrtc.MediaStreamTrack;
|
|
|
|
/** Java wrapper for a C++ RtpSenderInterface. */
|
|
public class RtpSender {
|
|
private long nativeRtpSender;
|
|
|
|
@Nullable private MediaStreamTrack cachedTrack;
|
|
private boolean ownsTrack = true;
|
|
private final @Nullable DtmfSender dtmfSender;
|
|
|
|
@CalledByNative
|
|
public RtpSender(long nativeRtpSender) {
|
|
this.nativeRtpSender = nativeRtpSender;
|
|
long nativeTrack = nativeGetTrack(nativeRtpSender);
|
|
cachedTrack = MediaStreamTrack.createMediaStreamTrack(nativeTrack);
|
|
|
|
if (nativeGetMediaType(nativeRtpSender).equalsIgnoreCase(MediaStreamTrack.AUDIO_TRACK_KIND)) {
|
|
long nativeDtmfSender = nativeGetDtmfSender(nativeRtpSender);
|
|
dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
|
|
} else {
|
|
dtmfSender = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Starts sending a new track, without requiring additional SDP negotiation.
|
|
* <p>
|
|
* Note: This is equivalent to replaceTrack in the official WebRTC API. It
|
|
* was just implemented before the standards group settled on a name.
|
|
*
|
|
* @param takeOwnership If true, the RtpSender takes ownership of the track
|
|
* from the caller, and will auto-dispose of it when no
|
|
* longer needed. `takeOwnership` should only be used if
|
|
* the caller owns the track; it is not appropriate when
|
|
* the track is owned by, for example, another RtpSender
|
|
* or a MediaStream.
|
|
* @return true on success and false on failure.
|
|
*/
|
|
public boolean setTrack(@Nullable MediaStreamTrack track, boolean takeOwnership) {
|
|
checkRtpSenderExists();
|
|
if (!nativeSetTrack(nativeRtpSender, (track == null) ? 0 : track.getNativeMediaStreamTrack())) {
|
|
return false;
|
|
}
|
|
if (cachedTrack != null && ownsTrack) {
|
|
cachedTrack.dispose();
|
|
}
|
|
cachedTrack = track;
|
|
ownsTrack = takeOwnership;
|
|
return true;
|
|
}
|
|
|
|
@Nullable
|
|
public MediaStreamTrack track() {
|
|
return cachedTrack;
|
|
}
|
|
|
|
public void setStreams(List<String> streamIds) {
|
|
checkRtpSenderExists();
|
|
nativeSetStreams(nativeRtpSender, streamIds);
|
|
}
|
|
|
|
public List<String> getStreams() {
|
|
checkRtpSenderExists();
|
|
return nativeGetStreams(nativeRtpSender);
|
|
}
|
|
|
|
public boolean setParameters(RtpParameters parameters) {
|
|
checkRtpSenderExists();
|
|
return nativeSetParameters(nativeRtpSender, parameters);
|
|
}
|
|
|
|
public RtpParameters getParameters() {
|
|
checkRtpSenderExists();
|
|
return nativeGetParameters(nativeRtpSender);
|
|
}
|
|
|
|
public String id() {
|
|
checkRtpSenderExists();
|
|
return nativeGetId(nativeRtpSender);
|
|
}
|
|
|
|
@Nullable
|
|
public DtmfSender dtmf() {
|
|
return dtmfSender;
|
|
}
|
|
|
|
public void setFrameEncryptor(FrameEncryptor frameEncryptor) {
|
|
checkRtpSenderExists();
|
|
nativeSetFrameEncryptor(nativeRtpSender, frameEncryptor.getNativeFrameEncryptor());
|
|
}
|
|
|
|
public void dispose() {
|
|
checkRtpSenderExists();
|
|
if (dtmfSender != null) {
|
|
dtmfSender.dispose();
|
|
}
|
|
if (cachedTrack != null && ownsTrack) {
|
|
cachedTrack.dispose();
|
|
}
|
|
JniCommon.nativeReleaseRef(nativeRtpSender);
|
|
nativeRtpSender = 0;
|
|
}
|
|
|
|
/** Returns a pointer to webrtc::RtpSenderInterface. */
|
|
long getNativeRtpSender() {
|
|
checkRtpSenderExists();
|
|
return nativeRtpSender;
|
|
}
|
|
|
|
private void checkRtpSenderExists() {
|
|
if (nativeRtpSender == 0) {
|
|
throw new IllegalStateException("RtpSender has been disposed.");
|
|
}
|
|
}
|
|
|
|
private static native boolean nativeSetTrack(long rtpSender, long nativeTrack);
|
|
|
|
// This should increment the reference count of the track.
|
|
// Will be released in dispose() or setTrack().
|
|
private static native long nativeGetTrack(long rtpSender);
|
|
|
|
private static native void nativeSetStreams(long rtpSender, List<String> streamIds);
|
|
|
|
private static native List<String> nativeGetStreams(long rtpSender);
|
|
|
|
// This should increment the reference count of the DTMF sender.
|
|
// Will be released in dispose().
|
|
private static native long nativeGetDtmfSender(long rtpSender);
|
|
|
|
private static native boolean nativeSetParameters(long rtpSender, RtpParameters parameters);
|
|
|
|
private static native RtpParameters nativeGetParameters(long rtpSender);
|
|
|
|
private static native String nativeGetId(long rtpSender);
|
|
|
|
private static native void nativeSetFrameEncryptor(long rtpSender, long nativeFrameEncryptor);
|
|
|
|
private static native String nativeGetMediaType(long rtpSender);
|
|
};
|