blob: 73a781633d8ef23a3c901a914cd3a947de70fa4a [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. */
18public class MediaStream {
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010019 private static final String TAG = "MediaStream";
20
Magnus Jedvert6062f372017-11-16 16:53:12 +010021 public final List<AudioTrack> audioTracks = new ArrayList<>();
22 public final List<VideoTrack> videoTracks = new ArrayList<>();
23 public final List<VideoTrack> preservedVideoTracks = new ArrayList<>();
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000024 // Package-protected for PeerConnection.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025 final long nativeStream;
26
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010027 @CalledByNative
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028 public MediaStream(long nativeStream) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029 this.nativeStream = nativeStream;
30 }
31
32 public boolean addTrack(AudioTrack track) {
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010033 if (addAudioTrackToNativeStream(nativeStream, track.nativeTrack)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034 audioTracks.add(track);
35 return true;
36 }
37 return false;
38 }
39
40 public boolean addTrack(VideoTrack track) {
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010041 if (addVideoTrackToNativeStream(nativeStream, track.nativeTrack)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042 videoTracks.add(track);
43 return true;
44 }
45 return false;
46 }
47
Alex Glaznev32b5d232015-09-15 11:09:34 -070048 // Tracks added in addTrack() call will be auto released once MediaStream.dispose()
49 // is called. If video track need to be preserved after MediaStream is destroyed it
50 // should be added to MediaStream using addPreservedTrack() call.
51 public boolean addPreservedTrack(VideoTrack track) {
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010052 if (addVideoTrackToNativeStream(nativeStream, track.nativeTrack)) {
Alex Glaznev32b5d232015-09-15 11:09:34 -070053 preservedVideoTracks.add(track);
54 return true;
55 }
56 return false;
57 }
58
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059 public boolean removeTrack(AudioTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080060 audioTracks.remove(track);
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010061 return removeNativeAudioTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 }
63
64 public boolean removeTrack(VideoTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080065 videoTracks.remove(track);
66 preservedVideoTracks.remove(track);
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010067 return removeNativeVideoTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068 }
69
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010070 @CalledByNative
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 public void dispose() {
Alex Glaznev32b5d232015-09-15 11:09:34 -070072 // Remove and release previously added audio and video tracks.
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000073 while (!audioTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010074 AudioTrack track = audioTracks.get(0 /* index */);
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000075 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000076 track.dispose();
77 }
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000078 while (!videoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010079 VideoTrack track = videoTracks.get(0 /* index */);
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000080 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081 track.dispose();
82 }
Alex Glaznev32b5d232015-09-15 11:09:34 -070083 // Remove, but do not release preserved video tracks.
84 while (!preservedVideoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010085 removeTrack(preservedVideoTracks.get(0 /* index */));
Alex Glaznev32b5d232015-09-15 11:09:34 -070086 }
Magnus Jedvert1212f1e2017-12-20 12:00:50 +010087 JniCommon.nativeReleaseRef(nativeStream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088 }
89
90 public String label() {
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010091 return getNativeLabel(nativeStream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 }
93
Sami Kalliomäkibde473e2017-10-30 13:34:41 +010094 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095 public String toString() {
sakalb6760f92016-09-29 04:12:44 -070096 return "[" + label() + ":A=" + audioTracks.size() + ":V=" + videoTracks.size() + "]";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097 }
98
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010099 @CalledByNative
100 void addNativeAudioTrack(long nativeTrack) {
101 audioTracks.add(new AudioTrack(nativeTrack));
102 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100104 @CalledByNative
105 void addNativeVideoTrack(long nativeTrack) {
106 videoTracks.add(new VideoTrack(nativeTrack));
107 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100109 @CalledByNative
110 void removeAudioTrack(long nativeTrack) {
111 removeMediaStreamTrack(audioTracks, nativeTrack);
112 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100114 @CalledByNative
115 void removeVideoTrack(long nativeTrack) {
116 removeMediaStreamTrack(videoTracks, nativeTrack);
117 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100119 private static void removeMediaStreamTrack(
120 List<? extends MediaStreamTrack> tracks, long nativeTrack) {
121 final Iterator<? extends MediaStreamTrack> it = tracks.iterator();
122 while (it.hasNext()) {
123 MediaStreamTrack track = it.next();
124 if (track.nativeTrack == nativeTrack) {
125 track.dispose();
126 it.remove();
127 return;
128 }
129 }
130 Logging.e(TAG, "Couldn't not find track");
131 }
132
133 private static native boolean addAudioTrackToNativeStream(
134 long nativeStream, long nativeAudioTrack);
135
136 private static native boolean addVideoTrackToNativeStream(
137 long nativeStream, long nativeVideoTrack);
138
139 private static native boolean removeNativeAudioTrack(long nativeStream, long nativeAudioTrack);
140
141 private static native boolean removeNativeVideoTrack(long nativeStream, long nativeVideoTrack);
142
143 private static native String getNativeLabel(long nativeStream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144}