Index: webrtc/sdk/android/api/org/webrtc/VideoTrack.java |
diff --git a/webrtc/sdk/android/api/org/webrtc/VideoTrack.java b/webrtc/sdk/android/api/org/webrtc/VideoTrack.java |
index 8118940a0318753b4d4bc9cc9e1882a6d4841799..18a826cb730f76f3c8ae10cf195fc0b5a21d8dd1 100644 |
--- a/webrtc/sdk/android/api/org/webrtc/VideoTrack.java |
+++ b/webrtc/sdk/android/api/org/webrtc/VideoTrack.java |
@@ -10,26 +10,55 @@ |
package org.webrtc; |
+import java.util.IdentityHashMap; |
import java.util.LinkedList; |
/** Java version of VideoTrackInterface. */ |
public class VideoTrack extends MediaStreamTrack { |
private final LinkedList<VideoRenderer> renderers = new LinkedList<VideoRenderer>(); |
+ private final IdentityHashMap<VideoSink, Long> sinks = new IdentityHashMap<VideoSink, Long>(); |
public VideoTrack(long nativeTrack) { |
super(nativeTrack); |
} |
+ /** |
+ * Adds a VideoSink to the track. |
+ * |
+ * A track can have any number of VideoSinks. VideoSinks will replace |
+ * renderers. However, converting old style texture frames will involve costly |
+ * conversion to I420 so it is not recommended to upgrade before all your |
+ * sources produce VideoFrames. |
+ */ |
+ public void addSink(VideoSink sink) { |
+ final long nativeSink = nativeWrapSink(sink); |
+ sinks.put(sink, nativeSink); |
+ nativeAddSink(nativeTrack, nativeSink); |
+ } |
+ |
+ /** |
+ * Removes a VideoSink from the track. |
+ * |
+ * If the VideoSink was not attached to the track, this is a no-op. |
+ */ |
+ public void removeSink(VideoSink sink) { |
+ final long nativeSink = sinks.remove(sink); |
+ if (nativeSink != 0) { |
+ nativeRemoveSink(nativeTrack, nativeSink); |
+ nativeFreeSink(nativeSink); |
+ } |
+ } |
+ |
public void addRenderer(VideoRenderer renderer) { |
renderers.add(renderer); |
- nativeAddRenderer(nativeTrack, renderer.nativeVideoRenderer); |
+ nativeAddSink(nativeTrack, renderer.nativeVideoRenderer); |
} |
public void removeRenderer(VideoRenderer renderer) { |
if (!renderers.remove(renderer)) { |
return; |
} |
- nativeRemoveRenderer(nativeTrack, renderer.nativeVideoRenderer); |
+ nativeRemoveSink(nativeTrack, renderer.nativeVideoRenderer); |
renderer.dispose(); |
} |
@@ -37,10 +66,17 @@ public class VideoTrack extends MediaStreamTrack { |
while (!renderers.isEmpty()) { |
removeRenderer(renderers.getFirst()); |
} |
+ for (long nativeSink : sinks.values()) { |
+ nativeRemoveSink(nativeTrack, nativeSink); |
+ nativeFreeSink(nativeSink); |
+ } |
+ sinks.clear(); |
super.dispose(); |
} |
- private static native void nativeAddRenderer(long nativeTrack, long nativeRenderer); |
+ private static native void nativeAddSink(long nativeTrack, long nativeSink); |
+ private static native void nativeRemoveSink(long nativeTrack, long nativeSink); |
- private static native void nativeRemoveRenderer(long nativeTrack, long nativeRenderer); |
+ private static native long nativeWrapSink(VideoSink sink); |
+ private static native void nativeFreeSink(long nativeSink); |
} |