Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: webrtc/sdk/android/api/org/webrtc/VideoTrack.java

Issue 3002553002: Add support for adding VideoSinks to VideoTracks. (Closed)
Patch Set: Add documentation, fix bug. Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}
« no previous file with comments | « webrtc/sdk/android/api/org/webrtc/VideoSink.java ('k') | webrtc/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698