blob: 7839a03998ffee24af542bdad6e582e3bce33ca2 [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. */
18public class VideoTrack extends MediaStreamTrack {
Magnus Jedvert6062f372017-11-16 16:53:12 +010019 private final List<VideoRenderer> renderers = new ArrayList<>();
sakal0ba43b52017-08-14 05:17:49 -070020 private final IdentityHashMap<VideoSink, Long> sinks = new IdentityHashMap<VideoSink, Long>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021
22 public VideoTrack(long nativeTrack) {
23 super(nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000024 }
25
sakal0ba43b52017-08-14 05:17:49 -070026 /**
27 * Adds a VideoSink to the track.
28 *
29 * A track can have any number of VideoSinks. VideoSinks will replace
30 * renderers. However, converting old style texture frames will involve costly
31 * conversion to I420 so it is not recommended to upgrade before all your
32 * sources produce VideoFrames.
33 */
34 public void addSink(VideoSink sink) {
35 final long nativeSink = nativeWrapSink(sink);
36 sinks.put(sink, nativeSink);
37 nativeAddSink(nativeTrack, nativeSink);
38 }
39
40 /**
41 * Removes a VideoSink from the track.
42 *
43 * If the VideoSink was not attached to the track, this is a no-op.
44 */
45 public void removeSink(VideoSink sink) {
46 final long nativeSink = sinks.remove(sink);
47 if (nativeSink != 0) {
48 nativeRemoveSink(nativeTrack, nativeSink);
49 nativeFreeSink(nativeSink);
50 }
51 }
52
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053 public void addRenderer(VideoRenderer renderer) {
54 renderers.add(renderer);
sakal0ba43b52017-08-14 05:17:49 -070055 nativeAddSink(nativeTrack, renderer.nativeVideoRenderer);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056 }
57
58 public void removeRenderer(VideoRenderer renderer) {
59 if (!renderers.remove(renderer)) {
60 return;
61 }
sakal0ba43b52017-08-14 05:17:49 -070062 nativeRemoveSink(nativeTrack, renderer.nativeVideoRenderer);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 renderer.dispose();
64 }
65
Sami Kalliomäkibde473e2017-10-30 13:34:41 +010066 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067 public void dispose() {
Magnus Jedvert6062f372017-11-16 16:53:12 +010068 for (VideoRenderer renderer : renderers) {
69 nativeRemoveSink(nativeTrack, renderer.nativeVideoRenderer);
70 renderer.dispose();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 }
Magnus Jedvert6062f372017-11-16 16:53:12 +010072 renderers.clear();
sakal0ba43b52017-08-14 05:17:49 -070073 for (long nativeSink : sinks.values()) {
74 nativeRemoveSink(nativeTrack, nativeSink);
75 nativeFreeSink(nativeSink);
76 }
77 sinks.clear();
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000078 super.dispose();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079 }
80
sakal0ba43b52017-08-14 05:17:49 -070081 private static native void nativeAddSink(long nativeTrack, long nativeSink);
82 private static native void nativeRemoveSink(long nativeTrack, long nativeSink);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083
sakal0ba43b52017-08-14 05:17:49 -070084 private static native long nativeWrapSink(VideoSink sink);
85 private static native void nativeFreeSink(long nativeSink);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086}