From ffbfba979f9d48176c7ed5dcc60b6a8076303b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Tue, 25 May 2021 10:35:10 +0200 Subject: [PATCH] Added `PeerConnectionObserverJni::OnRemoveTrack()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I0880caa77a1097f56c560152e85c9ca29242f825 This PR add support for the `PeerConnectionObserverJni::OnRemoveTrack()` event on Java, allowing to be notified when a remote track has been removed. It's a very thing JNI wrapper on top of C++ API, being mostly similar to other already available events like `track` and `addTrack`. In Javascript API, tracks are not "removed" explicitly from the PeerConnection, but instead receiver PeerConnection gets notified that they have been removed from the streams they are associated to, and when no `MediaStream` object has that track, it's considered that the track has been removed from the PeerConnection. In Java and C++ APIs there's no `MediaStreamObserver` class, so there's no way to listen to the `removeTrack` event the same way happens in Javascript API, but instead C++ API has a `removeTrack` event at PeerConnection level. This patchset just only wraps and expose this `removeTrack` event from the C++ API to the Java API. This PR has been sponsored by Atos Research and Innovation (https://atos.net/en/about-us/innovation-and-research). Bug: webrtc:12850 Change-Id: I0880caa77a1097f56c560152e85c9ca29242f825 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/218847 Reviewed-by: Harald Alvestrand Reviewed-by: Xavier Lepaul‎ Commit-Queue: Harald Alvestrand Cr-Commit-Position: refs/heads/master@{#34225} --- AUTHORS | 1 + .../src/org/appspot/apprtc/PeerConnectionClient.java | 3 +++ sdk/android/api/org/webrtc/PeerConnection.java | 9 ++++++++- sdk/android/src/jni/pc/peer_connection.cc | 10 ++++++++++ sdk/android/src/jni/pc/peer_connection.h | 2 ++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 64488bfc62..b4d4100c6a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -53,6 +53,7 @@ James H. Brown Jan Grulich Jan Kalab Jens Nielsen +Jesús Leganés-Combarro Jiawei Ou Jie Mao Jiwon Kim diff --git a/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java b/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java index 31e6e9722b..b3282a6955 100644 --- a/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java +++ b/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java @@ -1316,6 +1316,9 @@ public class PeerConnectionClient { @Override public void onAddTrack(final RtpReceiver receiver, final MediaStream[] mediaStreams) {} + + @Override + public void onRemoveTrack(final RtpReceiver receiver) {} } // Implementation detail: handle offer creation/signaling and answer setting, diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java index 38d2d38deb..67705ba3d5 100644 --- a/sdk/android/api/org/webrtc/PeerConnection.java +++ b/sdk/android/api/org/webrtc/PeerConnection.java @@ -141,7 +141,14 @@ public class PeerConnection { * Triggered when a new track is signaled by the remote peer, as a result of * setRemoteDescription. */ - @CalledByNative("Observer") void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams); + @CalledByNative("Observer") + default void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams){}; + + /** + * Triggered when a previously added remote track is removed by the remote + * peer, as a result of setRemoteDescription. + */ + @CalledByNative("Observer") default void onRemoveTrack(RtpReceiver receiver){}; /** * Triggered when the signaling from SetRemoteDescription indicates that a transceiver diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc index cee7a58a15..09b8f33edb 100644 --- a/sdk/android/src/jni/pc/peer_connection.cc +++ b/sdk/android/src/jni/pc/peer_connection.cc @@ -410,6 +410,16 @@ void PeerConnectionObserverJni::OnAddTrack( NativeToJavaMediaStreamArray(env, streams)); } +void PeerConnectionObserverJni::OnRemoveTrack( + rtc::scoped_refptr receiver) { + JNIEnv* env = AttachCurrentThreadIfNeeded(); + ScopedJavaLocalRef j_rtp_receiver = + NativeToJavaRtpReceiver(env, receiver); + rtp_receivers_.emplace_back(env, j_rtp_receiver); + + Java_Observer_onRemoveTrack(env, j_observer_global_, j_rtp_receiver); +} + void PeerConnectionObserverJni::OnTrack( rtc::scoped_refptr transceiver) { JNIEnv* env = AttachCurrentThreadIfNeeded(); diff --git a/sdk/android/src/jni/pc/peer_connection.h b/sdk/android/src/jni/pc/peer_connection.h index a9e2af2a47..86d99f31c4 100644 --- a/sdk/android/src/jni/pc/peer_connection.h +++ b/sdk/android/src/jni/pc/peer_connection.h @@ -72,6 +72,8 @@ class PeerConnectionObserverJni : public PeerConnectionObserver { streams) override; void OnTrack( rtc::scoped_refptr transceiver) override; + void OnRemoveTrack( + rtc::scoped_refptr receiver) override; private: typedef std::map