blob: e0eebeda0d842d94c0b106089399f9c0cf2dd6a7 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
11package org.webrtc;
12
sakal0ba43b52017-08-14 05:17:49 -070013import java.util.IdentityHashMap;
Magnus Jedvert6062f372017-11-16 16:53:12 +010014import java.util.ArrayList;
15import java.util.List;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
17/** Java version of VideoTrackInterface. */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010018@JNINamespace("webrtc::jni")
henrike@webrtc.org28e20752013-07-10 00:45:36 +000019public class VideoTrack extends MediaStreamTrack {
Magnus Jedvert6062f372017-11-16 16:53:12 +010020 private final List<VideoRenderer> renderers = new ArrayList<>();
sakal0ba43b52017-08-14 05:17:49 -070021 private final IdentityHashMap<VideoSink, Long> sinks = new IdentityHashMap<VideoSink, Long>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022
23 public VideoTrack(long nativeTrack) {
24 super(nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025 }
26
sakal0ba43b52017-08-14 05:17:49 -070027 /**
28 * Adds a VideoSink to the track.
29 *
30 * A track can have any number of VideoSinks. VideoSinks will replace
31 * renderers. However, converting old style texture frames will involve costly
32 * conversion to I420 so it is not recommended to upgrade before all your
33 * sources produce VideoFrames.
34 */
35 public void addSink(VideoSink sink) {
36 final long nativeSink = nativeWrapSink(sink);
37 sinks.put(sink, nativeSink);
38 nativeAddSink(nativeTrack, nativeSink);
39 }
40
41 /**
42 * Removes a VideoSink from the track.
43 *
44 * If the VideoSink was not attached to the track, this is a no-op.
45 */
46 public void removeSink(VideoSink sink) {
47 final long nativeSink = sinks.remove(sink);
48 if (nativeSink != 0) {
49 nativeRemoveSink(nativeTrack, nativeSink);
50 nativeFreeSink(nativeSink);
51 }
52 }
53
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054 public void addRenderer(VideoRenderer renderer) {
55 renderers.add(renderer);
sakal0ba43b52017-08-14 05:17:49 -070056 nativeAddSink(nativeTrack, renderer.nativeVideoRenderer);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 }
58
59 public void removeRenderer(VideoRenderer renderer) {
60 if (!renderers.remove(renderer)) {
61 return;
62 }
sakal0ba43b52017-08-14 05:17:49 -070063 nativeRemoveSink(nativeTrack, renderer.nativeVideoRenderer);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 renderer.dispose();
65 }
66
Sami Kalliomäkibde473e2017-10-30 13:34:41 +010067 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068 public void dispose() {
Magnus Jedvert6062f372017-11-16 16:53:12 +010069 for (VideoRenderer renderer : renderers) {
70 nativeRemoveSink(nativeTrack, renderer.nativeVideoRenderer);
71 renderer.dispose();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 }
Magnus Jedvert6062f372017-11-16 16:53:12 +010073 renderers.clear();
sakal0ba43b52017-08-14 05:17:49 -070074 for (long nativeSink : sinks.values()) {
75 nativeRemoveSink(nativeTrack, nativeSink);
76 nativeFreeSink(nativeSink);
77 }
78 sinks.clear();
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000079 super.dispose();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 }
81
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010082 private static native void nativeAddSink(long track, long nativeSink);
83 private static native void nativeRemoveSink(long track, long nativeSink);
sakal0ba43b52017-08-14 05:17:49 -070084 private static native long nativeWrapSink(VideoSink sink);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +010085 private static native void nativeFreeSink(long sink);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086}