blob: a00c0bca212cfbc15e910494ab71ceab8badd97d [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
13import java.util.LinkedList;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000014
15/** Java wrapper for a C++ MediaStreamInterface. */
16public class MediaStream {
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000017 public final LinkedList<AudioTrack> audioTracks;
18 public final LinkedList<VideoTrack> videoTracks;
Alex Glaznev32b5d232015-09-15 11:09:34 -070019 public final LinkedList<VideoTrack> preservedVideoTracks;
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000020 // Package-protected for PeerConnection.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021 final long nativeStream;
22
23 public MediaStream(long nativeStream) {
24 audioTracks = new LinkedList<AudioTrack>();
25 videoTracks = new LinkedList<VideoTrack>();
Alex Glaznev32b5d232015-09-15 11:09:34 -070026 preservedVideoTracks = new LinkedList<VideoTrack>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027 this.nativeStream = nativeStream;
28 }
29
30 public boolean addTrack(AudioTrack track) {
31 if (nativeAddAudioTrack(nativeStream, track.nativeTrack)) {
32 audioTracks.add(track);
33 return true;
34 }
35 return false;
36 }
37
38 public boolean addTrack(VideoTrack track) {
39 if (nativeAddVideoTrack(nativeStream, track.nativeTrack)) {
40 videoTracks.add(track);
41 return true;
42 }
43 return false;
44 }
45
Alex Glaznev32b5d232015-09-15 11:09:34 -070046 // Tracks added in addTrack() call will be auto released once MediaStream.dispose()
47 // is called. If video track need to be preserved after MediaStream is destroyed it
48 // should be added to MediaStream using addPreservedTrack() call.
49 public boolean addPreservedTrack(VideoTrack track) {
50 if (nativeAddVideoTrack(nativeStream, track.nativeTrack)) {
51 preservedVideoTracks.add(track);
52 return true;
53 }
54 return false;
55 }
56
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 public boolean removeTrack(AudioTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080058 audioTracks.remove(track);
59 return nativeRemoveAudioTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 }
61
62 public boolean removeTrack(VideoTrack track) {
deadbeef6ecee072016-02-11 09:57:23 -080063 videoTracks.remove(track);
64 preservedVideoTracks.remove(track);
65 return nativeRemoveVideoTrack(nativeStream, track.nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066 }
67
68 public void dispose() {
Alex Glaznev32b5d232015-09-15 11:09:34 -070069 // Remove and release previously added audio and video tracks.
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000070 while (!audioTracks.isEmpty()) {
71 AudioTrack track = audioTracks.getFirst();
72 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 track.dispose();
74 }
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000075 while (!videoTracks.isEmpty()) {
76 VideoTrack track = videoTracks.getFirst();
77 removeTrack(track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078 track.dispose();
79 }
Alex Glaznev32b5d232015-09-15 11:09:34 -070080 // Remove, but do not release preserved video tracks.
81 while (!preservedVideoTracks.isEmpty()) {
82 removeTrack(preservedVideoTracks.getFirst());
83 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 free(nativeStream);
85 }
86
87 public String label() {
88 return nativeLabel(nativeStream);
89 }
90
Sami Kalliomäkibde473e2017-10-30 13:34:41 +010091 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 public String toString() {
sakalb6760f92016-09-29 04:12:44 -070093 return "[" + label() + ":A=" + audioTracks.size() + ":V=" + videoTracks.size() + "]";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 }
95
sakalb6760f92016-09-29 04:12:44 -070096 private static native boolean nativeAddAudioTrack(long nativeStream, long nativeAudioTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097
sakalb6760f92016-09-29 04:12:44 -070098 private static native boolean nativeAddVideoTrack(long nativeStream, long nativeVideoTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099
sakalb6760f92016-09-29 04:12:44 -0700100 private static native boolean nativeRemoveAudioTrack(long nativeStream, long nativeAudioTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101
sakalb6760f92016-09-29 04:12:44 -0700102 private static native boolean nativeRemoveVideoTrack(long nativeStream, long nativeVideoTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103
104 private static native String nativeLabel(long nativeStream);
105
106 private static native void free(long nativeStream);
107}