blob: bc894e5d042292928455cdf3c1c280818d500732 [file] [log] [blame]
deadbeef4139c0f2015-10-06 12:29:25 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
deadbeef4139c0f2015-10-06 12:29:25 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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.
deadbeef4139c0f2015-10-06 12:29:25 -07009 */
10
11package org.webrtc;
12
Artem Titarenko69540f42018-12-10 12:30:46 +010013import android.support.annotation.Nullable;
Cyril Lashkevichfa77ba62019-10-08 13:06:15 +000014import java.util.List;
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010015
deadbeef4139c0f2015-10-06 12:29:25 -070016/** Java wrapper for a C++ RtpSenderInterface. */
17public class RtpSender {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020018 private long nativeRtpSender;
deadbeef4139c0f2015-10-06 12:29:25 -070019
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010020 @Nullable private MediaStreamTrack cachedTrack;
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080021 private boolean ownsTrack = true;
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010022 private final @Nullable DtmfSender dtmfSender;
deadbeef24af6632017-02-01 21:53:09 -080023
Magnus Jedvert38631532017-12-07 14:07:20 +010024 @CalledByNative
deadbeef4139c0f2015-10-06 12:29:25 -070025 public RtpSender(long nativeRtpSender) {
26 this.nativeRtpSender = nativeRtpSender;
Seth Hampson9a58cc02018-03-06 17:24:06 -080027 long nativeTrack = nativeGetTrack(nativeRtpSender);
28 cachedTrack = MediaStreamTrack.createMediaStreamTrack(nativeTrack);
deadbeef24af6632017-02-01 21:53:09 -080029
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010030 long nativeDtmfSender = nativeGetDtmfSender(nativeRtpSender);
deadbeef24af6632017-02-01 21:53:09 -080031 dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
deadbeef4139c0f2015-10-06 12:29:25 -070032 }
33
deadbeef7a246882017-08-09 08:40:10 -070034 /**
35 * Starts sending a new track, without requiring additional SDP negotiation.
36 * <p>
37 * Note: This is equivalent to replaceTrack in the official WebRTC API. It
38 * was just implemented before the standards group settled on a name.
39 *
40 * @param takeOwnership If true, the RtpSender takes ownership of the track
41 * from the caller, and will auto-dispose of it when no
42 * longer needed. |takeOwnership| should only be used if
43 * the caller owns the track; it is not appropriate when
44 * the track is owned by, for example, another RtpSender
45 * or a MediaStream.
46 * @return true on success and false on failure.
47 */
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010048 public boolean setTrack(@Nullable MediaStreamTrack track, boolean takeOwnership) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020049 checkRtpSenderExists();
50 if (!nativeSetTrack(nativeRtpSender, (track == null) ? 0 : track.getNativeMediaStreamTrack())) {
sakalb6760f92016-09-29 04:12:44 -070051 return false;
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080052 }
53 if (cachedTrack != null && ownsTrack) {
deadbeef4139c0f2015-10-06 12:29:25 -070054 cachedTrack.dispose();
55 }
56 cachedTrack = track;
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080057 ownsTrack = takeOwnership;
58 return true;
deadbeef4139c0f2015-10-06 12:29:25 -070059 }
60
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010061 @Nullable
deadbeef4139c0f2015-10-06 12:29:25 -070062 public MediaStreamTrack track() {
63 return cachedTrack;
64 }
65
Cyril Lashkevichfa77ba62019-10-08 13:06:15 +000066 public void setStreams(List<String> streamIds) {
67 checkRtpSenderExists();
68 nativeSetStreams(nativeRtpSender, streamIds);
69 }
70
71 public List<String> getStreams() {
72 checkRtpSenderExists();
73 return nativeGetStreams(nativeRtpSender);
74 }
75
skvlad303b3c22016-03-24 19:36:46 -070076 public boolean setParameters(RtpParameters parameters) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020077 checkRtpSenderExists();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010078 return nativeSetParameters(nativeRtpSender, parameters);
skvlad303b3c22016-03-24 19:36:46 -070079 }
80
81 public RtpParameters getParameters() {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020082 checkRtpSenderExists();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010083 return nativeGetParameters(nativeRtpSender);
skvlad303b3c22016-03-24 19:36:46 -070084 }
85
deadbeef4139c0f2015-10-06 12:29:25 -070086 public String id() {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020087 checkRtpSenderExists();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010088 return nativeGetId(nativeRtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070089 }
90
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010091 @Nullable
deadbeef24af6632017-02-01 21:53:09 -080092 public DtmfSender dtmf() {
93 return dtmfSender;
94 }
95
Benjamin Wrightea8b6f92018-09-06 12:05:18 -070096 public void setFrameEncryptor(FrameEncryptor frameEncryptor) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020097 checkRtpSenderExists();
Benjamin Wrightea8b6f92018-09-06 12:05:18 -070098 nativeSetFrameEncryptor(nativeRtpSender, frameEncryptor.getNativeFrameEncryptor());
99 }
100
deadbeef4139c0f2015-10-06 12:29:25 -0700101 public void dispose() {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200102 checkRtpSenderExists();
deadbeef24af6632017-02-01 21:53:09 -0800103 if (dtmfSender != null) {
104 dtmfSender.dispose();
105 }
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -0800106 if (cachedTrack != null && ownsTrack) {
deadbeef4139c0f2015-10-06 12:29:25 -0700107 cachedTrack.dispose();
108 }
magjedb1c74532017-08-27 13:47:20 -0700109 JniCommon.nativeReleaseRef(nativeRtpSender);
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200110 nativeRtpSender = 0;
111 }
112
113 /** Returns a pointer to webrtc::RtpSenderInterface. */
114 long getNativeRtpSender() {
115 checkRtpSenderExists();
116 return nativeRtpSender;
117 }
118
119 private void checkRtpSenderExists() {
120 if (nativeRtpSender == 0) {
121 throw new IllegalStateException("RtpSender has been disposed.");
122 }
deadbeef4139c0f2015-10-06 12:29:25 -0700123 }
124
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100125 private static native boolean nativeSetTrack(long rtpSender, long nativeTrack);
deadbeef4139c0f2015-10-06 12:29:25 -0700126
127 // This should increment the reference count of the track.
128 // Will be released in dispose() or setTrack().
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100129 private static native long nativeGetTrack(long rtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -0700130
Cyril Lashkevichfa77ba62019-10-08 13:06:15 +0000131 private static native void nativeSetStreams(long rtpSender, List<String> streamIds);
132
133 private static native List<String> nativeGetStreams(long rtpSender);
134
deadbeef24af6632017-02-01 21:53:09 -0800135 // This should increment the reference count of the DTMF sender.
136 // Will be released in dispose().
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100137 private static native long nativeGetDtmfSender(long rtpSender);
deadbeef24af6632017-02-01 21:53:09 -0800138
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100139 private static native boolean nativeSetParameters(long rtpSender, RtpParameters parameters);
skvlad303b3c22016-03-24 19:36:46 -0700140
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100141 private static native RtpParameters nativeGetParameters(long rtpSender);
skvlad303b3c22016-03-24 19:36:46 -0700142
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100143 private static native String nativeGetId(long rtpSender);
Benjamin Wrightea8b6f92018-09-06 12:05:18 -0700144
145 private static native void nativeSetFrameEncryptor(long rtpSender, long nativeFrameEncryptor);
sakalb6760f92016-09-29 04:12:44 -0700146};