diff --git a/webrtc/sdk/android/BUILD.gn b/webrtc/sdk/android/BUILD.gn index 07fc616017..5e4797ec42 100644 --- a/webrtc/sdk/android/BUILD.gn +++ b/webrtc/sdk/android/BUILD.gn @@ -24,7 +24,7 @@ config("libjingle_peerconnection_jni_warnings_config") { rtc_source_set("base_jni") { sources = [ - "src/jni/androidmediacodeccommon.h", + "src/jni/androidhistogram_jni.cc", "src/jni/audio_jni.h", "src/jni/classreferenceholder.cc", "src/jni/classreferenceholder.h", @@ -40,6 +40,7 @@ rtc_source_set("base_jni") { "//webrtc/api:libjingle_peerconnection_api", "//webrtc/base:rtc_base", "//webrtc/base:rtc_base_approved", + "//webrtc/system_wrappers:metrics_api", ] if (is_clang) { @@ -71,15 +72,12 @@ rtc_static_library("null_audio_jni") { deps = [ ":base_jni", - "//webrtc/api:libjingle_peerconnection_api", - "//webrtc/base:rtc_base", - "//webrtc/base:rtc_base_approved", ] } rtc_static_library("video_jni") { sources = [ - "src/jni/androidhistogram_jni.cc", + "src/jni/androidmediacodeccommon.h", "src/jni/androidmediadecoder_jni.cc", "src/jni/androidmediadecoder_jni.h", "src/jni/androidmediaencoder_jni.cc", @@ -87,12 +85,15 @@ rtc_static_library("video_jni") { "src/jni/androidvideotracksource.cc", "src/jni/androidvideotracksource.h", "src/jni/androidvideotracksource_jni.cc", + "src/jni/filevideocapturer_jni.cc", "src/jni/native_handle_impl.cc", "src/jni/native_handle_impl.h", "src/jni/surfacetexturehelper_jni.cc", "src/jni/surfacetexturehelper_jni.h", "src/jni/video_jni.cc", "src/jni/video_renderer_jni.cc", + "src/jni/videofilerenderer_jni.cc", + "src/jni/videotrack_jni.cc", "src/jni/wrapped_native_i420_buffer.cc", "src/jni/wrapped_native_i420_buffer.h", ] @@ -154,16 +155,7 @@ rtc_static_library("null_video_jni") { deps = [ ":base_jni", - "//webrtc/base:rtc_base_approved", ] - - if (is_clang) { - # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163). - suppressed_configs += [ - "//build/config/clang:extra_warnings", - "//build/config/clang:find_bad_constructs", - ] - } } rtc_static_library("media_jni") { @@ -173,9 +165,8 @@ rtc_static_library("media_jni") { deps = [ ":base_jni", - "//webrtc/api:libjingle_peerconnection_api", - "//webrtc/api/audio_codecs:audio_codecs_api", - "//webrtc/base:rtc_base_approved", + "//webrtc/call:call_interfaces", + "//webrtc/logging:rtc_event_log_api", "//webrtc/media:rtc_audio_video", ] @@ -195,20 +186,7 @@ rtc_static_library("null_media_jni") { deps = [ ":base_jni", - "//webrtc/api:libjingle_peerconnection_api", - "//webrtc/base:rtc_base", - "//webrtc/base:rtc_base_approved", - "//webrtc/call:call_interfaces", - "//webrtc/logging:rtc_event_log_api", ] - - if (is_clang) { - # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163). - suppressed_configs += [ - "//build/config/clang:extra_warnings", - "//build/config/clang:find_bad_constructs", - ] - } } rtc_static_library("peerconnection_jni") { diff --git a/webrtc/sdk/android/src/jni/androidhistogram_jni.cc b/webrtc/sdk/android/src/jni/androidhistogram_jni.cc index 74ddcfbb58..c3c9742a08 100644 --- a/webrtc/sdk/android/src/jni/androidhistogram_jni.cc +++ b/webrtc/sdk/android/src/jni/androidhistogram_jni.cc @@ -13,7 +13,6 @@ #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" #include "webrtc/system_wrappers/include/metrics.h" // Enables collection of native histograms and creating them. diff --git a/webrtc/sdk/android/src/jni/filevideocapturer_jni.cc b/webrtc/sdk/android/src/jni/filevideocapturer_jni.cc new file mode 100644 index 0000000000..9271a7991b --- /dev/null +++ b/webrtc/sdk/android/src/jni/filevideocapturer_jni.cc @@ -0,0 +1,60 @@ +/* + * Copyright 2017 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 + +#include "third_party/libyuv/include/libyuv/convert_from.h" +#include "webrtc/base/checks.h" +#include "webrtc/base/logging.h" + +namespace webrtc_jni { + +extern "C" JNIEXPORT void JNICALL +Java_org_webrtc_FileVideoCapturer_nativeI420ToNV21(JNIEnv* jni, + jclass, + jbyteArray j_src_buffer, + jint width, + jint height, + jbyteArray j_dst_buffer) { + size_t src_size = jni->GetArrayLength(j_src_buffer); + size_t dst_size = jni->GetArrayLength(j_dst_buffer); + int src_stride = width; + int dst_stride = width; + RTC_CHECK_GE(src_size, src_stride * height * 3 / 2); + RTC_CHECK_GE(dst_size, dst_stride * height * 3 / 2); + + jbyte* src_bytes = jni->GetByteArrayElements(j_src_buffer, 0); + uint8_t* src = reinterpret_cast(src_bytes); + jbyte* dst_bytes = jni->GetByteArrayElements(j_dst_buffer, 0); + uint8_t* dst = reinterpret_cast(dst_bytes); + + uint8_t* src_y = src; + size_t src_stride_y = src_stride; + uint8_t* src_u = src + src_stride * height; + size_t src_stride_u = src_stride / 2; + uint8_t* src_v = src + src_stride * height * 5 / 4; + size_t src_stride_v = src_stride / 2; + + uint8_t* dst_y = dst; + size_t dst_stride_y = dst_stride; + size_t dst_stride_uv = dst_stride; + uint8_t* dst_uv = dst + dst_stride * height; + + int ret = libyuv::I420ToNV21(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_uv, + dst_stride_uv, width, height); + jni->ReleaseByteArrayElements(j_src_buffer, src_bytes, 0); + jni->ReleaseByteArrayElements(j_dst_buffer, dst_bytes, 0); + if (ret) { + LOG(LS_ERROR) << "Error converting I420 frame to NV21: " << ret; + } +} + +} // namespace webrtc_jni diff --git a/webrtc/sdk/android/src/jni/media_jni.cc b/webrtc/sdk/android/src/jni/media_jni.cc index 7fbc67490a..0bc2737eb0 100644 --- a/webrtc/sdk/android/src/jni/media_jni.cc +++ b/webrtc/sdk/android/src/jni/media_jni.cc @@ -9,27 +9,32 @@ */ #include "webrtc/sdk/android/src/jni/media_jni.h" -#include "webrtc/api/audio_codecs/audio_decoder_factory.h" -#include "webrtc/api/audio_codecs/audio_encoder_factory.h" -#include "webrtc/media/engine/webrtcvideodecoderfactory.h" -#include "webrtc/media/engine/webrtcvideoencoderfactory.h" +#include "webrtc/call/callfactoryinterface.h" +#include "webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h" +#include "webrtc/media/engine/webrtcmediaengine.h" namespace webrtc_jni { -rtc::scoped_refptr -CreateNativePeerConnectionFactory( - rtc::Thread* network_thread, - rtc::Thread* worker_thread, - rtc::Thread* signaling_thread, - webrtc::AudioDeviceModule* default_adm, - rtc::scoped_refptr audio_encoder_factory, - rtc::scoped_refptr audio_decoder_factory, +webrtc::CallFactoryInterface* CreateCallFactory() { + return webrtc::CreateCallFactory().release(); +} + +webrtc::RtcEventLogFactoryInterface* CreateRtcEventLogFactory() { + return webrtc::CreateRtcEventLogFactory().release(); +} + +cricket::MediaEngineInterface* CreateMediaEngine( + webrtc::AudioDeviceModule* adm, + const rtc::scoped_refptr& + audio_encoder_factory, + const rtc::scoped_refptr& + audio_decoder_factory, cricket::WebRtcVideoEncoderFactory* video_encoder_factory, - cricket::WebRtcVideoDecoderFactory* video_decoder_factory) { - return webrtc::CreatePeerConnectionFactory( - network_thread, worker_thread, signaling_thread, default_adm, - audio_encoder_factory, audio_decoder_factory, video_encoder_factory, - video_decoder_factory); + cricket::WebRtcVideoDecoderFactory* video_decoder_factory, + rtc::scoped_refptr audio_mixer) { + return cricket::WebRtcMediaEngineFactory::Create( + adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory, + video_decoder_factory, audio_mixer); } } // namespace webrtc_jni diff --git a/webrtc/sdk/android/src/jni/media_jni.h b/webrtc/sdk/android/src/jni/media_jni.h index 168b12544e..d0e6410e08 100644 --- a/webrtc/sdk/android/src/jni/media_jni.h +++ b/webrtc/sdk/android/src/jni/media_jni.h @@ -11,22 +11,37 @@ #ifndef WEBRTC_SDK_ANDROID_SRC_JNI_MEDIA_JNI_H_ #define WEBRTC_SDK_ANDROID_SRC_JNI_MEDIA_JNI_H_ -#include "webrtc/api/peerconnectioninterface.h" #include "webrtc/base/scoped_ref_ptr.h" -#include "webrtc/base/thread.h" + +namespace webrtc { +class AudioDeviceModule; +class CallFactoryInterface; +class AudioEncoderFactory; +class AudioDecoderFactory; +class RtcEventLogFactoryInterface; +class AudioMixer; +} // namespace webrtc + +namespace cricket { +class MediaEngineInterface; +class WebRtcVideoEncoderFactory; +class WebRtcVideoDecoderFactory; +} // namespace cricket namespace webrtc_jni { -rtc::scoped_refptr -CreateNativePeerConnectionFactory( - rtc::Thread* network_thread, - rtc::Thread* worker_thread, - rtc::Thread* signaling_thread, - webrtc::AudioDeviceModule* default_adm, - rtc::scoped_refptr audio_encoder_factory, - rtc::scoped_refptr audio_decoder_factory, +webrtc::CallFactoryInterface* CreateCallFactory(); +webrtc::RtcEventLogFactoryInterface* CreateRtcEventLogFactory(); + +cricket::MediaEngineInterface* CreateMediaEngine( + webrtc::AudioDeviceModule* adm, + const rtc::scoped_refptr& + audio_encoder_factory, + const rtc::scoped_refptr& + audio_decoder_factory, cricket::WebRtcVideoEncoderFactory* video_encoder_factory, - cricket::WebRtcVideoDecoderFactory* video_decoder_factory); + cricket::WebRtcVideoDecoderFactory* video_decoder_factory, + rtc::scoped_refptr audio_mixer); } // namespace webrtc_jni diff --git a/webrtc/sdk/android/src/jni/null_audio_jni.cc b/webrtc/sdk/android/src/jni/null_audio_jni.cc index 8599b870fa..f9870cac04 100644 --- a/webrtc/sdk/android/src/jni/null_audio_jni.cc +++ b/webrtc/sdk/android/src/jni/null_audio_jni.cc @@ -12,11 +12,11 @@ namespace webrtc_jni { rtc::scoped_refptr CreateAudioDecoderFactory() { - return rtc::scoped_refptr(); + return nullptr; } rtc::scoped_refptr CreateAudioEncoderFactory() { - return rtc::scoped_refptr(); + return nullptr; } } // namespace webrtc_jni diff --git a/webrtc/sdk/android/src/jni/null_media_jni.cc b/webrtc/sdk/android/src/jni/null_media_jni.cc index b41f5c41b7..2a9b63a09b 100644 --- a/webrtc/sdk/android/src/jni/null_media_jni.cc +++ b/webrtc/sdk/android/src/jni/null_media_jni.cc @@ -10,34 +10,26 @@ #include "webrtc/sdk/android/src/jni/media_jni.h" -#include "webrtc/api/audio_codecs/audio_decoder_factory.h" // nogncheck -#include "webrtc/api/audio_codecs/audio_encoder_factory.h" // nogncheck -#include "webrtc/call/callfactoryinterface.h" -#include "webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h" -#include "webrtc/media/engine/webrtcvideodecoderfactory.h" // nogncheck -#include "webrtc/media/engine/webrtcvideoencoderfactory.h" // nogncheck - namespace webrtc_jni { -// This implementation is used for building WebRTC without audio and video -// support. -rtc::scoped_refptr -CreateNativePeerConnectionFactory( - rtc::Thread* network_thread, - rtc::Thread* worker_thread, - rtc::Thread* signaling_thread, - webrtc::AudioDeviceModule* default_adm, - rtc::scoped_refptr audio_encoder_factory, - rtc::scoped_refptr audio_decoder_factory, +webrtc::CallFactoryInterface* CreateCallFactory() { + return nullptr; +} + +webrtc::RtcEventLogFactoryInterface* CreateRtcEventLogFactory() { + return nullptr; +} + +cricket::MediaEngineInterface* CreateMediaEngine( + webrtc::AudioDeviceModule* adm, + const rtc::scoped_refptr& + audio_encoder_factory, + const rtc::scoped_refptr& + audio_decoder_factory, cricket::WebRtcVideoEncoderFactory* video_encoder_factory, - cricket::WebRtcVideoDecoderFactory* video_decoder_factory) { - return CreateModularPeerConnectionFactory( - network_thread, worker_thread, signaling_thread, default_adm, - audio_encoder_factory, audio_decoder_factory, video_encoder_factory, - video_decoder_factory, nullptr /*audio_mixer*/, - std::unique_ptr(), - std::unique_ptr(), - std::unique_ptr()); + cricket::WebRtcVideoDecoderFactory* video_decoder_factory, + rtc::scoped_refptr audio_mixer) { + return nullptr; } } // namespace webrtc_jni diff --git a/webrtc/sdk/android/src/jni/null_video_jni.cc b/webrtc/sdk/android/src/jni/null_video_jni.cc index 82394ff958..4d8c642daa 100644 --- a/webrtc/sdk/android/src/jni/null_video_jni.cc +++ b/webrtc/sdk/android/src/jni/null_video_jni.cc @@ -8,22 +8,10 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include - -#include "webrtc/base/scoped_ref_ptr.h" -#include "webrtc/sdk/android/src/jni/classreferenceholder.h" - -namespace cricket { -class WebRtcVideoEncoderFactory; -class WebRtcVideoDecoderFactory; -} // namespace cricket +#include "webrtc/sdk/android/src/jni/video_jni.h" namespace webrtc_jni { -class MediaCodecVideoEncoderFactory; -class MediaCodecVideoDecoderFactory; -class SurfaceTextureHelper; - cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory() { return nullptr; } @@ -33,7 +21,7 @@ cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory() { } jobject GetJavaSurfaceTextureHelper( - rtc::scoped_refptr surface_texture_helper) { + const rtc::scoped_refptr& surface_texture_helper) { return nullptr; } diff --git a/webrtc/sdk/android/src/jni/peerconnection_jni.cc b/webrtc/sdk/android/src/jni/peerconnection_jni.cc index f257575964..fd8a13622b 100644 --- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc +++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc @@ -43,8 +43,6 @@ #include #include -#include "third_party/libyuv/include/libyuv/convert_from.h" -#include "third_party/libyuv/include/libyuv/scale.h" #include "webrtc/api/mediaconstraintsinterface.h" #include "webrtc/api/peerconnectioninterface.h" #include "webrtc/api/rtpreceiverinterface.h" @@ -60,6 +58,7 @@ #include "webrtc/base/rtccertificategenerator.h" #include "webrtc/base/ssladapter.h" #include "webrtc/base/stringutils.h" +#include "webrtc/media/base/mediaengine.h" #include "webrtc/media/base/videocapturer.h" #include "webrtc/modules/utility/include/jvm_android.h" #include "webrtc/pc/webrtcsdp.h" @@ -1168,11 +1167,23 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory); } + webrtc::AudioDeviceModule* adm = nullptr; + rtc::scoped_refptr audio_mixer = nullptr; + std::unique_ptr call_factory( + CreateCallFactory()); + std::unique_ptr rtc_event_log_factory( + CreateRtcEventLogFactory()); + std::unique_ptr media_engine(CreateMediaEngine( + adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory, + video_decoder_factory, audio_mixer)); + rtc::scoped_refptr factory( - CreateNativePeerConnectionFactory( + CreateModularPeerConnectionFactory( network_thread.get(), worker_thread.get(), signaling_thread.get(), - nullptr, audio_encoder_factory, audio_decoder_factory, - video_encoder_factory, video_decoder_factory)); + adm, audio_encoder_factory, audio_decoder_factory, + video_encoder_factory, video_decoder_factory, audio_mixer, + std::move(media_engine), std::move(call_factory), + std::move(rtc_event_log_factory))); RTC_CHECK(factory) << "Failed to create the peer connection factory; " << "WebRTC/libjingle init likely failed on this device"; // TODO(honghaiz): Maybe put the options as the argument of @@ -1908,97 +1919,6 @@ JOW(jobject, MediaSource_nativeState)(JNIEnv* jni, jclass, jlong j_p) { return JavaEnumFromIndex(jni, "MediaSource$State", p->state()); } -JOW(void, FileVideoCapturer_nativeI420ToNV21)( - JNIEnv *jni, jclass, jbyteArray j_src_buffer, jint width, jint height, - jbyteArray j_dst_buffer) { - size_t src_size = jni->GetArrayLength(j_src_buffer); - size_t dst_size = jni->GetArrayLength(j_dst_buffer); - int src_stride = width; - int dst_stride = width; - RTC_CHECK_GE(src_size, src_stride * height * 3 / 2); - RTC_CHECK_GE(dst_size, dst_stride * height * 3 / 2); - - jbyte* src_bytes = jni->GetByteArrayElements(j_src_buffer, 0); - uint8_t* src = reinterpret_cast(src_bytes); - jbyte* dst_bytes = jni->GetByteArrayElements(j_dst_buffer, 0); - uint8_t* dst = reinterpret_cast(dst_bytes); - - uint8_t* src_y = src; - size_t src_stride_y = src_stride; - uint8_t* src_u = src + src_stride * height; - size_t src_stride_u = src_stride / 2; - uint8_t* src_v = src + src_stride * height * 5 / 4; - size_t src_stride_v = src_stride / 2; - - uint8_t* dst_y = dst; - size_t dst_stride_y = dst_stride; - size_t dst_stride_uv = dst_stride; - uint8_t* dst_uv = dst + dst_stride * height; - - int ret = libyuv::I420ToNV21(src_y, src_stride_y, src_u, src_stride_u, src_v, - src_stride_v, dst_y, dst_stride_y, dst_uv, - dst_stride_uv, width, height); - jni->ReleaseByteArrayElements(j_src_buffer, src_bytes, 0); - jni->ReleaseByteArrayElements(j_dst_buffer, dst_bytes, 0); - if (ret) { - LOG(LS_ERROR) << "Error converting I420 frame to NV21: " << ret; - } -} - -JOW(void, VideoFileRenderer_nativeI420Scale)( - JNIEnv *jni, jclass, - jobject j_src_buffer_y, jint j_src_stride_y, - jobject j_src_buffer_u, jint j_src_stride_u, - jobject j_src_buffer_v, jint j_src_stride_v, - jint width, jint height, - jbyteArray j_dst_buffer, jint dstWidth, jint dstHeight) { - size_t src_size_y = jni->GetDirectBufferCapacity(j_src_buffer_y); - size_t src_size_u = jni->GetDirectBufferCapacity(j_src_buffer_u); - size_t src_size_v = jni->GetDirectBufferCapacity(j_src_buffer_v); - size_t dst_size = jni->GetDirectBufferCapacity(j_dst_buffer); - int dst_stride = dstWidth; - RTC_CHECK_GE(src_size_y, j_src_stride_y * height); - RTC_CHECK_GE(src_size_u, j_src_stride_u * height / 4); - RTC_CHECK_GE(src_size_v, j_src_stride_v * height / 4); - RTC_CHECK_GE(dst_size, dst_stride * dstHeight * 3 / 2); - uint8_t* src_y = - reinterpret_cast(jni->GetDirectBufferAddress(j_src_buffer_y)); - uint8_t* src_u = - reinterpret_cast(jni->GetDirectBufferAddress(j_src_buffer_u)); - uint8_t* src_v = - reinterpret_cast(jni->GetDirectBufferAddress(j_src_buffer_v)); - uint8_t* dst = - reinterpret_cast(jni->GetDirectBufferAddress(j_dst_buffer)); - - uint8_t* dst_y = dst; - size_t dst_stride_y = dst_stride; - uint8_t* dst_u = dst + dst_stride * dstHeight; - size_t dst_stride_u = dst_stride / 2; - uint8_t* dst_v = dst + dst_stride * dstHeight * 5 / 4; - size_t dst_stride_v = dst_stride / 2; - - int ret = libyuv::I420Scale( - src_y, j_src_stride_y, src_u, j_src_stride_u, src_v, j_src_stride_v, - width, height, dst_y, dst_stride_y, dst_u, dst_stride_u, dst_v, - dst_stride_v, dstWidth, dstHeight, libyuv::kFilterBilinear); - if (ret) { - LOG(LS_ERROR) << "Error scaling I420 frame: " << ret; - } -} - -JOW(jobject, VideoFileRenderer_nativeCreateNativeByteBuffer) -(JNIEnv* jni, jclass, jint size) { - void* new_data = ::operator new(size); - jobject byte_buffer = jni->NewDirectByteBuffer(new_data, size); - return byte_buffer; -} - -JOW(void, VideoFileRenderer_nativeFreeNativeByteBuffer) -(JNIEnv* jni, jclass, jobject byte_buffer) { - void* data = jni->GetDirectBufferAddress(byte_buffer); - ::operator delete(data); -} - JOW(jstring, MediaStreamTrack_nativeId)(JNIEnv* jni, jclass, jlong j_p) { return JavaStringFromStdString( jni, reinterpret_cast(j_p)->id()); @@ -2026,26 +1946,6 @@ JOW(jboolean, MediaStreamTrack_nativeSetEnabled)( ->set_enabled(enabled); } -JOW(void, VideoTrack_nativeAddRenderer)( - JNIEnv* jni, jclass, - jlong j_video_track_pointer, jlong j_renderer_pointer) { - LOG(LS_INFO) << "VideoTrack::nativeAddRenderer"; - reinterpret_cast(j_video_track_pointer) - ->AddOrUpdateSink( - reinterpret_cast*>( - j_renderer_pointer), - rtc::VideoSinkWants()); -} - -JOW(void, VideoTrack_nativeRemoveRenderer)( - JNIEnv* jni, jclass, - jlong j_video_track_pointer, jlong j_renderer_pointer) { - reinterpret_cast(j_video_track_pointer) - ->RemoveSink( - reinterpret_cast*>( - j_renderer_pointer)); -} - JOW(jlong, CallSessionFileRotatingLogSink_nativeAddSink)( JNIEnv* jni, jclass, jstring j_dirPath, jint j_maxFileSize, jint j_severity) { diff --git a/webrtc/sdk/android/src/jni/video_jni.cc b/webrtc/sdk/android/src/jni/video_jni.cc index cd3b4b2819..60970769b3 100644 --- a/webrtc/sdk/android/src/jni/video_jni.cc +++ b/webrtc/sdk/android/src/jni/video_jni.cc @@ -21,25 +21,18 @@ #include "webrtc/sdk/android/src/jni/ownedfactoryandthreads.h" #include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h" -using cricket::WebRtcVideoDecoderFactory; -using cricket::WebRtcVideoEncoderFactory; -using webrtc::AndroidVideoTrackSource; -using webrtc::AudioSourceInterface; -using webrtc::VideoTrackSourceInterface; -using webrtc::VideoTrackInterface; - namespace webrtc_jni { -WebRtcVideoEncoderFactory* CreateVideoEncoderFactory() { +cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory() { return new MediaCodecVideoEncoderFactory(); } -WebRtcVideoDecoderFactory* CreateVideoDecoderFactory() { +cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory() { return new MediaCodecVideoDecoderFactory(); } jobject GetJavaSurfaceTextureHelper( - rtc::scoped_refptr surface_texture_helper) { + const rtc::scoped_refptr& surface_texture_helper) { return surface_texture_helper ? surface_texture_helper->GetJavaSurfaceTextureHelper() : nullptr; @@ -69,9 +62,10 @@ JOW(jlong, PeerConnectionFactory_nativeCreateVideoTrack) (JNIEnv* jni, jclass, jlong native_factory, jstring id, jlong native_source) { rtc::scoped_refptr factory( factoryFromJava(native_factory)); - rtc::scoped_refptr track(factory->CreateVideoTrack( - JavaToStdString(jni, id), - reinterpret_cast(native_source))); + rtc::scoped_refptr track( + factory->CreateVideoTrack( + JavaToStdString(jni, id), + reinterpret_cast(native_source))); return (jlong)track.release(); } diff --git a/webrtc/sdk/android/src/jni/video_jni.h b/webrtc/sdk/android/src/jni/video_jni.h index 9a885cdcad..f6ec9e68ce 100644 --- a/webrtc/sdk/android/src/jni/video_jni.h +++ b/webrtc/sdk/android/src/jni/video_jni.h @@ -14,18 +14,22 @@ #include #include "webrtc/base/scoped_ref_ptr.h" -// Adding 'nogncheck' to disable the gn include headers check. -// We don't want this target depend on video related targets -#include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h" // nogncheck + +namespace cricket { +class WebRtcVideoEncoderFactory; +class WebRtcVideoDecoderFactory; +} // namespace cricket namespace webrtc_jni { -WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(); +class SurfaceTextureHelper; -WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(); +cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(); + +cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(); jobject GetJavaSurfaceTextureHelper( - rtc::scoped_refptr surface_texture_helper); + const rtc::scoped_refptr& surface_texture_helper); } // namespace webrtc_jni diff --git a/webrtc/sdk/android/src/jni/video_renderer_jni.cc b/webrtc/sdk/android/src/jni/video_renderer_jni.cc index b5af0003f9..1bea6395d7 100644 --- a/webrtc/sdk/android/src/jni/video_renderer_jni.cc +++ b/webrtc/sdk/android/src/jni/video_renderer_jni.cc @@ -9,8 +9,6 @@ */ #include -#undef JNIEXPORT -#define JNIEXPORT __attribute__((visibility("default"))) #include "webrtc/api/video/video_frame.h" #include "webrtc/media/base/videosinkinterface.h" diff --git a/webrtc/sdk/android/src/jni/videofilerenderer_jni.cc b/webrtc/sdk/android/src/jni/videofilerenderer_jni.cc new file mode 100644 index 0000000000..83a089c216 --- /dev/null +++ b/webrtc/sdk/android/src/jni/videofilerenderer_jni.cc @@ -0,0 +1,85 @@ +/* + * Copyright 2017 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 + +#include "third_party/libyuv/include/libyuv/scale.h" +#include "webrtc/base/checks.h" +#include "webrtc/base/logging.h" + +namespace webrtc_jni { + +extern "C" JNIEXPORT void JNICALL +Java_org_webrtc_VideoFileRenderer_nativeI420Scale(JNIEnv* jni, + jclass, + jobject j_src_buffer_y, + jint j_src_stride_y, + jobject j_src_buffer_u, + jint j_src_stride_u, + jobject j_src_buffer_v, + jint j_src_stride_v, + jint width, + jint height, + jbyteArray j_dst_buffer, + jint dstWidth, + jint dstHeight) { + size_t src_size_y = jni->GetDirectBufferCapacity(j_src_buffer_y); + size_t src_size_u = jni->GetDirectBufferCapacity(j_src_buffer_u); + size_t src_size_v = jni->GetDirectBufferCapacity(j_src_buffer_v); + size_t dst_size = jni->GetDirectBufferCapacity(j_dst_buffer); + int dst_stride = dstWidth; + RTC_CHECK_GE(src_size_y, j_src_stride_y * height); + RTC_CHECK_GE(src_size_u, j_src_stride_u * height / 4); + RTC_CHECK_GE(src_size_v, j_src_stride_v * height / 4); + RTC_CHECK_GE(dst_size, dst_stride * dstHeight * 3 / 2); + uint8_t* src_y = + reinterpret_cast(jni->GetDirectBufferAddress(j_src_buffer_y)); + uint8_t* src_u = + reinterpret_cast(jni->GetDirectBufferAddress(j_src_buffer_u)); + uint8_t* src_v = + reinterpret_cast(jni->GetDirectBufferAddress(j_src_buffer_v)); + uint8_t* dst = + reinterpret_cast(jni->GetDirectBufferAddress(j_dst_buffer)); + + uint8_t* dst_y = dst; + size_t dst_stride_y = dst_stride; + uint8_t* dst_u = dst + dst_stride * dstHeight; + size_t dst_stride_u = dst_stride / 2; + uint8_t* dst_v = dst + dst_stride * dstHeight * 5 / 4; + size_t dst_stride_v = dst_stride / 2; + + int ret = libyuv::I420Scale( + src_y, j_src_stride_y, src_u, j_src_stride_u, src_v, j_src_stride_v, + width, height, dst_y, dst_stride_y, dst_u, dst_stride_u, dst_v, + dst_stride_v, dstWidth, dstHeight, libyuv::kFilterBilinear); + if (ret) { + LOG(LS_ERROR) << "Error scaling I420 frame: " << ret; + } +} + +extern "C" JNIEXPORT jobject JNICALL +Java_org_webrtc_VideoFileRenderer_nativeCreateNativeByteBuffer(JNIEnv* jni, + jclass, + jint size) { + void* new_data = ::operator new(size); + jobject byte_buffer = jni->NewDirectByteBuffer(new_data, size); + return byte_buffer; +} + +extern "C" JNIEXPORT void JNICALL +Java_org_webrtc_VideoFileRenderer_nativeFreeNativeByteBuffer( + JNIEnv* jni, + jclass, + jobject byte_buffer) { + void* data = jni->GetDirectBufferAddress(byte_buffer); + ::operator delete(data); +} + +} // namespace webrtc_jni diff --git a/webrtc/sdk/android/src/jni/videotrack_jni.cc b/webrtc/sdk/android/src/jni/videotrack_jni.cc new file mode 100644 index 0000000000..e35fda14da --- /dev/null +++ b/webrtc/sdk/android/src/jni/videotrack_jni.cc @@ -0,0 +1,42 @@ +/* + * Copyright 2017 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 + +#include "webrtc/api/mediastreaminterface.h" +#include "webrtc/base/logging.h" + +namespace webrtc_jni { + +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(j_video_track_pointer) + ->AddOrUpdateSink( + reinterpret_cast*>( + j_renderer_pointer), + 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(j_video_track_pointer) + ->RemoveSink( + reinterpret_cast*>( + j_renderer_pointer)); +} + +} // namespace webrtc_jni