blob: 8100ff77850a449b46e767d573392fa355f2c7ee [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
13/** Java wrapper for a C++ RtpSenderInterface. */
14public class RtpSender {
15 final long nativeRtpSender;
16
17 private MediaStreamTrack cachedTrack;
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080018 private boolean ownsTrack = true;
deadbeef4139c0f2015-10-06 12:29:25 -070019
deadbeef24af6632017-02-01 21:53:09 -080020 private final DtmfSender dtmfSender;
21
Magnus Jedvert38631532017-12-07 14:07:20 +010022 @CalledByNative
deadbeef4139c0f2015-10-06 12:29:25 -070023 public RtpSender(long nativeRtpSender) {
24 this.nativeRtpSender = nativeRtpSender;
Magnus Jedvert38631532017-12-07 14:07:20 +010025 long track = getNativeTrack(nativeRtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070026 // It may be possible for an RtpSender to be created without a track.
deadbeef24af6632017-02-01 21:53:09 -080027 cachedTrack = (track != 0) ? new MediaStreamTrack(track) : null;
28
Magnus Jedvert38631532017-12-07 14:07:20 +010029 long nativeDtmfSender = getNativeDtmfSender(nativeRtpSender);
deadbeef24af6632017-02-01 21:53:09 -080030 dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
deadbeef4139c0f2015-10-06 12:29:25 -070031 }
32
deadbeef7a246882017-08-09 08:40:10 -070033 /**
34 * Starts sending a new track, without requiring additional SDP negotiation.
35 * <p>
36 * Note: This is equivalent to replaceTrack in the official WebRTC API. It
37 * was just implemented before the standards group settled on a name.
38 *
39 * @param takeOwnership If true, the RtpSender takes ownership of the track
40 * from the caller, and will auto-dispose of it when no
41 * longer needed. |takeOwnership| should only be used if
42 * the caller owns the track; it is not appropriate when
43 * the track is owned by, for example, another RtpSender
44 * or a MediaStream.
45 * @return true on success and false on failure.
46 */
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080047 public boolean setTrack(MediaStreamTrack track, boolean takeOwnership) {
Magnus Jedvert38631532017-12-07 14:07:20 +010048 if (!setNativeTrack(nativeRtpSender, (track == null) ? 0 : track.nativeTrack)) {
sakalb6760f92016-09-29 04:12:44 -070049 return false;
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080050 }
51 if (cachedTrack != null && ownsTrack) {
deadbeef4139c0f2015-10-06 12:29:25 -070052 cachedTrack.dispose();
53 }
54 cachedTrack = track;
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080055 ownsTrack = takeOwnership;
56 return true;
deadbeef4139c0f2015-10-06 12:29:25 -070057 }
58
59 public MediaStreamTrack track() {
60 return cachedTrack;
61 }
62
skvlad303b3c22016-03-24 19:36:46 -070063 public boolean setParameters(RtpParameters parameters) {
Magnus Jedvert38631532017-12-07 14:07:20 +010064 return setNativeParameters(nativeRtpSender, parameters);
skvlad303b3c22016-03-24 19:36:46 -070065 }
66
67 public RtpParameters getParameters() {
Magnus Jedvert38631532017-12-07 14:07:20 +010068 return getNativeParameters(nativeRtpSender);
skvlad303b3c22016-03-24 19:36:46 -070069 }
70
deadbeef4139c0f2015-10-06 12:29:25 -070071 public String id() {
Magnus Jedvert38631532017-12-07 14:07:20 +010072 return getNativeId(nativeRtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070073 }
74
deadbeef24af6632017-02-01 21:53:09 -080075 public DtmfSender dtmf() {
76 return dtmfSender;
77 }
78
deadbeef4139c0f2015-10-06 12:29:25 -070079 public void dispose() {
deadbeef24af6632017-02-01 21:53:09 -080080 if (dtmfSender != null) {
81 dtmfSender.dispose();
82 }
Taylor Brandstettere5ba13b2016-01-07 15:11:25 -080083 if (cachedTrack != null && ownsTrack) {
deadbeef4139c0f2015-10-06 12:29:25 -070084 cachedTrack.dispose();
85 }
magjedb1c74532017-08-27 13:47:20 -070086 JniCommon.nativeReleaseRef(nativeRtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070087 }
88
Magnus Jedvert38631532017-12-07 14:07:20 +010089 private static native boolean setNativeTrack(long nativeRtpSender, long nativeTrack);
deadbeef4139c0f2015-10-06 12:29:25 -070090
91 // This should increment the reference count of the track.
92 // Will be released in dispose() or setTrack().
Magnus Jedvert38631532017-12-07 14:07:20 +010093 private static native long getNativeTrack(long nativeRtpSender);
deadbeef4139c0f2015-10-06 12:29:25 -070094
deadbeef24af6632017-02-01 21:53:09 -080095 // This should increment the reference count of the DTMF sender.
96 // Will be released in dispose().
Magnus Jedvert38631532017-12-07 14:07:20 +010097 private static native long getNativeDtmfSender(long nativeRtpSender);
deadbeef24af6632017-02-01 21:53:09 -080098
Magnus Jedvert38631532017-12-07 14:07:20 +010099 private static native boolean setNativeParameters(long nativeRtpSender, RtpParameters parameters);
skvlad303b3c22016-03-24 19:36:46 -0700100
Magnus Jedvert38631532017-12-07 14:07:20 +0100101 private static native RtpParameters getNativeParameters(long nativeRtpSender);
skvlad303b3c22016-03-24 19:36:46 -0700102
Magnus Jedvert38631532017-12-07 14:07:20 +0100103 private static native String getNativeId(long nativeRtpSender);
sakalb6760f92016-09-29 04:12:44 -0700104};