diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java index 724f70468d..007f9c0099 100644 --- a/sdk/android/api/org/webrtc/PeerConnection.java +++ b/sdk/android/api/org/webrtc/PeerConnection.java @@ -1176,6 +1176,14 @@ public void getStats(RTCStatsCollectorCallback callback) { nativeNewGetStats(callback); } + public void getStats(RTCStatsCollectorCallback callback, RtpSender sender) { + nativeNewGetStatsForSender(callback, sender.getNativeRtpSender()); + } + + public void getStats(RTCStatsCollectorCallback callback, RtpReceiver receiver) { + nativeNewGetStatsForReceiver(callback, receiver.getNativeRtpReceiver()); + } + /** * Limits the bandwidth allocated for all RTP streams sent by this * PeerConnection. Pass null to leave a value unchanged. @@ -1310,6 +1318,10 @@ private native void nativeAddIceCandidateWithObserver( private native void nativeRemoveLocalStream(long stream); private native boolean nativeOldGetStats(StatsObserver observer, long nativeTrack); private native void nativeNewGetStats(RTCStatsCollectorCallback callback); + private native void nativeNewGetStatsForSender( + RTCStatsCollectorCallback callback, long nativeRtpSender); + private native void nativeNewGetStatsForReceiver( + RTCStatsCollectorCallback callback, long nativeRtpReceiver); private native RtpSender nativeCreateSender(String kind, String stream_id); private native List nativeGetSenders(); private native List nativeGetReceivers(); diff --git a/sdk/android/api/org/webrtc/RtpReceiver.java b/sdk/android/api/org/webrtc/RtpReceiver.java index a5710f92e3..8aabc7d905 100644 --- a/sdk/android/api/org/webrtc/RtpReceiver.java +++ b/sdk/android/api/org/webrtc/RtpReceiver.java @@ -75,6 +75,12 @@ public void setFrameDecryptor(FrameDecryptor frameDecryptor) { nativeSetFrameDecryptor(nativeRtpReceiver, frameDecryptor.getNativeFrameDecryptor()); } + /** Returns a pointer to webrtc::RtpReceiverInterface. */ + long getNativeRtpReceiver() { + checkRtpReceiverExists(); + return nativeRtpReceiver; + } + private void checkRtpReceiverExists() { if (nativeRtpReceiver == 0) { throw new IllegalStateException("RtpReceiver has been disposed."); diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc index 502763a2d0..f0fab154bc 100644 --- a/sdk/android/src/jni/pc/peer_connection.cc +++ b/sdk/android/src/jni/pc/peer_connection.cc @@ -842,6 +842,30 @@ static void JNI_PeerConnection_NewGetStats( ExtractNativePC(jni, j_pc)->GetStats(callback.get()); } +static void JNI_PeerConnection_NewGetStatsForSender( + JNIEnv* jni, + const JavaParamRef& j_pc, + const JavaParamRef& j_callback, + jlong native_sener) { + auto callback = + rtc::make_ref_counted(jni, j_callback); + rtc::scoped_refptr selector( + reinterpret_cast(native_sener)); + ExtractNativePC(jni, j_pc)->GetStats(selector, callback); +} + +static void JNI_PeerConnection_NewGetStatsForReceiver( + JNIEnv* jni, + const JavaParamRef& j_pc, + const JavaParamRef& j_callback, + jlong native_receiver) { + auto callback = + rtc::make_ref_counted(jni, j_callback); + rtc::scoped_refptr selector( + reinterpret_cast(native_receiver)); + ExtractNativePC(jni, j_pc)->GetStats(selector, callback); +} + static jboolean JNI_PeerConnection_SetBitrate( JNIEnv* jni, const JavaParamRef& j_pc,