blob: e530fe5f7f96c3f041195e4dc1a68e917ea335e0 [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;
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010014import java.util.Iterator;
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020015import java.util.List;
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<>();
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020024 private long nativeStream;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010026 @CalledByNative
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027 public MediaStream(long nativeStream) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028 this.nativeStream = nativeStream;
29 }
30
31 public boolean addTrack(AudioTrack track) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020032 checkMediaStreamExists();
33 if (nativeAddAudioTrackToNativeStream(nativeStream, track.getNativeAudioTrack())) {
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) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020041 checkMediaStreamExists();
42 if (nativeAddVideoTrackToNativeStream(nativeStream, track.getNativeVideoTrack())) {
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) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020053 checkMediaStreamExists();
54 if (nativeAddVideoTrackToNativeStream(nativeStream, track.getNativeVideoTrack())) {
Alex Glaznev32b5d232015-09-15 11:09:34 -070055 preservedVideoTracks.add(track);
56 return true;
57 }
58 return false;
59 }
60
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 public boolean removeTrack(AudioTrack track) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020062 checkMediaStreamExists();
deadbeef6ecee072016-02-11 09:57:23 -080063 audioTracks.remove(track);
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020064 return nativeRemoveAudioTrack(nativeStream, track.getNativeAudioTrack());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 }
66
67 public boolean removeTrack(VideoTrack track) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020068 checkMediaStreamExists();
deadbeef6ecee072016-02-11 09:57:23 -080069 videoTracks.remove(track);
70 preservedVideoTracks.remove(track);
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020071 return nativeRemoveVideoTrack(nativeStream, track.getNativeVideoTrack());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 }
73
Magnus Jedvert6a0345b2017-11-27 11:23:42 +010074 @CalledByNative
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 public void dispose() {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020076 checkMediaStreamExists();
Alex Glaznev32b5d232015-09-15 11:09:34 -070077 // Remove and release previously added audio and video tracks.
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000078 while (!audioTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010079 AudioTrack track = audioTracks.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 }
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000083 while (!videoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010084 VideoTrack track = videoTracks.get(0 /* index */);
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000085 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086 track.dispose();
87 }
Alex Glaznev32b5d232015-09-15 11:09:34 -070088 // Remove, but do not release preserved video tracks.
89 while (!preservedVideoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010090 removeTrack(preservedVideoTracks.get(0 /* index */));
Alex Glaznev32b5d232015-09-15 11:09:34 -070091 }
Magnus Jedvert1212f1e2017-12-20 12:00:50 +010092 JniCommon.nativeReleaseRef(nativeStream);
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020093 nativeStream = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 }
95
Seth Hampsonc384e142018-03-06 15:47:10 -080096 public String getId() {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +020097 checkMediaStreamExists();
Seth Hampsonc384e142018-03-06 15:47:10 -080098 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
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200126 /** Returns a pointer to webrtc::MediaStreamInterface. */
127 long getNativeMediaStream() {
128 checkMediaStreamExists();
129 return nativeStream;
130 }
131
132 private void checkMediaStreamExists() {
133 if (nativeStream == 0) {
134 throw new IllegalStateException("MediaStream has been disposed.");
135 }
136 }
137
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100138 private static void removeMediaStreamTrack(
139 List<? extends MediaStreamTrack> tracks, long nativeTrack) {
140 final Iterator<? extends MediaStreamTrack> it = tracks.iterator();
141 while (it.hasNext()) {
142 MediaStreamTrack track = it.next();
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200143 if (track.getNativeMediaStreamTrack() == nativeTrack) {
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100144 track.dispose();
145 it.remove();
146 return;
147 }
148 }
149 Logging.e(TAG, "Couldn't not find track");
150 }
151
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100152 private static native boolean nativeAddAudioTrackToNativeStream(
153 long stream, long nativeAudioTrack);
154 private static native boolean nativeAddVideoTrackToNativeStream(
155 long stream, long nativeVideoTrack);
156 private static native boolean nativeRemoveAudioTrack(long stream, long nativeAudioTrack);
157 private static native boolean nativeRemoveVideoTrack(long stream, long nativeVideoTrack);
Seth Hampsonc384e142018-03-06 15:47:10 -0800158 private static native String nativeGetId(long stream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159}