blob: e3a38472c9092ea72047e74efdeffb7bbf69245b [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;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000014import java.util.LinkedList;
15
16/** Java version of VideoTrackInterface. */
17public class VideoTrack extends MediaStreamTrack {
sakalb6760f92016-09-29 04:12:44 -070018 private final LinkedList<VideoRenderer> renderers = new LinkedList<VideoRenderer>();
sakal0ba43b52017-08-14 05:17:49 -070019 private final IdentityHashMap<VideoSink, Long> sinks = new IdentityHashMap<VideoSink, Long>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020
21 public VideoTrack(long nativeTrack) {
22 super(nativeTrack);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000023 }
24
sakal0ba43b52017-08-14 05:17:49 -070025 /**
26 * Adds a VideoSink to the track.
27 *
28 * A track can have any number of VideoSinks. VideoSinks will replace
29 * renderers. However, converting old style texture frames will involve costly
30 * conversion to I420 so it is not recommended to upgrade before all your
31 * sources produce VideoFrames.
32 */
33 public void addSink(VideoSink sink) {
34 final long nativeSink = nativeWrapSink(sink);
35 sinks.put(sink, nativeSink);
36 nativeAddSink(nativeTrack, nativeSink);
37 }
38
39 /**
40 * Removes a VideoSink from the track.
41 *
42 * If the VideoSink was not attached to the track, this is a no-op.
43 */
44 public void removeSink(VideoSink sink) {
45 final long nativeSink = sinks.remove(sink);
46 if (nativeSink != 0) {
47 nativeRemoveSink(nativeTrack, nativeSink);
48 nativeFreeSink(nativeSink);
49 }
50 }
51
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052 public void addRenderer(VideoRenderer renderer) {
53 renderers.add(renderer);
sakal0ba43b52017-08-14 05:17:49 -070054 nativeAddSink(nativeTrack, renderer.nativeVideoRenderer);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055 }
56
57 public void removeRenderer(VideoRenderer renderer) {
58 if (!renderers.remove(renderer)) {
59 return;
60 }
sakal0ba43b52017-08-14 05:17:49 -070061 nativeRemoveSink(nativeTrack, renderer.nativeVideoRenderer);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 renderer.dispose();
63 }
64
Sami Kalliomäkibde473e2017-10-30 13:34:41 +010065 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066 public void dispose() {
67 while (!renderers.isEmpty()) {
68 removeRenderer(renderers.getFirst());
69 }
sakal0ba43b52017-08-14 05:17:49 -070070 for (long nativeSink : sinks.values()) {
71 nativeRemoveSink(nativeTrack, nativeSink);
72 nativeFreeSink(nativeSink);
73 }
74 sinks.clear();
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000075 super.dispose();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000076 }
77
sakal0ba43b52017-08-14 05:17:49 -070078 private static native void nativeAddSink(long nativeTrack, long nativeSink);
79 private static native void nativeRemoveSink(long nativeTrack, long nativeSink);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080
sakal0ba43b52017-08-14 05:17:49 -070081 private static native long nativeWrapSink(VideoSink sink);
82 private static native void nativeFreeSink(long nativeSink);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083}