diff --git a/sdk/android/src/jni/video_encoder_wrapper.cc b/sdk/android/src/jni/video_encoder_wrapper.cc index fe7508709f..d292a8553d 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.cc +++ b/sdk/android/src/jni/video_encoder_wrapper.cc @@ -38,10 +38,8 @@ VideoEncoderWrapper::VideoEncoderWrapper(JNIEnv* jni, initialized_ = false; num_resets_ = 0; - // Get bitrate limits in the constructor. This is a static property of the - // encoder and is expected to be available before it is initialized. - encoder_info_.resolution_bitrate_limits = JavaToNativeResolutionBitrateLimits( - jni, Java_VideoEncoder_getResolutionBitrateLimits(jni, encoder_)); + // Fetch and update encoder info. + UpdateEncoderInfo(jni); } VideoEncoderWrapper::~VideoEncoderWrapper() = default; @@ -91,11 +89,9 @@ 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); - encoder_info_.is_hardware_accelerated = IsHardwareVideoEncoder(jni, encoder_); - encoder_info_.has_internal_source = false; + // Some encoder's properties depend on settings and may change after + // initialization. + UpdateEncoderInfo(jni); if (status == WEBRTC_VIDEO_CODEC_OK) { initialized_ = true; @@ -103,6 +99,22 @@ int32_t VideoEncoderWrapper::InitEncodeInternal(JNIEnv* jni) { return status; } +void VideoEncoderWrapper::UpdateEncoderInfo(JNIEnv* jni) { + encoder_info_.supports_native_handle = true; + encoder_info_.has_internal_source = false; + + encoder_info_.implementation_name = JavaToStdString( + jni, Java_VideoEncoder_getImplementationName(jni, encoder_)); + + encoder_info_.is_hardware_accelerated = + Java_VideoEncoder_isHardwareEncoder(jni, encoder_); + + encoder_info_.scaling_settings = GetScalingSettingsInternal(jni); + + encoder_info_.resolution_bitrate_limits = JavaToNativeResolutionBitrateLimits( + jni, Java_VideoEncoder_getResolutionBitrateLimits(jni, encoder_)); +} + int32_t VideoEncoderWrapper::RegisterEncodeCompleteCallback( EncodedImageCallback* callback) { callback_ = callback; @@ -398,11 +410,6 @@ ScopedJavaLocalRef VideoEncoderWrapper::ToJavaBitrateAllocation( return Java_BitrateAllocation_Constructor(jni, j_allocation_array); } -std::string VideoEncoderWrapper::GetImplementationName(JNIEnv* jni) const { - return JavaToStdString( - jni, Java_VideoEncoder_getImplementationName(jni, encoder_)); -} - std::unique_ptr JavaToNativeVideoEncoder( JNIEnv* jni, const JavaRef& j_encoder) { @@ -417,10 +424,6 @@ std::unique_ptr JavaToNativeVideoEncoder( return std::unique_ptr(encoder); } -bool IsHardwareVideoEncoder(JNIEnv* jni, const JavaRef& j_encoder) { - return Java_VideoEncoder_isHardwareEncoder(jni, j_encoder); -} - std::vector JavaToNativeResolutionBitrateLimits( JNIEnv* jni, diff --git a/sdk/android/src/jni/video_encoder_wrapper.h b/sdk/android/src/jni/video_encoder_wrapper.h index ae45004324..2cd77dfae4 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.h +++ b/sdk/android/src/jni/video_encoder_wrapper.h @@ -74,10 +74,9 @@ class VideoEncoderWrapper : public VideoEncoder { ScopedJavaLocalRef ToJavaBitrateAllocation( JNIEnv* jni, const VideoBitrateAllocation& allocation); - std::string GetImplementationName(JNIEnv* jni) const; + void UpdateEncoderInfo(JNIEnv* jni); ScalingSettings GetScalingSettingsInternal(JNIEnv* jni) const; - std::vector GetResolutionBitrateLimits( JNIEnv* jni) const;