Provide Environment for AudioEncoderOpus in tests when created using the trait

To allow delete old signature of the AudioEncoderOpus::MakeAudioEncoder function and thus guarantee Opus AudioEncoder always has an Environment

Bug: webrtc:343086059
Change-Id: Ib660678aeb5a549dddd1dffa3d8c28b2ec6b9d0b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/356981
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42690}
This commit is contained in:
Danil Chapovalov 2024-07-29 17:59:19 +02:00 committed by WebRTC LUCI CQ
parent dfa7b2b425
commit 1932b44aa2
9 changed files with 61 additions and 28 deletions

View File

@ -1110,6 +1110,7 @@ if (rtc_include_tests) {
":neteq_test_support",
":neteq_test_tools",
"../../api/audio_codecs/opus:audio_encoder_opus",
"../../api/environment:environment_factory",
"../../api/test/metrics:global_metrics_logger_and_exporter",
"../../api/test/metrics:metric",
"../../rtc_base:macromagic",
@ -1200,6 +1201,7 @@ if (rtc_include_tests) {
":neteq_tools",
"../../api/audio_codecs:audio_codecs_api",
"../../api/audio_codecs/opus:audio_encoder_opus",
"../../api/environment:environment_factory",
"../../common_audio",
"../../rtc_base/system:arch",
"../../test:fileutils",
@ -1398,6 +1400,7 @@ if (rtc_include_tests) {
"../../api/audio_codecs/g722:audio_encoder_g722",
"../../api/audio_codecs/ilbc:audio_encoder_ilbc",
"../../api/audio_codecs/opus:audio_encoder_opus",
"../../api/environment:environment_factory",
"../../rtc_base:safe_conversions",
"//third_party/abseil-cpp/absl/flags:flag",
"//third_party/abseil-cpp/absl/flags:parse",

View File

@ -940,7 +940,9 @@ TEST_F(AcmSenderBitExactnessNewApi, OpusFromFormat_stereo_20ms) {
SdpAudioFormat("opus", 48000, 2, {{"stereo", "1"}}));
ASSERT_TRUE(SetUpSender(kTestFileFakeStereo32kHz, 32000));
ASSERT_NO_FATAL_FAILURE(SetUpTestExternalEncoder(
AudioEncoderOpus::MakeAudioEncoder(*config, 120), 120));
AudioEncoderOpus::MakeAudioEncoder(CreateEnvironment(), *config,
{.payload_type = 120}),
120));
Run(audio_checksum, payload_checksum, /*expected_packets=*/50,
/*expected_channels=*/test::AcmReceiveTestOldApi::kStereoOutput);
}
@ -995,7 +997,9 @@ TEST_F(AcmSenderBitExactnessNewApi, OpusFromFormat_stereo_20ms_voip) {
config->application = AudioEncoderOpusConfig::ApplicationMode::kVoip;
ASSERT_TRUE(SetUpSender(kTestFileFakeStereo32kHz, 32000));
ASSERT_NO_FATAL_FAILURE(SetUpTestExternalEncoder(
AudioEncoderOpus::MakeAudioEncoder(*config, 120), 120));
AudioEncoderOpus::MakeAudioEncoder(CreateEnvironment(), *config,
{.payload_type = 120}),
120));
const std::string audio_maybe_sse =
"cb644fc17d9666a0f5986eef24818159"
"|4a74024473c7c729543c2790829b1e42";
@ -1086,8 +1090,10 @@ TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_10kbps) {
const auto config = AudioEncoderOpus::SdpToConfig(
SdpAudioFormat("opus", 48000, 2, {{"maxaveragebitrate", "10000"}}));
ASSERT_TRUE(SetUpSender());
RegisterExternalSendCodec(AudioEncoderOpus::MakeAudioEncoder(*config, 107),
107);
RegisterExternalSendCodec(
AudioEncoderOpus::MakeAudioEncoder(CreateEnvironment(), *config,
{.payload_type = 107}),
107);
RunInner(7000, 12000);
}
@ -1095,8 +1101,10 @@ TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_50kbps) {
const auto config = AudioEncoderOpus::SdpToConfig(
SdpAudioFormat("opus", 48000, 2, {{"maxaveragebitrate", "50000"}}));
ASSERT_TRUE(SetUpSender());
RegisterExternalSendCodec(AudioEncoderOpus::MakeAudioEncoder(*config, 107),
107);
RegisterExternalSendCodec(
AudioEncoderOpus::MakeAudioEncoder(CreateEnvironment(), *config,
{.payload_type = 107}),
107);
RunInner(40000, 60000);
}
@ -1203,8 +1211,10 @@ TEST_F(AcmSetBitRateNewApi, MAYBE_OpusFromFormat_48khz_20ms_100kbps) {
const auto config = AudioEncoderOpus::SdpToConfig(
SdpAudioFormat("opus", 48000, 2, {{"maxaveragebitrate", "100000"}}));
ASSERT_TRUE(SetUpSender());
RegisterExternalSendCodec(AudioEncoderOpus::MakeAudioEncoder(*config, 107),
107);
RegisterExternalSendCodec(
AudioEncoderOpus::MakeAudioEncoder(CreateEnvironment(), *config,
{.payload_type = 107}),
107);
RunInner(80000, 120000);
}

