blob: e20352b381c5465871f6f626306f838383a32aed [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
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010013import javax.annotation.Nullable;
14
deadbeef4139c0f2015-10-06 12:29:25 -070015/** Java wrapper for a C++ RtpSenderInterface. */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010016@JNINamespace("webrtc::jni")
deadbeef4139c0f2015-10-06 12:29:25 -070017public class RtpSender {
18 final long nativeRtpSender;
19
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;
deadbeef4139c0f2015-10-06 12:29:25 -070022
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010023 private final @Nullable DtmfSender dtmfSender;
deadbeef24af6632017-02-01 21:53:09 -080024
Magnus Jedvert38631532017-12-07 14:07:20 +010025 @CalledByNative
deadbeef4139c0f2015-10-06 12:29:25 -070026 public RtpSender(long nativeRtpSender) {
27 this.nativeRtpSender = nativeRtpSender;
Seth Hampson9a58cc02018-03-06 17:24:06 -080028 long nativeTrack = nativeGetTrack(nativeRtpSender);
29 cachedTrack = MediaStreamTrack.createMediaStreamTrack(nativeTrack);
deadbeef24af6632017-02-01 21:53:09 -080030
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010031 long nativeDtmfSender = nativeGetDtmfSender(nativeRtpSender);
deadbeef24af6632017-02-01 21:53:09 -080032 dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
deadbeef4139c0f2015-10-06 12:29:25 -070033 }
34
deadbeef7a246882017-08-09 08:40:10 -070035 /**
36 * Starts sending a new track, without requiring additional SDP negotiation.
37 * <p>
38 * Note: This is equivalent to replaceTrack in the official WebRTC API. It
39 * was just implemented before the standards group settled on a name.
40 *
41 * @param takeOwnership If true, the RtpSender takes ownership of the track
42 * from the caller, and will auto-dispose of it when no
43 * longer needed. |takeOwnership| should only be used if
44 * the caller owns the track; it is not appropriate when
45 * the track is owned by, for example, another RtpSender
46 * or a MediaStream.
47 * @return true on success and false on failure.
48 */
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010049 public boolean setTrack(@Nullable MediaStreamTrack track, boolean takeOwnership) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010050 if (!nativeSetTrack(nativeRtpSender, (track == null) ? 0 : track.nativeTrack)) {
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
skvlad303b3c22016-03-24 19:36:46 -070066 public boolean setParameters(RtpParameters parameters) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010067 return nativeSetParameters(nativeRtpSender, parameters);
skvlad303b3c22016-03-24 19:36:46 -070068 }
69
70 public RtpParameters getParameters() {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010071 return nativeGetParameters(nativeRtpSender);
skvlad303b3c22016-03-24 19:36:46 -070072 }
73
deadbeef4139c0f2015-10-06 12:29:25 -070074 public String id() {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010075 return nativeGetId(nativeRtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070076 }
77
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010078 @Nullable
deadbeef24af6632017-02-01 21:53:09 -080079 public DtmfSender dtmf() {
80 return dtmfSender;
81 }
82
deadbeef4139c0f2015-10-06 12:29:25 -070083 public void dispose() {
deadbeef24af6632017-02-01 21:53:09 -080084 if (dtmfSender != null) {
85 dtmfSender.dispose();
86 }
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080087 if (cachedTrack != null && ownsTrack) {
deadbeef4139c0f2015-10-06 12:29:25 -070088 cachedTrack.dispose();
89 }
magjedb1c74532017-08-27 13:47:20 -070090 JniCommon.nativeReleaseRef(nativeRtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070091 }
92
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010093 private static native boolean nativeSetTrack(long rtpSender, long nativeTrack);
deadbeef4139c0f2015-10-06 12:29:25 -070094
95 // This should increment the reference count of the track.
96 // Will be released in dispose() or setTrack().
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010097 private static native long nativeGetTrack(long rtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070098
deadbeef24af6632017-02-01 21:53:09 -080099 // This should increment the reference count of the DTMF sender.
100 // Will be released in dispose().
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100101 private static native long nativeGetDtmfSender(long rtpSender);
deadbeef24af6632017-02-01 21:53:09 -0800102
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100103 private static native boolean nativeSetParameters(long rtpSender, RtpParameters parameters);
skvlad303b3c22016-03-24 19:36:46 -0700104
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100105 private static native RtpParameters nativeGetParameters(long rtpSender);
skvlad303b3c22016-03-24 19:36:46 -0700106
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100107 private static native String nativeGetId(long rtpSender);
sakalb6760f92016-09-29 04:12:44 -0700108};