In Android encoders, cache EncoderInfo in InitEncode.

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 <sakal@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25569}
This commit is contained in:
Erik Språng
2018-11-08 16:48:24 +01:00
committed by Commit Bot
parent 260770c28c
commit 6528d8a954
3 changed files with 14 additions and 17 deletions

View File

@ -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) {

View File

@ -32,8 +32,6 @@ namespace jni {
VideoEncoderWrapper::VideoEncoderWrapper(JNIEnv* jni,
const JavaRef<jobject>& 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<jobject> j_scaling_settings =
Java_VideoEncoder_getScalingSettings(jni, encoder_);
bool isOn =

View File

@ -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<jobject> encoder_;
const ScopedJavaGlobalRef<jclass> int_array_class_;
std::string implementation_name_;
rtc::TaskQueue* encoder_queue_;
std::deque<FrameExtraInfo> 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.