View File

@ -674,8 +674,8 @@ TEST(AudioEncoderOpusTest, TestConfigFromInvalidParams) {
TEST(AudioEncoderOpusTest, GetFrameLenghtRange) {
AudioEncoderOpusConfig config =
CreateConfigWithParameters({{"maxptime", "10"}, {"ptime", "10"}});
std::unique_ptr<AudioEncoder> encoder =
AudioEncoderOpus::MakeAudioEncoder(config, kDefaultOpusPayloadType);
std::unique_ptr<AudioEncoder> encoder = AudioEncoderOpus::MakeAudioEncoder(
CreateEnvironment(), config, {.payload_type = kDefaultOpusPayloadType});
auto ptime = webrtc::TimeDelta::Millis(10);
absl::optional<std::pair<webrtc::TimeDelta, webrtc::TimeDelta>> range = {
{ptime, ptime}};
@ -766,8 +766,8 @@ TEST_P(AudioEncoderOpusTest, OpusFlagDtxAsNonSpeech) {
AudioEncoderOpusConfig config;
config.dtx_enabled = true;
config.sample_rate_hz = sample_rate_hz_;
constexpr int payload_type = 17;
const auto encoder = AudioEncoderOpus::MakeAudioEncoder(config, payload_type);
const auto encoder = AudioEncoderOpus::MakeAudioEncoder(
CreateEnvironment(), config, {.payload_type = 17});
// Open file containing speech and silence.
const std::string kInputFileName =

View File

@ -10,11 +10,13 @@
#include "api/audio_codecs/opus/audio_decoder_opus.h"
#include "api/audio_codecs/opus/audio_encoder_opus.h"
#include "api/environment/environment.h"
#include "api/environment/environment_factory.h"
#include "common_audio/include/audio_util.h"
#include "common_audio/window_generator.h"
#include "modules/audio_coding/codecs/opus/test/lapped_transform.h"
#include "modules/audio_coding/neteq/tools/audio_loop.h"
#include "test/field_trial.h"
#include "test/explicit_key_value_config.h"
#include "test/gtest.h"
#include "test/testsupport/file_utils.h"
@ -103,8 +105,9 @@ float EncodedPowerRatio(AudioEncoder* encoder,
// TODO(ivoc): Remove this test, WebRTC-AdjustOpusBandwidth is obsolete.
TEST(BandwidthAdaptationTest, BandwidthAdaptationTest) {
test::ScopedFieldTrials override_field_trials(
"WebRTC-AdjustOpusBandwidth/Enabled/");
const Environment env =
CreateEnvironment(std::make_unique<test::ExplicitKeyValueConfig>(
"WebRTC-AdjustOpusBandwidth/Enabled/"));
constexpr float kMaxNarrowbandRatio = 0.0035f;
constexpr float kMinWidebandRatio = 0.01f;
@ -113,8 +116,8 @@ TEST(BandwidthAdaptationTest, BandwidthAdaptationTest) {
AudioEncoderOpusConfig enc_config;
enc_config.bitrate_bps = absl::optional<int>(7999);
enc_config.num_channels = kNumChannels;
constexpr int payload_type = 17;
auto encoder = AudioEncoderOpus::MakeAudioEncoder(enc_config, payload_type);
auto encoder =
AudioEncoderOpus::MakeAudioEncoder(env, enc_config, {.payload_type = 17});
// Create decoder.
AudioDecoderOpus::Config dec_config;

View File

@ -9,6 +9,7 @@
*/
#include "api/audio_codecs/opus/audio_encoder_opus.h"
#include "api/environment/environment_factory.h"
#include "api/test/metrics/global_metrics_logger_and_exporter.h"
#include "api/test/metrics/metric.h"
#include "modules/audio_coding/neteq/tools/audio_loop.h"
@ -23,10 +24,11 @@ using ::webrtc::test::GetGlobalMetricsLogger;
using ::webrtc::test::ImprovementDirection;
using ::webrtc::test::Unit;
int64_t RunComplexityTest(const AudioEncoderOpusConfig& config) {
int64_t RunComplexityTest(const Environment& env,
const AudioEncoderOpusConfig& config) {
// Create encoder.
constexpr int payload_type = 17;
const auto encoder = AudioEncoderOpus::MakeAudioEncoder(config, payload_type);
const auto encoder =
AudioEncoderOpus::MakeAudioEncoder(env, config, {.payload_type = 17});
// Open speech file.
const std::string kInputFileName =
webrtc::test::ResourcePath("audio_coding/speech_mono_32_48kHz", "pcm");
@ -63,16 +65,17 @@ int64_t RunComplexityTest(const AudioEncoderOpusConfig& config) {
// be higher, since we have explicitly asked for a higher complexity setting at
// the lower rate.
TEST(AudioEncoderOpusComplexityAdaptationTest, Adaptation_On) {
const Environment env = CreateEnvironment();
// Create config.
AudioEncoderOpusConfig config;
// The limit -- including the hysteresis window -- at which the complexity
// shuold be increased.
config.bitrate_bps = 11000 - 1;
config.low_rate_complexity = 9;
int64_t runtime_10999bps = RunComplexityTest(config);
int64_t runtime_10999bps = RunComplexityTest(env, config);
config.bitrate_bps = 15500;
int64_t runtime_15500bps = RunComplexityTest(config);
int64_t runtime_15500bps = RunComplexityTest(env, config);
GetGlobalMetricsLogger()->LogSingleValueMetric(
"opus_encoding_complexity_ratio", "adaptation_on",
@ -84,16 +87,17 @@ TEST(AudioEncoderOpusComplexityAdaptationTest, Adaptation_On) {
// adaptation enabled (neither on desktop, nor on mobile). The expectation is
// that the resulting ratio is less than 100% at all times.
TEST(AudioEncoderOpusComplexityAdaptationTest, Adaptation_Off) {
const Environment env = CreateEnvironment();
// Create config.
AudioEncoderOpusConfig config;
// The limit -- including the hysteresis window -- at which the complexity
// shuold be increased (but not in this test since complexity adaptation is
// disabled).
config.bitrate_bps = 11000 - 1;
int64_t runtime_10999bps = RunComplexityTest(config);
int64_t runtime_10999bps = RunComplexityTest(env, config);
config.bitrate_bps = 15500;
int64_t runtime_15500bps = RunComplexityTest(config);
int64_t runtime_15500bps = RunComplexityTest(env, config);
GetGlobalMetricsLogger()->LogSingleValueMetric(
"opus_encoding_complexity_ratio", "adaptation_off",

View File

@ -16,6 +16,7 @@
#include <vector>
#include "api/audio_codecs/opus/audio_encoder_opus.h"
#include "api/environment/environment_factory.h"
#include "modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
#include "modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
#include "modules/audio_coding/codecs/g722/audio_decoder_g722.h"
@ -392,7 +393,8 @@ class AudioDecoderOpusTest
config.application = opus_num_channels_ == 1
? AudioEncoderOpusConfig::ApplicationMode::kVoip
: AudioEncoderOpusConfig::ApplicationMode::kAudio;
audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(
CreateEnvironment(), config, {.payload_type = payload_type_});
audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
}
const int opus_sample_rate_hz_{std::get<0>(GetParam())};

View File

@ -31,6 +31,7 @@
#include "api/audio_codecs/g722/audio_encoder_g722.h"
#include "api/audio_codecs/ilbc/audio_encoder_ilbc.h"
#include "api/audio_codecs/opus/audio_encoder_opus.h"
#include "api/environment/environment_factory.h"
#include "modules/audio_coding/codecs/cng/audio_encoder_cng.h"
#include "modules/audio_coding/include/audio_coding_module.h"
#include "modules/audio_coding/neteq/tools/input_audio_file.h"
@ -206,7 +207,8 @@ std::unique_ptr<AudioEncoder> CreateEncoder(CodecType codec_type,
config.dtx_enabled = absl::GetFlag(FLAGS_dtx);
config.fec_enabled = absl::GetFlag(FLAGS_fec);
RTC_CHECK(config.IsOk());
return AudioEncoderOpus::MakeAudioEncoder(config, payload_type);
return AudioEncoderOpus::MakeAudioEncoder(CreateEnvironment(), config,
{.payload_type = payload_type});
}
case CodecType::kPcmU:

View File

@ -383,6 +383,8 @@ webrtc_fuzzer_test("audio_encoder_opus_fuzzer") {
deps = [
":audio_encoder_fuzzer",
"../../api/audio_codecs/opus:audio_encoder_opus",
"../../api/environment",
"../../api/environment:environment_factory",
"../../rtc_base:checks",
]
}

View File

@ -9,19 +9,26 @@
*/
#include "api/audio_codecs/opus/audio_encoder_opus.h"
#include "api/environment/environment.h"
#include "api/environment/environment_factory.h"
#include "rtc_base/checks.h"
#include "test/fuzzers/audio_encoder_fuzzer.h"
namespace webrtc {
void FuzzOneInput(const uint8_t* data, size_t size) {
// Create Environment once because creating it for each input noticably
// reduces the speed of the fuzzer.
static const Environment* const env = new Environment(CreateEnvironment());
AudioEncoderOpus::Config config;
config.frame_size_ms = 20;
RTC_CHECK(config.IsOk());
constexpr int kPayloadType = 100;
FuzzAudioEncoder(
/*data_view=*/{data, size},
/*encoder=*/AudioEncoderOpus::MakeAudioEncoder(config, kPayloadType));
/*encoder=*/AudioEncoderOpus::MakeAudioEncoder(*env, config,
{.payload_type = 100}));
}
} // namespace webrtc