diff --git a/api/video_codecs/libaom_av1_encoder_factory.cc b/api/video_codecs/libaom_av1_encoder_factory.cc index 5c950c7a97..87dd5d5685 100644 --- a/api/video_codecs/libaom_av1_encoder_factory.cc +++ b/api/video_codecs/libaom_av1_encoder_factory.cc @@ -97,7 +97,7 @@ class LibaomAv1Encoder : public VideoEncoderInterface { aom_codec_enc_cfg_t cfg_; absl::optional current_content_type_; - absl::optional current_effort_level_; + std::array, kMaxSpatialLayersWtf> current_effort_level_; int max_number_of_threads_; std::array, 8> last_resolution_in_buffer_; }; @@ -266,13 +266,6 @@ bool ValidateEncodeParams( return low <= val && val < high; }; - if (!in_range(kMinEffortLevel, kMaxEffortLevel + 1, - tu_settings.effort_level)) { - RTC_LOG(LS_ERROR) << "Unsupported effort level " - << tu_settings.effort_level; - return false; - } - for (size_t i = 0; i < frame_settings.size(); ++i) { const VideoEncoderInterface::FrameEncodeSettings& settings = frame_settings[i]; @@ -282,6 +275,12 @@ bool ValidateEncodeParams( return false; } + if (!in_range(kMinEffortLevel, kMaxEffortLevel + 1, + settings.effort_level)) { + RTC_LOG(LS_ERROR) << "Unsupported effort level " << settings.effort_level; + return false; + } + if (!in_range(0, kMaxSpatialLayersWtf, settings.spatial_id)) { RTC_LOG(LS_ERROR) << "invalid spatial id " << settings.spatial_id; return false; @@ -637,14 +636,6 @@ void LibaomAv1Encoder::Encode( return; } - if (tu_settings.effort_level != current_effort_level_) { - // For RTC we use speed level 6 to 10, with 8 being the default. Note that - // low effort means higher speed. - SET_OR_DO_ERROR_CALLBACK_AND_RETURN(AOME_SET_CPUUSED, - 8 - tu_settings.effort_level); - current_effort_level_ = tu_settings.effort_level; - } - if (current_content_type_ != tu_settings.content_hint) { if (tu_settings.content_hint == VideoCodecMode::kScreensharing) { // TD: Set speed 11? @@ -738,6 +729,14 @@ void LibaomAv1Encoder::Encode( // TD: What should duration be when Cqp is used? duration = TimeDelta::Millis(1); } + + if (settings.effort_level != current_effort_level_[settings.spatial_id]) { + // For RTC we use speed level 6 to 10, with 8 being the default. Note + // that low effort means higher speed. + SET_OR_DO_ERROR_CALLBACK_AND_RETURN(AOME_SET_CPUUSED, + 8 - settings.effort_level); + current_effort_level_[settings.spatial_id] = settings.effort_level; + } } RTC_LOG(LS_WARNING) diff --git a/api/video_codecs/libaom_av1_encoder_factory_test.cc b/api/video_codecs/libaom_av1_encoder_factory_test.cc index deb03aad62..02be3c2b66 100644 --- a/api/video_codecs/libaom_av1_encoder_factory_test.cc +++ b/api/video_codecs/libaom_av1_encoder_factory_test.cc @@ -178,6 +178,11 @@ class FrameEncoderSettingsBuilder { return *this; } + FrameEncoderSettingsBuilder& Effort(int effort_level) { + frame_encode_settings_.effort_level = effort_level; + return *this; + } + operator VideoEncoderInterface::FrameEncodeSettings&&() { return std::move(frame_encode_settings_); } @@ -661,10 +666,9 @@ TEST(LibaomAv1Encoder, HigherEffortLevelYieldsHigherQualityFrames) { for (int i = effort_range.first; i <= effort_range.second; ++i) { auto enc = LibaomAv1EncoderFactory().CreateEncoder(kCbrEncoderSettings, {}); EncodeResults res; - enc->Encode( - frame_in, - {.presentation_timestamp = Timestamp::Millis(0), .effort_level = i}, - ToVec({Fb().Rate(kCbr).Res(640, 360).Upd(0).Key().Cb(res.Cb())})); + enc->Encode(frame_in, {.presentation_timestamp = Timestamp::Millis(0)}, + ToVec({Fb().Rate(kCbr).Res(640, 360).Upd(0).Key().Effort(i).Cb( + res.Cb())})); double psnr = Psnr(frame_in, dec.Decode(*res.FrameAt(0))); EXPECT_THAT(psnr, Gt(psnr_last)); psnr_last = psnr; diff --git a/api/video_codecs/video_encoder_interface.h b/api/video_codecs/video_encoder_interface.h index de7c118d49..dfac9ef6ed 100644 --- a/api/video_codecs/video_encoder_interface.h +++ b/api/video_codecs/video_encoder_interface.h @@ -40,7 +40,6 @@ class VideoEncoderInterface { struct TemporalUnitSettings { VideoCodecMode content_hint = VideoCodecMode::kRealtimeVideo; Timestamp presentation_timestamp; - int effort_level = 0; }; // Results from calling Encode. Called once for each configured frame. @@ -72,6 +71,7 @@ class VideoEncoderInterface { Resolution resolution; std::vector reference_buffers; absl::optional update_buffer; + int effort_level = 0; EncodeResultCallback result_callback; };