blob: 798dd9944ebce13863d0a87bebddb6acd991617d [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;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015
16/** Java wrapper for a C++ MediaStreamInterface. */
17public class MediaStream {
Magnus Jedvert6062f372017-11-16 16:53:12 +010018 public final List<AudioTrack> audioTracks = new ArrayList<>();
19 public final List<VideoTrack> videoTracks = new ArrayList<>();
20 public final List<VideoTrack> preservedVideoTracks = new ArrayList<>();
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000021 // Package-protected for PeerConnection.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022 final long nativeStream;
23
24 public MediaStream(long nativeStream) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025 this.nativeStream = nativeStream;
26 }
27
28 public boolean addTrack(AudioTrack track) {
29 if (nativeAddAudioTrack(nativeStream, track.nativeTrack)) {
30 audioTracks.add(track);
31 return true;
32 }
33 return false;
34 }
35
36 public boolean addTrack(VideoTrack track) {
37 if (nativeAddVideoTrack(nativeStream, track.nativeTrack)) {
38 videoTracks.add(track);
39 return true;
40 }
41 return false;
42 }
43
Alex Glaznev32b5d232015-09-15 11:09:34 -070044 // Tracks added in addTrack() call will be auto released once MediaStream.dispose()
45 // is called. If video track need to be preserved after MediaStream is destroyed it
46 // should be added to MediaStream using addPreservedTrack() call.
47 public boolean addPreservedTrack(VideoTrack track) {
48 if (nativeAddVideoTrack(nativeStream, track.nativeTrack)) {
49 preservedVideoTracks.add(track);
50 return true;
51 }
52 return false;
53 }
54
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055 public boolean removeTrack(AudioTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080056 audioTracks.remove(track);
57 return nativeRemoveAudioTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 }
59
60 public boolean removeTrack(VideoTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080061 videoTracks.remove(track);
62 preservedVideoTracks.remove(track);
63 return nativeRemoveVideoTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 }
65
66 public void dispose() {
Alex Glaznev32b5d232015-09-15 11:09:34 -070067 // Remove and release previously added audio and video tracks.
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000068 while (!audioTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010069 AudioTrack track = audioTracks.get(0 /* index */);
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000070 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 track.dispose();
72 }
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000073 while (!videoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010074 VideoTrack track = videoTracks.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 }
Alex Glaznev32b5d232015-09-15 11:09:34 -070078 // Remove, but do not release preserved video tracks.
79 while (!preservedVideoTracks.isEmpty()) {
Magnus Jedvert6062f372017-11-16 16:53:12 +010080 removeTrack(preservedVideoTracks.get(0 /* index */));
Alex Glaznev32b5d232015-09-15 11:09:34 -070081 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 free(nativeStream);
83 }
84
85 public String label() {
86 return nativeLabel(nativeStream);
87 }
88
Sami Kalliomäkibde473e2017-10-30 13:34:41 +010089 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090 public String toString() {
sakalb6760f92016-09-29 04:12:44 -070091 return "[" + label() + ":A=" + audioTracks.size() + ":V=" + videoTracks.size() + "]";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 }
93
sakalb6760f92016-09-29 04:12:44 -070094 private static native boolean nativeAddAudioTrack(long nativeStream, long nativeAudioTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095
sakalb6760f92016-09-29 04:12:44 -070096 private static native boolean nativeAddVideoTrack(long nativeStream, long nativeVideoTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097
sakalb6760f92016-09-29 04:12:44 -070098 private static native boolean nativeRemoveAudioTrack(long nativeStream, long nativeAudioTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099
sakalb6760f92016-09-29 04:12:44 -0700100 private static native boolean nativeRemoveVideoTrack(long nativeStream, long nativeVideoTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101
102 private static native String nativeLabel(long nativeStream);
103
104 private static native void free(long nativeStream);
105}