From fa6a283953e64de8bfaa1925beff6ee339415808 Mon Sep 17 00:00:00 2001 From: Jonathan Yu Date: Mon, 12 Feb 2018 17:32:37 -0800 Subject: [PATCH] Add wrapper for VideoSink and VideoFrame to Android native_api. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:8769 Change-Id: If944b2a52a86666bebf094ec0e3c74c076d6c3d2 Reviewed-on: https://webrtc-review.googlesource.com/50740 Commit-Queue: Sami Kalliomäki Reviewed-by: Sami Kalliomäki Reviewed-by: Magnus Jedvert Cr-Commit-Position: refs/heads/master@{#22001} --- sdk/android/BUILD.gn | 20 ++++++++++++ sdk/android/native_api/video/wrapper.cc | 32 +++++++++++++++++++ sdk/android/native_api/video/wrapper.h | 35 +++++++++++++++++++++ sdk/android/src/jni/surfacetexturehelper.h | 2 +- sdk/android/src/jni/videoframe.cc | 8 +++++ sdk/android/src/jni/videoframe.h | 6 ++-- sdk/android/src/jni/videosink.cc | 30 ++++++++++++++++++ sdk/android/src/jni/videosink.h | 36 ++++++++++++++++++++++ sdk/android/src/jni/videotrack.cc | 27 +--------------- 9 files changed, 166 insertions(+), 30 deletions(-) create mode 100644 sdk/android/native_api/video/wrapper.cc create mode 100644 sdk/android/native_api/video/wrapper.h create mode 100644 sdk/android/src/jni/videosink.cc create mode 100644 sdk/android/src/jni/videosink.h diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 9225c6f497..a1c0cbff09 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -212,6 +212,8 @@ rtc_static_library("video_jni") { "src/jni/videoencoderwrapper.h", "src/jni/videoframe.cc", "src/jni/videoframe.h", + "src/jni/videosink.cc", + "src/jni/videosink.h", "src/jni/videotrack.cc", "src/jni/wrapped_native_i420_buffer.cc", "src/jni/wrapped_native_i420_buffer.h", @@ -807,6 +809,7 @@ group("native_api") { ":native_api_base", ":native_api_codecs", ":native_api_jni", + ":native_api_video", ] } @@ -893,6 +896,23 @@ rtc_static_library("native_api_codecs") { ] } +# API for creating C++ wrapper implementations of api/mediastreaminterface.h +# video interfaces from their Java equivalents. +rtc_static_library("native_api_video") { + visibility = [ "*" ] + sources = [ + "native_api/video/wrapper.cc", + "native_api/video/wrapper.h", + ] + deps = [ + ":native_api_jni", + ":video_jni", + "//api:libjingle_peerconnection_api", + "//api:video_frame_api", + "//rtc_base:rtc_base_approved", + ] +} + generate_jni("generated_native_unittests_jni") { testonly = true diff --git a/sdk/android/native_api/video/wrapper.cc b/sdk/android/native_api/video/wrapper.cc new file mode 100644 index 0000000000..0f1bcafa1b --- /dev/null +++ b/sdk/android/native_api/video/wrapper.cc @@ -0,0 +1,32 @@ +/* + * Copyright 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "sdk/android/native_api/video/wrapper.h" + +#include "rtc_base/ptr_util.h" +#include "sdk/android/native_api/jni/scoped_java_ref.h" +#include "sdk/android/src/jni/videoframe.h" +#include "sdk/android/src/jni/videosink.h" + +namespace webrtc { + +std::unique_ptr> JavaToNativeVideoSink( + JNIEnv* jni, + jobject video_sink) { + return rtc::MakeUnique( + jni, JavaParamRef(video_sink)); +} + +ScopedJavaLocalRef NativeToJavaVideoFrame(JNIEnv* jni, + const VideoFrame& frame) { + return jni::NativeToJavaFrame(jni, frame); +} + +} // namespace webrtc diff --git a/sdk/android/native_api/video/wrapper.h b/sdk/android/native_api/video/wrapper.h new file mode 100644 index 0000000000..35c305ca6c --- /dev/null +++ b/sdk/android/native_api/video/wrapper.h @@ -0,0 +1,35 @@ +/* + * Copyright 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef SDK_ANDROID_NATIVE_API_VIDEO_WRAPPER_H_ +#define SDK_ANDROID_NATIVE_API_VIDEO_WRAPPER_H_ + +#include +#include + +#include "api/mediastreaminterface.h" +#include "api/video/video_frame.h" +#include "sdk/android/native_api/jni/scoped_java_ref.h" + +namespace webrtc { + +// Creates an instance of rtc::VideoSinkInterface from Java +// VideoSink. +std::unique_ptr> JavaToNativeVideoSink( + JNIEnv* jni, + jobject video_sink); + +// Creates a Java VideoFrame object from a native VideoFrame. +ScopedJavaLocalRef NativeToJavaVideoFrame(JNIEnv* jni, + const VideoFrame& frame); + +} // namespace webrtc + +#endif // SDK_ANDROID_NATIVE_API_VIDEO_WRAPPER_H_ diff --git a/sdk/android/src/jni/surfacetexturehelper.h b/sdk/android/src/jni/surfacetexturehelper.h index d1cf3b5059..06b396954c 100644 --- a/sdk/android/src/jni/surfacetexturehelper.h +++ b/sdk/android/src/jni/surfacetexturehelper.h @@ -59,7 +59,7 @@ class SurfaceTextureHelper : public rtc::RefCountInterface { void ReturnTextureFrame() const; protected: - ~SurfaceTextureHelper(); + ~SurfaceTextureHelper() override; SurfaceTextureHelper(JNIEnv* jni, const JavaRef& j_surface_texture_helper); diff --git a/sdk/android/src/jni/videoframe.cc b/sdk/android/src/jni/videoframe.cc index 6341b822cb..f638e196b9 100644 --- a/sdk/android/src/jni/videoframe.cc +++ b/sdk/android/src/jni/videoframe.cc @@ -285,6 +285,10 @@ rtc::scoped_refptr AndroidTextureBuffer::ToI420() { return copy; } +AndroidVideoFrameBuffer::AndroidType AndroidTextureBuffer::android_type() { + return AndroidType::kTextureBuffer; +} + rtc::scoped_refptr AndroidVideoBuffer::Adopt( JNIEnv* jni, const JavaRef& j_video_frame_buffer) { @@ -351,6 +355,10 @@ rtc::scoped_refptr AndroidVideoBuffer::ToI420() { return AndroidVideoI420Buffer::Adopt(jni, width_, height_, j_i420_buffer); } +AndroidVideoFrameBuffer::AndroidType AndroidVideoBuffer::android_type() { + return AndroidType::kJavaBuffer; +} + VideoFrame JavaToNativeFrame(JNIEnv* jni, const JavaRef& j_video_frame, uint32_t timestamp_rtp) { diff --git a/sdk/android/src/jni/videoframe.h b/sdk/android/src/jni/videoframe.h index cd293cc6b2..5cb7a2d142 100644 --- a/sdk/android/src/jni/videoframe.h +++ b/sdk/android/src/jni/videoframe.h @@ -84,7 +84,7 @@ class AndroidTextureBuffer : public AndroidVideoFrameBuffer { int height, const NativeHandleImpl& native_handle, const rtc::scoped_refptr& surface_texture_helper); - ~AndroidTextureBuffer(); + ~AndroidTextureBuffer() override; NativeHandleImpl native_handle_impl() const; @@ -95,7 +95,7 @@ class AndroidTextureBuffer : public AndroidVideoFrameBuffer { rtc::scoped_refptr ToI420() override; - AndroidType android_type() override { return AndroidType::kTextureBuffer; } + AndroidType android_type() override; const int width_; const int height_; @@ -143,7 +143,7 @@ class AndroidVideoBuffer : public AndroidVideoFrameBuffer { rtc::scoped_refptr ToI420() override; - AndroidType android_type() override { return AndroidType::kJavaBuffer; } + AndroidType android_type() override; const int width_; const int height_; diff --git a/sdk/android/src/jni/videosink.cc b/sdk/android/src/jni/videosink.cc new file mode 100644 index 0000000000..89d6d2e827 --- /dev/null +++ b/sdk/android/src/jni/videosink.cc @@ -0,0 +1,30 @@ +/* + * Copyright 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "sdk/android/src/jni/videosink.h" + +#include "sdk/android/generated_video_jni/jni/VideoSink_jni.h" +#include "sdk/android/src/jni/videoframe.h" + +namespace webrtc { +namespace jni { + +VideoSinkWrapper::VideoSinkWrapper(JNIEnv* jni, const JavaRef& j_sink) + : j_sink_(jni, j_sink) {} + +VideoSinkWrapper::~VideoSinkWrapper() {} + +void VideoSinkWrapper::OnFrame(const VideoFrame& frame) { + JNIEnv* jni = AttachCurrentThreadIfNeeded(); + Java_VideoSink_onFrame(jni, j_sink_, NativeToJavaFrame(jni, frame)); +} + +} // namespace jni +} // namespace webrtc diff --git a/sdk/android/src/jni/videosink.h b/sdk/android/src/jni/videosink.h new file mode 100644 index 0000000000..7efe44405f --- /dev/null +++ b/sdk/android/src/jni/videosink.h @@ -0,0 +1,36 @@ +/* + * Copyright 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef SDK_ANDROID_SRC_JNI_VIDEOSINK_H_ +#define SDK_ANDROID_SRC_JNI_VIDEOSINK_H_ + +#include + +#include "api/mediastreaminterface.h" +#include "sdk/android/src/jni/jni_helpers.h" + +namespace webrtc { +namespace jni { + +class VideoSinkWrapper : public rtc::VideoSinkInterface { + public: + VideoSinkWrapper(JNIEnv* jni, const JavaRef& j_sink); + ~VideoSinkWrapper() override; + + private: + void OnFrame(const VideoFrame& frame) override; + + const ScopedJavaGlobalRef j_sink_; +}; + +} // namespace jni +} // namespace webrtc + +#endif // SDK_ANDROID_SRC_JNI_VIDEOSINK_H_ diff --git a/sdk/android/src/jni/videotrack.cc b/sdk/android/src/jni/videotrack.cc index b9db009b74..0595b753cf 100644 --- a/sdk/android/src/jni/videotrack.cc +++ b/sdk/android/src/jni/videotrack.cc @@ -11,38 +11,13 @@ #include #include "api/mediastreaminterface.h" -#include "rtc_base/logging.h" -#include "sdk/android/generated_video_jni/jni/VideoSink_jni.h" #include "sdk/android/generated_video_jni/jni/VideoTrack_jni.h" #include "sdk/android/src/jni/jni_helpers.h" -#include "sdk/android/src/jni/videoframe.h" +#include "sdk/android/src/jni/videosink.h" namespace webrtc { namespace jni { -namespace { - -class VideoSinkWrapper : public rtc::VideoSinkInterface { - public: - VideoSinkWrapper(JNIEnv* jni, const JavaRef& j_sink); - ~VideoSinkWrapper() override {} - - private: - void OnFrame(const VideoFrame& frame) override; - - const ScopedJavaGlobalRef j_sink_; -}; - -VideoSinkWrapper::VideoSinkWrapper(JNIEnv* jni, const JavaRef& j_sink) - : j_sink_(jni, j_sink) {} - -void VideoSinkWrapper::OnFrame(const VideoFrame& frame) { - JNIEnv* jni = AttachCurrentThreadIfNeeded(); - Java_VideoSink_onFrame(jni, j_sink_, NativeToJavaFrame(jni, frame)); -} - -} // namespace - static void JNI_VideoTrack_AddSink(JNIEnv* jni, const JavaParamRef&, jlong j_native_track,