From 6528d8a954abae85ea2dd0cd3adb5fc3471219ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Thu, 8 Nov 2018 16:48:24 +0100 Subject: [PATCH] In Android encoders, cache EncoderInfo in InitEncode. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GetEncoderInfo() is now called every frame, so we should not do expensive parsing or logging in there. Instead, prepare an EncoderInfo instance in InitEncode() and just return that in GetEncoderInfo(). Bug: webrtc:9890 Change-Id: Idc9e79e681c6f7ff4f9b446aa298c156f25bc6f6 Reviewed-on: https://webrtc-review.googlesource.com/c/110161 Reviewed-by: Sami Kalliomäki Commit-Queue: Erik Språng Cr-Commit-Position: refs/heads/master@{#25569} --- sdk/android/src/jni/androidmediaencoder.cc | 11 ++++++----- sdk/android/src/jni/videoencoderwrapper.cc | 15 ++++++--------- sdk/android/src/jni/videoencoderwrapper.h | 5 ++--- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/sdk/android/src/jni/androidmediaencoder.cc b/sdk/android/src/jni/androidmediaencoder.cc index d25b0dbf3b..9072fde5c1 100644 --- a/sdk/android/src/jni/androidmediaencoder.cc +++ b/sdk/android/src/jni/androidmediaencoder.cc @@ -267,6 +267,7 @@ class MediaCodecVideoEncoder : public VideoEncoder { size_t gof_idx_; const bool has_egl_context_; + EncoderInfo encoder_info_; // Temporary fix for VP8. // Sends a key frame if frames are largely spaced apart (possibly @@ -354,6 +355,10 @@ int32_t MediaCodecVideoEncoder::InitEncode(const VideoCodec* codec_settings, ALOGD << "H.264 profile: " << profile_; } + encoder_info_.supports_native_handle = has_egl_context_; + encoder_info_.implementation_name = "MediaCodec"; + encoder_info_.scaling_settings = GetScalingSettingsInternal(); + return InitEncodeInternal( init_width, init_height, codec_settings->startBitrate, codec_settings->maxFramerate, @@ -922,11 +927,7 @@ int32_t MediaCodecVideoEncoder::SetRateAllocation( } VideoEncoder::EncoderInfo MediaCodecVideoEncoder::GetEncoderInfo() const { - EncoderInfo info; - info.supports_native_handle = has_egl_context_; - info.implementation_name = "MediaCodec"; - info.scaling_settings = GetScalingSettingsInternal(); - return info; + return encoder_info_; } bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { diff --git a/sdk/android/src/jni/videoencoderwrapper.cc b/sdk/android/src/jni/videoencoderwrapper.cc index f63785d470..1e4b84eac6 100644 --- a/sdk/android/src/jni/videoencoderwrapper.cc +++ b/sdk/android/src/jni/videoencoderwrapper.cc @@ -32,8 +32,6 @@ namespace jni { VideoEncoderWrapper::VideoEncoderWrapper(JNIEnv* jni, const JavaRef& j_encoder) : encoder_(jni, j_encoder), int_array_class_(GetClass(jni, "[I")) { - implementation_name_ = GetImplementationName(jni); - initialized_ = false; num_resets_ = 0; } @@ -82,6 +80,10 @@ int32_t VideoEncoderWrapper::InitEncodeInternal(JNIEnv* jni) { jni, Java_VideoEncoder_initEncode(jni, encoder_, settings, callback)); RTC_LOG(LS_INFO) << "initEncode: " << status; + encoder_info_.supports_native_handle = true; + encoder_info_.implementation_name = GetImplementationName(jni); + encoder_info_.scaling_settings = GetScalingSettingsInternal(jni); + if (status == WEBRTC_VIDEO_CODEC_OK) { initialized_ = true; } @@ -149,16 +151,11 @@ int32_t VideoEncoderWrapper::SetRateAllocation( } VideoEncoder::EncoderInfo VideoEncoderWrapper::GetEncoderInfo() const { - EncoderInfo info; - info.supports_native_handle = true; - info.implementation_name = implementation_name_; - info.scaling_settings = GetScalingSettingsInternal(); - return info; + return encoder_info_; } VideoEncoderWrapper::ScalingSettings -VideoEncoderWrapper::GetScalingSettingsInternal() const { - JNIEnv* jni = AttachCurrentThreadIfNeeded(); +VideoEncoderWrapper::GetScalingSettingsInternal(JNIEnv* jni) const { ScopedJavaLocalRef j_scaling_settings = Java_VideoEncoder_getScalingSettings(jni, encoder_); bool isOn = diff --git a/sdk/android/src/jni/videoencoderwrapper.h b/sdk/android/src/jni/videoencoderwrapper.h index c35b880c2c..3618f78473 100644 --- a/sdk/android/src/jni/videoencoderwrapper.h +++ b/sdk/android/src/jni/videoencoderwrapper.h @@ -86,13 +86,11 @@ class VideoEncoderWrapper : public VideoEncoder { const VideoBitrateAllocation& allocation); std::string GetImplementationName(JNIEnv* jni) const; - ScalingSettings GetScalingSettingsInternal() const; + ScalingSettings GetScalingSettingsInternal(JNIEnv* jni) const; const ScopedJavaGlobalRef encoder_; const ScopedJavaGlobalRef int_array_class_; - std::string implementation_name_; - rtc::TaskQueue* encoder_queue_; std::deque frame_extra_infos_; EncodedImageCallback* callback_; @@ -100,6 +98,7 @@ class VideoEncoderWrapper : public VideoEncoder { int num_resets_; int number_of_cores_; VideoCodec codec_settings_; + EncoderInfo encoder_info_; H264BitstreamParser h264_bitstream_parser_; // VP9 variables to populate codec specific structure.