blob: d66d844936d5a5ec7dd7c1731f1ca318a9ccabb5 [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
91 public String label() {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010092 return nativeGetLabel(nativeStream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 }
94
Sami Kalliomäkibde473e2017-10-30 13:34:41 +010095 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096 public String toString() {
sakalb6760f92016-09-29 04:12:44 -070097 return "[" + label() + ":A=" + audioTracks.size() + ":V=" + videoTracks.size() + "]";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098 }
99
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100100 @CalledByNative
101 void addNativeAudioTrack(long nativeTrack) {
102 audioTracks.add(new AudioTrack(nativeTrack));
103 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100105 @CalledByNative
106 void addNativeVideoTrack(long nativeTrack) {
107 videoTracks.add(new VideoTrack(nativeTrack));
108 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100110 @CalledByNative
111 void removeAudioTrack(long nativeTrack) {
112 removeMediaStreamTrack(audioTracks, nativeTrack);
113 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100115 @CalledByNative
116 void removeVideoTrack(long nativeTrack) {
117 removeMediaStreamTrack(videoTracks, nativeTrack);
118 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119
Magnus Jedvert6a0345b2017-11-27 11:23:42 +0100120 private static void removeMediaStreamTrack(
121 List<? extends MediaStreamTrack> tracks, long nativeTrack) {
122 final Iterator<? extends MediaStreamTrack> it = tracks.iterator();
123 while (it.hasNext()) {
124 MediaStreamTrack track = it.next();
125 if (track.nativeTrack == nativeTrack) {
126 track.dispose();
127 it.remove();
128 return;
129 }
130 }
131 Logging.e(TAG, "Couldn't not find track");
132 }
133
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100134 private static native boolean nativeAddAudioTrackToNativeStream(
135 long stream, long nativeAudioTrack);
136 private static native boolean nativeAddVideoTrackToNativeStream(
137 long stream, long nativeVideoTrack);
138 private static native boolean nativeRemoveAudioTrack(long stream, long nativeAudioTrack);
139 private static native boolean nativeRemoveVideoTrack(long stream, long nativeVideoTrack);
140 private static native String nativeGetLabel(long stream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141}