Index: webrtc/sdk/android/src/jni/peerconnection_jni.cc |
diff --git a/webrtc/sdk/android/src/jni/peerconnection_jni.cc b/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
index 6416a1748987f8ea39bfaa282624e7d961c16310..d22c0a32e7ce63ee9996bf13476949b7b96544a7 100644 |
--- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
+++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
@@ -99,6 +99,7 @@ using webrtc::PeerConnectionFactoryInterface; |
using webrtc::PeerConnectionInterface; |
using webrtc::PeerConnectionObserver; |
using webrtc::RtpReceiverInterface; |
+using webrtc::RtpReceiverObserverInterface; |
using webrtc::RtpSenderInterface; |
using webrtc::SessionDescriptionInterface; |
using webrtc::SetSessionDescriptionObserver; |
@@ -829,6 +830,46 @@ class JavaVideoRendererWrapper |
ScopedGlobalRef<jclass> j_byte_buffer_class_; |
}; |
+// Adapter between the C++ RtpReceiverObserverInterface and the Java |
+// RtpReceiver.Observer interface. Wraps an instance of the Java interface and |
+// dispatches C++ callbacks to Java. |
+class RtpReceiverObserver : public RtpReceiverObserverInterface { |
+ public: |
+ RtpReceiverObserver(JNIEnv* jni, jobject j_observer) |
+ : j_observer_global_(jni, j_observer) {} |
+ |
+ ~RtpReceiverObserver() override {} |
+ |
+ void OnFirstPacketReceived(cricket::MediaType media_type) override { |
+ JNIEnv* const jni = AttachCurrentThreadIfNeeded(); |
+ |
+ jmethodID j_on_first_packet_received_mid = GetMethodID( |
+ jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived", |
+ "(Lorg/webrtc/MediaStreamTrack$MediaType;)V"); |
+ // Get the Java version of media type. |
+ jclass j_media_type_class = |
+ FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); |
+ |
+ RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO || |
+ media_type == cricket::MEDIA_TYPE_VIDEO) |
+ << "Media type: " << media_type; |
+ const char* media_type_str = media_type == cricket::MEDIA_TYPE_AUDIO |
+ ? "MEDIA_TYPE_AUDIO" |
+ : "MEDIA_TYPE_VIDEO"; |
+ jfieldID j_media_type_fid = |
+ GetStaticFieldID(jni, j_media_type_class, media_type_str, |
+ "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
+ jobject JavaMediaType = |
+ GetStaticObjectField(jni, j_media_type_class, j_media_type_fid); |
+ // Trigger the callback function. |
+ jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid, |
+ JavaMediaType); |
+ CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; |
+ } |
+ |
+ private: |
+ const ScopedGlobalRef<jobject> j_observer_global_; |
+}; |
static DataChannelInterface* ExtractNativeDC(JNIEnv* jni, jobject j_dc) { |
jfieldID native_dc_id = GetFieldID(jni, |
@@ -2382,20 +2423,20 @@ JOW(jlong, RtpReceiver_nativeGetTrack)(JNIEnv* jni, |
} |
JOW(jboolean, RtpReceiver_nativeSetParameters) |
-(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) { |
+(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer, jobject j_parameters) { |
if (IsNull(jni, j_parameters)) { |
return false; |
} |
webrtc::RtpParameters parameters; |
JavaRtpParametersToJsepRtpParameters(jni, j_parameters, ¶meters); |
- return reinterpret_cast<RtpReceiverInterface*>(j_rtp_sender_pointer) |
+ return reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) |
->SetParameters(parameters); |
} |
JOW(jobject, RtpReceiver_nativeGetParameters) |
-(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer) { |
+(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { |
webrtc::RtpParameters parameters = |
- reinterpret_cast<RtpReceiverInterface*>(j_rtp_sender_pointer) |
+ reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) |
->GetParameters(); |
return JsepRtpParametersToJavaRtpParameters(jni, parameters); |
} |
@@ -2407,8 +2448,29 @@ JOW(jstring, RtpReceiver_nativeId)( |
reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id()); |
} |
-JOW(void, RtpReceiver_free)(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { |
+JOW(void, RtpReceiver_free) |
+(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { |
reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->Release(); |
} |
+JOW(jlong, RtpReceiver_nativeSetObserver) |
+(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer, jobject j_observer) { |
+ RtpReceiverObserver* rtpReceiverObserver = |
+ new RtpReceiverObserver(jni, j_observer); |
+ reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) |
+ ->SetObserver(rtpReceiverObserver); |
+ return jlongFromPointer(rtpReceiverObserver); |
+} |
+ |
+JOW(void, RtpReceiver_nativeUnsetObserver) |
+(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer, jlong j_observer_pointer) { |
+ reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) |
+ ->SetObserver(nullptr); |
+ RtpReceiverObserver* observer = |
+ reinterpret_cast<RtpReceiverObserver*>(j_observer_pointer); |
+ if (observer) { |
+ delete observer; |
+ } |
+} |
+ |
} // namespace webrtc_jni |