| 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);
|
| }
|
|
|