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:
@ -267,6 +267,7 @@ class MediaCodecVideoEncoder : public VideoEncoder {
|
|||||||
size_t gof_idx_;
|
size_t gof_idx_;
|
||||||
|
|
||||||
const bool has_egl_context_;
|
const bool has_egl_context_;
|
||||||
|
EncoderInfo encoder_info_;
|
||||||
|
|
||||||
// Temporary fix for VP8.
|
// Temporary fix for VP8.
|
||||||
// Sends a key frame if frames are largely spaced apart (possibly
|
// 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_;
|
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(
|
return InitEncodeInternal(
|
||||||
init_width, init_height, codec_settings->startBitrate,
|
init_width, init_height, codec_settings->startBitrate,
|
||||||
codec_settings->maxFramerate,
|
codec_settings->maxFramerate,
|
||||||
@ -922,11 +927,7 @@ int32_t MediaCodecVideoEncoder::SetRateAllocation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
VideoEncoder::EncoderInfo MediaCodecVideoEncoder::GetEncoderInfo() const {
|
VideoEncoder::EncoderInfo MediaCodecVideoEncoder::GetEncoderInfo() const {
|
||||||
EncoderInfo info;
|
return encoder_info_;
|
||||||
info.supports_native_handle = has_egl_context_;
|
|
||||||
info.implementation_name = "MediaCodec";
|
|
||||||
info.scaling_settings = GetScalingSettingsInternal();
|
|
||||||
return info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
||||||
|
@ -32,8 +32,6 @@ namespace jni {
|
|||||||
VideoEncoderWrapper::VideoEncoderWrapper(JNIEnv* jni,
|
VideoEncoderWrapper::VideoEncoderWrapper(JNIEnv* jni,
|
||||||
const JavaRef<jobject>& j_encoder)
|
const JavaRef<jobject>& j_encoder)
|
||||||
: encoder_(jni, j_encoder), int_array_class_(GetClass(jni, "[I")) {
|
: encoder_(jni, j_encoder), int_array_class_(GetClass(jni, "[I")) {
|
||||||
implementation_name_ = GetImplementationName(jni);
|
|
||||||
|
|
||||||
initialized_ = false;
|
initialized_ = false;
|
||||||
num_resets_ = 0;
|
num_resets_ = 0;
|
||||||
}
|
}
|
||||||
@ -82,6 +80,10 @@ int32_t VideoEncoderWrapper::InitEncodeInternal(JNIEnv* jni) {
|
|||||||
jni, Java_VideoEncoder_initEncode(jni, encoder_, settings, callback));
|
jni, Java_VideoEncoder_initEncode(jni, encoder_, settings, callback));
|
||||||
RTC_LOG(LS_INFO) << "initEncode: " << status;
|
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) {
|
if (status == WEBRTC_VIDEO_CODEC_OK) {
|
||||||
initialized_ = true;
|
initialized_ = true;
|
||||||
}
|
}
|
||||||
@ -149,16 +151,11 @@ int32_t VideoEncoderWrapper::SetRateAllocation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
VideoEncoder::EncoderInfo VideoEncoderWrapper::GetEncoderInfo() const {
|
VideoEncoder::EncoderInfo VideoEncoderWrapper::GetEncoderInfo() const {
|
||||||
EncoderInfo info;
|
return encoder_info_;
|
||||||
info.supports_native_handle = true;
|
|
||||||
info.implementation_name = implementation_name_;
|
|
||||||
info.scaling_settings = GetScalingSettingsInternal();
|
|
||||||
return info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoEncoderWrapper::ScalingSettings
|
VideoEncoderWrapper::ScalingSettings
|
||||||
VideoEncoderWrapper::GetScalingSettingsInternal() const {
|
VideoEncoderWrapper::GetScalingSettingsInternal(JNIEnv* jni) const {
|
||||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
|
||||||
ScopedJavaLocalRef<jobject> j_scaling_settings =
|
ScopedJavaLocalRef<jobject> j_scaling_settings =
|
||||||
Java_VideoEncoder_getScalingSettings(jni, encoder_);
|
Java_VideoEncoder_getScalingSettings(jni, encoder_);
|
||||||
bool isOn =
|
bool isOn =
|
||||||
|
@ -86,13 +86,11 @@ class VideoEncoderWrapper : public VideoEncoder {
|
|||||||
const VideoBitrateAllocation& allocation);
|
const VideoBitrateAllocation& allocation);
|
||||||
std::string GetImplementationName(JNIEnv* jni) const;
|
std::string GetImplementationName(JNIEnv* jni) const;
|
||||||
|
|
||||||
ScalingSettings GetScalingSettingsInternal() const;
|
ScalingSettings GetScalingSettingsInternal(JNIEnv* jni) const;
|
||||||
|
|
||||||
const ScopedJavaGlobalRef<jobject> encoder_;
|
const ScopedJavaGlobalRef<jobject> encoder_;
|
||||||
const ScopedJavaGlobalRef<jclass> int_array_class_;
|
const ScopedJavaGlobalRef<jclass> int_array_class_;
|
||||||
|
|
||||||
std::string implementation_name_;
|
|
||||||
|
|
||||||
rtc::TaskQueue* encoder_queue_;
|
rtc::TaskQueue* encoder_queue_;
|
||||||
std::deque<FrameExtraInfo> frame_extra_infos_;
|
std::deque<FrameExtraInfo> frame_extra_infos_;
|
||||||
EncodedImageCallback* callback_;
|
EncodedImageCallback* callback_;
|
||||||
@ -100,6 +98,7 @@ class VideoEncoderWrapper : public VideoEncoder {
|
|||||||
int num_resets_;
|
int num_resets_;
|
||||||
int number_of_cores_;
|
int number_of_cores_;
|
||||||
VideoCodec codec_settings_;
|
VideoCodec codec_settings_;
|
||||||
|
EncoderInfo encoder_info_;
|
||||||
H264BitstreamParser h264_bitstream_parser_;
|
H264BitstreamParser h264_bitstream_parser_;
|
||||||
|
|
||||||
// VP9 variables to populate codec specific structure.
|
// VP9 variables to populate codec specific structure.
|
||||||
|
Reference in New Issue
Block a user