blob: 18a826cb730f76f3c8ae10cf195fc0b5a21d8dd1 [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
65 public void dispose() {
66 while (!renderers.isEmpty()) {
67 removeRenderer(renderers.getFirst());
68 }
sakal0ba43b52017-08-14 05:17:49 -070069 for (long nativeSink : sinks.values()) {
70 nativeRemoveSink(nativeTrack, nativeSink);
71 nativeFreeSink(nativeSink);
72 }
73 sinks.clear();
fischman@webrtc.org32001ef2013-08-12 23:26:21 +000074 super.dispose();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 }
76
sakal0ba43b52017-08-14 05:17:49 -070077 private static native void nativeAddSink(long nativeTrack, long nativeSink);
78 private static native void nativeRemoveSink(long nativeTrack, long nativeSink);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079
sakal0ba43b52017-08-14 05:17:49 -070080 private static native long nativeWrapSink(VideoSink sink);
81 private static native void nativeFreeSink(long nativeSink);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082}