xref: /aosp_15_r20/external/webrtc/sdk/android/api/org/webrtc/RtpSender.java (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2015 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 package org.webrtc;
12 
13 import androidx.annotation.Nullable;
14 import java.util.List;
15 import org.webrtc.MediaStreamTrack;
16 
17 /** Java wrapper for a C++ RtpSenderInterface. */
18 public class RtpSender {
19   private long nativeRtpSender;
20 
21   @Nullable private MediaStreamTrack cachedTrack;
22   private boolean ownsTrack = true;
23   private final @Nullable DtmfSender dtmfSender;
24 
25   @CalledByNative
RtpSender(long nativeRtpSender)26   public RtpSender(long nativeRtpSender) {
27     this.nativeRtpSender = nativeRtpSender;
28     long nativeTrack = nativeGetTrack(nativeRtpSender);
29     cachedTrack = MediaStreamTrack.createMediaStreamTrack(nativeTrack);
30 
31     if (nativeGetMediaType(nativeRtpSender).equalsIgnoreCase(MediaStreamTrack.AUDIO_TRACK_KIND)) {
32       long nativeDtmfSender = nativeGetDtmfSender(nativeRtpSender);
33       dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
34     } else {
35       dtmfSender = null;
36     }
37   }
38 
39   /**
40    * Starts sending a new track, without requiring additional SDP negotiation.
41    * <p>
42    * Note: This is equivalent to replaceTrack in the official WebRTC API. It
43    * was just implemented before the standards group settled on a name.
44    *
45    * @param takeOwnership If true, the RtpSender takes ownership of the track
46    *                      from the caller, and will auto-dispose of it when no
47    *                      longer needed. `takeOwnership` should only be used if
48    *                      the caller owns the track; it is not appropriate when
49    *                      the track is owned by, for example, another RtpSender
50    *                      or a MediaStream.
51    * @return              true on success and false on failure.
52    */
setTrack(@ullable MediaStreamTrack track, boolean takeOwnership)53   public boolean setTrack(@Nullable MediaStreamTrack track, boolean takeOwnership) {
54     checkRtpSenderExists();
55     if (!nativeSetTrack(nativeRtpSender, (track == null) ? 0 : track.getNativeMediaStreamTrack())) {
56       return false;
57     }
58     if (cachedTrack != null && ownsTrack) {
59       cachedTrack.dispose();
60     }
61     cachedTrack = track;
62     ownsTrack = takeOwnership;
63     return true;
64   }
65 
66   @Nullable
track()67   public MediaStreamTrack track() {
68     return cachedTrack;
69   }
70 
setStreams(List<String> streamIds)71   public void setStreams(List<String> streamIds) {
72     checkRtpSenderExists();
73     nativeSetStreams(nativeRtpSender, streamIds);
74   }
75 
getStreams()76   public List<String> getStreams() {
77     checkRtpSenderExists();
78     return nativeGetStreams(nativeRtpSender);
79   }
80 
setParameters(RtpParameters parameters)81   public boolean setParameters(RtpParameters parameters) {
82     checkRtpSenderExists();
83     return nativeSetParameters(nativeRtpSender, parameters);
84   }
85 
getParameters()86   public RtpParameters getParameters() {
87     checkRtpSenderExists();
88     return nativeGetParameters(nativeRtpSender);
89   }
90 
id()91   public String id() {
92     checkRtpSenderExists();
93     return nativeGetId(nativeRtpSender);
94   }
95 
96   @Nullable
dtmf()97   public DtmfSender dtmf() {
98     return dtmfSender;
99   }
100 
setFrameEncryptor(FrameEncryptor frameEncryptor)101   public void setFrameEncryptor(FrameEncryptor frameEncryptor) {
102     checkRtpSenderExists();
103     nativeSetFrameEncryptor(nativeRtpSender, frameEncryptor.getNativeFrameEncryptor());
104   }
105 
dispose()106   public void dispose() {
107     checkRtpSenderExists();
108     if (dtmfSender != null) {
109       dtmfSender.dispose();
110     }
111     if (cachedTrack != null && ownsTrack) {
112       cachedTrack.dispose();
113     }
114     JniCommon.nativeReleaseRef(nativeRtpSender);
115     nativeRtpSender = 0;
116   }
117 
118   /** Returns a pointer to webrtc::RtpSenderInterface. */
getNativeRtpSender()119   long getNativeRtpSender() {
120     checkRtpSenderExists();
121     return nativeRtpSender;
122   }
123 
checkRtpSenderExists()124   private void checkRtpSenderExists() {
125     if (nativeRtpSender == 0) {
126       throw new IllegalStateException("RtpSender has been disposed.");
127     }
128   }
129 
nativeSetTrack(long rtpSender, long nativeTrack)130   private static native boolean nativeSetTrack(long rtpSender, long nativeTrack);
131 
132   // This should increment the reference count of the track.
133   // Will be released in dispose() or setTrack().
nativeGetTrack(long rtpSender)134   private static native long nativeGetTrack(long rtpSender);
135 
nativeSetStreams(long rtpSender, List<String> streamIds)136   private static native void nativeSetStreams(long rtpSender, List<String> streamIds);
137 
nativeGetStreams(long rtpSender)138   private static native List<String> nativeGetStreams(long rtpSender);
139 
140   // This should increment the reference count of the DTMF sender.
141   // Will be released in dispose().
nativeGetDtmfSender(long rtpSender)142   private static native long nativeGetDtmfSender(long rtpSender);
143 
nativeSetParameters(long rtpSender, RtpParameters parameters)144   private static native boolean nativeSetParameters(long rtpSender, RtpParameters parameters);
145 
nativeGetParameters(long rtpSender)146   private static native RtpParameters nativeGetParameters(long rtpSender);
147 
nativeGetId(long rtpSender)148   private static native String nativeGetId(long rtpSender);
149 
nativeSetFrameEncryptor(long rtpSender, long nativeFrameEncryptor)150   private static native void nativeSetFrameEncryptor(long rtpSender, long nativeFrameEncryptor);
151 
nativeGetMediaType(long rtpSender)152   private static native String nativeGetMediaType(long rtpSender);
153 };
154