Android: Replace webrtc_jni namespace with nested jni namespace
This CL replaces:
namespace webrtc_jni {
with:
namespace webrtc {
namespace jni {
The main benefit is that we don't have to use the webrtc:: qualifier
inside the jni namespace so we can reduce some clutter.
BUG=None
Review-Url: https://codereview.webrtc.org/3009613002
Cr-Commit-Position: refs/heads/master@{#19569}
This commit is contained in:
parent
b59e7df40f
commit
a3d4f68fb4
@ -36,12 +36,12 @@ static ClassReferenceHolder* g_class_reference_holder = nullptr;
|
||||
|
||||
void LoadGlobalClassReferenceHolder() {
|
||||
RTC_CHECK(g_class_reference_holder == nullptr);
|
||||
g_class_reference_holder = new ClassReferenceHolder(webrtc_jni::GetEnv());
|
||||
g_class_reference_holder = new ClassReferenceHolder(webrtc::jni::GetEnv());
|
||||
}
|
||||
|
||||
void FreeGlobalClassReferenceHolder() {
|
||||
g_class_reference_holder->FreeReferences(
|
||||
webrtc_jni::AttachCurrentThreadIfNeeded());
|
||||
webrtc::jni::AttachCurrentThreadIfNeeded());
|
||||
delete g_class_reference_holder;
|
||||
g_class_reference_holder = nullptr;
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
// This is a supplement of webrtc_jni::ClassReferenceHolder.
|
||||
// This is a supplement of webrtc::jni::ClassReferenceHolder.
|
||||
// The purpose of this ClassReferenceHolder is to load the example
|
||||
// specific java class into JNI c++ side, so that our c++ code can
|
||||
// call those java functions.
|
||||
|
||||
@ -17,7 +17,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
extern "C" jint JNIEXPORT JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved) {
|
||||
jint ret = InitGlobalJniVariables(jvm);
|
||||
@ -38,4 +39,5 @@ extern "C" void JNIEXPORT JNICALL JNI_OnUnLoad(JavaVM* jvm, void* reserved) {
|
||||
RTC_CHECK(rtc::CleanupSSL()) << "Failed to CleanupSSL()";
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -164,10 +164,10 @@ void SimplePeerConnection::DeletePeerConnection() {
|
||||
|
||||
#if defined(WEBRTC_ANDROID)
|
||||
if (g_camera) {
|
||||
JNIEnv* env = webrtc_jni::GetEnv();
|
||||
JNIEnv* env = webrtc::jni::GetEnv();
|
||||
jclass pc_factory_class =
|
||||
unity_plugin::FindClass(env, "org/webrtc/UnityUtility");
|
||||
jmethodID stop_camera_method = webrtc_jni::GetStaticMethodID(
|
||||
jmethodID stop_camera_method = webrtc::jni::GetStaticMethodID(
|
||||
env, pc_factory_class, "StopCamera", "(Lorg/webrtc/VideoCapturer;)V");
|
||||
|
||||
env->CallStaticVoidMethod(pc_factory_class, stop_camera_method, g_camera);
|
||||
@ -409,10 +409,10 @@ void SimplePeerConnection::AddStreams(bool audio_only) {
|
||||
|
||||
if (!audio_only) {
|
||||
#if defined(WEBRTC_ANDROID)
|
||||
JNIEnv* env = webrtc_jni::GetEnv();
|
||||
JNIEnv* env = webrtc::jni::GetEnv();
|
||||
jclass pc_factory_class =
|
||||
unity_plugin::FindClass(env, "org/webrtc/UnityUtility");
|
||||
jmethodID load_texture_helper_method = webrtc_jni::GetStaticMethodID(
|
||||
jmethodID load_texture_helper_method = webrtc::jni::GetStaticMethodID(
|
||||
env, pc_factory_class, "LoadSurfaceTextureHelper",
|
||||
"()Lorg/webrtc/SurfaceTextureHelper;");
|
||||
jobject texture_helper = env->CallStaticObjectMethod(
|
||||
@ -421,15 +421,15 @@ void SimplePeerConnection::AddStreams(bool audio_only) {
|
||||
RTC_DCHECK(texture_helper != nullptr)
|
||||
<< "Cannot get the Surface Texture Helper.";
|
||||
|
||||
rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> source(
|
||||
new rtc::RefCountedObject<webrtc::AndroidVideoTrackSource>(
|
||||
rtc::scoped_refptr<AndroidVideoTrackSource> source(
|
||||
new rtc::RefCountedObject<AndroidVideoTrackSource>(
|
||||
g_signaling_thread.get(), env, texture_helper, false));
|
||||
rtc::scoped_refptr<webrtc::VideoTrackSourceProxy> proxy_source =
|
||||
webrtc::VideoTrackSourceProxy::Create(g_signaling_thread.get(),
|
||||
g_worker_thread.get(), source);
|
||||
|
||||
// link with VideoCapturer (Camera);
|
||||
jmethodID link_camera_method = webrtc_jni::GetStaticMethodID(
|
||||
jmethodID link_camera_method = webrtc::jni::GetStaticMethodID(
|
||||
env, pc_factory_class, "LinkCamera",
|
||||
"(JLorg/webrtc/SurfaceTextureHelper;)Lorg/webrtc/VideoCapturer;");
|
||||
jobject camera_tmp =
|
||||
|
||||
@ -40,10 +40,10 @@ void EnsureInitializedOnce() {
|
||||
JavaVM* jvm = NULL;
|
||||
RTC_CHECK_EQ(0, jni->GetJavaVM(&jvm));
|
||||
|
||||
jint ret = webrtc_jni::InitGlobalJniVariables(jvm);
|
||||
jint ret = jni::InitGlobalJniVariables(jvm);
|
||||
RTC_DCHECK_GE(ret, 0);
|
||||
|
||||
webrtc_jni::LoadGlobalClassReferenceHolder();
|
||||
jni::LoadGlobalClassReferenceHolder();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@ -134,8 +134,8 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
||||
if (config_.hw_codec) {
|
||||
#if defined(WEBRTC_VIDEOPROCESSOR_INTEGRATIONTEST_HW_CODECS_ENABLED)
|
||||
#if defined(WEBRTC_ANDROID)
|
||||
encoder_factory_.reset(new webrtc_jni::MediaCodecVideoEncoderFactory());
|
||||
decoder_factory_.reset(new webrtc_jni::MediaCodecVideoDecoderFactory());
|
||||
encoder_factory_.reset(new jni::MediaCodecVideoEncoderFactory());
|
||||
decoder_factory_.reset(new jni::MediaCodecVideoDecoderFactory());
|
||||
#elif defined(WEBRTC_IOS)
|
||||
EXPECT_EQ(kVideoCodecH264, config_.codec_settings.codecType)
|
||||
<< "iOS HW codecs only support H264.";
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
#include "webrtc/system_wrappers/include/metrics.h"
|
||||
|
||||
// Enables collection of native histograms and creating them.
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
Histogram_nativeCreateCounts,
|
||||
@ -28,7 +29,7 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jint buckets) {
|
||||
std::string name = JavaToStdString(jni, j_name);
|
||||
return jlongFromPointer(
|
||||
webrtc::metrics::HistogramFactoryGetCounts(name, min, max, buckets));
|
||||
metrics::HistogramFactoryGetCounts(name, min, max, buckets));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
@ -38,8 +39,7 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jstring j_name,
|
||||
jint max) {
|
||||
std::string name = JavaToStdString(jni, j_name);
|
||||
return jlongFromPointer(
|
||||
webrtc::metrics::HistogramFactoryGetEnumeration(name, max));
|
||||
return jlongFromPointer(metrics::HistogramFactoryGetEnumeration(name, max));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -49,9 +49,9 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jlong histogram,
|
||||
jint sample) {
|
||||
if (histogram) {
|
||||
HistogramAdd(reinterpret_cast<webrtc::metrics::Histogram*>(histogram),
|
||||
sample);
|
||||
HistogramAdd(reinterpret_cast<metrics::Histogram*>(histogram), sample);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -19,7 +19,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Uncomment this define to enable verbose logging for every encoded/decoded
|
||||
// video frame.
|
||||
@ -82,6 +83,7 @@ static inline bool CheckException(JNIEnv* jni) {
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIACODECCOMMON_H_
|
||||
|
||||
@ -39,18 +39,8 @@ using rtc::Bind;
|
||||
using rtc::Thread;
|
||||
using rtc::ThreadManager;
|
||||
|
||||
using webrtc::CodecSpecificInfo;
|
||||
using webrtc::DecodedImageCallback;
|
||||
using webrtc::EncodedImage;
|
||||
using webrtc::VideoFrame;
|
||||
using webrtc::RTPFragmentationHeader;
|
||||
using webrtc::VideoCodec;
|
||||
using webrtc::VideoCodecType;
|
||||
using webrtc::kVideoCodecH264;
|
||||
using webrtc::kVideoCodecVP8;
|
||||
using webrtc::kVideoCodecVP9;
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Logging macros.
|
||||
#define TAG_DECODER "MediaCodecVideoDecoder"
|
||||
@ -66,8 +56,7 @@ namespace webrtc_jni {
|
||||
|
||||
enum { kMaxWarningLogFrames = 2 };
|
||||
|
||||
class MediaCodecVideoDecoder : public webrtc::VideoDecoder,
|
||||
public rtc::MessageHandler {
|
||||
class MediaCodecVideoDecoder : public VideoDecoder, public rtc::MessageHandler {
|
||||
public:
|
||||
explicit MediaCodecVideoDecoder(
|
||||
JNIEnv* jni, VideoCodecType codecType, jobject render_egl_context);
|
||||
@ -121,7 +110,7 @@ class MediaCodecVideoDecoder : public webrtc::VideoDecoder,
|
||||
bool sw_fallback_required_;
|
||||
bool use_surface_;
|
||||
VideoCodec codec_;
|
||||
webrtc::I420BufferPool decoded_frame_pool_;
|
||||
I420BufferPool decoded_frame_pool_;
|
||||
rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper_;
|
||||
DecodedImageCallback* callback_;
|
||||
int frames_received_; // Number of frames received by decoder.
|
||||
@ -134,7 +123,7 @@ class MediaCodecVideoDecoder : public webrtc::VideoDecoder,
|
||||
int current_decoding_time_ms_; // Overall decoding time in the current second
|
||||
int current_delay_time_ms_; // Overall delay time in the current second.
|
||||
uint32_t max_pending_frames_; // Maximum number of pending input frames.
|
||||
webrtc::H264BitstreamParser h264_bitstream_parser_;
|
||||
H264BitstreamParser h264_bitstream_parser_;
|
||||
std::deque<rtc::Optional<uint8_t>> pending_frame_qps_;
|
||||
|
||||
// State that is constant for the lifetime of this object once the ctor
|
||||
@ -561,7 +550,7 @@ int32_t MediaCodecVideoDecoder::Decode(
|
||||
|
||||
// Always start with a complete key frame.
|
||||
if (key_frame_required_) {
|
||||
if (inputImage._frameType != webrtc::kVideoFrameKey) {
|
||||
if (inputImage._frameType != kVideoFrameKey) {
|
||||
ALOGE << "Decode() - key frame is required";
|
||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||
}
|
||||
@ -661,7 +650,7 @@ int32_t MediaCodecVideoDecoder::DecodeOnCodecThread(
|
||||
rtc::Optional<uint8_t> qp;
|
||||
if (codecType_ == kVideoCodecVP8) {
|
||||
int qp_int;
|
||||
if (webrtc::vp8::GetQp(inputImage._buffer, inputImage._length, &qp_int)) {
|
||||
if (vp8::GetQp(inputImage._buffer, inputImage._length, &qp_int)) {
|
||||
qp = rtc::Optional<uint8_t>(qp_int);
|
||||
}
|
||||
} else if (codecType_ == kVideoCodecH264) {
|
||||
@ -726,7 +715,7 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs(
|
||||
int width = GetIntField(jni, *j_media_codec_video_decoder_, j_width_field_);
|
||||
int height = GetIntField(jni, *j_media_codec_video_decoder_, j_height_field_);
|
||||
|
||||
rtc::scoped_refptr<webrtc::VideoFrameBuffer> frame_buffer;
|
||||
rtc::scoped_refptr<VideoFrameBuffer> frame_buffer;
|
||||
int64_t presentation_timestamps_ms = 0;
|
||||
int64_t output_timestamps_ms = 0;
|
||||
int64_t output_ntp_timestamps_ms = 0;
|
||||
@ -753,7 +742,7 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs(
|
||||
frame_delayed_ms = GetLongField(
|
||||
jni, j_decoder_output_buffer, j_texture_frame_delay_ms_field_);
|
||||
|
||||
// Create webrtc::VideoFrameBuffer with native texture handle.
|
||||
// Create VideoFrameBuffer with native texture handle.
|
||||
frame_buffer = surface_texture_helper_->CreateTextureFrame(
|
||||
width, height, NativeHandleImpl(jni, texture_id, j_transform_matrix));
|
||||
} else {
|
||||
@ -805,7 +794,7 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs(
|
||||
payload += output_buffer_offset;
|
||||
|
||||
// Create yuv420 frame.
|
||||
rtc::scoped_refptr<webrtc::I420Buffer> i420_buffer =
|
||||
rtc::scoped_refptr<I420Buffer> i420_buffer =
|
||||
decoded_frame_pool_.CreateBuffer(width, height);
|
||||
if (color_format == COLOR_FormatYUV420Planar) {
|
||||
RTC_CHECK_EQ(0, stride % 2);
|
||||
@ -903,7 +892,7 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs(
|
||||
|
||||
// If the frame was dropped, frame_buffer is left as nullptr.
|
||||
if (frame_buffer) {
|
||||
VideoFrame decoded_frame(frame_buffer, 0, 0, webrtc::kVideoRotation_0);
|
||||
VideoFrame decoded_frame(frame_buffer, 0, 0, kVideoRotation_0);
|
||||
decoded_frame.set_timestamp(output_timestamps_ms);
|
||||
decoded_frame.set_ntp_time_ms(output_ntp_timestamps_ms);
|
||||
|
||||
@ -1004,7 +993,7 @@ void MediaCodecVideoDecoderFactory::SetEGLContext(
|
||||
}
|
||||
}
|
||||
|
||||
webrtc::VideoDecoder* MediaCodecVideoDecoderFactory::CreateVideoDecoder(
|
||||
VideoDecoder* MediaCodecVideoDecoderFactory::CreateVideoDecoder(
|
||||
VideoCodecType type) {
|
||||
if (supported_codec_types_.empty()) {
|
||||
ALOGW << "No HW video decoder for type " << (int)type;
|
||||
@ -1022,8 +1011,7 @@ webrtc::VideoDecoder* MediaCodecVideoDecoderFactory::CreateVideoDecoder(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void MediaCodecVideoDecoderFactory::DestroyVideoDecoder(
|
||||
webrtc::VideoDecoder* decoder) {
|
||||
void MediaCodecVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder* decoder) {
|
||||
ALOGD << "Destroy video decoder.";
|
||||
delete decoder;
|
||||
}
|
||||
@ -1032,4 +1020,5 @@ const char* MediaCodecVideoDecoder::ImplementationName() const {
|
||||
return "MediaCodec";
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,7 +14,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Implementation of Android MediaCodec based decoder factory.
|
||||
class MediaCodecVideoDecoderFactory
|
||||
@ -26,16 +27,16 @@ class MediaCodecVideoDecoderFactory
|
||||
void SetEGLContext(JNIEnv* jni, jobject render_egl_context);
|
||||
|
||||
// WebRtcVideoDecoderFactory implementation.
|
||||
webrtc::VideoDecoder* CreateVideoDecoder(webrtc::VideoCodecType type)
|
||||
override;
|
||||
VideoDecoder* CreateVideoDecoder(VideoCodecType type) override;
|
||||
|
||||
void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override;
|
||||
void DestroyVideoDecoder(VideoDecoder* decoder) override;
|
||||
|
||||
private:
|
||||
jobject egl_context_;
|
||||
std::vector<webrtc::VideoCodecType> supported_codec_types_;
|
||||
std::vector<VideoCodecType> supported_codec_types_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIADECODER_JNI_H_
|
||||
|
||||
@ -50,18 +50,8 @@ using rtc::Bind;
|
||||
using rtc::Thread;
|
||||
using rtc::ThreadManager;
|
||||
|
||||
using webrtc::CodecSpecificInfo;
|
||||
using webrtc::EncodedImage;
|
||||
using webrtc::VideoFrame;
|
||||
using webrtc::RTPFragmentationHeader;
|
||||
using webrtc::VideoCodec;
|
||||
using webrtc::VideoCodecType;
|
||||
using webrtc::kVideoCodecH264;
|
||||
using webrtc::kVideoCodecVP8;
|
||||
using webrtc::kVideoCodecVP9;
|
||||
using webrtc::QualityScaler;
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Maximum supported HW video encoder fps.
|
||||
#define MAX_VIDEO_FPS 30
|
||||
@ -93,32 +83,32 @@ const char kH264HighProfileFieldTrial[] = "WebRTC-H264HighProfile";
|
||||
const char kCustomQPThresholdsFieldTrial[] = "WebRTC-CustomQPThresholds";
|
||||
} // namespace
|
||||
|
||||
// MediaCodecVideoEncoder is a webrtc::VideoEncoder implementation that uses
|
||||
// MediaCodecVideoEncoder is a VideoEncoder implementation that uses
|
||||
// Android's MediaCodec SDK API behind the scenes to implement (hopefully)
|
||||
// HW-backed video encode. This C++ class is implemented as a very thin shim,
|
||||
// delegating all of the interesting work to org.webrtc.MediaCodecVideoEncoder.
|
||||
// MediaCodecVideoEncoder must be operated on a single task queue, currently
|
||||
// this is the encoder queue from ViE encoder.
|
||||
class MediaCodecVideoEncoder : public webrtc::VideoEncoder {
|
||||
class MediaCodecVideoEncoder : public VideoEncoder {
|
||||
public:
|
||||
virtual ~MediaCodecVideoEncoder();
|
||||
MediaCodecVideoEncoder(JNIEnv* jni,
|
||||
const cricket::VideoCodec& codec,
|
||||
jobject egl_context);
|
||||
|
||||
// webrtc::VideoEncoder implementation.
|
||||
int32_t InitEncode(const webrtc::VideoCodec* codec_settings,
|
||||
// VideoEncoder implementation.
|
||||
int32_t InitEncode(const VideoCodec* codec_settings,
|
||||
int32_t /* number_of_cores */,
|
||||
size_t /* max_payload_size */) override;
|
||||
int32_t Encode(const webrtc::VideoFrame& input_image,
|
||||
const webrtc::CodecSpecificInfo* /* codec_specific_info */,
|
||||
const std::vector<webrtc::FrameType>* frame_types) override;
|
||||
int32_t Encode(const VideoFrame& input_image,
|
||||
const CodecSpecificInfo* /* codec_specific_info */,
|
||||
const std::vector<FrameType>* frame_types) override;
|
||||
int32_t RegisterEncodeCompleteCallback(
|
||||
webrtc::EncodedImageCallback* callback) override;
|
||||
EncodedImageCallback* callback) override;
|
||||
int32_t Release() override;
|
||||
int32_t SetChannelParameters(uint32_t /* packet_loss */,
|
||||
int64_t /* rtt */) override;
|
||||
int32_t SetRateAllocation(const webrtc::BitrateAllocation& rate_allocation,
|
||||
int32_t SetRateAllocation(const BitrateAllocation& rate_allocation,
|
||||
uint32_t frame_rate) override;
|
||||
|
||||
bool SupportsNativeHandle() const override { return egl_context_ != nullptr; }
|
||||
@ -170,19 +160,17 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder {
|
||||
// Reconfigure to match |frame| in width, height. Also reconfigures the
|
||||
// encoder if |frame| is a texture/byte buffer and the encoder is initialized
|
||||
// for byte buffer/texture. Returns false if reconfiguring fails.
|
||||
bool MaybeReconfigureEncoder(JNIEnv* jni, const webrtc::VideoFrame& frame);
|
||||
bool MaybeReconfigureEncoder(JNIEnv* jni, const VideoFrame& frame);
|
||||
|
||||
// Returns true if the frame is a texture frame and we should use surface
|
||||
// based encoding.
|
||||
bool IsTextureFrame(JNIEnv* jni, const webrtc::VideoFrame& frame);
|
||||
bool IsTextureFrame(JNIEnv* jni, const VideoFrame& frame);
|
||||
|
||||
bool EncodeByteBuffer(JNIEnv* jni,
|
||||
bool key_frame,
|
||||
const webrtc::VideoFrame& frame,
|
||||
const VideoFrame& frame,
|
||||
int input_buffer_index);
|
||||
bool EncodeTexture(JNIEnv* jni,
|
||||
bool key_frame,
|
||||
const webrtc::VideoFrame& frame);
|
||||
bool EncodeTexture(JNIEnv* jni, bool key_frame, const VideoFrame& frame);
|
||||
// Encodes a new style org.webrtc.VideoFrame. Might be a I420 or a texture
|
||||
// frame.
|
||||
bool EncodeJavaFrame(JNIEnv* jni,
|
||||
@ -219,7 +207,7 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder {
|
||||
// Type of video codec.
|
||||
const cricket::VideoCodec codec_;
|
||||
|
||||
webrtc::EncodedImageCallback* callback_;
|
||||
EncodedImageCallback* callback_;
|
||||
|
||||
// State that is constant for the lifetime of this object once the ctor
|
||||
// returns.
|
||||
@ -273,7 +261,7 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder {
|
||||
InputFrameInfo(int64_t encode_start_time,
|
||||
int32_t frame_timestamp,
|
||||
int64_t frame_render_time_ms,
|
||||
webrtc::VideoRotation rotation)
|
||||
VideoRotation rotation)
|
||||
: encode_start_time(encode_start_time),
|
||||
frame_timestamp(frame_timestamp),
|
||||
frame_render_time_ms(frame_render_time_ms),
|
||||
@ -284,15 +272,15 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder {
|
||||
// Input frame information.
|
||||
const int32_t frame_timestamp;
|
||||
const int64_t frame_render_time_ms;
|
||||
const webrtc::VideoRotation rotation;
|
||||
const VideoRotation rotation;
|
||||
};
|
||||
std::list<InputFrameInfo> input_frame_infos_;
|
||||
int32_t output_timestamp_; // Last output frame timestamp from
|
||||
// |input_frame_infos_|.
|
||||
int64_t output_render_time_ms_; // Last output frame render time from
|
||||
// |input_frame_infos_|.
|
||||
webrtc::VideoRotation output_rotation_; // Last output frame rotation from
|
||||
// |input_frame_infos_|.
|
||||
VideoRotation output_rotation_; // Last output frame rotation from
|
||||
// |input_frame_infos_|.
|
||||
|
||||
// Frame size in bytes fed to MediaCodec.
|
||||
int yuv_size_;
|
||||
@ -300,14 +288,14 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder {
|
||||
// value and the next Encode() call being ignored.
|
||||
bool drop_next_input_frame_;
|
||||
bool scale_;
|
||||
webrtc::H264::Profile profile_;
|
||||
H264::Profile profile_;
|
||||
// Global references; must be deleted in Release().
|
||||
std::vector<jobject> input_buffers_;
|
||||
webrtc::H264BitstreamParser h264_bitstream_parser_;
|
||||
H264BitstreamParser h264_bitstream_parser_;
|
||||
|
||||
// VP9 variables to populate codec specific structure.
|
||||
webrtc::GofInfoVP9 gof_; // Contains each frame's temporal information for
|
||||
// non-flexible VP9 mode.
|
||||
GofInfoVP9 gof_; // Contains each frame's temporal information for
|
||||
// non-flexible VP9 mode.
|
||||
size_t gof_idx_;
|
||||
|
||||
// EGL context - owned by factory, should not be allocated/destroyed
|
||||
@ -319,7 +307,7 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder {
|
||||
// corresponding to a large image change).
|
||||
int64_t last_frame_received_ms_;
|
||||
int frames_received_since_last_key_;
|
||||
webrtc::VideoCodecMode codec_mode_;
|
||||
VideoCodecMode codec_mode_;
|
||||
|
||||
// RTP state.
|
||||
uint16_t picture_id_;
|
||||
@ -412,15 +400,14 @@ MediaCodecVideoEncoder::MediaCodecVideoEncoder(JNIEnv* jni,
|
||||
ProcessHWError(true /* reset_if_fallback_unavailable */);
|
||||
}
|
||||
|
||||
webrtc::Random random(rtc::TimeMicros());
|
||||
Random random(rtc::TimeMicros());
|
||||
picture_id_ = random.Rand<uint16_t>() & 0x7FFF;
|
||||
tl0_pic_idx_ = random.Rand<uint8_t>();
|
||||
}
|
||||
|
||||
int32_t MediaCodecVideoEncoder::InitEncode(
|
||||
const webrtc::VideoCodec* codec_settings,
|
||||
int32_t /* number_of_cores */,
|
||||
size_t /* max_payload_size */) {
|
||||
int32_t MediaCodecVideoEncoder::InitEncode(const VideoCodec* codec_settings,
|
||||
int32_t /* number_of_cores */,
|
||||
size_t /* max_payload_size */) {
|
||||
RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
|
||||
if (codec_settings == NULL) {
|
||||
ALOGE << "NULL VideoCodec instance";
|
||||
@ -452,10 +439,10 @@ int32_t MediaCodecVideoEncoder::InitEncode(
|
||||
ALOGD << "Encoder automatic resize " << (scale_ ? "enabled" : "disabled");
|
||||
|
||||
// Check allowed H.264 profile
|
||||
profile_ = webrtc::H264::Profile::kProfileBaseline;
|
||||
profile_ = H264::Profile::kProfileBaseline;
|
||||
if (codec_type == kVideoCodecH264) {
|
||||
const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id =
|
||||
webrtc::H264::ParseSdpProfileLevelId(codec_.params);
|
||||
const rtc::Optional<H264::ProfileLevelId> profile_level_id =
|
||||
H264::ParseSdpProfileLevelId(codec_.params);
|
||||
RTC_DCHECK(profile_level_id);
|
||||
profile_ = profile_level_id->profile;
|
||||
ALOGD << "H.264 profile: " << profile_;
|
||||
@ -553,7 +540,7 @@ int32_t MediaCodecVideoEncoder::ProcessHWErrorOnEncode() {
|
||||
}
|
||||
|
||||
VideoCodecType MediaCodecVideoEncoder::GetCodecType() const {
|
||||
return webrtc::PayloadStringToCodecType(codec_.name);
|
||||
return PayloadStringToCodecType(codec_.name);
|
||||
}
|
||||
|
||||
int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width,
|
||||
@ -602,7 +589,7 @@ int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width,
|
||||
input_frame_infos_.clear();
|
||||
drop_next_input_frame_ = false;
|
||||
use_surface_ = use_surface;
|
||||
gof_.SetGofInfoVP9(webrtc::TemporalStructureMode::kTemporalStructureMode1);
|
||||
gof_.SetGofInfoVP9(TemporalStructureMode::kTemporalStructureMode1);
|
||||
gof_idx_ = 0;
|
||||
last_frame_received_ms_ = -1;
|
||||
frames_received_since_last_key_ = kMinKeyFrameInterval;
|
||||
@ -686,9 +673,9 @@ int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width,
|
||||
}
|
||||
|
||||
int32_t MediaCodecVideoEncoder::Encode(
|
||||
const webrtc::VideoFrame& frame,
|
||||
const webrtc::CodecSpecificInfo* /* codec_specific_info */,
|
||||
const std::vector<webrtc::FrameType>* frame_types) {
|
||||
const VideoFrame& frame,
|
||||
const CodecSpecificInfo* /* codec_specific_info */,
|
||||
const std::vector<FrameType>* frame_types) {
|
||||
RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
|
||||
if (sw_fallback_required_)
|
||||
return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
|
||||
@ -701,7 +688,7 @@ int32_t MediaCodecVideoEncoder::Encode(
|
||||
}
|
||||
|
||||
bool send_key_frame = false;
|
||||
if (codec_mode_ == webrtc::kRealtimeVideo) {
|
||||
if (codec_mode_ == kRealtimeVideo) {
|
||||
++frames_received_since_last_key_;
|
||||
int64_t now_ms = rtc::TimeMillis();
|
||||
if (last_frame_received_ms_ != -1 &&
|
||||
@ -761,8 +748,7 @@ int32_t MediaCodecVideoEncoder::Encode(
|
||||
}
|
||||
consecutive_full_queue_frame_drops_ = 0;
|
||||
|
||||
rtc::scoped_refptr<webrtc::VideoFrameBuffer> input_buffer(
|
||||
frame.video_frame_buffer());
|
||||
rtc::scoped_refptr<VideoFrameBuffer> input_buffer(frame.video_frame_buffer());
|
||||
|
||||
VideoFrame input_frame(input_buffer, frame.timestamp(),
|
||||
frame.render_time_ms(), frame.rotation());
|
||||
@ -773,7 +759,7 @@ int32_t MediaCodecVideoEncoder::Encode(
|
||||
}
|
||||
|
||||
const bool key_frame =
|
||||
frame_types->front() != webrtc::kVideoFrameDelta || send_key_frame;
|
||||
frame_types->front() != kVideoFrameDelta || send_key_frame;
|
||||
bool encode_status = true;
|
||||
|
||||
int j_input_buffer_index = -1;
|
||||
@ -803,7 +789,7 @@ int32_t MediaCodecVideoEncoder::Encode(
|
||||
}
|
||||
|
||||
if (input_frame.video_frame_buffer()->type() !=
|
||||
webrtc::VideoFrameBuffer::Type::kNative) {
|
||||
VideoFrameBuffer::Type::kNative) {
|
||||
encode_status =
|
||||
EncodeByteBuffer(jni, key_frame, input_frame, j_input_buffer_index);
|
||||
} else {
|
||||
@ -852,9 +838,8 @@ int32_t MediaCodecVideoEncoder::Encode(
|
||||
return WEBRTC_VIDEO_CODEC_OK;
|
||||
}
|
||||
|
||||
bool MediaCodecVideoEncoder::MaybeReconfigureEncoder(
|
||||
JNIEnv* jni,
|
||||
const webrtc::VideoFrame& frame) {
|
||||
bool MediaCodecVideoEncoder::MaybeReconfigureEncoder(JNIEnv* jni,
|
||||
const VideoFrame& frame) {
|
||||
RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
|
||||
|
||||
bool is_texture = IsTextureFrame(jni, frame);
|
||||
@ -888,9 +873,8 @@ bool MediaCodecVideoEncoder::MaybeReconfigureEncoder(
|
||||
}
|
||||
|
||||
bool MediaCodecVideoEncoder::IsTextureFrame(JNIEnv* jni,
|
||||
const webrtc::VideoFrame& frame) {
|
||||
if (frame.video_frame_buffer()->type() !=
|
||||
webrtc::VideoFrameBuffer::Type::kNative) {
|
||||
const VideoFrame& frame) {
|
||||
if (frame.video_frame_buffer()->type() != VideoFrameBuffer::Type::kNative) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -911,12 +895,12 @@ bool MediaCodecVideoEncoder::IsTextureFrame(JNIEnv* jni,
|
||||
|
||||
bool MediaCodecVideoEncoder::EncodeByteBuffer(JNIEnv* jni,
|
||||
bool key_frame,
|
||||
const webrtc::VideoFrame& frame,
|
||||
const VideoFrame& frame,
|
||||
int input_buffer_index) {
|
||||
RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
|
||||
RTC_CHECK(!use_surface_);
|
||||
|
||||
rtc::scoped_refptr<webrtc::I420BufferInterface> i420_buffer =
|
||||
rtc::scoped_refptr<I420BufferInterface> i420_buffer =
|
||||
frame.video_frame_buffer()->ToI420();
|
||||
if (!FillInputBuffer(jni, input_buffer_index, i420_buffer->DataY(),
|
||||
i420_buffer->StrideY(), i420_buffer->DataU(),
|
||||
@ -962,7 +946,7 @@ bool MediaCodecVideoEncoder::FillInputBuffer(JNIEnv* jni,
|
||||
|
||||
bool MediaCodecVideoEncoder::EncodeTexture(JNIEnv* jni,
|
||||
bool key_frame,
|
||||
const webrtc::VideoFrame& frame) {
|
||||
const VideoFrame& frame) {
|
||||
RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
|
||||
RTC_CHECK(use_surface_);
|
||||
NativeHandleImpl handle =
|
||||
@ -997,7 +981,7 @@ bool MediaCodecVideoEncoder::EncodeJavaFrame(JNIEnv* jni,
|
||||
}
|
||||
|
||||
int32_t MediaCodecVideoEncoder::RegisterEncodeCompleteCallback(
|
||||
webrtc::EncodedImageCallback* callback) {
|
||||
EncodedImageCallback* callback) {
|
||||
RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
@ -1038,7 +1022,7 @@ int32_t MediaCodecVideoEncoder::Release() {
|
||||
}
|
||||
|
||||
int32_t MediaCodecVideoEncoder::SetRateAllocation(
|
||||
const webrtc::BitrateAllocation& rate_allocation,
|
||||
const BitrateAllocation& rate_allocation,
|
||||
uint32_t frame_rate) {
|
||||
RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
|
||||
const uint32_t new_bit_rate = rate_allocation.get_sum_kbps();
|
||||
@ -1147,35 +1131,33 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
||||
|
||||
// Callback - return encoded frame.
|
||||
const VideoCodecType codec_type = GetCodecType();
|
||||
webrtc::EncodedImageCallback::Result callback_result(
|
||||
webrtc::EncodedImageCallback::Result::OK);
|
||||
EncodedImageCallback::Result callback_result(
|
||||
EncodedImageCallback::Result::OK);
|
||||
if (callback_) {
|
||||
std::unique_ptr<webrtc::EncodedImage> image(
|
||||
new webrtc::EncodedImage(payload, payload_size, payload_size));
|
||||
std::unique_ptr<EncodedImage> image(
|
||||
new EncodedImage(payload, payload_size, payload_size));
|
||||
image->_encodedWidth = width_;
|
||||
image->_encodedHeight = height_;
|
||||
image->_timeStamp = output_timestamp_;
|
||||
image->capture_time_ms_ = output_render_time_ms_;
|
||||
image->rotation_ = output_rotation_;
|
||||
image->content_type_ =
|
||||
(codec_mode_ == webrtc::VideoCodecMode::kScreensharing)
|
||||
? webrtc::VideoContentType::SCREENSHARE
|
||||
: webrtc::VideoContentType::UNSPECIFIED;
|
||||
image->timing_.flags = webrtc::TimingFrameFlags::kInvalid;
|
||||
image->_frameType =
|
||||
(key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta);
|
||||
image->content_type_ = (codec_mode_ == VideoCodecMode::kScreensharing)
|
||||
? VideoContentType::SCREENSHARE
|
||||
: VideoContentType::UNSPECIFIED;
|
||||
image->timing_.flags = TimingFrameFlags::kInvalid;
|
||||
image->_frameType = (key_frame ? kVideoFrameKey : kVideoFrameDelta);
|
||||
image->_completeFrame = true;
|
||||
webrtc::CodecSpecificInfo info;
|
||||
CodecSpecificInfo info;
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.codecType = codec_type;
|
||||
if (codec_type == kVideoCodecVP8) {
|
||||
info.codecSpecific.VP8.pictureId = picture_id_;
|
||||
info.codecSpecific.VP8.nonReference = false;
|
||||
info.codecSpecific.VP8.simulcastIdx = 0;
|
||||
info.codecSpecific.VP8.temporalIdx = webrtc::kNoTemporalIdx;
|
||||
info.codecSpecific.VP8.temporalIdx = kNoTemporalIdx;
|
||||
info.codecSpecific.VP8.layerSync = false;
|
||||
info.codecSpecific.VP8.tl0PicIdx = webrtc::kNoTl0PicIdx;
|
||||
info.codecSpecific.VP8.keyIdx = webrtc::kNoKeyIdx;
|
||||
info.codecSpecific.VP8.tl0PicIdx = kNoTl0PicIdx;
|
||||
info.codecSpecific.VP8.keyIdx = kNoKeyIdx;
|
||||
} else if (codec_type == kVideoCodecVP9) {
|
||||
if (key_frame) {
|
||||
gof_idx_ = 0;
|
||||
@ -1185,8 +1167,8 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
||||
info.codecSpecific.VP9.flexible_mode = false;
|
||||
info.codecSpecific.VP9.ss_data_available = key_frame ? true : false;
|
||||
info.codecSpecific.VP9.tl0_pic_idx = tl0_pic_idx_++;
|
||||
info.codecSpecific.VP9.temporal_idx = webrtc::kNoTemporalIdx;
|
||||
info.codecSpecific.VP9.spatial_idx = webrtc::kNoSpatialIdx;
|
||||
info.codecSpecific.VP9.temporal_idx = kNoTemporalIdx;
|
||||
info.codecSpecific.VP9.spatial_idx = kNoSpatialIdx;
|
||||
info.codecSpecific.VP9.temporal_up_switch = true;
|
||||
info.codecSpecific.VP9.inter_layer_predicted = false;
|
||||
info.codecSpecific.VP9.gof_idx =
|
||||
@ -1203,7 +1185,7 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
||||
picture_id_ = (picture_id_ + 1) & 0x7FFF;
|
||||
|
||||
// Generate a header describing a single fragment.
|
||||
webrtc::RTPFragmentationHeader header;
|
||||
RTPFragmentationHeader header;
|
||||
memset(&header, 0, sizeof(header));
|
||||
if (codec_type == kVideoCodecVP8 || codec_type == kVideoCodecVP9) {
|
||||
header.VerifyAndAllocateFragmentationHeader(1);
|
||||
@ -1213,13 +1195,13 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
||||
header.fragmentationTimeDiff[0] = 0;
|
||||
if (codec_type == kVideoCodecVP8) {
|
||||
int qp;
|
||||
if (webrtc::vp8::GetQp(payload, payload_size, &qp)) {
|
||||
if (vp8::GetQp(payload, payload_size, &qp)) {
|
||||
current_acc_qp_ += qp;
|
||||
image->qp_ = qp;
|
||||
}
|
||||
} else if (codec_type == kVideoCodecVP9) {
|
||||
int qp;
|
||||
if (webrtc::vp9::GetQp(payload, payload_size, &qp)) {
|
||||
if (vp9::GetQp(payload, payload_size, &qp)) {
|
||||
current_acc_qp_ += qp;
|
||||
image->qp_ = qp;
|
||||
}
|
||||
@ -1232,8 +1214,8 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
||||
image->qp_ = qp;
|
||||
}
|
||||
// For H.264 search for start codes.
|
||||
const std::vector<webrtc::H264::NaluIndex> nalu_idxs =
|
||||
webrtc::H264::FindNaluIndices(payload, payload_size);
|
||||
const std::vector<H264::NaluIndex> nalu_idxs =
|
||||
H264::FindNaluIndices(payload, payload_size);
|
||||
if (nalu_idxs.empty()) {
|
||||
ALOGE << "Start code is not found!";
|
||||
ALOGE << "Data:" << image->_buffer[0] << " " << image->_buffer[1]
|
||||
@ -1316,12 +1298,12 @@ void MediaCodecVideoEncoder::LogStatistics(bool force_log) {
|
||||
}
|
||||
}
|
||||
|
||||
webrtc::VideoEncoder::ScalingSettings
|
||||
MediaCodecVideoEncoder::GetScalingSettings() const {
|
||||
if (webrtc::field_trial::IsEnabled(kCustomQPThresholdsFieldTrial)) {
|
||||
VideoEncoder::ScalingSettings MediaCodecVideoEncoder::GetScalingSettings()
|
||||
const {
|
||||
if (field_trial::IsEnabled(kCustomQPThresholdsFieldTrial)) {
|
||||
const VideoCodecType codec_type = GetCodecType();
|
||||
std::string experiment_string =
|
||||
webrtc::field_trial::FindFullName(kCustomQPThresholdsFieldTrial);
|
||||
field_trial::FindFullName(kCustomQPThresholdsFieldTrial);
|
||||
ALOGD << "QP custom thresholds: " << experiment_string << " for codec "
|
||||
<< codec_type;
|
||||
int low_vp8_qp_threshold;
|
||||
@ -1391,11 +1373,11 @@ MediaCodecVideoEncoderFactory::MediaCodecVideoEncoderFactory()
|
||||
// TODO(magjed): Enumerate actual level instead of using hardcoded level
|
||||
// 3.1. Level 3.1 is 1280x720@30fps which is enough for now.
|
||||
cricket::VideoCodec constrained_high(cricket::kH264CodecName);
|
||||
const webrtc::H264::ProfileLevelId constrained_high_profile(
|
||||
webrtc::H264::kProfileConstrainedHigh, webrtc::H264::kLevel3_1);
|
||||
const H264::ProfileLevelId constrained_high_profile(
|
||||
H264::kProfileConstrainedHigh, H264::kLevel3_1);
|
||||
constrained_high.SetParam(
|
||||
cricket::kH264FmtpProfileLevelId,
|
||||
*webrtc::H264::ProfileLevelIdToString(constrained_high_profile));
|
||||
*H264::ProfileLevelIdToString(constrained_high_profile));
|
||||
constrained_high.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
|
||||
constrained_high.SetParam(cricket::kH264FmtpPacketizationMode, "1");
|
||||
supported_codecs_with_h264_hp_.push_back(constrained_high);
|
||||
@ -1412,11 +1394,11 @@ MediaCodecVideoEncoderFactory::MediaCodecVideoEncoderFactory()
|
||||
// profile as long as we have decode support for it and still send Baseline
|
||||
// since Baseline is a subset of the High profile.
|
||||
cricket::VideoCodec constrained_baseline(cricket::kH264CodecName);
|
||||
const webrtc::H264::ProfileLevelId constrained_baseline_profile(
|
||||
webrtc::H264::kProfileConstrainedBaseline, webrtc::H264::kLevel3_1);
|
||||
const H264::ProfileLevelId constrained_baseline_profile(
|
||||
H264::kProfileConstrainedBaseline, H264::kLevel3_1);
|
||||
constrained_baseline.SetParam(
|
||||
cricket::kH264FmtpProfileLevelId,
|
||||
*webrtc::H264::ProfileLevelIdToString(constrained_baseline_profile));
|
||||
*H264::ProfileLevelIdToString(constrained_baseline_profile));
|
||||
constrained_baseline.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
|
||||
constrained_baseline.SetParam(cricket::kH264FmtpPacketizationMode, "1");
|
||||
supported_codecs_.push_back(constrained_baseline);
|
||||
@ -1445,7 +1427,7 @@ void MediaCodecVideoEncoderFactory::SetEGLContext(
|
||||
}
|
||||
}
|
||||
|
||||
webrtc::VideoEncoder* MediaCodecVideoEncoderFactory::CreateVideoEncoder(
|
||||
VideoEncoder* MediaCodecVideoEncoderFactory::CreateVideoEncoder(
|
||||
const cricket::VideoCodec& codec) {
|
||||
if (supported_codecs().empty()) {
|
||||
ALOGW << "No HW video encoder for codec " << codec.name;
|
||||
@ -1463,15 +1445,14 @@ webrtc::VideoEncoder* MediaCodecVideoEncoderFactory::CreateVideoEncoder(
|
||||
|
||||
const std::vector<cricket::VideoCodec>&
|
||||
MediaCodecVideoEncoderFactory::supported_codecs() const {
|
||||
if (webrtc::field_trial::IsEnabled(kH264HighProfileFieldTrial)) {
|
||||
if (field_trial::IsEnabled(kH264HighProfileFieldTrial)) {
|
||||
return supported_codecs_with_h264_hp_;
|
||||
} else {
|
||||
return supported_codecs_;
|
||||
}
|
||||
}
|
||||
|
||||
void MediaCodecVideoEncoderFactory::DestroyVideoEncoder(
|
||||
webrtc::VideoEncoder* encoder) {
|
||||
void MediaCodecVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder* encoder) {
|
||||
ALOGD << "Destroy video encoder.";
|
||||
delete encoder;
|
||||
}
|
||||
@ -1500,4 +1481,5 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
stride_u, buffer_v, stride_v);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Implementation of Android MediaCodec based encoder factory.
|
||||
class MediaCodecVideoEncoderFactory
|
||||
@ -28,10 +29,9 @@ class MediaCodecVideoEncoderFactory
|
||||
void SetEGLContext(JNIEnv* jni, jobject egl_context);
|
||||
|
||||
// WebRtcVideoEncoderFactory implementation.
|
||||
webrtc::VideoEncoder* CreateVideoEncoder(
|
||||
const cricket::VideoCodec& codec) override;
|
||||
VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override;
|
||||
const std::vector<cricket::VideoCodec>& supported_codecs() const override;
|
||||
void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override;
|
||||
void DestroyVideoEncoder(VideoEncoder* encoder) override;
|
||||
|
||||
private:
|
||||
jobject egl_context_;
|
||||
@ -41,6 +41,7 @@ class MediaCodecVideoEncoderFactory
|
||||
std::vector<cricket::VideoCodec> supported_codecs_with_h264_hp_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIAENCODER_JNI_H_
|
||||
|
||||
@ -17,10 +17,11 @@
|
||||
#include "webrtc/system_wrappers/include/metrics_default.h"
|
||||
|
||||
// Enables collection of native histograms and creating them.
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void, Metrics_nativeEnable, JNIEnv* jni, jclass) {
|
||||
webrtc::metrics::Enable();
|
||||
metrics::Enable();
|
||||
}
|
||||
|
||||
// Gets and clears native histograms.
|
||||
@ -39,9 +40,8 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
jobject j_metrics = jni->NewObject(
|
||||
j_metrics_class, GetMethodID(jni, j_metrics_class, "<init>", "()V"));
|
||||
|
||||
std::map<std::string, std::unique_ptr<webrtc::metrics::SampleInfo>>
|
||||
histograms;
|
||||
webrtc::metrics::GetAndReset(&histograms);
|
||||
std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
|
||||
metrics::GetAndReset(&histograms);
|
||||
for (const auto& kv : histograms) {
|
||||
// Create and add samples to |HistogramInfo|.
|
||||
jobject j_info = jni->NewObject(
|
||||
@ -61,4 +61,5 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
return j_metrics;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -21,6 +21,7 @@ const int kRequiredResolutionAlignment = 2;
|
||||
}
|
||||
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
AndroidVideoTrackSource::AndroidVideoTrackSource(
|
||||
rtc::Thread* signaling_thread,
|
||||
@ -29,17 +30,16 @@ AndroidVideoTrackSource::AndroidVideoTrackSource(
|
||||
bool is_screencast)
|
||||
: AdaptedVideoTrackSource(kRequiredResolutionAlignment),
|
||||
signaling_thread_(signaling_thread),
|
||||
surface_texture_helper_(
|
||||
new rtc::RefCountedObject<webrtc_jni::SurfaceTextureHelper>(
|
||||
jni,
|
||||
j_surface_texture_helper)),
|
||||
surface_texture_helper_(new rtc::RefCountedObject<SurfaceTextureHelper>(
|
||||
jni,
|
||||
j_surface_texture_helper)),
|
||||
video_buffer_factory_(jni),
|
||||
is_screencast_(is_screencast) {
|
||||
LOG(LS_INFO) << "AndroidVideoTrackSource ctor";
|
||||
camera_thread_checker_.DetachFromThread();
|
||||
|
||||
jclass j_video_frame_buffer_class =
|
||||
webrtc_jni::FindClass(jni, "org/webrtc/VideoFrame$Buffer");
|
||||
FindClass(jni, "org/webrtc/VideoFrame$Buffer");
|
||||
j_crop_and_scale_id_ =
|
||||
jni->GetMethodID(j_video_frame_buffer_class, "cropAndScale",
|
||||
"(IIIIII)Lorg/webrtc/VideoFrame$Buffer;");
|
||||
@ -115,7 +115,7 @@ void AndroidVideoTrackSource::OnTextureFrameCaptured(
|
||||
int height,
|
||||
VideoRotation rotation,
|
||||
int64_t timestamp_ns,
|
||||
const webrtc_jni::NativeHandleImpl& handle) {
|
||||
const NativeHandleImpl& handle) {
|
||||
RTC_DCHECK(camera_thread_checker_.CalledOnValidThread());
|
||||
|
||||
int64_t camera_time_us = timestamp_ns / rtc::kNumNanosecsPerMicrosec;
|
||||
@ -136,7 +136,7 @@ void AndroidVideoTrackSource::OnTextureFrameCaptured(
|
||||
return;
|
||||
}
|
||||
|
||||
webrtc_jni::Matrix matrix = handle.sampling_matrix;
|
||||
Matrix matrix = handle.sampling_matrix;
|
||||
|
||||
matrix.Crop(crop_width / static_cast<float>(width),
|
||||
crop_height / static_cast<float>(height),
|
||||
@ -153,11 +153,10 @@ void AndroidVideoTrackSource::OnTextureFrameCaptured(
|
||||
rotation = kVideoRotation_0;
|
||||
}
|
||||
|
||||
OnFrame(VideoFrame(
|
||||
surface_texture_helper_->CreateTextureFrame(
|
||||
adapted_width, adapted_height,
|
||||
webrtc_jni::NativeHandleImpl(handle.oes_texture_id, matrix)),
|
||||
rotation, translated_camera_time_us));
|
||||
OnFrame(VideoFrame(surface_texture_helper_->CreateTextureFrame(
|
||||
adapted_width, adapted_height,
|
||||
NativeHandleImpl(handle.oes_texture_id, matrix)),
|
||||
rotation, translated_camera_time_us));
|
||||
}
|
||||
|
||||
void AndroidVideoTrackSource::OnFrameCaptured(JNIEnv* jni,
|
||||
@ -209,3 +208,4 @@ void AndroidVideoTrackSource::OnOutputFormatRequest(int width,
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
} // namespace webrtc
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
#include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
class AndroidVideoTrackSource : public rtc::AdaptedVideoTrackSource {
|
||||
public:
|
||||
@ -59,7 +60,7 @@ class AndroidVideoTrackSource : public rtc::AdaptedVideoTrackSource {
|
||||
int height,
|
||||
VideoRotation rotation,
|
||||
int64_t timestamp_ns,
|
||||
const webrtc_jni::NativeHandleImpl& handle);
|
||||
const NativeHandleImpl& handle);
|
||||
|
||||
void OnFrameCaptured(JNIEnv* jni,
|
||||
int width,
|
||||
@ -70,8 +71,7 @@ class AndroidVideoTrackSource : public rtc::AdaptedVideoTrackSource {
|
||||
|
||||
void OnOutputFormatRequest(int width, int height, int fps);
|
||||
|
||||
rtc::scoped_refptr<webrtc_jni::SurfaceTextureHelper>
|
||||
surface_texture_helper() {
|
||||
rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper() {
|
||||
return surface_texture_helper_;
|
||||
}
|
||||
|
||||
@ -83,13 +83,14 @@ class AndroidVideoTrackSource : public rtc::AdaptedVideoTrackSource {
|
||||
rtc::TimestampAligner timestamp_aligner_;
|
||||
NV12ToI420Scaler nv12toi420_scaler_;
|
||||
I420BufferPool buffer_pool_;
|
||||
rtc::scoped_refptr<webrtc_jni::SurfaceTextureHelper> surface_texture_helper_;
|
||||
webrtc_jni::AndroidVideoBufferFactory video_buffer_factory_;
|
||||
rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper_;
|
||||
AndroidVideoBufferFactory video_buffer_factory_;
|
||||
const bool is_screencast_;
|
||||
|
||||
jmethodID j_crop_and_scale_id_;
|
||||
};
|
||||
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_API_ANDROID_JNI_ANDROIDVIDEOTRACKSOURCE_H_
|
||||
|
||||
@ -14,19 +14,24 @@
|
||||
#include "webrtc/sdk/android/src/jni/androidvideotracksource.h"
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
static webrtc::VideoRotation jintToVideoRotation(jint rotation) {
|
||||
namespace webrtc {
|
||||
|
||||
namespace {
|
||||
|
||||
static VideoRotation jintToVideoRotation(jint rotation) {
|
||||
RTC_DCHECK(rotation == 0 || rotation == 90 || rotation == 180 ||
|
||||
rotation == 270);
|
||||
return static_cast<webrtc::VideoRotation>(rotation);
|
||||
return static_cast<VideoRotation>(rotation);
|
||||
}
|
||||
|
||||
namespace webrtc_jni {
|
||||
} // namespace
|
||||
|
||||
static webrtc::AndroidVideoTrackSource* AndroidVideoTrackSourceFromJavaProxy(
|
||||
namespace jni {
|
||||
|
||||
static AndroidVideoTrackSource* AndroidVideoTrackSourceFromJavaProxy(
|
||||
jlong j_proxy) {
|
||||
auto proxy_source = reinterpret_cast<webrtc::VideoTrackSourceProxy*>(j_proxy);
|
||||
return reinterpret_cast<webrtc::AndroidVideoTrackSource*>(
|
||||
proxy_source->internal());
|
||||
auto proxy_source = reinterpret_cast<VideoTrackSourceProxy*>(j_proxy);
|
||||
return reinterpret_cast<AndroidVideoTrackSource*>(proxy_source->internal());
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(
|
||||
@ -41,7 +46,7 @@ JNI_FUNCTION_DECLARATION(
|
||||
jint height,
|
||||
jint rotation,
|
||||
jlong timestamp) {
|
||||
webrtc::AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSourceFromJavaProxy(j_source);
|
||||
jbyte* bytes = jni->GetByteArrayElements(j_frame, nullptr);
|
||||
source->OnByteBufferFrameCaptured(bytes, length, width, height,
|
||||
@ -61,7 +66,7 @@ JNI_FUNCTION_DECLARATION(
|
||||
jfloatArray j_transform_matrix,
|
||||
jint j_rotation,
|
||||
jlong j_timestamp) {
|
||||
webrtc::AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSourceFromJavaProxy(j_source);
|
||||
source->OnTextureFrameCaptured(
|
||||
j_width, j_height, jintToVideoRotation(j_rotation), j_timestamp,
|
||||
@ -78,7 +83,7 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jint j_rotation,
|
||||
jlong j_timestamp_ns,
|
||||
jobject j_video_frame_buffer) {
|
||||
webrtc::AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSourceFromJavaProxy(j_source);
|
||||
source->OnFrameCaptured(jni, j_width, j_height, j_timestamp_ns,
|
||||
jintToVideoRotation(j_rotation),
|
||||
@ -92,11 +97,10 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jlong j_source,
|
||||
jboolean j_success) {
|
||||
LOG(LS_INFO) << "AndroidVideoTrackSourceObserve_nativeCapturerStarted";
|
||||
webrtc::AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSourceFromJavaProxy(j_source);
|
||||
source->SetState(j_success
|
||||
? webrtc::AndroidVideoTrackSource::SourceState::kLive
|
||||
: webrtc::AndroidVideoTrackSource::SourceState::kEnded);
|
||||
source->SetState(j_success ? AndroidVideoTrackSource::SourceState::kLive
|
||||
: AndroidVideoTrackSource::SourceState::kEnded);
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -105,9 +109,9 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jclass,
|
||||
jlong j_source) {
|
||||
LOG(LS_INFO) << "AndroidVideoTrackSourceObserve_nativeCapturerStopped";
|
||||
webrtc::AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSourceFromJavaProxy(j_source);
|
||||
source->SetState(webrtc::AndroidVideoTrackSource::SourceState::kEnded);
|
||||
source->SetState(AndroidVideoTrackSource::SourceState::kEnded);
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -119,9 +123,10 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jint j_height,
|
||||
jint j_fps) {
|
||||
LOG(LS_INFO) << "VideoSource_nativeAdaptOutputFormat";
|
||||
webrtc::AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSourceFromJavaProxy(j_source);
|
||||
source->OnOutputFormatRequest(j_width, j_height, j_fps);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -11,7 +11,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// ClassReferenceHolder holds global reference to Java classes in app/webrtc.
|
||||
class ClassReferenceHolder {
|
||||
@ -153,4 +154,5 @@ jclass FindClass(JNIEnv* jni, const char* name) {
|
||||
return g_class_reference_holder->GetClass(name);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -20,7 +20,8 @@
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// LoadGlobalClassReferenceHolder must be called in JNI_OnLoad.
|
||||
void LoadGlobalClassReferenceHolder();
|
||||
@ -31,6 +32,15 @@ void FreeGlobalClassReferenceHolder();
|
||||
// process.
|
||||
jclass FindClass(JNIEnv* jni, const char* name);
|
||||
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
// TODO(magjed): Remove once external clients are updated.
|
||||
namespace webrtc_jni {
|
||||
|
||||
using webrtc::jni::LoadGlobalClassReferenceHolder;
|
||||
using webrtc::jni::FreeGlobalClassReferenceHolder;
|
||||
|
||||
} // namespace webrtc_jni
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_CLASSREFERENCEHOLDER_H_
|
||||
|
||||
@ -14,7 +14,8 @@
|
||||
#include "webrtc/rtc_base/checks.h"
|
||||
#include "webrtc/rtc_base/logging.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_org_webrtc_FileVideoCapturer_nativeI420ToNV21(JNIEnv* jni,
|
||||
@ -57,4 +58,5 @@ Java_org_webrtc_FileVideoCapturer_nativeI420ToNV21(JNIEnv* jni,
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -17,7 +17,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
static JavaVM* g_jvm = nullptr;
|
||||
|
||||
@ -385,4 +386,5 @@ bool Iterable::Iterator::AtEnd() const {
|
||||
return jni_ == nullptr || IsNull(jni_, iterator_);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -39,7 +39,8 @@
|
||||
#define JNI_FUNCTION_DECLARATION(rettype, name, ...) \
|
||||
extern "C" JNIEXPORT rettype JNICALL Java_org_webrtc_##name(__VA_ARGS__)
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
jint InitGlobalJniVariables(JavaVM *jvm);
|
||||
|
||||
@ -204,6 +205,15 @@ class Iterable {
|
||||
RTC_DISALLOW_COPY_AND_ASSIGN(Iterable);
|
||||
};
|
||||
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
// TODO(magjed): Remove once external clients are updated.
|
||||
namespace webrtc_jni {
|
||||
|
||||
using webrtc::jni::AttachCurrentThreadIfNeeded;
|
||||
using webrtc::jni::InitGlobalJniVariables;
|
||||
|
||||
} // namespace webrtc_jni
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_JNI_HELPERS_H_
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
extern "C" jint JNIEXPORT JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
|
||||
jint ret = InitGlobalJniVariables(jvm);
|
||||
@ -35,4 +36,5 @@ extern "C" void JNIEXPORT JNICALL JNI_OnUnLoad(JavaVM *jvm, void *reserved) {
|
||||
RTC_CHECK(rtc::CleanupSSL()) << "Failed to CleanupSSL()";
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -24,11 +24,12 @@
|
||||
#include "webrtc/sdk/android/src/jni/wrapped_native_i420_buffer.h"
|
||||
#include "webrtc/system_wrappers/include/aligned_malloc.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
namespace {
|
||||
|
||||
class AndroidVideoI420Buffer : public webrtc::I420BufferInterface {
|
||||
class AndroidVideoI420Buffer : public I420BufferInterface {
|
||||
public:
|
||||
// Wraps an existing reference to a Java VideoBuffer. Retain will not be
|
||||
// called but release will be called when the C++ object is destroyed.
|
||||
@ -167,14 +168,14 @@ jfloatArray Matrix::ToJava(JNIEnv* jni) const {
|
||||
return matrix;
|
||||
}
|
||||
|
||||
void Matrix::Rotate(webrtc::VideoRotation rotation) {
|
||||
void Matrix::Rotate(VideoRotation rotation) {
|
||||
// Texture coordinates are in the range 0 to 1. The transformation of the last
|
||||
// row in each rotation matrix is needed for proper translation, e.g, to
|
||||
// mirror x, we don't replace x by -x, but by 1-x.
|
||||
switch (rotation) {
|
||||
case webrtc::kVideoRotation_0:
|
||||
case kVideoRotation_0:
|
||||
break;
|
||||
case webrtc::kVideoRotation_90: {
|
||||
case kVideoRotation_90: {
|
||||
const float ROTATE_90[16] =
|
||||
{ elem_[4], elem_[5], elem_[6], elem_[7],
|
||||
-elem_[0], -elem_[1], -elem_[2], -elem_[3],
|
||||
@ -183,7 +184,7 @@ void Matrix::Rotate(webrtc::VideoRotation rotation) {
|
||||
elem_[2] + elem_[14], elem_[3] + elem_[15]};
|
||||
memcpy(elem_, ROTATE_90, sizeof(elem_));
|
||||
} break;
|
||||
case webrtc::kVideoRotation_180: {
|
||||
case kVideoRotation_180: {
|
||||
const float ROTATE_180[16] =
|
||||
{ -elem_[0], -elem_[1], -elem_[2], -elem_[3],
|
||||
-elem_[4], -elem_[5], -elem_[6], -elem_[7],
|
||||
@ -192,7 +193,7 @@ void Matrix::Rotate(webrtc::VideoRotation rotation) {
|
||||
elem_[2] + elem_[6] + elem_[14], elem_[3] + elem_[11]+ elem_[15]};
|
||||
memcpy(elem_, ROTATE_180, sizeof(elem_));
|
||||
} break;
|
||||
case webrtc::kVideoRotation_270: {
|
||||
case kVideoRotation_270: {
|
||||
const float ROTATE_270[16] =
|
||||
{ -elem_[4], -elem_[5], -elem_[6], -elem_[7],
|
||||
elem_[0], elem_[1], elem_[2], elem_[3],
|
||||
@ -261,7 +262,7 @@ AndroidTextureBuffer::~AndroidTextureBuffer() {
|
||||
no_longer_used_cb_();
|
||||
}
|
||||
|
||||
webrtc::VideoFrameBuffer::Type AndroidTextureBuffer::type() const {
|
||||
VideoFrameBuffer::Type AndroidTextureBuffer::type() const {
|
||||
return Type::kNative;
|
||||
}
|
||||
|
||||
@ -277,7 +278,7 @@ int AndroidTextureBuffer::height() const {
|
||||
return height_;
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<webrtc::I420BufferInterface> AndroidTextureBuffer::ToI420() {
|
||||
rtc::scoped_refptr<I420BufferInterface> AndroidTextureBuffer::ToI420() {
|
||||
int uv_width = (width() + 7) / 8;
|
||||
int stride = 8 * uv_width;
|
||||
int uv_height = (height() + 1) / 2;
|
||||
@ -291,16 +292,16 @@ rtc::scoped_refptr<webrtc::I420BufferInterface> AndroidTextureBuffer::ToI420() {
|
||||
// system_wrappers/include/aligned_malloc.h violate current DEPS
|
||||
// rules. We get away for now only because it is indirectly included
|
||||
// by i420_buffer.h
|
||||
std::unique_ptr<uint8_t, webrtc::AlignedFreeDeleter> yuv_data(
|
||||
static_cast<uint8_t*>(webrtc::AlignedMalloc(size, kBufferAlignment)));
|
||||
std::unique_ptr<uint8_t, AlignedFreeDeleter> yuv_data(
|
||||
static_cast<uint8_t*>(AlignedMalloc(size, kBufferAlignment)));
|
||||
// See YuvConverter.java for the required layout.
|
||||
uint8_t* y_data = yuv_data.get();
|
||||
uint8_t* u_data = y_data + height() * stride;
|
||||
uint8_t* v_data = u_data + stride/2;
|
||||
|
||||
rtc::scoped_refptr<webrtc::I420BufferInterface> copy = webrtc::WrapI420Buffer(
|
||||
rtc::scoped_refptr<I420BufferInterface> copy = webrtc::WrapI420Buffer(
|
||||
width(), height(), y_data, stride, u_data, stride, v_data, stride,
|
||||
rtc::Bind(&webrtc::AlignedFree, yuv_data.release()));
|
||||
rtc::Bind(&AlignedFree, yuv_data.release()));
|
||||
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
@ -366,7 +367,7 @@ jobject AndroidVideoBuffer::video_frame_buffer() const {
|
||||
return *j_video_frame_buffer_;
|
||||
}
|
||||
|
||||
webrtc::VideoFrameBuffer::Type AndroidVideoBuffer::type() const {
|
||||
VideoFrameBuffer::Type AndroidVideoBuffer::type() const {
|
||||
return Type::kNative;
|
||||
}
|
||||
|
||||
@ -378,7 +379,7 @@ int AndroidVideoBuffer::height() const {
|
||||
return height_;
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<webrtc::I420BufferInterface> AndroidVideoBuffer::ToI420() {
|
||||
rtc::scoped_refptr<I420BufferInterface> AndroidVideoBuffer::ToI420() {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
|
||||
@ -405,9 +406,9 @@ jobject AndroidVideoBuffer::ToJavaI420Frame(JNIEnv* jni, int rotation) {
|
||||
jni, j_i420_frame_class, "<init>", "(ILorg/webrtc/VideoFrame$Buffer;J)V");
|
||||
// Java code just uses the native frame to hold a reference to the buffer so
|
||||
// this is okay.
|
||||
webrtc::VideoFrame* native_frame = new webrtc::VideoFrame(
|
||||
this, 0 /* timestamp */, 0 /* render_time_ms */,
|
||||
webrtc::VideoRotation::kVideoRotation_0 /* rotation */);
|
||||
VideoFrame* native_frame =
|
||||
new VideoFrame(this, 0 /* timestamp */, 0 /* render_time_ms */,
|
||||
VideoRotation::kVideoRotation_0 /* rotation */);
|
||||
return jni->NewObject(j_i420_frame_class, j_i420_frame_ctor_id, rotation,
|
||||
*j_video_frame_buffer_, jlongFromPointer(native_frame));
|
||||
}
|
||||
@ -434,7 +435,7 @@ AndroidVideoBufferFactory::AndroidVideoBufferFactory(JNIEnv* jni)
|
||||
j_get_height_id_(
|
||||
GetMethodID(jni, *j_video_frame_buffer_class_, "getHeight", "()I")) {}
|
||||
|
||||
webrtc::VideoFrame AndroidVideoBufferFactory::CreateFrame(
|
||||
VideoFrame AndroidVideoBufferFactory::CreateFrame(
|
||||
JNIEnv* jni,
|
||||
jobject j_video_frame,
|
||||
uint32_t timestamp_rtp) const {
|
||||
@ -445,9 +446,9 @@ webrtc::VideoFrame AndroidVideoBufferFactory::CreateFrame(
|
||||
jni->CallLongMethod(j_video_frame, j_get_timestamp_ns_id_);
|
||||
rtc::scoped_refptr<AndroidVideoBuffer> buffer =
|
||||
CreateBuffer(jni, j_video_frame_buffer);
|
||||
return webrtc::VideoFrame(buffer, timestamp_rtp,
|
||||
timestamp_ns / rtc::kNumNanosecsPerMillisec,
|
||||
static_cast<webrtc::VideoRotation>(rotation));
|
||||
return VideoFrame(buffer, timestamp_rtp,
|
||||
timestamp_ns / rtc::kNumNanosecsPerMillisec,
|
||||
static_cast<VideoRotation>(rotation));
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBufferFactory::WrapBuffer(
|
||||
@ -475,9 +476,8 @@ JavaVideoFrameFactory::JavaVideoFrameFactory(JNIEnv* jni)
|
||||
"(Lorg/webrtc/VideoFrame$Buffer;IJ)V");
|
||||
}
|
||||
|
||||
static bool IsJavaVideoBuffer(
|
||||
rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer) {
|
||||
if (buffer->type() != webrtc::VideoFrameBuffer::Type::kNative) {
|
||||
static bool IsJavaVideoBuffer(rtc::scoped_refptr<VideoFrameBuffer> buffer) {
|
||||
if (buffer->type() != VideoFrameBuffer::Type::kNative) {
|
||||
return false;
|
||||
}
|
||||
AndroidVideoFrameBuffer* android_buffer =
|
||||
@ -486,14 +486,12 @@ static bool IsJavaVideoBuffer(
|
||||
AndroidVideoFrameBuffer::AndroidType::kJavaBuffer;
|
||||
}
|
||||
|
||||
jobject JavaVideoFrameFactory::ToJavaFrame(
|
||||
JNIEnv* jni,
|
||||
const webrtc::VideoFrame& frame) const {
|
||||
rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer =
|
||||
frame.video_frame_buffer();
|
||||
jobject JavaVideoFrameFactory::ToJavaFrame(JNIEnv* jni,
|
||||
const VideoFrame& frame) const {
|
||||
rtc::scoped_refptr<VideoFrameBuffer> buffer = frame.video_frame_buffer();
|
||||
jobject j_buffer;
|
||||
if (IsJavaVideoBuffer(buffer)) {
|
||||
RTC_DCHECK(buffer->type() == webrtc::VideoFrameBuffer::Type::kNative);
|
||||
RTC_DCHECK(buffer->type() == VideoFrameBuffer::Type::kNative);
|
||||
AndroidVideoFrameBuffer* android_buffer =
|
||||
static_cast<AndroidVideoFrameBuffer*>(buffer.get());
|
||||
RTC_DCHECK(android_buffer->android_type() ==
|
||||
@ -510,4 +508,5 @@ jobject JavaVideoFrameFactory::ToJavaFrame(
|
||||
static_cast<jlong>(frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec));
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -19,7 +19,8 @@
|
||||
#include "webrtc/rtc_base/callback.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Open gl texture matrix, in column-major order. Operations are
|
||||
// in-place.
|
||||
@ -37,7 +38,7 @@ class Matrix {
|
||||
float crop_x,
|
||||
float crop_y);
|
||||
|
||||
void Rotate(webrtc::VideoRotation rotation);
|
||||
void Rotate(VideoRotation rotation);
|
||||
|
||||
private:
|
||||
Matrix() {}
|
||||
@ -62,7 +63,7 @@ struct NativeHandleImpl {
|
||||
// Java-based frames.
|
||||
// TODO(sakal): Remove this and AndroidTextureBuffer once they are no longer
|
||||
// needed.
|
||||
class AndroidVideoFrameBuffer : public webrtc::VideoFrameBuffer {
|
||||
class AndroidVideoFrameBuffer : public VideoFrameBuffer {
|
||||
public:
|
||||
enum class AndroidType { kTextureBuffer, kJavaBuffer };
|
||||
|
||||
@ -85,7 +86,7 @@ class AndroidTextureBuffer : public AndroidVideoFrameBuffer {
|
||||
int width() const override;
|
||||
int height() const override;
|
||||
|
||||
rtc::scoped_refptr<webrtc::I420BufferInterface> ToI420() override;
|
||||
rtc::scoped_refptr<I420BufferInterface> ToI420() override;
|
||||
|
||||
AndroidType android_type() override { return AndroidType::kTextureBuffer; }
|
||||
|
||||
@ -137,7 +138,7 @@ class AndroidVideoBuffer : public AndroidVideoFrameBuffer {
|
||||
int width() const override;
|
||||
int height() const override;
|
||||
|
||||
rtc::scoped_refptr<webrtc::I420BufferInterface> ToI420() override;
|
||||
rtc::scoped_refptr<I420BufferInterface> ToI420() override;
|
||||
|
||||
AndroidType android_type() override { return AndroidType::kJavaBuffer; }
|
||||
|
||||
@ -152,9 +153,9 @@ class AndroidVideoBufferFactory {
|
||||
public:
|
||||
explicit AndroidVideoBufferFactory(JNIEnv* jni);
|
||||
|
||||
webrtc::VideoFrame CreateFrame(JNIEnv* jni,
|
||||
jobject j_video_frame,
|
||||
uint32_t timestamp_rtp) const;
|
||||
VideoFrame CreateFrame(JNIEnv* jni,
|
||||
jobject j_video_frame,
|
||||
uint32_t timestamp_rtp) const;
|
||||
|
||||
// Wraps a buffer to AndroidVideoBuffer without incrementing the reference
|
||||
// count.
|
||||
@ -183,13 +184,14 @@ class JavaVideoFrameFactory {
|
||||
public:
|
||||
JavaVideoFrameFactory(JNIEnv* jni);
|
||||
|
||||
jobject ToJavaFrame(JNIEnv* jni, const webrtc::VideoFrame& frame) const;
|
||||
jobject ToJavaFrame(JNIEnv* jni, const VideoFrame& frame) const;
|
||||
|
||||
private:
|
||||
ScopedGlobalRef<jclass> j_video_frame_class_;
|
||||
jmethodID j_video_frame_constructor_id_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_NATIVE_HANDLE_IMPL_H_
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
|
||||
#include "webrtc/rtc_base/checks.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_org_webrtc_NV12Buffer_nativeCropAndScale(JNIEnv* jni,
|
||||
@ -73,4 +74,5 @@ Java_org_webrtc_NV12Buffer_nativeCropAndScale(JNIEnv* jni,
|
||||
scale_height, libyuv::kFilterBox);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -17,7 +17,8 @@
|
||||
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
||||
#include "webrtc/rtc_base/checks.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_org_webrtc_NV21Buffer_nativeCropAndScale(JNIEnv* jni,
|
||||
@ -61,7 +62,7 @@ Java_org_webrtc_NV21Buffer_nativeCropAndScale(JNIEnv* jni,
|
||||
src_y += crop_x + crop_y * src_stride_y;
|
||||
src_uv += crop_chroma_x + crop_chroma_y * src_stride_uv;
|
||||
|
||||
webrtc::NV12ToI420Scaler scaler;
|
||||
NV12ToI420Scaler scaler;
|
||||
// U- and V-planes are swapped because this is NV21 not NV12.
|
||||
scaler.NV12ToI420Scale(src_y, src_stride_y, src_uv, src_stride_uv, crop_width,
|
||||
crop_height, dst_y, dst_stride_y, dst_v, dst_stride_v,
|
||||
@ -70,4 +71,5 @@ Java_org_webrtc_NV21Buffer_nativeCropAndScale(JNIEnv* jni,
|
||||
jni->ReleaseByteArrayElements(j_src, src_bytes, JNI_ABORT);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -20,7 +20,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
enum AndroidSdkVersion {
|
||||
SDK_VERSION_LOLLIPOP = 21,
|
||||
@ -442,4 +443,5 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
static_cast<NetworkHandle>(network_handle));
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -20,7 +20,8 @@
|
||||
#include "webrtc/rtc_base/thread_checker.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
typedef int64_t NetworkHandle;
|
||||
|
||||
@ -92,6 +93,15 @@ class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {
|
||||
rtc::NetworkMonitorInterface* CreateNetworkMonitor() override;
|
||||
};
|
||||
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
// TODO(magjed): Remove once external clients are updated.
|
||||
namespace webrtc_jni {
|
||||
|
||||
using webrtc::jni::AndroidNetworkMonitor;
|
||||
using webrtc::jni::AndroidNetworkMonitorFactory;
|
||||
|
||||
} // namespace webrtc_jni
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_ANDROIDNETWORKMONITOR_JNI_H_
|
||||
|
||||
@ -13,14 +13,16 @@
|
||||
#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
|
||||
#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioDecoderFactory> CreateAudioDecoderFactory() {
|
||||
return webrtc::CreateBuiltinAudioDecoderFactory();
|
||||
rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory() {
|
||||
return CreateBuiltinAudioDecoderFactory();
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioEncoderFactory> CreateAudioEncoderFactory() {
|
||||
return webrtc::CreateBuiltinAudioEncoderFactory();
|
||||
rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory() {
|
||||
return CreateBuiltinAudioEncoderFactory();
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -17,12 +17,14 @@
|
||||
#include "webrtc/api/audio_codecs/audio_encoder_factory.h" // nogncheck
|
||||
#include "webrtc/rtc_base/scoped_ref_ptr.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioDecoderFactory> CreateAudioDecoderFactory();
|
||||
rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory();
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioEncoderFactory> CreateAudioEncoderFactory();
|
||||
rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory();
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_AUDIO_JNI_H_
|
||||
|
||||
@ -11,7 +11,8 @@
|
||||
#include "webrtc/api/mediastreaminterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
AudioTrack_nativeSetVolume,
|
||||
@ -19,9 +20,10 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jclass,
|
||||
jlong j_p,
|
||||
jdouble volume) {
|
||||
rtc::scoped_refptr<webrtc::AudioSourceInterface> source(
|
||||
reinterpret_cast<webrtc::AudioTrackInterface*>(j_p)->GetSource());
|
||||
rtc::scoped_refptr<AudioSourceInterface> source(
|
||||
reinterpret_cast<AudioTrackInterface*>(j_p)->GetSource());
|
||||
source->SetVolume(volume);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -11,7 +11,8 @@
|
||||
#include "webrtc/rtc_base/logsinks.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
CallSessionFileRotatingLogSink_nativeAddSink,
|
||||
@ -76,4 +77,5 @@ JNI_FUNCTION_DECLARATION(jbyteArray,
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,14 +14,14 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/pc/datachannelobserver_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
static webrtc::DataChannelInterface* ExtractNativeDC(JNIEnv* jni,
|
||||
jobject j_dc) {
|
||||
static DataChannelInterface* ExtractNativeDC(JNIEnv* jni, jobject j_dc) {
|
||||
jfieldID native_dc_id =
|
||||
GetFieldID(jni, GetObjectClass(jni, j_dc), "nativeDataChannel", "J");
|
||||
jlong j_d = GetLongField(jni, j_dc, native_dc_id);
|
||||
return reinterpret_cast<webrtc::DataChannelInterface*>(j_d);
|
||||
return reinterpret_cast<DataChannelInterface*>(j_d);
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
@ -87,7 +87,7 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jbyteArray data,
|
||||
jboolean binary) {
|
||||
jbyte* bytes = jni->GetByteArrayElements(data, NULL);
|
||||
bool ret = ExtractNativeDC(jni, j_dc)->Send(webrtc::DataBuffer(
|
||||
bool ret = ExtractNativeDC(jni, j_dc)->Send(DataBuffer(
|
||||
rtc::CopyOnWriteBuffer(bytes, jni->GetArrayLength(data)), binary));
|
||||
jni->ReleaseByteArrayElements(data, bytes, JNI_ABORT);
|
||||
return ret;
|
||||
@ -97,4 +97,5 @@ JNI_FUNCTION_DECLARATION(void, DataChannel_dispose, JNIEnv* jni, jobject j_dc) {
|
||||
CHECK_RELEASE(ExtractNativeDC(jni, j_dc));
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -12,7 +12,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Convenience, used since callbacks occur on the signaling thread, which may
|
||||
// be a non-Java thread.
|
||||
@ -52,7 +53,7 @@ void DataChannelObserverJni::OnStateChange() {
|
||||
CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
|
||||
}
|
||||
|
||||
void DataChannelObserverJni::OnMessage(const webrtc::DataBuffer& buffer) {
|
||||
void DataChannelObserverJni::OnMessage(const DataBuffer& buffer) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jobject byte_buffer = jni()->NewDirectByteBuffer(
|
||||
const_cast<char*>(buffer.data.data<char>()), buffer.data.size());
|
||||
@ -62,4 +63,5 @@ void DataChannelObserverJni::OnMessage(const webrtc::DataBuffer& buffer) {
|
||||
CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,18 +14,19 @@
|
||||
#include "webrtc/api/datachannelinterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Adapter for a Java DataChannel$Observer presenting a C++ DataChannelObserver
|
||||
// and dispatching the callback from C++ back to Java.
|
||||
class DataChannelObserverJni : public webrtc::DataChannelObserver {
|
||||
class DataChannelObserverJni : public DataChannelObserver {
|
||||
public:
|
||||
DataChannelObserverJni(JNIEnv* jni, jobject j_observer);
|
||||
virtual ~DataChannelObserverJni() {}
|
||||
|
||||
void OnBufferedAmountChange(uint64_t previous_amount) override;
|
||||
void OnStateChange() override;
|
||||
void OnMessage(const webrtc::DataBuffer& buffer) override;
|
||||
void OnMessage(const DataBuffer& buffer) override;
|
||||
|
||||
private:
|
||||
const ScopedGlobalRef<jobject> j_observer_global_;
|
||||
@ -37,6 +38,7 @@ class DataChannelObserverJni : public webrtc::DataChannelObserver {
|
||||
const jmethodID j_buffer_ctor_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_DATACHANNELOBSERVER_JNI_H_
|
||||
|
||||
@ -11,14 +11,15 @@
|
||||
#include "webrtc/api/dtmfsenderinterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
DtmfSender_nativeCanInsertDtmf,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_dtmf_sender_pointer) {
|
||||
return reinterpret_cast<webrtc::DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
->CanInsertDtmf();
|
||||
}
|
||||
|
||||
@ -30,7 +31,7 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jstring tones,
|
||||
jint duration,
|
||||
jint inter_tone_gap) {
|
||||
return reinterpret_cast<webrtc::DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
->InsertDtmf(JavaToStdString(jni, tones), duration, inter_tone_gap);
|
||||
}
|
||||
|
||||
@ -40,8 +41,8 @@ JNI_FUNCTION_DECLARATION(jstring,
|
||||
jclass,
|
||||
jlong j_dtmf_sender_pointer) {
|
||||
return JavaStringFromStdString(
|
||||
jni, reinterpret_cast<webrtc::DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
->tones());
|
||||
jni,
|
||||
reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->tones());
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jint,
|
||||
@ -49,7 +50,7 @@ JNI_FUNCTION_DECLARATION(jint,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_dtmf_sender_pointer) {
|
||||
return reinterpret_cast<webrtc::DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
->duration();
|
||||
}
|
||||
|
||||
@ -58,8 +59,9 @@ JNI_FUNCTION_DECLARATION(jint,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_dtmf_sender_pointer) {
|
||||
return reinterpret_cast<webrtc::DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
|
||||
->inter_tone_gap();
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -15,11 +15,11 @@
|
||||
#include "webrtc/pc/webrtcsdp.h"
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
webrtc::DataChannelInit JavaToNativeDataChannelInit(JNIEnv* jni,
|
||||
jobject j_init) {
|
||||
webrtc::DataChannelInit init;
|
||||
DataChannelInit JavaToNativeDataChannelInit(JNIEnv* jni, jobject j_init) {
|
||||
DataChannelInit init;
|
||||
|
||||
jclass j_init_class = FindClass(jni, "org/webrtc/DataChannel$Init");
|
||||
jfieldID ordered_id = GetFieldID(jni, j_init_class, "ordered", "Z");
|
||||
@ -93,7 +93,7 @@ cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate) {
|
||||
std::string sdp =
|
||||
JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_id));
|
||||
cricket::Candidate candidate;
|
||||
if (!webrtc::SdpDeserializeCandidate(sdp_mid, sdp, &candidate, NULL)) {
|
||||
if (!SdpDeserializeCandidate(sdp_mid, sdp, &candidate, NULL)) {
|
||||
LOG(LS_ERROR) << "SdpDescrializeCandidate failed with sdp " << sdp;
|
||||
}
|
||||
return candidate;
|
||||
@ -102,7 +102,7 @@ cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate) {
|
||||
jobject NativeToJavaCandidate(JNIEnv* jni,
|
||||
jclass* candidate_class,
|
||||
const cricket::Candidate& candidate) {
|
||||
std::string sdp = webrtc::SdpSerializeCandidate(candidate);
|
||||
std::string sdp = SdpSerializeCandidate(candidate);
|
||||
RTC_CHECK(!sdp.empty()) << "got an empty ICE candidate";
|
||||
jmethodID ctor = GetMethodID(jni, *candidate_class, "<init>",
|
||||
"(Ljava/lang/String;ILjava/lang/String;)V");
|
||||
@ -130,9 +130,8 @@ jobjectArray NativeToJavaCandidateArray(
|
||||
return java_candidates;
|
||||
}
|
||||
|
||||
webrtc::SessionDescriptionInterface* JavaToNativeSessionDescription(
|
||||
JNIEnv* jni,
|
||||
jobject j_sdp) {
|
||||
SessionDescriptionInterface* JavaToNativeSessionDescription(JNIEnv* jni,
|
||||
jobject j_sdp) {
|
||||
jfieldID j_type_id = GetFieldID(jni, GetObjectClass(jni, j_sdp), "type",
|
||||
"Lorg/webrtc/SessionDescription$Type;");
|
||||
jobject j_type = GetObjectField(jni, j_sdp, j_type_id);
|
||||
@ -149,12 +148,12 @@ webrtc::SessionDescriptionInterface* JavaToNativeSessionDescription(
|
||||
jstring j_description = (jstring)GetObjectField(jni, j_sdp, j_description_id);
|
||||
std::string std_description = JavaToStdString(jni, j_description);
|
||||
|
||||
return webrtc::CreateSessionDescription(std_type, std_description, NULL);
|
||||
return CreateSessionDescription(std_type, std_description, NULL);
|
||||
}
|
||||
|
||||
jobject NativeToJavaSessionDescription(
|
||||
JNIEnv* jni,
|
||||
const webrtc::SessionDescriptionInterface* desc) {
|
||||
const SessionDescriptionInterface* desc) {
|
||||
std::string sdp;
|
||||
RTC_CHECK(desc->ToString(&sdp)) << "got so far: " << sdp;
|
||||
jstring j_description = JavaStringFromStdString(jni, sdp);
|
||||
@ -178,7 +177,7 @@ jobject NativeToJavaSessionDescription(
|
||||
return j_sdp;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionFactoryInterface::Options
|
||||
PeerConnectionFactoryInterface::Options
|
||||
JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, jobject options) {
|
||||
jclass options_class = jni->GetObjectClass(options);
|
||||
jfieldID network_ignore_mask_field =
|
||||
@ -196,7 +195,7 @@ JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, jobject options) {
|
||||
bool disable_network_monitor =
|
||||
jni->GetBooleanField(options, disable_network_monitor_field);
|
||||
|
||||
webrtc::PeerConnectionFactoryInterface::Options native_options;
|
||||
PeerConnectionFactoryInterface::Options native_options;
|
||||
|
||||
// This doesn't necessarily match the c++ version of this struct; feel free
|
||||
// to add more parameters as necessary.
|
||||
@ -206,80 +205,82 @@ JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, jobject options) {
|
||||
return native_options;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionInterface::IceTransportsType
|
||||
JavaToNativeIceTransportsType(JNIEnv* jni, jobject j_ice_transports_type) {
|
||||
PeerConnectionInterface::IceTransportsType JavaToNativeIceTransportsType(
|
||||
JNIEnv* jni,
|
||||
jobject j_ice_transports_type) {
|
||||
std::string enum_name =
|
||||
GetJavaEnumName(jni, "org/webrtc/PeerConnection$IceTransportsType",
|
||||
j_ice_transports_type);
|
||||
|
||||
if (enum_name == "ALL")
|
||||
return webrtc::PeerConnectionInterface::kAll;
|
||||
return PeerConnectionInterface::kAll;
|
||||
|
||||
if (enum_name == "RELAY")
|
||||
return webrtc::PeerConnectionInterface::kRelay;
|
||||
return PeerConnectionInterface::kRelay;
|
||||
|
||||
if (enum_name == "NOHOST")
|
||||
return webrtc::PeerConnectionInterface::kNoHost;
|
||||
return PeerConnectionInterface::kNoHost;
|
||||
|
||||
if (enum_name == "NONE")
|
||||
return webrtc::PeerConnectionInterface::kNone;
|
||||
return PeerConnectionInterface::kNone;
|
||||
|
||||
RTC_CHECK(false) << "Unexpected IceTransportsType enum_name " << enum_name;
|
||||
return webrtc::PeerConnectionInterface::kAll;
|
||||
return PeerConnectionInterface::kAll;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionInterface::BundlePolicy JavaToNativeBundlePolicy(
|
||||
PeerConnectionInterface::BundlePolicy JavaToNativeBundlePolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_bundle_policy) {
|
||||
std::string enum_name = GetJavaEnumName(
|
||||
jni, "org/webrtc/PeerConnection$BundlePolicy", j_bundle_policy);
|
||||
|
||||
if (enum_name == "BALANCED")
|
||||
return webrtc::PeerConnectionInterface::kBundlePolicyBalanced;
|
||||
return PeerConnectionInterface::kBundlePolicyBalanced;
|
||||
|
||||
if (enum_name == "MAXBUNDLE")
|
||||
return webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle;
|
||||
return PeerConnectionInterface::kBundlePolicyMaxBundle;
|
||||
|
||||
if (enum_name == "MAXCOMPAT")
|
||||
return webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat;
|
||||
return PeerConnectionInterface::kBundlePolicyMaxCompat;
|
||||
|
||||
RTC_CHECK(false) << "Unexpected BundlePolicy enum_name " << enum_name;
|
||||
return webrtc::PeerConnectionInterface::kBundlePolicyBalanced;
|
||||
return PeerConnectionInterface::kBundlePolicyBalanced;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionInterface::RtcpMuxPolicy JavaToNativeRtcpMuxPolicy(
|
||||
PeerConnectionInterface::RtcpMuxPolicy JavaToNativeRtcpMuxPolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_rtcp_mux_policy) {
|
||||
std::string enum_name = GetJavaEnumName(
|
||||
jni, "org/webrtc/PeerConnection$RtcpMuxPolicy", j_rtcp_mux_policy);
|
||||
|
||||
if (enum_name == "NEGOTIATE")
|
||||
return webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
|
||||
return PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
|
||||
|
||||
if (enum_name == "REQUIRE")
|
||||
return webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire;
|
||||
return PeerConnectionInterface::kRtcpMuxPolicyRequire;
|
||||
|
||||
RTC_CHECK(false) << "Unexpected RtcpMuxPolicy enum_name " << enum_name;
|
||||
return webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
|
||||
return PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionInterface::TcpCandidatePolicy
|
||||
JavaToNativeTcpCandidatePolicy(JNIEnv* jni, jobject j_tcp_candidate_policy) {
|
||||
PeerConnectionInterface::TcpCandidatePolicy JavaToNativeTcpCandidatePolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_tcp_candidate_policy) {
|
||||
std::string enum_name =
|
||||
GetJavaEnumName(jni, "org/webrtc/PeerConnection$TcpCandidatePolicy",
|
||||
j_tcp_candidate_policy);
|
||||
|
||||
if (enum_name == "ENABLED")
|
||||
return webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled;
|
||||
return PeerConnectionInterface::kTcpCandidatePolicyEnabled;
|
||||
|
||||
if (enum_name == "DISABLED")
|
||||
return webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled;
|
||||
return PeerConnectionInterface::kTcpCandidatePolicyDisabled;
|
||||
|
||||
RTC_CHECK(false) << "Unexpected TcpCandidatePolicy enum_name " << enum_name;
|
||||
return webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled;
|
||||
return PeerConnectionInterface::kTcpCandidatePolicyEnabled;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionInterface::CandidateNetworkPolicy
|
||||
PeerConnectionInterface::CandidateNetworkPolicy
|
||||
JavaToNativeCandidateNetworkPolicy(JNIEnv* jni,
|
||||
jobject j_candidate_network_policy) {
|
||||
std::string enum_name =
|
||||
@ -287,14 +288,14 @@ JavaToNativeCandidateNetworkPolicy(JNIEnv* jni,
|
||||
j_candidate_network_policy);
|
||||
|
||||
if (enum_name == "ALL")
|
||||
return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll;
|
||||
return PeerConnectionInterface::kCandidateNetworkPolicyAll;
|
||||
|
||||
if (enum_name == "LOW_COST")
|
||||
return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyLowCost;
|
||||
return PeerConnectionInterface::kCandidateNetworkPolicyLowCost;
|
||||
|
||||
RTC_CHECK(false) << "Unexpected CandidateNetworkPolicy enum_name "
|
||||
<< enum_name;
|
||||
return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll;
|
||||
return PeerConnectionInterface::kCandidateNetworkPolicyAll;
|
||||
}
|
||||
|
||||
rtc::KeyType JavaToNativeKeyType(JNIEnv* jni, jobject j_key_type) {
|
||||
@ -310,23 +311,23 @@ rtc::KeyType JavaToNativeKeyType(JNIEnv* jni, jobject j_key_type) {
|
||||
return rtc::KT_ECDSA;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionInterface::ContinualGatheringPolicy
|
||||
PeerConnectionInterface::ContinualGatheringPolicy
|
||||
JavaToNativeContinualGatheringPolicy(JNIEnv* jni, jobject j_gathering_policy) {
|
||||
std::string enum_name =
|
||||
GetJavaEnumName(jni, "org/webrtc/PeerConnection$ContinualGatheringPolicy",
|
||||
j_gathering_policy);
|
||||
if (enum_name == "GATHER_ONCE")
|
||||
return webrtc::PeerConnectionInterface::GATHER_ONCE;
|
||||
return PeerConnectionInterface::GATHER_ONCE;
|
||||
|
||||
if (enum_name == "GATHER_CONTINUALLY")
|
||||
return webrtc::PeerConnectionInterface::GATHER_CONTINUALLY;
|
||||
return PeerConnectionInterface::GATHER_CONTINUALLY;
|
||||
|
||||
RTC_CHECK(false) << "Unexpected ContinualGatheringPolicy enum name "
|
||||
<< enum_name;
|
||||
return webrtc::PeerConnectionInterface::GATHER_ONCE;
|
||||
return PeerConnectionInterface::GATHER_ONCE;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy(
|
||||
PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_ice_server_tls_cert_policy) {
|
||||
std::string enum_name =
|
||||
@ -334,19 +335,18 @@ webrtc::PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy(
|
||||
j_ice_server_tls_cert_policy);
|
||||
|
||||
if (enum_name == "TLS_CERT_POLICY_SECURE")
|
||||
return webrtc::PeerConnectionInterface::kTlsCertPolicySecure;
|
||||
return PeerConnectionInterface::kTlsCertPolicySecure;
|
||||
|
||||
if (enum_name == "TLS_CERT_POLICY_INSECURE_NO_CHECK")
|
||||
return webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck;
|
||||
return PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck;
|
||||
|
||||
RTC_CHECK(false) << "Unexpected TlsCertPolicy enum_name " << enum_name;
|
||||
return webrtc::PeerConnectionInterface::kTlsCertPolicySecure;
|
||||
return PeerConnectionInterface::kTlsCertPolicySecure;
|
||||
}
|
||||
|
||||
void JavaToNativeIceServers(
|
||||
JNIEnv* jni,
|
||||
jobject j_ice_servers,
|
||||
webrtc::PeerConnectionInterface::IceServers* ice_servers) {
|
||||
void JavaToNativeIceServers(JNIEnv* jni,
|
||||
jobject j_ice_servers,
|
||||
PeerConnectionInterface::IceServers* ice_servers) {
|
||||
for (jobject j_ice_server : Iterable(jni, j_ice_servers)) {
|
||||
jclass j_ice_server_class = GetObjectClass(jni, j_ice_server);
|
||||
jfieldID j_ice_server_uri_id =
|
||||
@ -368,11 +368,11 @@ void JavaToNativeIceServers(
|
||||
GetObjectField(jni, j_ice_server, j_ice_server_username_id));
|
||||
jstring password = reinterpret_cast<jstring>(
|
||||
GetObjectField(jni, j_ice_server, j_ice_server_password_id));
|
||||
webrtc::PeerConnectionInterface::TlsCertPolicy tls_cert_policy =
|
||||
PeerConnectionInterface::TlsCertPolicy tls_cert_policy =
|
||||
JavaToNativeTlsCertPolicy(jni, j_ice_server_tls_cert_policy);
|
||||
jstring hostname = reinterpret_cast<jstring>(
|
||||
GetObjectField(jni, j_ice_server, j_ice_server_hostname_id));
|
||||
webrtc::PeerConnectionInterface::IceServer server;
|
||||
PeerConnectionInterface::IceServer server;
|
||||
server.uri = JavaToStdString(jni, uri);
|
||||
server.username = JavaToStdString(jni, username);
|
||||
server.password = JavaToStdString(jni, password);
|
||||
@ -385,7 +385,7 @@ void JavaToNativeIceServers(
|
||||
void JavaToNativeRTCConfiguration(
|
||||
JNIEnv* jni,
|
||||
jobject j_rtc_config,
|
||||
webrtc::PeerConnectionInterface::RTCConfiguration* rtc_config) {
|
||||
PeerConnectionInterface::RTCConfiguration* rtc_config) {
|
||||
jclass j_rtc_config_class = GetObjectClass(jni, j_rtc_config);
|
||||
|
||||
jfieldID j_ice_transports_type_id =
|
||||
@ -516,7 +516,7 @@ void JavaToNativeRTCConfiguration(
|
||||
|
||||
void JavaToNativeRtpParameters(JNIEnv* jni,
|
||||
jobject j_parameters,
|
||||
webrtc::RtpParameters* parameters) {
|
||||
RtpParameters* parameters) {
|
||||
RTC_CHECK(parameters != nullptr);
|
||||
jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
|
||||
jfieldID encodings_id =
|
||||
@ -540,7 +540,7 @@ void JavaToNativeRtpParameters(JNIEnv* jni,
|
||||
jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J");
|
||||
|
||||
for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) {
|
||||
webrtc::RtpEncodingParameters encoding;
|
||||
RtpEncodingParameters encoding;
|
||||
encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id);
|
||||
jobject j_bitrate =
|
||||
GetNullableObjectField(jni, j_encoding_parameters, bitrate_id);
|
||||
@ -572,7 +572,7 @@ void JavaToNativeRtpParameters(JNIEnv* jni,
|
||||
GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;");
|
||||
|
||||
for (jobject j_codec : Iterable(jni, j_codecs)) {
|
||||
webrtc::RtpCodecParameters codec;
|
||||
RtpCodecParameters codec;
|
||||
codec.payload_type = GetIntField(jni, j_codec, payload_type_id);
|
||||
codec.name = JavaToStdString(jni, GetStringField(jni, j_codec, name_id));
|
||||
codec.kind =
|
||||
@ -595,7 +595,7 @@ void JavaToNativeRtpParameters(JNIEnv* jni,
|
||||
}
|
||||
|
||||
jobject NativeToJavaRtpParameters(JNIEnv* jni,
|
||||
const webrtc::RtpParameters& parameters) {
|
||||
const RtpParameters& parameters) {
|
||||
jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
|
||||
jmethodID parameters_ctor =
|
||||
GetMethodID(jni, parameters_class, "<init>", "()V");
|
||||
@ -621,7 +621,7 @@ jobject NativeToJavaRtpParameters(JNIEnv* jni,
|
||||
jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V");
|
||||
jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V");
|
||||
|
||||
for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) {
|
||||
for (const RtpEncodingParameters& encoding : parameters.encodings) {
|
||||
jobject j_encoding_parameters =
|
||||
jni->NewObject(encoding_class, encoding_ctor);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
@ -664,7 +664,7 @@ jobject NativeToJavaRtpParameters(JNIEnv* jni,
|
||||
jfieldID num_channels_id =
|
||||
GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;");
|
||||
|
||||
for (const webrtc::RtpCodecParameters& codec : parameters.codecs) {
|
||||
for (const RtpCodecParameters& codec : parameters.codecs) {
|
||||
jobject j_codec = jni->NewObject(codec_class, codec_ctor);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
jni->SetIntField(j_codec, payload_type_id, codec.payload_type);
|
||||
@ -697,4 +697,5 @@ jobject NativeToJavaRtpParameters(JNIEnv* jni,
|
||||
return j_parameters;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -27,10 +27,10 @@
|
||||
// PeerConnection-related structures. Similar to some methods in jni_helpers.h,
|
||||
// but specifically for structures tied to the PeerConnection API.
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
webrtc::DataChannelInit JavaToNativeDataChannelInit(JNIEnv* jni,
|
||||
jobject j_init);
|
||||
DataChannelInit JavaToNativeDataChannelInit(JNIEnv* jni, jobject j_init);
|
||||
|
||||
cricket::MediaType JavaToNativeMediaType(JNIEnv* jni, jobject j_media_type);
|
||||
|
||||
@ -46,67 +46,66 @@ jobjectArray NativeToJavaCandidateArray(
|
||||
JNIEnv* jni,
|
||||
const std::vector<cricket::Candidate>& candidates);
|
||||
|
||||
webrtc::SessionDescriptionInterface* JavaToNativeSessionDescription(
|
||||
JNIEnv* jni,
|
||||
jobject j_sdp);
|
||||
SessionDescriptionInterface* JavaToNativeSessionDescription(JNIEnv* jni,
|
||||
jobject j_sdp);
|
||||
|
||||
jobject NativeToJavaSessionDescription(
|
||||
JNIEnv* jni,
|
||||
const webrtc::SessionDescriptionInterface* desc);
|
||||
jobject NativeToJavaSessionDescription(JNIEnv* jni,
|
||||
const SessionDescriptionInterface* desc);
|
||||
|
||||
webrtc::PeerConnectionFactoryInterface::Options
|
||||
PeerConnectionFactoryInterface::Options
|
||||
JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, jobject options);
|
||||
|
||||
/*****************************************************
|
||||
* Below are all things that go into RTCConfiguration.
|
||||
*****************************************************/
|
||||
webrtc::PeerConnectionInterface::IceTransportsType
|
||||
JavaToNativeIceTransportsType(JNIEnv* jni, jobject j_ice_transports_type);
|
||||
PeerConnectionInterface::IceTransportsType JavaToNativeIceTransportsType(
|
||||
JNIEnv* jni,
|
||||
jobject j_ice_transports_type);
|
||||
|
||||
webrtc::PeerConnectionInterface::BundlePolicy JavaToNativeBundlePolicy(
|
||||
PeerConnectionInterface::BundlePolicy JavaToNativeBundlePolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_bundle_policy);
|
||||
|
||||
webrtc::PeerConnectionInterface::RtcpMuxPolicy JavaToNativeRtcpMuxPolicy(
|
||||
PeerConnectionInterface::RtcpMuxPolicy JavaToNativeRtcpMuxPolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_rtcp_mux_policy);
|
||||
|
||||
webrtc::PeerConnectionInterface::TcpCandidatePolicy
|
||||
JavaToNativeTcpCandidatePolicy(JNIEnv* jni, jobject j_tcp_candidate_policy);
|
||||
PeerConnectionInterface::TcpCandidatePolicy JavaToNativeTcpCandidatePolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_tcp_candidate_policy);
|
||||
|
||||
webrtc::PeerConnectionInterface::CandidateNetworkPolicy
|
||||
PeerConnectionInterface::CandidateNetworkPolicy
|
||||
JavaToNativeCandidateNetworkPolicy(JNIEnv* jni,
|
||||
jobject j_candidate_network_policy);
|
||||
|
||||
rtc::KeyType JavaToNativeKeyType(JNIEnv* jni, jobject j_key_type);
|
||||
|
||||
webrtc::PeerConnectionInterface::ContinualGatheringPolicy
|
||||
PeerConnectionInterface::ContinualGatheringPolicy
|
||||
JavaToNativeContinualGatheringPolicy(JNIEnv* jni, jobject j_gathering_policy);
|
||||
|
||||
webrtc::PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy(
|
||||
PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy(
|
||||
JNIEnv* jni,
|
||||
jobject j_ice_server_tls_cert_policy);
|
||||
|
||||
void JavaToNativeIceServers(
|
||||
JNIEnv* jni,
|
||||
jobject j_ice_servers,
|
||||
webrtc::PeerConnectionInterface::IceServers* ice_servers);
|
||||
void JavaToNativeIceServers(JNIEnv* jni,
|
||||
jobject j_ice_servers,
|
||||
PeerConnectionInterface::IceServers* ice_servers);
|
||||
|
||||
void JavaToNativeRTCConfiguration(
|
||||
JNIEnv* jni,
|
||||
jobject j_rtc_config,
|
||||
webrtc::PeerConnectionInterface::RTCConfiguration* rtc_config);
|
||||
PeerConnectionInterface::RTCConfiguration* rtc_config);
|
||||
|
||||
/*********************************************************
|
||||
* RtpParameters, used for RtpSender and RtpReceiver APIs.
|
||||
*********************************************************/
|
||||
void JavaToNativeRtpParameters(JNIEnv* jni,
|
||||
jobject j_parameters,
|
||||
webrtc::RtpParameters* parameters);
|
||||
RtpParameters* parameters);
|
||||
|
||||
jobject NativeToJavaRtpParameters(JNIEnv* jni,
|
||||
const webrtc::RtpParameters& parameters);
|
||||
jobject NativeToJavaRtpParameters(JNIEnv* jni, const RtpParameters& parameters);
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_JAVA_NATIVE_CONVERSION_H_
|
||||
|
||||
@ -15,7 +15,8 @@
|
||||
#include "webrtc/system_wrappers/include/logcat_trace_context.h"
|
||||
#include "webrtc/system_wrappers/include/trace.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
Logging_nativeEnableTracing,
|
||||
@ -24,16 +25,15 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jstring j_path,
|
||||
jint nativeLevels) {
|
||||
std::string path = JavaToStdString(jni, j_path);
|
||||
if (nativeLevels != webrtc::kTraceNone) {
|
||||
webrtc::Trace::set_level_filter(nativeLevels);
|
||||
if (nativeLevels != kTraceNone) {
|
||||
Trace::set_level_filter(nativeLevels);
|
||||
if (path != "logcat:") {
|
||||
RTC_CHECK_EQ(0, webrtc::Trace::SetTraceFile(path.c_str(), false))
|
||||
RTC_CHECK_EQ(0, Trace::SetTraceFile(path.c_str(), false))
|
||||
<< "SetTraceFile failed";
|
||||
} else {
|
||||
// Intentionally leak this to avoid needing to reason about its lifecycle.
|
||||
// It keeps no state and functions only as a dispatch point.
|
||||
static webrtc::LogcatTraceContext* g_trace_callback =
|
||||
new webrtc::LogcatTraceContext();
|
||||
static LogcatTraceContext* g_trace_callback = new LogcatTraceContext();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -75,4 +75,5 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
LOG_TAG(static_cast<rtc::LoggingSeverity>(j_severity), tag) << message;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,28 +14,28 @@
|
||||
#include "webrtc/media/engine/webrtcmediaengine.h"
|
||||
#include "webrtc/modules/audio_processing/include/audio_processing.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
webrtc::CallFactoryInterface* CreateCallFactory() {
|
||||
CallFactoryInterface* CreateCallFactory() {
|
||||
return webrtc::CreateCallFactory().release();
|
||||
}
|
||||
|
||||
webrtc::RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
|
||||
RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
|
||||
return webrtc::CreateRtcEventLogFactory().release();
|
||||
}
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
webrtc::AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
|
||||
audio_encoder_factory,
|
||||
const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
|
||||
audio_decoder_factory,
|
||||
AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
|
||||
const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
|
||||
cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
|
||||
cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
|
||||
rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer) {
|
||||
rtc::scoped_refptr<AudioMixer> audio_mixer) {
|
||||
return cricket::WebRtcMediaEngineFactory::Create(
|
||||
adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
|
||||
video_decoder_factory, audio_mixer, webrtc::AudioProcessing::Create());
|
||||
video_decoder_factory, audio_mixer, AudioProcessing::Create());
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -28,21 +28,21 @@ class WebRtcVideoEncoderFactory;
|
||||
class WebRtcVideoDecoderFactory;
|
||||
} // namespace cricket
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
webrtc::CallFactoryInterface* CreateCallFactory();
|
||||
webrtc::RtcEventLogFactoryInterface* CreateRtcEventLogFactory();
|
||||
CallFactoryInterface* CreateCallFactory();
|
||||
RtcEventLogFactoryInterface* CreateRtcEventLogFactory();
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
webrtc::AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
|
||||
audio_encoder_factory,
|
||||
const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
|
||||
audio_decoder_factory,
|
||||
AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
|
||||
const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
|
||||
cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
|
||||
cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
|
||||
rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer);
|
||||
rtc::scoped_refptr<AudioMixer> audio_mixer);
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_MEDIA_JNI_H_
|
||||
|
||||
@ -10,7 +10,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/pc/mediaconstraints_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
MediaConstraintsJni::MediaConstraintsJni(JNIEnv* jni, jobject j_constraints) {
|
||||
PopulateConstraintsFromJavaPairList(jni, j_constraints, "mandatory",
|
||||
@ -44,4 +45,5 @@ void MediaConstraintsJni::PopulateConstraintsFromJavaPairList(
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,11 +14,12 @@
|
||||
#include "webrtc/api/mediaconstraintsinterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Wrapper for a Java MediaConstraints object. Copies all needed data so when
|
||||
// the constructor returns the Java object is no longer needed.
|
||||
class MediaConstraintsJni : public webrtc::MediaConstraintsInterface {
|
||||
class MediaConstraintsJni : public MediaConstraintsInterface {
|
||||
public:
|
||||
MediaConstraintsJni(JNIEnv* jni, jobject j_constraints);
|
||||
virtual ~MediaConstraintsJni() {}
|
||||
@ -38,6 +39,7 @@ class MediaConstraintsJni : public webrtc::MediaConstraintsInterface {
|
||||
Constraints optional_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_MEDIACONSTRAINTS_JNI_H_
|
||||
|
||||
@ -11,16 +11,18 @@
|
||||
#include "webrtc/api/mediastreaminterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jobject,
|
||||
MediaSource_nativeState,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_p) {
|
||||
rtc::scoped_refptr<webrtc::MediaSourceInterface> p(
|
||||
reinterpret_cast<webrtc::MediaSourceInterface*>(j_p));
|
||||
rtc::scoped_refptr<MediaSourceInterface> p(
|
||||
reinterpret_cast<MediaSourceInterface*>(j_p));
|
||||
return JavaEnumFromIndexAndClassName(jni, "MediaSource$State", p->state());
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -11,7 +11,8 @@
|
||||
#include "webrtc/api/mediastreaminterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
MediaStream_nativeAddAudioTrack,
|
||||
@ -19,8 +20,8 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jclass,
|
||||
jlong pointer,
|
||||
jlong j_audio_track_pointer) {
|
||||
return reinterpret_cast<webrtc::MediaStreamInterface*>(pointer)->AddTrack(
|
||||
reinterpret_cast<webrtc::AudioTrackInterface*>(j_audio_track_pointer));
|
||||
return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack(
|
||||
reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
@ -29,8 +30,8 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jclass,
|
||||
jlong pointer,
|
||||
jlong j_video_track_pointer) {
|
||||
return reinterpret_cast<webrtc::MediaStreamInterface*>(pointer)->AddTrack(
|
||||
reinterpret_cast<webrtc::VideoTrackInterface*>(j_video_track_pointer));
|
||||
return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack(
|
||||
reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
@ -39,8 +40,8 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jclass,
|
||||
jlong pointer,
|
||||
jlong j_audio_track_pointer) {
|
||||
return reinterpret_cast<webrtc::MediaStreamInterface*>(pointer)->RemoveTrack(
|
||||
reinterpret_cast<webrtc::AudioTrackInterface*>(j_audio_track_pointer));
|
||||
return reinterpret_cast<MediaStreamInterface*>(pointer)->RemoveTrack(
|
||||
reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
@ -49,8 +50,8 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jclass,
|
||||
jlong pointer,
|
||||
jlong j_video_track_pointer) {
|
||||
return reinterpret_cast<webrtc::MediaStreamInterface*>(pointer)->RemoveTrack(
|
||||
reinterpret_cast<webrtc::VideoTrackInterface*>(j_video_track_pointer));
|
||||
return reinterpret_cast<MediaStreamInterface*>(pointer)->RemoveTrack(
|
||||
reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jstring,
|
||||
@ -59,11 +60,12 @@ JNI_FUNCTION_DECLARATION(jstring,
|
||||
jclass,
|
||||
jlong j_p) {
|
||||
return JavaStringFromStdString(
|
||||
jni, reinterpret_cast<webrtc::MediaStreamInterface*>(j_p)->label());
|
||||
jni, reinterpret_cast<MediaStreamInterface*>(j_p)->label());
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void, MediaStream_free, JNIEnv*, jclass, jlong j_p) {
|
||||
CHECK_RELEASE(reinterpret_cast<webrtc::MediaStreamInterface*>(j_p));
|
||||
CHECK_RELEASE(reinterpret_cast<MediaStreamInterface*>(j_p));
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -11,7 +11,8 @@
|
||||
#include "webrtc/api/mediastreaminterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jstring,
|
||||
MediaStreamTrack_nativeId,
|
||||
@ -19,7 +20,7 @@ JNI_FUNCTION_DECLARATION(jstring,
|
||||
jclass,
|
||||
jlong j_p) {
|
||||
return JavaStringFromStdString(
|
||||
jni, reinterpret_cast<webrtc::MediaStreamTrackInterface*>(j_p)->id());
|
||||
jni, reinterpret_cast<MediaStreamTrackInterface*>(j_p)->id());
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jstring,
|
||||
@ -28,7 +29,7 @@ JNI_FUNCTION_DECLARATION(jstring,
|
||||
jclass,
|
||||
jlong j_p) {
|
||||
return JavaStringFromStdString(
|
||||
jni, reinterpret_cast<webrtc::MediaStreamTrackInterface*>(j_p)->kind());
|
||||
jni, reinterpret_cast<MediaStreamTrackInterface*>(j_p)->kind());
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
@ -36,7 +37,7 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_p) {
|
||||
return reinterpret_cast<webrtc::MediaStreamTrackInterface*>(j_p)->enabled();
|
||||
return reinterpret_cast<MediaStreamTrackInterface*>(j_p)->enabled();
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jobject,
|
||||
@ -46,7 +47,7 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
jlong j_p) {
|
||||
return JavaEnumFromIndexAndClassName(
|
||||
jni, "MediaStreamTrack$State",
|
||||
reinterpret_cast<webrtc::MediaStreamTrackInterface*>(j_p)->state());
|
||||
reinterpret_cast<MediaStreamTrackInterface*>(j_p)->state());
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
@ -55,8 +56,9 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jclass,
|
||||
jlong j_p,
|
||||
jboolean enabled) {
|
||||
return reinterpret_cast<webrtc::MediaStreamTrackInterface*>(j_p)->set_enabled(
|
||||
return reinterpret_cast<MediaStreamTrackInterface*>(j_p)->set_enabled(
|
||||
enabled);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -10,14 +10,16 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/pc/audio_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioDecoderFactory> CreateAudioDecoderFactory() {
|
||||
rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioEncoderFactory> CreateAudioEncoderFactory() {
|
||||
rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -10,26 +10,26 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/pc/media_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
webrtc::CallFactoryInterface* CreateCallFactory() {
|
||||
CallFactoryInterface* CreateCallFactory() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
webrtc::RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
|
||||
RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
webrtc::AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
|
||||
audio_encoder_factory,
|
||||
const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
|
||||
audio_decoder_factory,
|
||||
AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
|
||||
const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
|
||||
cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
|
||||
cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
|
||||
rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer) {
|
||||
rtc::scoped_refptr<AudioMixer> audio_mixer) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -10,7 +10,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/pc/video_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(
|
||||
JNIEnv* jni,
|
||||
@ -29,4 +30,5 @@ jobject GetJavaSurfaceTextureHelper(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,7 +14,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
PeerConnectionFactoryInterface* factoryFromJava(jlong j_p) {
|
||||
return reinterpret_cast<OwnedFactoryAndThreads*>(j_p)->factory();
|
||||
@ -61,4 +62,5 @@ void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() {
|
||||
[this] { JavaCallbackOnFactoryThreads(); });
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -21,9 +21,9 @@
|
||||
using cricket::WebRtcVideoDecoderFactory;
|
||||
using cricket::WebRtcVideoEncoderFactory;
|
||||
using rtc::Thread;
|
||||
using webrtc::PeerConnectionFactoryInterface;
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
PeerConnectionFactoryInterface* factoryFromJava(jlong j_p);
|
||||
|
||||
@ -75,6 +75,7 @@ class OwnedFactoryAndThreads {
|
||||
PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor.
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_OWNEDFACTORYANDTHREADS_H_
|
||||
|
||||
@ -45,16 +45,17 @@
|
||||
#include "webrtc/sdk/android/src/jni/pc/statsobserver_jni.h"
|
||||
#include "webrtc/system_wrappers/include/trace.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
static rtc::scoped_refptr<webrtc::PeerConnectionInterface> ExtractNativePC(
|
||||
static rtc::scoped_refptr<PeerConnectionInterface> ExtractNativePC(
|
||||
JNIEnv* jni,
|
||||
jobject j_pc) {
|
||||
jfieldID native_pc_id =
|
||||
GetFieldID(jni, GetObjectClass(jni, j_pc), "nativePeerConnection", "J");
|
||||
jlong j_p = GetLongField(jni, j_pc, native_pc_id);
|
||||
return rtc::scoped_refptr<webrtc::PeerConnectionInterface>(
|
||||
reinterpret_cast<webrtc::PeerConnectionInterface*>(j_p));
|
||||
return rtc::scoped_refptr<PeerConnectionInterface>(
|
||||
reinterpret_cast<PeerConnectionInterface*>(j_p));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -71,7 +72,7 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
PeerConnection_getLocalDescription,
|
||||
JNIEnv* jni,
|
||||
jobject j_pc) {
|
||||
const webrtc::SessionDescriptionInterface* sdp =
|
||||
const SessionDescriptionInterface* sdp =
|
||||
ExtractNativePC(jni, j_pc)->local_description();
|
||||
return sdp ? NativeToJavaSessionDescription(jni, sdp) : NULL;
|
||||
}
|
||||
@ -80,7 +81,7 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
PeerConnection_getRemoteDescription,
|
||||
JNIEnv* jni,
|
||||
jobject j_pc) {
|
||||
const webrtc::SessionDescriptionInterface* sdp =
|
||||
const SessionDescriptionInterface* sdp =
|
||||
ExtractNativePC(jni, j_pc)->remote_description();
|
||||
return sdp ? NativeToJavaSessionDescription(jni, sdp) : NULL;
|
||||
}
|
||||
@ -91,8 +92,8 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
jobject j_pc,
|
||||
jstring j_label,
|
||||
jobject j_init) {
|
||||
webrtc::DataChannelInit init = JavaToNativeDataChannelInit(jni, j_init);
|
||||
rtc::scoped_refptr<webrtc::DataChannelInterface> channel(
|
||||
DataChannelInit init = JavaToNativeDataChannelInit(jni, j_init);
|
||||
rtc::scoped_refptr<DataChannelInterface> channel(
|
||||
ExtractNativePC(jni, j_pc)->CreateDataChannel(
|
||||
JavaToStdString(jni, j_label), &init));
|
||||
// Mustn't pass channel.get() directly through NewObject to avoid reading its
|
||||
@ -177,8 +178,8 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
// in the observer object.
|
||||
PeerConnectionObserverJni* observer =
|
||||
reinterpret_cast<PeerConnectionObserverJni*>(native_observer);
|
||||
webrtc::PeerConnectionInterface::RTCConfiguration rtc_config(
|
||||
webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive);
|
||||
PeerConnectionInterface::RTCConfiguration rtc_config(
|
||||
PeerConnectionInterface::RTCConfigurationType::kAggressive);
|
||||
JavaToNativeRTCConfiguration(jni, j_rtc_config, &rtc_config);
|
||||
CopyConstraintsIntoRtcConfiguration(observer->constraints(), &rtc_config);
|
||||
return ExtractNativePC(jni, j_pc)->SetConfiguration(rtc_config);
|
||||
@ -193,8 +194,8 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jstring j_candidate_sdp) {
|
||||
std::string sdp_mid = JavaToStdString(jni, j_sdp_mid);
|
||||
std::string sdp = JavaToStdString(jni, j_candidate_sdp);
|
||||
std::unique_ptr<webrtc::IceCandidateInterface> candidate(
|
||||
webrtc::CreateIceCandidate(sdp_mid, j_sdp_mline_index, sdp, nullptr));
|
||||
std::unique_ptr<IceCandidateInterface> candidate(
|
||||
CreateIceCandidate(sdp_mid, j_sdp_mline_index, sdp, nullptr));
|
||||
return ExtractNativePC(jni, j_pc)->AddIceCandidate(candidate.get());
|
||||
}
|
||||
|
||||
@ -218,7 +219,7 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jobject j_pc,
|
||||
jlong native_stream) {
|
||||
return ExtractNativePC(jni, j_pc)->AddStream(
|
||||
reinterpret_cast<webrtc::MediaStreamInterface*>(native_stream));
|
||||
reinterpret_cast<MediaStreamInterface*>(native_stream));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -227,7 +228,7 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jobject j_pc,
|
||||
jlong native_stream) {
|
||||
ExtractNativePC(jni, j_pc)->RemoveStream(
|
||||
reinterpret_cast<webrtc::MediaStreamInterface*>(native_stream));
|
||||
reinterpret_cast<MediaStreamInterface*>(native_stream));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jobject,
|
||||
@ -242,7 +243,7 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
|
||||
std::string kind = JavaToStdString(jni, j_kind);
|
||||
std::string stream_id = JavaToStdString(jni, j_stream_id);
|
||||
rtc::scoped_refptr<webrtc::RtpSenderInterface> sender =
|
||||
rtc::scoped_refptr<RtpSenderInterface> sender =
|
||||
ExtractNativePC(jni, j_pc)->CreateSender(kind, stream_id);
|
||||
if (!sender.get()) {
|
||||
return nullptr;
|
||||
@ -327,9 +328,8 @@ JNI_FUNCTION_DECLARATION(bool,
|
||||
rtc::scoped_refptr<StatsObserverJni> observer(
|
||||
new rtc::RefCountedObject<StatsObserverJni>(jni, j_observer));
|
||||
return ExtractNativePC(jni, j_pc)->GetStats(
|
||||
observer,
|
||||
reinterpret_cast<webrtc::MediaStreamTrackInterface*>(native_track),
|
||||
webrtc::PeerConnectionInterface::kStatsOutputLevelStandard);
|
||||
observer, reinterpret_cast<MediaStreamTrackInterface*>(native_track),
|
||||
PeerConnectionInterface::kStatsOutputLevelStandard);
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -350,7 +350,7 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jobject j_min,
|
||||
jobject j_current,
|
||||
jobject j_max) {
|
||||
webrtc::PeerConnectionInterface::BitrateParameters params;
|
||||
PeerConnectionInterface::BitrateParameters params;
|
||||
jclass j_integer_class = jni->FindClass("java/lang/Integer");
|
||||
jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I");
|
||||
if (!IsNull(jni, j_min)) {
|
||||
@ -389,7 +389,7 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
PeerConnection_signalingState,
|
||||
JNIEnv* jni,
|
||||
jobject j_pc) {
|
||||
webrtc::PeerConnectionInterface::SignalingState state =
|
||||
PeerConnectionInterface::SignalingState state =
|
||||
ExtractNativePC(jni, j_pc)->signaling_state();
|
||||
return JavaEnumFromIndexAndClassName(jni, "PeerConnection$SignalingState",
|
||||
state);
|
||||
@ -399,7 +399,7 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
PeerConnection_iceConnectionState,
|
||||
JNIEnv* jni,
|
||||
jobject j_pc) {
|
||||
webrtc::PeerConnectionInterface::IceConnectionState state =
|
||||
PeerConnectionInterface::IceConnectionState state =
|
||||
ExtractNativePC(jni, j_pc)->ice_connection_state();
|
||||
return JavaEnumFromIndexAndClassName(jni, "PeerConnection$IceConnectionState",
|
||||
state);
|
||||
@ -409,7 +409,7 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
PeerConnection_iceGatheringState,
|
||||
JNIEnv* jni,
|
||||
jobject j_pc) {
|
||||
webrtc::PeerConnectionInterface::IceGatheringState state =
|
||||
PeerConnectionInterface::IceGatheringState state =
|
||||
ExtractNativePC(jni, j_pc)->ice_gathering_state();
|
||||
return JavaEnumFromIndexAndClassName(jni, "PeerConnection$IceGatheringState",
|
||||
state);
|
||||
@ -423,4 +423,5 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
return;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -32,7 +32,8 @@
|
||||
#include "webrtc/system_wrappers/include/field_trial_default.h" // nogncheck
|
||||
#include "webrtc/system_wrappers/include/trace.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Note: Some of the video-specific PeerConnectionFactory methods are
|
||||
// implemented in "video_jni.cc". This is done so that if an application
|
||||
@ -63,7 +64,7 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jboolean video_hw_acceleration) {
|
||||
video_hw_acceleration_enabled = video_hw_acceleration;
|
||||
if (!factory_static_initialized) {
|
||||
webrtc::JVM::Initialize(GetJVM());
|
||||
JVM::Initialize(GetJVM());
|
||||
factory_static_initialized = true;
|
||||
}
|
||||
}
|
||||
@ -83,7 +84,7 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jni->ReleaseStringUTFChars(j_trials_init_string, init_string);
|
||||
LOG(LS_INFO) << "initializeFieldTrials: " << field_trials_init_string;
|
||||
}
|
||||
webrtc::field_trial::InitFieldTrialsFromString(field_trials_init_string);
|
||||
field_trial::InitFieldTrialsFromString(field_trials_init_string);
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -99,7 +100,7 @@ JNI_FUNCTION_DECLARATION(jstring,
|
||||
jclass,
|
||||
jstring j_name) {
|
||||
return JavaStringFromStdString(
|
||||
jni, webrtc::field_trial::FindFullName(JavaToStdString(jni, j_name)));
|
||||
jni, field_trial::FindFullName(JavaToStdString(jni, j_name)));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
@ -146,7 +147,7 @@ JNI_FUNCTION_DECLARATION(
|
||||
// webrtc/rtc_base/ are convoluted, we simply wrap here to avoid having to
|
||||
// think about ramifications of auto-wrapping there.
|
||||
rtc::ThreadManager::Instance()->WrapCurrentThread();
|
||||
webrtc::Trace::CreateTrace();
|
||||
Trace::CreateTrace();
|
||||
|
||||
std::unique_ptr<rtc::Thread> network_thread =
|
||||
rtc::Thread::CreateWithSocketServer();
|
||||
@ -167,7 +168,7 @@ JNI_FUNCTION_DECLARATION(
|
||||
auto audio_encoder_factory = CreateAudioEncoderFactory();
|
||||
auto audio_decoder_factory = CreateAudioDecoderFactory();
|
||||
|
||||
webrtc::PeerConnectionFactoryInterface::Options options;
|
||||
PeerConnectionFactoryInterface::Options options;
|
||||
bool has_options = joptions != NULL;
|
||||
if (has_options) {
|
||||
options = JavaToNativePeerConnectionFactoryOptions(jni, joptions);
|
||||
@ -184,17 +185,16 @@ JNI_FUNCTION_DECLARATION(
|
||||
rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory);
|
||||
}
|
||||
|
||||
webrtc::AudioDeviceModule* adm = nullptr;
|
||||
rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer = nullptr;
|
||||
std::unique_ptr<webrtc::CallFactoryInterface> call_factory(
|
||||
CreateCallFactory());
|
||||
std::unique_ptr<webrtc::RtcEventLogFactoryInterface> rtc_event_log_factory(
|
||||
AudioDeviceModule* adm = nullptr;
|
||||
rtc::scoped_refptr<AudioMixer> audio_mixer = nullptr;
|
||||
std::unique_ptr<CallFactoryInterface> call_factory(CreateCallFactory());
|
||||
std::unique_ptr<RtcEventLogFactoryInterface> rtc_event_log_factory(
|
||||
CreateRtcEventLogFactory());
|
||||
std::unique_ptr<cricket::MediaEngineInterface> media_engine(CreateMediaEngine(
|
||||
adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
|
||||
video_decoder_factory, audio_mixer));
|
||||
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
CreateModularPeerConnectionFactory(
|
||||
network_thread.get(), worker_thread.get(), signaling_thread.get(),
|
||||
adm, audio_encoder_factory, audio_decoder_factory,
|
||||
@ -223,11 +223,11 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jlong j_p) {
|
||||
delete reinterpret_cast<OwnedFactoryAndThreads*>(j_p);
|
||||
if (field_trials_init_string) {
|
||||
webrtc::field_trial::InitFieldTrialsFromString(NULL);
|
||||
field_trial::InitFieldTrialsFromString(NULL);
|
||||
delete field_trials_init_string;
|
||||
field_trials_init_string = NULL;
|
||||
}
|
||||
webrtc::Trace::ReturnTrace();
|
||||
Trace::ReturnTrace();
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(void,
|
||||
@ -246,9 +246,9 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jclass,
|
||||
jlong native_factory,
|
||||
jstring label) {
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
factoryFromJava(native_factory));
|
||||
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream(
|
||||
rtc::scoped_refptr<MediaStreamInterface> stream(
|
||||
factory->CreateLocalMediaStream(JavaToStdString(jni, label)));
|
||||
return (jlong)stream.release();
|
||||
}
|
||||
@ -261,11 +261,11 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jobject j_constraints) {
|
||||
std::unique_ptr<MediaConstraintsJni> constraints(
|
||||
new MediaConstraintsJni(jni, j_constraints));
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
factoryFromJava(native_factory));
|
||||
cricket::AudioOptions options;
|
||||
CopyConstraintsIntoAudioOptions(constraints.get(), &options);
|
||||
rtc::scoped_refptr<webrtc::AudioSourceInterface> source(
|
||||
rtc::scoped_refptr<AudioSourceInterface> source(
|
||||
factory->CreateAudioSource(options));
|
||||
return (jlong)source.release();
|
||||
}
|
||||
@ -277,12 +277,11 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jlong native_factory,
|
||||
jstring id,
|
||||
jlong native_source) {
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
factoryFromJava(native_factory));
|
||||
rtc::scoped_refptr<webrtc::AudioTrackInterface> track(
|
||||
factory->CreateAudioTrack(
|
||||
JavaToStdString(jni, id),
|
||||
reinterpret_cast<webrtc::AudioSourceInterface*>(native_source)));
|
||||
rtc::scoped_refptr<AudioTrackInterface> track(factory->CreateAudioTrack(
|
||||
JavaToStdString(jni, id),
|
||||
reinterpret_cast<AudioSourceInterface*>(native_source)));
|
||||
return (jlong)track.release();
|
||||
}
|
||||
|
||||
@ -293,7 +292,7 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jlong native_factory,
|
||||
jint file,
|
||||
jint filesize_limit_bytes) {
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
factoryFromJava(native_factory));
|
||||
return factory->StartAecDump(file, filesize_limit_bytes);
|
||||
}
|
||||
@ -303,7 +302,7 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong native_factory) {
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
factoryFromJava(native_factory));
|
||||
factory->StopAecDump();
|
||||
}
|
||||
@ -314,9 +313,9 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jclass,
|
||||
jlong native_factory,
|
||||
jobject options) {
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
factoryFromJava(native_factory));
|
||||
webrtc::PeerConnectionFactoryInterface::Options options_to_set =
|
||||
PeerConnectionFactoryInterface::Options options_to_set =
|
||||
JavaToNativePeerConnectionFactoryOptions(jni, options);
|
||||
factory->SetOptions(options_to_set);
|
||||
|
||||
@ -339,12 +338,12 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jobject j_rtc_config,
|
||||
jobject j_constraints,
|
||||
jlong observer_p) {
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> f(
|
||||
reinterpret_cast<webrtc::PeerConnectionFactoryInterface*>(
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> f(
|
||||
reinterpret_cast<PeerConnectionFactoryInterface*>(
|
||||
factoryFromJava(factory)));
|
||||
|
||||
webrtc::PeerConnectionInterface::RTCConfiguration rtc_config(
|
||||
webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive);
|
||||
PeerConnectionInterface::RTCConfiguration rtc_config(
|
||||
PeerConnectionInterface::RTCConfigurationType::kAggressive);
|
||||
JavaToNativeRTCConfiguration(jni, j_rtc_config, &rtc_config);
|
||||
|
||||
jclass j_rtc_config_class = GetObjectClass(jni, j_rtc_config);
|
||||
@ -369,9 +368,10 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
reinterpret_cast<PeerConnectionObserverJni*>(observer_p);
|
||||
observer->SetConstraints(new MediaConstraintsJni(jni, j_constraints));
|
||||
CopyConstraintsIntoRtcConfiguration(observer->constraints(), &rtc_config);
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionInterface> pc(
|
||||
rtc::scoped_refptr<PeerConnectionInterface> pc(
|
||||
f->CreatePeerConnection(rtc_config, nullptr, nullptr, observer));
|
||||
return (jlong)pc.release();
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -15,7 +15,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Convenience, used since callbacks occur on the signaling thread, which may
|
||||
// be a non-Java thread.
|
||||
@ -52,7 +53,7 @@ PeerConnectionObserverJni::~PeerConnectionObserverJni() {
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnIceCandidate(
|
||||
const webrtc::IceCandidateInterface* candidate) {
|
||||
const IceCandidateInterface* candidate) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
std::string sdp;
|
||||
RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp;
|
||||
@ -83,7 +84,7 @@ void PeerConnectionObserverJni::OnIceCandidatesRemoved(
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnSignalingChange(
|
||||
webrtc::PeerConnectionInterface::SignalingState new_state) {
|
||||
PeerConnectionInterface::SignalingState new_state) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jmethodID m = GetMethodID(jni(), *j_observer_class_, "onSignalingChange",
|
||||
"(Lorg/webrtc/PeerConnection$SignalingState;)V");
|
||||
@ -94,7 +95,7 @@ void PeerConnectionObserverJni::OnSignalingChange(
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnIceConnectionChange(
|
||||
webrtc::PeerConnectionInterface::IceConnectionState new_state) {
|
||||
PeerConnectionInterface::IceConnectionState new_state) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jmethodID m =
|
||||
GetMethodID(jni(), *j_observer_class_, "onIceConnectionChange",
|
||||
@ -114,7 +115,7 @@ void PeerConnectionObserverJni::OnIceConnectionReceivingChange(bool receiving) {
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnIceGatheringChange(
|
||||
webrtc::PeerConnectionInterface::IceGatheringState new_state) {
|
||||
PeerConnectionInterface::IceGatheringState new_state) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jmethodID m = GetMethodID(jni(), *j_observer_class_, "onIceGatheringChange",
|
||||
"(Lorg/webrtc/PeerConnection$IceGatheringState;)V");
|
||||
@ -125,7 +126,7 @@ void PeerConnectionObserverJni::OnIceGatheringChange(
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnAddStream(
|
||||
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {
|
||||
rtc::scoped_refptr<MediaStreamInterface> stream) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
// The stream could be added into the remote_streams_ map when calling
|
||||
// OnAddTrack.
|
||||
@ -176,7 +177,7 @@ void PeerConnectionObserverJni::OnAddStream(
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnRemoveStream(
|
||||
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {
|
||||
rtc::scoped_refptr<MediaStreamInterface> stream) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream);
|
||||
RTC_CHECK(it != remote_streams_.end())
|
||||
@ -193,7 +194,7 @@ void PeerConnectionObserverJni::OnRemoveStream(
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnDataChannel(
|
||||
rtc::scoped_refptr<webrtc::DataChannelInterface> channel) {
|
||||
rtc::scoped_refptr<DataChannelInterface> channel) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jobject j_channel =
|
||||
jni()->NewObject(*j_data_channel_class_, j_data_channel_ctor_,
|
||||
@ -223,9 +224,8 @@ void PeerConnectionObserverJni::OnRenegotiationNeeded() {
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnAddTrack(
|
||||
rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
|
||||
const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&
|
||||
streams) {
|
||||
rtc::scoped_refptr<RtpReceiverInterface> receiver,
|
||||
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jobject j_rtp_receiver =
|
||||
jni()->NewObject(*j_rtp_receiver_class_, j_rtp_receiver_ctor_,
|
||||
@ -272,7 +272,7 @@ void PeerConnectionObserverJni::DisposeRtpReceiver(
|
||||
// If the NativeToJavaStreamsMap contains the stream, return it.
|
||||
// Otherwise, create a new Java MediaStream.
|
||||
jobject PeerConnectionObserverJni::GetOrCreateJavaStream(
|
||||
const rtc::scoped_refptr<webrtc::MediaStreamInterface>& stream) {
|
||||
const rtc::scoped_refptr<MediaStreamInterface>& stream) {
|
||||
NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream);
|
||||
if (it != remote_streams_.end()) {
|
||||
return it->second;
|
||||
@ -292,8 +292,7 @@ jobject PeerConnectionObserverJni::GetOrCreateJavaStream(
|
||||
|
||||
jobjectArray PeerConnectionObserverJni::NativeToJavaMediaStreamArray(
|
||||
JNIEnv* jni,
|
||||
const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&
|
||||
streams) {
|
||||
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
|
||||
jobjectArray java_streams =
|
||||
jni->NewObjectArray(streams.size(), *j_media_stream_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -304,4 +303,5 @@ jobjectArray PeerConnectionObserverJni::NativeToJavaMediaStreamArray(
|
||||
return java_streams;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -19,48 +19,43 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/pc/mediaconstraints_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Adapter between the C++ PeerConnectionObserver interface and the Java
|
||||
// PeerConnection.Observer interface. Wraps an instance of the Java interface
|
||||
// and dispatches C++ callbacks to Java.
|
||||
class PeerConnectionObserverJni : public webrtc::PeerConnectionObserver {
|
||||
class PeerConnectionObserverJni : public PeerConnectionObserver {
|
||||
public:
|
||||
PeerConnectionObserverJni(JNIEnv* jni, jobject j_observer);
|
||||
virtual ~PeerConnectionObserverJni();
|
||||
|
||||
// Implementation of PeerConnectionObserver interface, which propagates
|
||||
// the callbacks to the Java observer.
|
||||
void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
|
||||
void OnIceCandidate(const IceCandidateInterface* candidate) override;
|
||||
void OnIceCandidatesRemoved(
|
||||
const std::vector<cricket::Candidate>& candidates) override;
|
||||
void OnSignalingChange(
|
||||
webrtc::PeerConnectionInterface::SignalingState new_state) override;
|
||||
PeerConnectionInterface::SignalingState new_state) override;
|
||||
void OnIceConnectionChange(
|
||||
webrtc::PeerConnectionInterface::IceConnectionState new_state) override;
|
||||
PeerConnectionInterface::IceConnectionState new_state) override;
|
||||
void OnIceConnectionReceivingChange(bool receiving) override;
|
||||
void OnIceGatheringChange(
|
||||
webrtc::PeerConnectionInterface::IceGatheringState new_state) override;
|
||||
void OnAddStream(
|
||||
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
|
||||
void OnRemoveStream(
|
||||
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
|
||||
void OnDataChannel(
|
||||
rtc::scoped_refptr<webrtc::DataChannelInterface> channel) override;
|
||||
PeerConnectionInterface::IceGatheringState new_state) override;
|
||||
void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
|
||||
void OnRemoveStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
|
||||
void OnDataChannel(rtc::scoped_refptr<DataChannelInterface> channel) override;
|
||||
void OnRenegotiationNeeded() override;
|
||||
void OnAddTrack(
|
||||
rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
|
||||
const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&
|
||||
streams) override;
|
||||
void OnAddTrack(rtc::scoped_refptr<RtpReceiverInterface> receiver,
|
||||
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>&
|
||||
streams) override;
|
||||
|
||||
void SetConstraints(MediaConstraintsJni* constraints);
|
||||
const MediaConstraintsJni* constraints() { return constraints_.get(); }
|
||||
|
||||
private:
|
||||
typedef std::map<webrtc::MediaStreamInterface*, jobject>
|
||||
NativeToJavaStreamsMap;
|
||||
typedef std::map<webrtc::RtpReceiverInterface*, jobject>
|
||||
NativeToJavaRtpReceiverMap;
|
||||
typedef std::map<MediaStreamInterface*, jobject> NativeToJavaStreamsMap;
|
||||
typedef std::map<RtpReceiverInterface*, jobject> NativeToJavaRtpReceiverMap;
|
||||
|
||||
void DisposeRemoteStream(const NativeToJavaStreamsMap::iterator& it);
|
||||
void DisposeRtpReceiver(const NativeToJavaRtpReceiverMap::iterator& it);
|
||||
@ -68,13 +63,12 @@ class PeerConnectionObserverJni : public webrtc::PeerConnectionObserver {
|
||||
// If the NativeToJavaStreamsMap contains the stream, return it.
|
||||
// Otherwise, create a new Java MediaStream.
|
||||
jobject GetOrCreateJavaStream(
|
||||
const rtc::scoped_refptr<webrtc::MediaStreamInterface>& stream);
|
||||
const rtc::scoped_refptr<MediaStreamInterface>& stream);
|
||||
|
||||
// Converts array of streams, creating or re-using Java streams as necessary.
|
||||
jobjectArray NativeToJavaMediaStreamArray(
|
||||
JNIEnv* jni,
|
||||
const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&
|
||||
streams);
|
||||
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams);
|
||||
|
||||
const ScopedGlobalRef<jobject> j_observer_global_;
|
||||
const ScopedGlobalRef<jclass> j_observer_class_;
|
||||
@ -95,6 +89,7 @@ class PeerConnectionObserverJni : public webrtc::PeerConnectionObserver {
|
||||
std::unique_ptr<MediaConstraintsJni> constraints_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_PEERCONNECTIONOBSERVER_JNI_H_
|
||||
|
||||
@ -15,7 +15,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
RTCStatsCollectorCallbackWrapper::RTCStatsCollectorCallbackWrapper(
|
||||
JNIEnv* jni,
|
||||
@ -57,7 +58,7 @@ RTCStatsCollectorCallbackWrapper::RTCStatsCollectorCallbackWrapper(
|
||||
j_string_class_(FindClass(jni, "java/lang/String")) {}
|
||||
|
||||
void RTCStatsCollectorCallbackWrapper::OnStatsDelivered(
|
||||
const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report) {
|
||||
const rtc::scoped_refptr<const RTCStatsReport>& report) {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
jobject j_report = ReportToJava(jni, report);
|
||||
@ -69,11 +70,11 @@ void RTCStatsCollectorCallbackWrapper::OnStatsDelivered(
|
||||
|
||||
jobject RTCStatsCollectorCallbackWrapper::ReportToJava(
|
||||
JNIEnv* jni,
|
||||
const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report) {
|
||||
const rtc::scoped_refptr<const RTCStatsReport>& report) {
|
||||
jobject j_stats_map =
|
||||
jni->NewObject(j_linked_hash_map_class_, j_linked_hash_map_ctor_);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
for (const webrtc::RTCStats& stats : *report) {
|
||||
for (const RTCStats& stats : *report) {
|
||||
// Create a local reference frame for each RTCStats, since there is a
|
||||
// maximum number of references that can be created in one frame.
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
@ -88,14 +89,13 @@ jobject RTCStatsCollectorCallbackWrapper::ReportToJava(
|
||||
return j_report;
|
||||
}
|
||||
|
||||
jobject RTCStatsCollectorCallbackWrapper::StatsToJava(
|
||||
JNIEnv* jni,
|
||||
const webrtc::RTCStats& stats) {
|
||||
jobject RTCStatsCollectorCallbackWrapper::StatsToJava(JNIEnv* jni,
|
||||
const RTCStats& stats) {
|
||||
jstring j_type = JavaStringFromStdString(jni, stats.type());
|
||||
jstring j_id = JavaStringFromStdString(jni, stats.id());
|
||||
jobject j_members =
|
||||
jni->NewObject(j_linked_hash_map_class_, j_linked_hash_map_ctor_);
|
||||
for (const webrtc::RTCStatsMemberInterface* member : stats.Members()) {
|
||||
for (const RTCStatsMemberInterface* member : stats.Members()) {
|
||||
if (!member->is_defined()) {
|
||||
continue;
|
||||
}
|
||||
@ -115,57 +115,56 @@ jobject RTCStatsCollectorCallbackWrapper::StatsToJava(
|
||||
|
||||
jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
JNIEnv* jni,
|
||||
const webrtc::RTCStatsMemberInterface* member) {
|
||||
const RTCStatsMemberInterface* member) {
|
||||
switch (member->type()) {
|
||||
case webrtc::RTCStatsMemberInterface::kBool: {
|
||||
jobject value =
|
||||
jni->NewObject(j_boolean_class_, j_boolean_ctor_,
|
||||
*member->cast_to<webrtc::RTCStatsMember<bool>>());
|
||||
case RTCStatsMemberInterface::kBool: {
|
||||
jobject value = jni->NewObject(j_boolean_class_, j_boolean_ctor_,
|
||||
*member->cast_to<RTCStatsMember<bool>>());
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
return value;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kInt32: {
|
||||
case RTCStatsMemberInterface::kInt32: {
|
||||
jobject value =
|
||||
jni->NewObject(j_integer_class_, j_integer_ctor_,
|
||||
*member->cast_to<webrtc::RTCStatsMember<int32_t>>());
|
||||
*member->cast_to<RTCStatsMember<int32_t>>());
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
return value;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kUint32: {
|
||||
jobject value = jni->NewObject(
|
||||
j_long_class_, j_long_ctor_,
|
||||
(jlong)*member->cast_to<webrtc::RTCStatsMember<uint32_t>>());
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
return value;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kInt64: {
|
||||
case RTCStatsMemberInterface::kUint32: {
|
||||
jobject value =
|
||||
jni->NewObject(j_long_class_, j_long_ctor_,
|
||||
*member->cast_to<webrtc::RTCStatsMember<int64_t>>());
|
||||
(jlong)*member->cast_to<RTCStatsMember<uint32_t>>());
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
return value;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kUint64: {
|
||||
case RTCStatsMemberInterface::kInt64: {
|
||||
jobject value =
|
||||
jni->NewObject(j_long_class_, j_long_ctor_,
|
||||
*member->cast_to<RTCStatsMember<int64_t>>());
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
return value;
|
||||
}
|
||||
case RTCStatsMemberInterface::kUint64: {
|
||||
jobject value =
|
||||
jni->NewObject(j_big_integer_class_, j_big_integer_ctor_,
|
||||
JavaStringFromStdString(jni, member->ValueToString()));
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
return value;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kDouble: {
|
||||
case RTCStatsMemberInterface::kDouble: {
|
||||
jobject value =
|
||||
jni->NewObject(j_double_class_, j_double_ctor_,
|
||||
*member->cast_to<webrtc::RTCStatsMember<double>>());
|
||||
*member->cast_to<RTCStatsMember<double>>());
|
||||
CHECK_EXCEPTION(jni) << "error during NewObject";
|
||||
return value;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kString: {
|
||||
case RTCStatsMemberInterface::kString: {
|
||||
return JavaStringFromStdString(
|
||||
jni, *member->cast_to<webrtc::RTCStatsMember<std::string>>());
|
||||
jni, *member->cast_to<RTCStatsMember<std::string>>());
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kSequenceBool: {
|
||||
case RTCStatsMemberInterface::kSequenceBool: {
|
||||
const std::vector<bool>& values =
|
||||
*member->cast_to<webrtc::RTCStatsMember<std::vector<bool>>>();
|
||||
*member->cast_to<RTCStatsMember<std::vector<bool>>>();
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), j_boolean_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -177,9 +176,9 @@ jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
}
|
||||
return j_values;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kSequenceInt32: {
|
||||
case RTCStatsMemberInterface::kSequenceInt32: {
|
||||
const std::vector<int32_t>& values =
|
||||
*member->cast_to<webrtc::RTCStatsMember<std::vector<int32_t>>>();
|
||||
*member->cast_to<RTCStatsMember<std::vector<int32_t>>>();
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), j_integer_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -191,9 +190,9 @@ jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
}
|
||||
return j_values;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kSequenceUint32: {
|
||||
case RTCStatsMemberInterface::kSequenceUint32: {
|
||||
const std::vector<uint32_t>& values =
|
||||
*member->cast_to<webrtc::RTCStatsMember<std::vector<uint32_t>>>();
|
||||
*member->cast_to<RTCStatsMember<std::vector<uint32_t>>>();
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), j_long_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -204,9 +203,9 @@ jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
}
|
||||
return j_values;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kSequenceInt64: {
|
||||
case RTCStatsMemberInterface::kSequenceInt64: {
|
||||
const std::vector<int64_t>& values =
|
||||
*member->cast_to<webrtc::RTCStatsMember<std::vector<int64_t>>>();
|
||||
*member->cast_to<RTCStatsMember<std::vector<int64_t>>>();
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), j_long_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -217,9 +216,9 @@ jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
}
|
||||
return j_values;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kSequenceUint64: {
|
||||
case RTCStatsMemberInterface::kSequenceUint64: {
|
||||
const std::vector<uint64_t>& values =
|
||||
*member->cast_to<webrtc::RTCStatsMember<std::vector<uint64_t>>>();
|
||||
*member->cast_to<RTCStatsMember<std::vector<uint64_t>>>();
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), j_big_integer_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -232,9 +231,9 @@ jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
}
|
||||
return j_values;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kSequenceDouble: {
|
||||
case RTCStatsMemberInterface::kSequenceDouble: {
|
||||
const std::vector<double>& values =
|
||||
*member->cast_to<webrtc::RTCStatsMember<std::vector<double>>>();
|
||||
*member->cast_to<RTCStatsMember<std::vector<double>>>();
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), j_double_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -246,9 +245,9 @@ jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
}
|
||||
return j_values;
|
||||
}
|
||||
case webrtc::RTCStatsMemberInterface::kSequenceString: {
|
||||
case RTCStatsMemberInterface::kSequenceString: {
|
||||
const std::vector<std::string>& values =
|
||||
*member->cast_to<webrtc::RTCStatsMember<std::vector<std::string>>>();
|
||||
*member->cast_to<RTCStatsMember<std::vector<std::string>>>();
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), j_string_class_, nullptr);
|
||||
CHECK_EXCEPTION(jni) << "error during NewObjectArray";
|
||||
@ -264,4 +263,5 @@ jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -16,27 +16,25 @@
|
||||
#include "webrtc/api/peerconnectioninterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Adapter for a Java RTCStatsCollectorCallback presenting a C++
|
||||
// RTCStatsCollectorCallback and dispatching the callback from C++ back to
|
||||
// Java.
|
||||
class RTCStatsCollectorCallbackWrapper
|
||||
: public webrtc::RTCStatsCollectorCallback {
|
||||
class RTCStatsCollectorCallbackWrapper : public RTCStatsCollectorCallback {
|
||||
public:
|
||||
RTCStatsCollectorCallbackWrapper(JNIEnv* jni, jobject j_callback);
|
||||
|
||||
void OnStatsDelivered(
|
||||
const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report) override;
|
||||
const rtc::scoped_refptr<const RTCStatsReport>& report) override;
|
||||
|
||||
private:
|
||||
// Helper functions for converting C++ RTCStatsReport to Java equivalent.
|
||||
jobject ReportToJava(
|
||||
JNIEnv* jni,
|
||||
const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report);
|
||||
jobject StatsToJava(JNIEnv* jni, const webrtc::RTCStats& stats);
|
||||
jobject MemberToJava(JNIEnv* jni,
|
||||
const webrtc::RTCStatsMemberInterface* member);
|
||||
jobject ReportToJava(JNIEnv* jni,
|
||||
const rtc::scoped_refptr<const RTCStatsReport>& report);
|
||||
jobject StatsToJava(JNIEnv* jni, const RTCStats& stats);
|
||||
jobject MemberToJava(JNIEnv* jni, const RTCStatsMemberInterface* member);
|
||||
|
||||
const ScopedGlobalRef<jobject> j_callback_global_;
|
||||
const ScopedGlobalRef<jclass> j_callback_class_;
|
||||
@ -60,6 +58,7 @@ class RTCStatsCollectorCallbackWrapper
|
||||
const jclass j_string_class_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_RTCSTATSCOLLECTORCALLBACKWRAPPER_H_
|
||||
|
||||
@ -13,7 +13,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
|
||||
#include "webrtc/sdk/android/src/jni/pc/rtpreceiverobserver_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
RtpReceiver_nativeGetTrack,
|
||||
@ -22,7 +23,7 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jlong j_rtp_receiver_pointer,
|
||||
jlong j_track_pointer) {
|
||||
return jlongFromPointer(
|
||||
reinterpret_cast<webrtc::RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
->track()
|
||||
.release());
|
||||
}
|
||||
@ -36,9 +37,9 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
if (IsNull(jni, j_parameters)) {
|
||||
return false;
|
||||
}
|
||||
webrtc::RtpParameters parameters;
|
||||
RtpParameters parameters;
|
||||
JavaToNativeRtpParameters(jni, j_parameters, ¶meters);
|
||||
return reinterpret_cast<webrtc::RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
return reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
->SetParameters(parameters);
|
||||
}
|
||||
|
||||
@ -47,8 +48,8 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_rtp_receiver_pointer) {
|
||||
webrtc::RtpParameters parameters =
|
||||
reinterpret_cast<webrtc::RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
RtpParameters parameters =
|
||||
reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
->GetParameters();
|
||||
return NativeToJavaRtpParameters(jni, parameters);
|
||||
}
|
||||
@ -60,8 +61,7 @@ JNI_FUNCTION_DECLARATION(jstring,
|
||||
jlong j_rtp_receiver_pointer) {
|
||||
return JavaStringFromStdString(
|
||||
jni,
|
||||
reinterpret_cast<webrtc::RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
->id());
|
||||
reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id());
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
@ -72,7 +72,7 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jobject j_observer) {
|
||||
RtpReceiverObserverJni* rtpReceiverObserver =
|
||||
new RtpReceiverObserverJni(jni, j_observer);
|
||||
reinterpret_cast<webrtc::RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
->SetObserver(rtpReceiverObserver);
|
||||
return jlongFromPointer(rtpReceiverObserver);
|
||||
}
|
||||
@ -83,7 +83,7 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
jclass,
|
||||
jlong j_rtp_receiver_pointer,
|
||||
jlong j_observer_pointer) {
|
||||
reinterpret_cast<webrtc::RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
|
||||
->SetObserver(nullptr);
|
||||
RtpReceiverObserverJni* observer =
|
||||
reinterpret_cast<RtpReceiverObserverJni*>(j_observer_pointer);
|
||||
@ -92,4 +92,5 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -12,7 +12,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
void RtpReceiverObserverJni::OnFirstPacketReceived(
|
||||
cricket::MediaType media_type) {
|
||||
@ -29,4 +30,5 @@ void RtpReceiverObserverJni::OnFirstPacketReceived(
|
||||
CHECK_EXCEPTION(jni) << "error during CallVoidMethod";
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,12 +14,13 @@
|
||||
#include "webrtc/api/rtpreceiverinterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// 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 RtpReceiverObserverJni : public webrtc::RtpReceiverObserverInterface {
|
||||
class RtpReceiverObserverJni : public RtpReceiverObserverInterface {
|
||||
public:
|
||||
RtpReceiverObserverJni(JNIEnv* jni, jobject j_observer)
|
||||
: j_observer_global_(jni, j_observer) {}
|
||||
@ -32,6 +33,7 @@ class RtpReceiverObserverJni : public webrtc::RtpReceiverObserverInterface {
|
||||
const ScopedGlobalRef<jobject> j_observer_global_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_RTPRECEIVEROBSERVER_JNI_H_
|
||||
|
||||
@ -12,7 +12,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jboolean,
|
||||
RtpSender_nativeSetTrack,
|
||||
@ -20,9 +21,8 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
jclass,
|
||||
jlong j_rtp_sender_pointer,
|
||||
jlong j_track_pointer) {
|
||||
return reinterpret_cast<webrtc::RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
->SetTrack(reinterpret_cast<webrtc::MediaStreamTrackInterface*>(
|
||||
j_track_pointer));
|
||||
return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
->SetTrack(reinterpret_cast<MediaStreamTrackInterface*>(j_track_pointer));
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
@ -31,7 +31,7 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jclass,
|
||||
jlong j_rtp_sender_pointer) {
|
||||
return jlongFromPointer(
|
||||
reinterpret_cast<webrtc::RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
->track()
|
||||
.release());
|
||||
}
|
||||
@ -42,7 +42,7 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jclass,
|
||||
jlong j_rtp_sender_pointer) {
|
||||
return jlongFromPointer(
|
||||
reinterpret_cast<webrtc::RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
->GetDtmfSender()
|
||||
.release());
|
||||
}
|
||||
@ -56,9 +56,9 @@ JNI_FUNCTION_DECLARATION(jboolean,
|
||||
if (IsNull(jni, j_parameters)) {
|
||||
return false;
|
||||
}
|
||||
webrtc::RtpParameters parameters;
|
||||
RtpParameters parameters;
|
||||
JavaToNativeRtpParameters(jni, j_parameters, ¶meters);
|
||||
return reinterpret_cast<webrtc::RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
->SetParameters(parameters);
|
||||
}
|
||||
|
||||
@ -67,8 +67,8 @@ JNI_FUNCTION_DECLARATION(jobject,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_rtp_sender_pointer) {
|
||||
webrtc::RtpParameters parameters =
|
||||
reinterpret_cast<webrtc::RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
RtpParameters parameters =
|
||||
reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
->GetParameters();
|
||||
return NativeToJavaRtpParameters(jni, parameters);
|
||||
}
|
||||
@ -79,8 +79,8 @@ JNI_FUNCTION_DECLARATION(jstring,
|
||||
jclass,
|
||||
jlong j_rtp_sender_pointer) {
|
||||
return JavaStringFromStdString(
|
||||
jni, reinterpret_cast<webrtc::RtpSenderInterface*>(j_rtp_sender_pointer)
|
||||
->id());
|
||||
jni, reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)->id());
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -18,7 +18,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/pc/mediaconstraints_jni.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Adapter for a Java StatsObserver presenting a C++
|
||||
// CreateSessionDescriptionObserver or SetSessionDescriptionObserver and
|
||||
@ -44,7 +45,7 @@ class SdpObserverJni : public T {
|
||||
}
|
||||
|
||||
// Can't mark override because of templating.
|
||||
virtual void OnSuccess(webrtc::SessionDescriptionInterface* desc) {
|
||||
virtual void OnSuccess(SessionDescriptionInterface* desc) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jmethodID m = GetMethodID(jni(), *j_observer_class_, "onCreateSuccess",
|
||||
"(Lorg/webrtc/SessionDescription;)V");
|
||||
@ -76,7 +77,7 @@ class SdpObserverJni : public T {
|
||||
};
|
||||
|
||||
class CreateSdpObserverJni
|
||||
: public SdpObserverJni<webrtc::CreateSessionDescriptionObserver> {
|
||||
: public SdpObserverJni<CreateSessionDescriptionObserver> {
|
||||
public:
|
||||
CreateSdpObserverJni(JNIEnv* jni,
|
||||
jobject j_observer,
|
||||
@ -89,8 +90,7 @@ class CreateSdpObserverJni
|
||||
}
|
||||
};
|
||||
|
||||
class SetSdpObserverJni
|
||||
: public SdpObserverJni<webrtc::SetSessionDescriptionObserver> {
|
||||
class SetSdpObserverJni : public SdpObserverJni<SetSessionDescriptionObserver> {
|
||||
public:
|
||||
SetSdpObserverJni(JNIEnv* jni,
|
||||
jobject j_observer,
|
||||
@ -103,6 +103,7 @@ class SetSdpObserverJni
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_SDPOBSERVER_JNI_H_
|
||||
|
||||
@ -12,7 +12,8 @@
|
||||
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Convenience, used since callbacks occur on the signaling thread, which may
|
||||
// be a non-Java thread.
|
||||
@ -35,7 +36,7 @@ StatsObserverJni::StatsObserverJni(JNIEnv* jni, jobject j_observer)
|
||||
"<init>",
|
||||
"(Ljava/lang/String;Ljava/lang/String;)V")) {}
|
||||
|
||||
void StatsObserverJni::OnComplete(const webrtc::StatsReports& reports) {
|
||||
void StatsObserverJni::OnComplete(const StatsReports& reports) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
jobjectArray j_reports = ReportsToJava(jni(), reports);
|
||||
jmethodID m = GetMethodID(jni(), *j_observer_class_, "onComplete",
|
||||
@ -44,9 +45,8 @@ void StatsObserverJni::OnComplete(const webrtc::StatsReports& reports) {
|
||||
CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
|
||||
}
|
||||
|
||||
jobjectArray StatsObserverJni::ReportsToJava(
|
||||
JNIEnv* jni,
|
||||
const webrtc::StatsReports& reports) {
|
||||
jobjectArray StatsObserverJni::ReportsToJava(JNIEnv* jni,
|
||||
const StatsReports& reports) {
|
||||
jobjectArray reports_array =
|
||||
jni->NewObjectArray(reports.size(), *j_stats_report_class_, NULL);
|
||||
int i = 0;
|
||||
@ -63,9 +63,8 @@ jobjectArray StatsObserverJni::ReportsToJava(
|
||||
return reports_array;
|
||||
}
|
||||
|
||||
jobjectArray StatsObserverJni::ValuesToJava(
|
||||
JNIEnv* jni,
|
||||
const webrtc::StatsReport::Values& values) {
|
||||
jobjectArray StatsObserverJni::ValuesToJava(JNIEnv* jni,
|
||||
const StatsReport::Values& values) {
|
||||
jobjectArray j_values =
|
||||
jni->NewObjectArray(values.size(), *j_value_class_, NULL);
|
||||
int i = 0;
|
||||
@ -82,4 +81,5 @@ jobjectArray StatsObserverJni::ValuesToJava(
|
||||
return j_values;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,21 +14,21 @@
|
||||
#include "webrtc/api/peerconnectioninterface.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Adapter for a Java StatsObserver presenting a C++ webrtc::StatsObserver and
|
||||
// Adapter for a Java StatsObserver presenting a C++ StatsObserver and
|
||||
// dispatching the callback from C++ back to Java.
|
||||
class StatsObserverJni : public webrtc::StatsObserver {
|
||||
class StatsObserverJni : public StatsObserver {
|
||||
public:
|
||||
StatsObserverJni(JNIEnv* jni, jobject j_observer);
|
||||
|
||||
void OnComplete(const webrtc::StatsReports& reports) override;
|
||||
void OnComplete(const StatsReports& reports) override;
|
||||
|
||||
private:
|
||||
jobjectArray ReportsToJava(JNIEnv* jni, const webrtc::StatsReports& reports);
|
||||
jobjectArray ReportsToJava(JNIEnv* jni, const StatsReports& reports);
|
||||
|
||||
jobjectArray ValuesToJava(JNIEnv* jni,
|
||||
const webrtc::StatsReport::Values& values);
|
||||
jobjectArray ValuesToJava(JNIEnv* jni, const StatsReport::Values& values);
|
||||
|
||||
const ScopedGlobalRef<jobject> j_observer_global_;
|
||||
const ScopedGlobalRef<jclass> j_observer_class_;
|
||||
@ -38,6 +38,7 @@ class StatsObserverJni : public webrtc::StatsObserver {
|
||||
const jmethodID j_value_ctor_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_STATSOBSERVER_JNI_H_
|
||||
|
||||
@ -22,7 +22,8 @@
|
||||
#include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h"
|
||||
#include "webrtc/sdk/android/src/jni/videodecoderfactorywrapper.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// TODO(sakal): Remove this once MediaCodecVideoDecoder/Encoder are no longer
|
||||
// used and all applications inject their own codecs.
|
||||
@ -67,13 +68,13 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
OwnedFactoryAndThreads* factory =
|
||||
reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
|
||||
|
||||
rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> source(
|
||||
new rtc::RefCountedObject<webrtc::AndroidVideoTrackSource>(
|
||||
rtc::scoped_refptr<AndroidVideoTrackSource> source(
|
||||
new rtc::RefCountedObject<AndroidVideoTrackSource>(
|
||||
factory->signaling_thread(), jni, j_surface_texture_helper,
|
||||
is_screencast));
|
||||
rtc::scoped_refptr<webrtc::VideoTrackSourceProxy> proxy_source =
|
||||
webrtc::VideoTrackSourceProxy::Create(factory->signaling_thread(),
|
||||
factory->worker_thread(), source);
|
||||
rtc::scoped_refptr<VideoTrackSourceProxy> proxy_source =
|
||||
VideoTrackSourceProxy::Create(factory->signaling_thread(),
|
||||
factory->worker_thread(), source);
|
||||
|
||||
return (jlong)proxy_source.release();
|
||||
}
|
||||
@ -87,10 +88,9 @@ JNI_FUNCTION_DECLARATION(jlong,
|
||||
jlong native_source) {
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
factoryFromJava(native_factory));
|
||||
rtc::scoped_refptr<webrtc::VideoTrackInterface> track(
|
||||
factory->CreateVideoTrack(
|
||||
JavaToStdString(jni, id),
|
||||
reinterpret_cast<webrtc::VideoTrackSourceInterface*>(native_source)));
|
||||
rtc::scoped_refptr<VideoTrackInterface> track(factory->CreateVideoTrack(
|
||||
JavaToStdString(jni, id),
|
||||
reinterpret_cast<VideoTrackSourceInterface*>(native_source)));
|
||||
return (jlong)track.release();
|
||||
}
|
||||
|
||||
@ -126,4 +126,5 @@ JNI_FUNCTION_DECLARATION(
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -20,7 +20,8 @@ class WebRtcVideoEncoderFactory;
|
||||
class WebRtcVideoDecoderFactory;
|
||||
} // namespace cricket
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
class SurfaceTextureHelper;
|
||||
|
||||
@ -35,6 +36,7 @@ cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(
|
||||
jobject GetJavaSurfaceTextureHelper(
|
||||
const rtc::scoped_refptr<SurfaceTextureHelper>& surface_texture_helper);
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_PC_VIDEO_JNI_H_
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
#include "webrtc/rtc_base/logging.h"
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
rtc::scoped_refptr<SurfaceTextureHelper> SurfaceTextureHelper::create(
|
||||
JNIEnv* jni,
|
||||
@ -71,12 +72,14 @@ void SurfaceTextureHelper::ReturnTextureFrame() const {
|
||||
jni) << "error during SurfaceTextureHelper.returnTextureFrame";
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<webrtc::VideoFrameBuffer>
|
||||
SurfaceTextureHelper::CreateTextureFrame(int width, int height,
|
||||
rtc::scoped_refptr<VideoFrameBuffer> SurfaceTextureHelper::CreateTextureFrame(
|
||||
int width,
|
||||
int height,
|
||||
const NativeHandleImpl& native_handle) {
|
||||
return new rtc::RefCountedObject<AndroidTextureBuffer>(
|
||||
width, height, native_handle, *j_surface_texture_helper_,
|
||||
rtc::Bind(&SurfaceTextureHelper::ReturnTextureFrame, this));
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -19,10 +19,11 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Helper class to create and synchronize access to an Android SurfaceTexture.
|
||||
// It is used for creating webrtc::VideoFrameBuffers from a SurfaceTexture when
|
||||
// It is used for creating VideoFrameBuffers from a SurfaceTexture when
|
||||
// the SurfaceTexture has been updated.
|
||||
// When the VideoFrameBuffer is released, this class returns the buffer to the
|
||||
// java SurfaceTextureHelper so it can be updated safely. The VideoFrameBuffer
|
||||
@ -46,7 +47,7 @@ class SurfaceTextureHelper : public rtc::RefCountInterface {
|
||||
|
||||
jobject GetJavaSurfaceTextureHelper() const;
|
||||
|
||||
rtc::scoped_refptr<webrtc::VideoFrameBuffer> CreateTextureFrame(
|
||||
rtc::scoped_refptr<VideoFrameBuffer> CreateTextureFrame(
|
||||
int width,
|
||||
int height,
|
||||
const NativeHandleImpl& native_handle);
|
||||
@ -63,6 +64,7 @@ class SurfaceTextureHelper : public rtc::RefCountInterface {
|
||||
const jmethodID j_return_texture_method_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_SURFACETEXTUREHELPER_JNI_H_
|
||||
|
||||
@ -16,12 +16,12 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer
|
||||
// instance.
|
||||
class JavaVideoRendererWrapper
|
||||
: public rtc::VideoSinkInterface<webrtc::VideoFrame> {
|
||||
class JavaVideoRendererWrapper : public rtc::VideoSinkInterface<VideoFrame> {
|
||||
public:
|
||||
JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks)
|
||||
: j_callbacks_(jni, j_callbacks),
|
||||
@ -44,12 +44,12 @@ class JavaVideoRendererWrapper
|
||||
|
||||
virtual ~JavaVideoRendererWrapper() {}
|
||||
|
||||
void OnFrame(const webrtc::VideoFrame& video_frame) override {
|
||||
void OnFrame(const VideoFrame& video_frame) override {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
|
||||
jobject j_frame;
|
||||
if (video_frame.video_frame_buffer()->type() ==
|
||||
webrtc::VideoFrameBuffer::Type::kNative) {
|
||||
VideoFrameBuffer::Type::kNative) {
|
||||
AndroidVideoFrameBuffer* android_buffer =
|
||||
static_cast<AndroidVideoFrameBuffer*>(
|
||||
video_frame.video_frame_buffer().get());
|
||||
@ -77,15 +77,15 @@ class JavaVideoRendererWrapper
|
||||
// Make a shallow copy of |frame| to be used with Java. The callee has
|
||||
// ownership of the frame, and the frame should be released with
|
||||
// VideoRenderer.releaseNativeFrame().
|
||||
static jlong javaShallowCopy(const webrtc::VideoFrame* frame) {
|
||||
return jlongFromPointer(new webrtc::VideoFrame(*frame));
|
||||
static jlong javaShallowCopy(const VideoFrame* frame) {
|
||||
return jlongFromPointer(new VideoFrame(*frame));
|
||||
}
|
||||
|
||||
// Return a VideoRenderer.I420Frame referring to the data in |frame|.
|
||||
jobject ToJavaI420Frame(const webrtc::VideoFrame* frame) {
|
||||
jobject ToJavaI420Frame(const VideoFrame* frame) {
|
||||
jintArray strides = jni()->NewIntArray(3);
|
||||
jint* strides_array = jni()->GetIntArrayElements(strides, NULL);
|
||||
rtc::scoped_refptr<webrtc::I420BufferInterface> i420_buffer =
|
||||
rtc::scoped_refptr<I420BufferInterface> i420_buffer =
|
||||
frame->video_frame_buffer()->ToI420();
|
||||
strides_array[0] = i420_buffer->StrideY();
|
||||
strides_array[1] = i420_buffer->StrideU();
|
||||
@ -113,7 +113,7 @@ class JavaVideoRendererWrapper
|
||||
}
|
||||
|
||||
// Return a VideoRenderer.I420Frame referring texture object in |frame|.
|
||||
jobject ToJavaTextureFrame(const webrtc::VideoFrame* frame) {
|
||||
jobject ToJavaTextureFrame(const VideoFrame* frame) {
|
||||
NativeHandleImpl handle =
|
||||
static_cast<AndroidTextureBuffer*>(frame->video_frame_buffer().get())
|
||||
->native_handle_impl();
|
||||
@ -148,7 +148,7 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_frame_ptr) {
|
||||
delete reinterpret_cast<const webrtc::VideoFrame*>(j_frame_ptr);
|
||||
delete reinterpret_cast<const VideoFrame*>(j_frame_ptr);
|
||||
}
|
||||
|
||||
JNI_FUNCTION_DECLARATION(jlong,
|
||||
@ -194,4 +194,5 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -15,7 +15,8 @@
|
||||
#include "webrtc/rtc_base/logging.h"
|
||||
#include "webrtc/sdk/android/src/jni/videodecoderwrapper.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
VideoDecoderFactoryWrapper::VideoDecoderFactoryWrapper(JNIEnv* jni,
|
||||
jobject decoder_factory)
|
||||
@ -26,20 +27,20 @@ VideoDecoderFactoryWrapper::VideoDecoderFactoryWrapper(JNIEnv* jni,
|
||||
"(Ljava/lang/String;)Lorg/webrtc/VideoDecoder;");
|
||||
}
|
||||
|
||||
webrtc::VideoDecoder* VideoDecoderFactoryWrapper::CreateVideoDecoder(
|
||||
webrtc::VideoCodecType type) {
|
||||
VideoDecoder* VideoDecoderFactoryWrapper::CreateVideoDecoder(
|
||||
VideoCodecType type) {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
const char* type_payload = webrtc::CodecTypeToPayloadString(type);
|
||||
const char* type_payload = CodecTypeToPayloadString(type);
|
||||
jstring name = jni->NewStringUTF(type_payload);
|
||||
jobject decoder =
|
||||
jni->CallObjectMethod(*decoder_factory_, create_decoder_method_, name);
|
||||
return decoder != nullptr ? new VideoDecoderWrapper(jni, decoder) : nullptr;
|
||||
}
|
||||
|
||||
void VideoDecoderFactoryWrapper::DestroyVideoDecoder(
|
||||
webrtc::VideoDecoder* decoder) {
|
||||
void VideoDecoderFactoryWrapper::DestroyVideoDecoder(VideoDecoder* decoder) {
|
||||
delete decoder;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Wrapper for Java VideoDecoderFactory class. Delegates method calls through
|
||||
// JNI and wraps the decoder inside VideoDecoderWrapper.
|
||||
@ -26,15 +27,15 @@ class VideoDecoderFactoryWrapper : public cricket::WebRtcVideoDecoderFactory {
|
||||
|
||||
// Caller takes the ownership of the returned object and it should be released
|
||||
// by calling DestroyVideoDecoder().
|
||||
webrtc::VideoDecoder* CreateVideoDecoder(
|
||||
webrtc::VideoCodecType type) override;
|
||||
void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override;
|
||||
VideoDecoder* CreateVideoDecoder(VideoCodecType type) override;
|
||||
void DestroyVideoDecoder(VideoDecoder* decoder) override;
|
||||
|
||||
private:
|
||||
const ScopedGlobalRef<jobject> decoder_factory_;
|
||||
jmethodID create_decoder_method_;
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_VIDEODECODERFACTORYWRAPPER_H_
|
||||
|
||||
@ -17,7 +17,8 @@
|
||||
#include "webrtc/rtc_base/logging.h"
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
VideoDecoderWrapper::VideoDecoderWrapper(JNIEnv* jni, jobject decoder)
|
||||
: android_video_buffer_factory_(jni),
|
||||
@ -76,9 +77,8 @@ VideoDecoderWrapper::VideoDecoderWrapper(JNIEnv* jni, jobject decoder)
|
||||
qp_parsing_enabled_ = true;
|
||||
}
|
||||
|
||||
int32_t VideoDecoderWrapper::InitDecode(
|
||||
const webrtc::VideoCodec* codec_settings,
|
||||
int32_t number_of_cores) {
|
||||
int32_t VideoDecoderWrapper::InitDecode(const VideoCodec* codec_settings,
|
||||
int32_t number_of_cores) {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
|
||||
@ -113,10 +113,10 @@ int32_t VideoDecoderWrapper::InitDecodeInternal(JNIEnv* jni) {
|
||||
}
|
||||
|
||||
int32_t VideoDecoderWrapper::Decode(
|
||||
const webrtc::EncodedImage& input_image,
|
||||
const EncodedImage& input_image,
|
||||
bool missing_frames,
|
||||
const webrtc::RTPFragmentationHeader* fragmentation,
|
||||
const webrtc::CodecSpecificInfo* codec_specific_info,
|
||||
const RTPFragmentationHeader* fragmentation,
|
||||
const CodecSpecificInfo* codec_specific_info,
|
||||
int64_t render_time_ms) {
|
||||
if (!initialized_) {
|
||||
// Most likely initializing the codec failed.
|
||||
@ -141,7 +141,7 @@ int32_t VideoDecoderWrapper::Decode(
|
||||
}
|
||||
|
||||
int32_t VideoDecoderWrapper::RegisterDecodeCompleteCallback(
|
||||
webrtc::DecodedImageCallback* callback) {
|
||||
DecodedImageCallback* callback) {
|
||||
callback_ = callback;
|
||||
return WEBRTC_VIDEO_CODEC_OK;
|
||||
}
|
||||
@ -188,7 +188,7 @@ void VideoDecoderWrapper::OnDecodedFrame(JNIEnv* jni,
|
||||
// find a matching timestamp.
|
||||
} while (frame_extra_info.capture_time_ms != capture_time_ms);
|
||||
|
||||
webrtc::VideoFrame frame = android_video_buffer_factory_.CreateFrame(
|
||||
VideoFrame frame = android_video_buffer_factory_.CreateFrame(
|
||||
jni, jframe, frame_extra_info.timestamp_rtp);
|
||||
|
||||
rtc::Optional<int32_t> decoding_time_ms;
|
||||
@ -214,17 +214,17 @@ void VideoDecoderWrapper::OnDecodedFrame(JNIEnv* jni,
|
||||
|
||||
jobject VideoDecoderWrapper::ConvertEncodedImageToJavaEncodedImage(
|
||||
JNIEnv* jni,
|
||||
const webrtc::EncodedImage& image) {
|
||||
const EncodedImage& image) {
|
||||
jobject buffer = jni->NewDirectByteBuffer(image._buffer, image._length);
|
||||
jfieldID frame_type_field;
|
||||
switch (image._frameType) {
|
||||
case webrtc::kEmptyFrame:
|
||||
case kEmptyFrame:
|
||||
frame_type_field = empty_frame_field_;
|
||||
break;
|
||||
case webrtc::kVideoFrameKey:
|
||||
case kVideoFrameKey:
|
||||
frame_type_field = video_frame_key_field_;
|
||||
break;
|
||||
case webrtc::kVideoFrameDelta:
|
||||
case kVideoFrameDelta:
|
||||
frame_type_field = video_frame_delta_field_;
|
||||
break;
|
||||
default:
|
||||
@ -261,30 +261,28 @@ int32_t VideoDecoderWrapper::HandleReturnCode(JNIEnv* jni, jobject code) {
|
||||
}
|
||||
|
||||
rtc::Optional<uint8_t> VideoDecoderWrapper::ParseQP(
|
||||
const webrtc::EncodedImage& input_image) {
|
||||
const EncodedImage& input_image) {
|
||||
if (input_image.qp_ != -1) {
|
||||
return rtc::Optional<uint8_t>(input_image.qp_);
|
||||
}
|
||||
|
||||
rtc::Optional<uint8_t> qp;
|
||||
switch (codec_settings_.codecType) {
|
||||
case webrtc::kVideoCodecVP8: {
|
||||
case kVideoCodecVP8: {
|
||||
int qp_int;
|
||||
if (webrtc::vp8::GetQp(input_image._buffer, input_image._length,
|
||||
&qp_int)) {
|
||||
if (vp8::GetQp(input_image._buffer, input_image._length, &qp_int)) {
|
||||
qp = rtc::Optional<uint8_t>(qp_int);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case webrtc::kVideoCodecVP9: {
|
||||
case kVideoCodecVP9: {
|
||||
int qp_int;
|
||||
if (webrtc::vp9::GetQp(input_image._buffer, input_image._length,
|
||||
&qp_int)) {
|
||||
if (vp9::GetQp(input_image._buffer, input_image._length, &qp_int)) {
|
||||
qp = rtc::Optional<uint8_t>(qp_int);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case webrtc::kVideoCodecH264: {
|
||||
case kVideoCodecH264: {
|
||||
h264_bitstream_parser_.ParseBitstream(input_image._buffer,
|
||||
input_image._length);
|
||||
int qp_int;
|
||||
@ -312,4 +310,5 @@ JNI_FUNCTION_DECLARATION(void,
|
||||
native_decoder->OnDecodedFrame(jni, jframe, jdecode_time_ms, jqp);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -19,26 +19,27 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Wraps a Java decoder and delegates all calls to it. Passes
|
||||
// VideoDecoderWrapperCallback to the decoder on InitDecode. Wraps the received
|
||||
// frames to AndroidVideoBuffer.
|
||||
class VideoDecoderWrapper : public webrtc::VideoDecoder {
|
||||
class VideoDecoderWrapper : public VideoDecoder {
|
||||
public:
|
||||
VideoDecoderWrapper(JNIEnv* jni, jobject decoder);
|
||||
|
||||
int32_t InitDecode(const webrtc::VideoCodec* codec_settings,
|
||||
int32_t InitDecode(const VideoCodec* codec_settings,
|
||||
int32_t number_of_cores) override;
|
||||
|
||||
int32_t Decode(const webrtc::EncodedImage& input_image,
|
||||
int32_t Decode(const EncodedImage& input_image,
|
||||
bool missing_frames,
|
||||
const webrtc::RTPFragmentationHeader* fragmentation,
|
||||
const webrtc::CodecSpecificInfo* codec_specific_info,
|
||||
const RTPFragmentationHeader* fragmentation,
|
||||
const CodecSpecificInfo* codec_specific_info,
|
||||
int64_t render_time_ms) override;
|
||||
|
||||
int32_t RegisterDecodeCompleteCallback(
|
||||
webrtc::DecodedImageCallback* callback) override;
|
||||
DecodedImageCallback* callback) override;
|
||||
|
||||
int32_t Release() override;
|
||||
|
||||
@ -69,18 +70,18 @@ class VideoDecoderWrapper : public webrtc::VideoDecoder {
|
||||
// status code.
|
||||
int32_t HandleReturnCode(JNIEnv* jni, jobject code);
|
||||
|
||||
rtc::Optional<uint8_t> ParseQP(const webrtc::EncodedImage& input_image);
|
||||
rtc::Optional<uint8_t> ParseQP(const EncodedImage& input_image);
|
||||
|
||||
webrtc::VideoCodec codec_settings_;
|
||||
VideoCodec codec_settings_;
|
||||
int32_t number_of_cores_;
|
||||
|
||||
bool initialized_;
|
||||
AndroidVideoBufferFactory android_video_buffer_factory_;
|
||||
std::deque<FrameExtraInfo> frame_extra_infos_;
|
||||
bool qp_parsing_enabled_;
|
||||
webrtc::H264BitstreamParser h264_bitstream_parser_;
|
||||
H264BitstreamParser h264_bitstream_parser_;
|
||||
|
||||
webrtc::DecodedImageCallback* callback_;
|
||||
DecodedImageCallback* callback_;
|
||||
|
||||
const ScopedGlobalRef<jobject> decoder_;
|
||||
const ScopedGlobalRef<jclass> encoded_image_class_;
|
||||
@ -110,11 +111,11 @@ class VideoDecoderWrapper : public webrtc::VideoDecoder {
|
||||
jmethodID integer_constructor_;
|
||||
jmethodID int_value_method_;
|
||||
|
||||
jobject ConvertEncodedImageToJavaEncodedImage(
|
||||
JNIEnv* jni,
|
||||
const webrtc::EncodedImage& image);
|
||||
jobject ConvertEncodedImageToJavaEncodedImage(JNIEnv* jni,
|
||||
const EncodedImage& image);
|
||||
};
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_VIDEODECODERWRAPPER_H_
|
||||
|
||||
@ -14,7 +14,8 @@
|
||||
#include "webrtc/rtc_base/checks.h"
|
||||
#include "webrtc/rtc_base/logging.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_org_webrtc_VideoFileRenderer_nativeI420Scale(JNIEnv* jni,
|
||||
@ -82,4 +83,5 @@ Java_org_webrtc_VideoFileRenderer_nativeFreeNativeByteBuffer(
|
||||
::operator delete(data);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -14,7 +14,8 @@
|
||||
|
||||
#include "webrtc/rtc_base/checks.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_org_webrtc_VideoFrame_nativeCropAndScaleI420(JNIEnv* jni,
|
||||
@ -59,4 +60,5 @@ Java_org_webrtc_VideoFrame_nativeCropAndScaleI420(JNIEnv* jni,
|
||||
RTC_DCHECK_EQ(ret, 0) << "I420Scale failed";
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -16,17 +16,18 @@
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
namespace {
|
||||
|
||||
class VideoSinkWrapper : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
|
||||
class VideoSinkWrapper : public rtc::VideoSinkInterface<VideoFrame> {
|
||||
public:
|
||||
VideoSinkWrapper(JNIEnv* jni, jobject j_sink);
|
||||
~VideoSinkWrapper() override {}
|
||||
|
||||
private:
|
||||
void OnFrame(const webrtc::VideoFrame& frame) override;
|
||||
void OnFrame(const VideoFrame& frame) override;
|
||||
|
||||
jmethodID j_on_frame_method_;
|
||||
|
||||
@ -41,7 +42,7 @@ VideoSinkWrapper::VideoSinkWrapper(JNIEnv* jni, jobject j_sink)
|
||||
"(Lorg/webrtc/VideoFrame;)V");
|
||||
}
|
||||
|
||||
void VideoSinkWrapper::OnFrame(const webrtc::VideoFrame& frame) {
|
||||
void VideoSinkWrapper::OnFrame(const VideoFrame& frame) {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
jni->CallVoidMethod(*j_sink_, j_on_frame_method_,
|
||||
@ -55,10 +56,9 @@ Java_org_webrtc_VideoTrack_nativeAddSink(JNIEnv* jni,
|
||||
jclass,
|
||||
jlong j_native_track,
|
||||
jlong j_native_sink) {
|
||||
reinterpret_cast<webrtc::VideoTrackInterface*>(j_native_track)
|
||||
reinterpret_cast<VideoTrackInterface*>(j_native_track)
|
||||
->AddOrUpdateSink(
|
||||
reinterpret_cast<rtc::VideoSinkInterface<webrtc::VideoFrame>*>(
|
||||
j_native_sink),
|
||||
reinterpret_cast<rtc::VideoSinkInterface<VideoFrame>*>(j_native_sink),
|
||||
rtc::VideoSinkWants());
|
||||
}
|
||||
|
||||
@ -67,10 +67,9 @@ 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_native_sink));
|
||||
reinterpret_cast<VideoTrackInterface*>(j_native_track)
|
||||
->RemoveSink(reinterpret_cast<rtc::VideoSinkInterface<VideoFrame>*>(
|
||||
j_native_sink));
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT jlong JNICALL
|
||||
@ -82,8 +81,8 @@ 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);
|
||||
delete reinterpret_cast<rtc::VideoSinkInterface<VideoFrame>*>(j_native_sink);
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -13,12 +13,13 @@
|
||||
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
||||
#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// TODO(magjed): Write a test for this function.
|
||||
jobject WrapI420Buffer(
|
||||
JNIEnv* jni,
|
||||
const rtc::scoped_refptr<webrtc::I420BufferInterface>& i420_buffer) {
|
||||
const rtc::scoped_refptr<I420BufferInterface>& i420_buffer) {
|
||||
jclass j_wrapped_native_i420_buffer_class =
|
||||
FindClass(jni, "org/webrtc/WrappedNativeI420Buffer");
|
||||
jmethodID j_wrapped_native_i420_buffer_ctor_id =
|
||||
@ -46,4 +47,5 @@ jobject WrapI420Buffer(
|
||||
return j_wrapped_native_i420_buffer;
|
||||
}
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -15,14 +15,16 @@
|
||||
|
||||
#include "webrtc/api/video/video_frame_buffer.h"
|
||||
|
||||
namespace webrtc_jni {
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// This function wraps the C++ I420 buffer and returns a Java
|
||||
// VideoFrame.I420Buffer as a jobject.
|
||||
jobject WrapI420Buffer(
|
||||
JNIEnv* jni,
|
||||
const rtc::scoped_refptr<webrtc::I420BufferInterface>& i420_buffer);
|
||||
const rtc::scoped_refptr<I420BufferInterface>& i420_buffer);
|
||||
|
||||
} // namespace webrtc_jni
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_SDK_ANDROID_SRC_JNI_WRAPPED_NATIVE_I420_BUFFER_H_
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user