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:
parent
dfa7b2b425
commit
1932b44aa2
@ -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",
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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())};
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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",
|
||||
]
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user