diff --git a/talk/app/webrtc/java/src/org/webrtc/MediaStream.java b/talk/app/webrtc/java/src/org/webrtc/MediaStream.java index aa5b3e0697..be00f13e67 100644 --- a/talk/app/webrtc/java/src/org/webrtc/MediaStream.java +++ b/talk/app/webrtc/java/src/org/webrtc/MediaStream.java @@ -33,12 +33,14 @@ import java.util.LinkedList; public class MediaStream { public final LinkedList audioTracks; public final LinkedList videoTracks; + public final LinkedList preservedVideoTracks; // Package-protected for PeerConnection. final long nativeStream; public MediaStream(long nativeStream) { audioTracks = new LinkedList(); videoTracks = new LinkedList(); + preservedVideoTracks = new LinkedList(); this.nativeStream = nativeStream; } @@ -58,6 +60,17 @@ public class MediaStream { return false; } + // Tracks added in addTrack() call will be auto released once MediaStream.dispose() + // is called. If video track need to be preserved after MediaStream is destroyed it + // should be added to MediaStream using addPreservedTrack() call. + public boolean addPreservedTrack(VideoTrack track) { + if (nativeAddVideoTrack(nativeStream, track.nativeTrack)) { + preservedVideoTracks.add(track); + return true; + } + return false; + } + public boolean removeTrack(AudioTrack track) { if (nativeRemoveAudioTrack(nativeStream, track.nativeTrack)) { audioTracks.remove(track); @@ -69,12 +82,14 @@ public class MediaStream { public boolean removeTrack(VideoTrack track) { if (nativeRemoveVideoTrack(nativeStream, track.nativeTrack)) { videoTracks.remove(track); + preservedVideoTracks.remove(track); return true; } return false; } public void dispose() { + // Remove and release previously added audio and video tracks. while (!audioTracks.isEmpty()) { AudioTrack track = audioTracks.getFirst(); removeTrack(track); @@ -85,6 +100,10 @@ public class MediaStream { removeTrack(track); track.dispose(); } + // Remove, but do not release preserved video tracks. + while (!preservedVideoTracks.isEmpty()) { + removeTrack(preservedVideoTracks.getFirst()); + } free(nativeStream); }