blob: e04fabdd8523f2b6ce749287d1932f7480df4c08 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
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.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
11package org.webrtc;
12
Magnus Jedvert6062f372017-11-16 16:53:12 +010013import java.util.ArrayList;
14import java.util.List;
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010015import java.util.Iterator;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
17/** Java wrapper for a C++ MediaStreamInterface. */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010018@JNINamespace("webrtc::jni")
henrike@webrtc.org28e20752013-07-10 00:45:36 +000019public class MediaStream {
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010020 private static final String TAG = "MediaStream";
21
Magnus Jedvert6062f372017-11-16 16:53:12 +010022 public final List<AudioTrack> audioTracks = new ArrayList<>();
23 public final List<VideoTrack> videoTracks = new ArrayList<>();
24 public final List<VideoTrack> preservedVideoTracks = new ArrayList<>();
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000025 // Package-protected for PeerConnection.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000026 final long nativeStream;
27
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010028 @CalledByNative
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029 public MediaStream(long nativeStream) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030 this.nativeStream = nativeStream;
31 }
32
33 public boolean addTrack(AudioTrack track) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010034 if (nativeAddAudioTrackToNativeStream(nativeStream, track.nativeTrack)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035 audioTracks.add(track);
36 return true;
37 }
38 return false;
39 }
40
41 public boolean addTrack(VideoTrack track) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010042 if (nativeAddVideoTrackToNativeStream(nativeStream, track.nativeTrack)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043 videoTracks.add(track);
44 return true;
45 }
46 return false;
47 }
48
Alex Glaznev32b5d232015-09-15 11:09:34 -070049 // Tracks added in addTrack() call will be auto released once MediaStream.dispose()
50 // is called. If video track need to be preserved after MediaStream is destroyed it
51 // should be added to MediaStream using addPreservedTrack() call.
52 public boolean addPreservedTrack(VideoTrack track) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010053 if (nativeAddVideoTrackToNativeStream(nativeStream, track.nativeTrack)) {
Alex Glaznev32b5d232015-09-15 11:09:34 -070054 preservedVideoTracks.add(track);
55 return true;
56 }
57 return false;
58 }
59
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 public boolean removeTrack(AudioTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080061 audioTracks.remove(track);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010062 return nativeRemoveAudioTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 }
64
65 public boolean removeTrack(VideoTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080066 videoTracks.remove(track);
67 preservedVideoTracks.remove(track);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010068 return nativeRemoveVideoTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069 }
70
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010071 @CalledByNative
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 public void dispose() {
Alex Glaznev32b5d232015-09-15 11:09:34 -070073 // Remove and release previously added audio and video tracks.
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000074 while (!audioTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010075 AudioTrack track = audioTracks.get(0 /* index */);
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000076 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000077 track.dispose();
78 }
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000079 while (!videoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010080 VideoTrack track = videoTracks.get(0 /* index */);
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000081 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 track.dispose();
83 }
Alex Glaznev32b5d232015-09-15 11:09:34 -070084 // Remove, but do not release preserved video tracks.
85 while (!preservedVideoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010086 removeTrack(preservedVideoTracks.get(0 /* index */));
Alex Glaznev32b5d232015-09-15 11:09:34 -070087 }
Magnus Jedvert1212f1e2017-12-20 12:00:50 +010088 JniCommon.nativeReleaseRef(nativeStream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089 }
90
Seth Hampsonc384e142018-03-06 15:47:10 -080091 // TODO(shampson): Remove this when downstreams have moved to using id() instead.
92 @Deprecated
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 public String label() {
Seth Hampsonc384e142018-03-06 15:47:10 -080094 return nativeGetId(nativeStream);
95 }
96
97 public String getId() {
98 return nativeGetId(nativeStream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 }
100
Sami Kalliomäkibde473e2017-10-30 13:34:41 +0100101 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 public String toString() {
Seth Hampsonc384e142018-03-06 15:47:10 -0800103 return "[" + getId() + ":A=" + audioTracks.size() + ":V=" + videoTracks.size() + "]";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104 }
105
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100106 @CalledByNative
107 void addNativeAudioTrack(long nativeTrack) {
108 audioTracks.add(new AudioTrack(nativeTrack));
109 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000110
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100111 @CalledByNative
112 void addNativeVideoTrack(long nativeTrack) {
113 videoTracks.add(new VideoTrack(nativeTrack));
114 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100116 @CalledByNative
117 void removeAudioTrack(long nativeTrack) {
118 removeMediaStreamTrack(audioTracks, nativeTrack);
119 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100121 @CalledByNative
122 void removeVideoTrack(long nativeTrack) {
123 removeMediaStreamTrack(videoTracks, nativeTrack);
124 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100126 private static void removeMediaStreamTrack(
127 List<? extends MediaStreamTrack> tracks, long nativeTrack) {
128 final Iterator<? extends MediaStreamTrack> it = tracks.iterator();
129 while (it.hasNext()) {
130 MediaStreamTrack track = it.next();
131 if (track.nativeTrack == nativeTrack) {
132 track.dispose();
133 it.remove();
134 return;
135 }
136 }
137 Logging.e(TAG, "Couldn't not find track");
138 }
139
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100140 private static native boolean nativeAddAudioTrackToNativeStream(
141 long stream, long nativeAudioTrack);
142 private static native boolean nativeAddVideoTrackToNativeStream(
143 long stream, long nativeVideoTrack);
144 private static native boolean nativeRemoveAudioTrack(long stream, long nativeAudioTrack);
145 private static native boolean nativeRemoveVideoTrack(long stream, long nativeVideoTrack);
Seth Hampsonc384e142018-03-06 15:47:10 -0800146 private static native String nativeGetId(long stream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147}