Index: talk/app/webrtc/java/src/org/webrtc/MediaStream.java |
diff --git a/talk/app/webrtc/java/src/org/webrtc/MediaStream.java b/talk/app/webrtc/java/src/org/webrtc/MediaStream.java |
index aa5b3e0697bd229afbb8f39101abab465fd497a4..be00f13e674580c6ccd7553557e9e738f7adc8cd 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<AudioTrack> audioTracks; |
public final LinkedList<VideoTrack> videoTracks; |
+ public final LinkedList<VideoTrack> preservedVideoTracks; |
// Package-protected for PeerConnection. |
final long nativeStream; |
public MediaStream(long nativeStream) { |
audioTracks = new LinkedList<AudioTrack>(); |
videoTracks = new LinkedList<VideoTrack>(); |
+ preservedVideoTracks = new LinkedList<VideoTrack>(); |
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); |
} |