Index: webrtc/sdk/android/src/jni/videotrack_jni.cc |
diff --git a/webrtc/sdk/android/src/jni/videotrack_jni.cc b/webrtc/sdk/android/src/jni/videotrack_jni.cc |
index 96ab92850047f523b0f9bf8ee957d1476fb48bee..9368acffbd81e1df9c7e1e3e5b4977eb618ab089 100644 |
--- a/webrtc/sdk/android/src/jni/videotrack_jni.cc |
+++ b/webrtc/sdk/android/src/jni/videotrack_jni.cc |
@@ -12,31 +12,78 @@ |
#include "webrtc/api/mediastreaminterface.h" |
#include "webrtc/rtc_base/logging.h" |
+#include "webrtc/sdk/android/src/jni/classreferenceholder.h" |
+#include "webrtc/sdk/android/src/jni/jni_helpers.h" |
+#include "webrtc/sdk/android/src/jni/native_handle_impl.h" |
namespace webrtc_jni { |
+namespace { |
+ |
+class VideoSinkWrapper : public rtc::VideoSinkInterface<webrtc::VideoFrame> { |
+ public: |
+ VideoSinkWrapper(JNIEnv* jni, jobject j_sink); |
+ ~VideoSinkWrapper() override {} |
+ |
+ private: |
+ void OnFrame(const webrtc::VideoFrame& frame) override; |
+ |
+ jmethodID j_on_frame_method_; |
+ |
+ const JavaVideoFrameFactory java_video_frame_factory_; |
+ const ScopedGlobalRef<jobject> j_sink_; |
+}; |
+ |
+VideoSinkWrapper::VideoSinkWrapper(JNIEnv* jni, jobject j_sink) |
+ : java_video_frame_factory_(jni), j_sink_(jni, j_sink) { |
+ jclass j_video_sink_class = FindClass(jni, "org/webrtc/VideoSink"); |
+ j_on_frame_method_ = jni->GetMethodID(j_video_sink_class, "onFrame", |
+ "(Lorg/webrtc/VideoFrame;)V"); |
+} |
+ |
+void VideoSinkWrapper::OnFrame(const webrtc::VideoFrame& frame) { |
+ JNIEnv* jni = AttachCurrentThreadIfNeeded(); |
+ ScopedLocalRefFrame local_ref_frame(jni); |
+ jni->CallVoidMethod(*j_sink_, j_on_frame_method_, |
+ java_video_frame_factory_.ToJavaFrame(jni, frame)); |
+} |
+ |
+} // namespace |
+ |
extern "C" JNIEXPORT void JNICALL |
-Java_org_webrtc_VideoTrack_nativeAddRenderer(JNIEnv* jni, |
- jclass, |
- jlong j_video_track_pointer, |
- jlong j_renderer_pointer) { |
- LOG(LS_INFO) << "VideoTrack::nativeAddRenderer"; |
- reinterpret_cast<webrtc::VideoTrackInterface*>(j_video_track_pointer) |
+Java_org_webrtc_VideoTrack_nativeAddSink(JNIEnv* jni, |
+ jclass, |
+ jlong j_native_track, |
+ jlong j_native_sink) { |
+ reinterpret_cast<webrtc::VideoTrackInterface*>(j_native_track) |
->AddOrUpdateSink( |
reinterpret_cast<rtc::VideoSinkInterface<webrtc::VideoFrame>*>( |
- j_renderer_pointer), |
+ j_native_sink), |
rtc::VideoSinkWants()); |
} |
extern "C" JNIEXPORT void JNICALL |
-Java_org_webrtc_VideoTrack_nativeRemoveRenderer(JNIEnv* jni, |
- jclass, |
- jlong j_video_track_pointer, |
- jlong j_renderer_pointer) { |
- reinterpret_cast<webrtc::VideoTrackInterface*>(j_video_track_pointer) |
+Java_org_webrtc_VideoTrack_nativeRemoveSink(JNIEnv* jni, |
+ jclass, |
+ jlong j_native_track, |
+ jlong j_native_sink) { |
+ reinterpret_cast<webrtc::VideoTrackInterface*>(j_native_track) |
->RemoveSink( |
reinterpret_cast<rtc::VideoSinkInterface<webrtc::VideoFrame>*>( |
- j_renderer_pointer)); |
+ j_native_sink)); |
+} |
+ |
+extern "C" JNIEXPORT jlong JNICALL |
+Java_org_webrtc_VideoTrack_nativeWrapSink(JNIEnv* jni, jclass, jobject sink) { |
+ return jlongFromPointer(new VideoSinkWrapper(jni, sink)); |
+} |
+ |
+extern "C" JNIEXPORT void JNICALL |
+Java_org_webrtc_VideoTrack_nativeFreeSink(JNIEnv* jni, |
+ jclass, |
+ jlong j_native_sink) { |
+ delete reinterpret_cast<rtc::VideoSinkInterface<webrtc::VideoFrame>*>( |
+ j_native_sink); |
} |
} // namespace webrtc_jni |