diff --git a/api/audio_codecs/audio_decoder_factory_template.h b/api/audio_codecs/audio_decoder_factory_template.h index 47f47b5b38..6490f4c2a9 100644 --- a/api/audio_codecs/audio_decoder_factory_template.h +++ b/api/audio_codecs/audio_decoder_factory_template.h @@ -58,11 +58,16 @@ struct Helper { "absl::optional"); return opt_config ? true : Helper::IsSupportedDecoder(format); } + // TODO: bugs.webrtc.org/356878416 - Migrate to `Create` static std::unique_ptr MakeAudioDecoder( const SdpAudioFormat& format, absl::optional codec_pair_id) { auto opt_config = T::SdpToConfig(format); - return opt_config ? T::MakeAudioDecoder(*opt_config, codec_pair_id) + return opt_config ? +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + T::MakeAudioDecoder(*opt_config, codec_pair_id) +#pragma clang diagnostic pop : Helper::MakeAudioDecoder(format, codec_pair_id); } }; diff --git a/api/audio_codecs/opus/BUILD.gn b/api/audio_codecs/opus/BUILD.gn index 2c0dbefc7f..8c673116de 100644 --- a/api/audio_codecs/opus/BUILD.gn +++ b/api/audio_codecs/opus/BUILD.gn @@ -67,6 +67,8 @@ rtc_library("audio_decoder_opus") { "../../../modules/audio_coding:webrtc_opus", "../../../rtc_base:checks", "../../../rtc_base/system:rtc_export", + "../../environment", + "../../transport:field_trial_based_config", "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/types:optional", ] diff --git a/api/audio_codecs/opus/audio_decoder_opus.cc b/api/audio_codecs/opus/audio_decoder_opus.cc index 3c8635d6c8..e1ba301cbd 100644 --- a/api/audio_codecs/opus/audio_decoder_opus.cc +++ b/api/audio_codecs/opus/audio_decoder_opus.cc @@ -22,6 +22,7 @@ #include "api/audio_codecs/audio_decoder.h" #include "api/audio_codecs/audio_format.h" #include "api/field_trials_view.h" +#include "api/transport/field_trial_based_config.h" #include "modules/audio_coding/codecs/opus/audio_decoder_opus.h" #include "rtc_base/checks.h" @@ -79,6 +80,17 @@ void AudioDecoderOpus::AppendSupportedDecoders( specs->push_back({std::move(opus_format), opus_info}); } +std::unique_ptr AudioDecoderOpus::MakeAudioDecoder( + const Environment& env, + Config config) { + if (!config.IsOk()) { + RTC_DCHECK_NOTREACHED(); + return nullptr; + } + return std::make_unique( + env.field_trials(), config.num_channels, config.sample_rate_hz); +} + std::unique_ptr AudioDecoderOpus::MakeAudioDecoder( Config config, absl::optional /*codec_pair_id*/, @@ -87,8 +99,13 @@ std::unique_ptr AudioDecoderOpus::MakeAudioDecoder( RTC_DCHECK_NOTREACHED(); return nullptr; } - return std::make_unique(config.num_channels, - config.sample_rate_hz); + if (field_trials == nullptr) { + return std::make_unique( + FieldTrialBasedConfig(), config.num_channels, config.sample_rate_hz); + } else { + return std::make_unique( + *field_trials, config.num_channels, config.sample_rate_hz); + } } } // namespace webrtc diff --git a/api/audio_codecs/opus/audio_decoder_opus.h b/api/audio_codecs/opus/audio_decoder_opus.h index 138c0377df..b4d84cb2d5 100644 --- a/api/audio_codecs/opus/audio_decoder_opus.h +++ b/api/audio_codecs/opus/audio_decoder_opus.h @@ -18,6 +18,7 @@ #include "api/audio_codecs/audio_codec_pair_id.h" #include "api/audio_codecs/audio_decoder.h" #include "api/audio_codecs/audio_format.h" +#include "api/environment/environment.h" #include "api/field_trials_view.h" #include "rtc_base/system/rtc_export.h" @@ -33,10 +34,16 @@ struct RTC_EXPORT AudioDecoderOpus { }; static absl::optional SdpToConfig(const SdpAudioFormat& audio_format); static void AppendSupportedDecoders(std::vector* specs); - static std::unique_ptr MakeAudioDecoder( + + [[deprecated("bugs.webrtc.org/356878416")]] // + static std::unique_ptr + MakeAudioDecoder( Config config, absl::optional codec_pair_id = absl::nullopt, const FieldTrialsView* field_trials = nullptr); + + static std::unique_ptr MakeAudioDecoder(const Environment& env, + Config config); }; } // namespace webrtc diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn index a93d434c8e..cb98266510 100644 --- a/modules/audio_coding/BUILD.gn +++ b/modules/audio_coding/BUILD.gn @@ -485,7 +485,6 @@ rtc_library("webrtc_opus") { "../../rtc_base:safe_minmax", "../../rtc_base:stringutils", "../../rtc_base:timeutils", - "../../system_wrappers:field_trial", "//third_party/abseil-cpp/absl/memory", "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/strings:string_view", @@ -1207,6 +1206,7 @@ if (rtc_include_tests) { "../../api/environment:environment_factory", "../../common_audio", "../../rtc_base/system:arch", + "../../test:explicit_key_value_config", "../../test:fileutils", "../../test:test_main", "../../test:test_support", diff --git a/modules/audio_coding/codecs/opus/audio_decoder_opus.cc b/modules/audio_coding/codecs/opus/audio_decoder_opus.cc index 0f53409f48..7d5e3cfd60 100644 --- a/modules/audio_coding/codecs/opus/audio_decoder_opus.cc +++ b/modules/audio_coding/codecs/opus/audio_decoder_opus.cc @@ -15,17 +15,18 @@ #include "absl/types/optional.h" #include "api/array_view.h" +#include "api/field_trials_view.h" #include "modules/audio_coding/codecs/opus/audio_coder_opus_common.h" #include "rtc_base/checks.h" -#include "system_wrappers/include/field_trial.h" namespace webrtc { -AudioDecoderOpusImpl::AudioDecoderOpusImpl(size_t num_channels, +AudioDecoderOpusImpl::AudioDecoderOpusImpl(const FieldTrialsView& field_trials, + size_t num_channels, int sample_rate_hz) : channels_(num_channels), sample_rate_hz_(sample_rate_hz), - generate_plc_(field_trial::IsEnabled("WebRTC-Audio-OpusGeneratePlc")) { + generate_plc_(field_trials.IsEnabled("WebRTC-Audio-OpusGeneratePlc")) { RTC_DCHECK(num_channels == 1 || num_channels == 2); RTC_DCHECK(sample_rate_hz == 16000 || sample_rate_hz == 48000); const int error = diff --git a/modules/audio_coding/codecs/opus/audio_decoder_opus.h b/modules/audio_coding/codecs/opus/audio_decoder_opus.h index 2dd62fd4ee..55dbf514f5 100644 --- a/modules/audio_coding/codecs/opus/audio_decoder_opus.h +++ b/modules/audio_coding/codecs/opus/audio_decoder_opus.h @@ -17,6 +17,7 @@ #include #include "api/audio_codecs/audio_decoder.h" +#include "api/field_trials_view.h" #include "modules/audio_coding/codecs/opus/opus_interface.h" #include "rtc_base/buffer.h" @@ -24,8 +25,10 @@ namespace webrtc { class AudioDecoderOpusImpl final : public AudioDecoder { public: - explicit AudioDecoderOpusImpl(size_t num_channels, - int sample_rate_hz = 48000); + explicit AudioDecoderOpusImpl(const FieldTrialsView& field_trails, + size_t num_channels, + int sample_rate_hz); + ~AudioDecoderOpusImpl() override; AudioDecoderOpusImpl(const AudioDecoderOpusImpl&) = delete; diff --git a/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc b/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc index 423d389db2..85b9293029 100644 --- a/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc +++ b/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc @@ -122,7 +122,7 @@ TEST(BandwidthAdaptationTest, BandwidthAdaptationTest) { // Create decoder. AudioDecoderOpus::Config dec_config; dec_config.num_channels = kNumChannels; - auto decoder = AudioDecoderOpus::MakeAudioDecoder(dec_config); + auto decoder = AudioDecoderOpus::MakeAudioDecoder(env, dec_config); // Open speech file. const std::string kInputFileName = diff --git a/modules/audio_coding/neteq/audio_decoder_unittest.cc b/modules/audio_coding/neteq/audio_decoder_unittest.cc index da2f496120..a39b46bb0b 100644 --- a/modules/audio_coding/neteq/audio_decoder_unittest.cc +++ b/modules/audio_coding/neteq/audio_decoder_unittest.cc @@ -28,6 +28,7 @@ #include "modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h" #include "modules/audio_coding/neteq/tools/resample_input_audio_file.h" #include "rtc_base/system/arch.h" +#include "test/explicit_key_value_config.h" #include "test/gtest.h" #include "test/testsupport/file_utils.h" @@ -35,6 +36,8 @@ namespace webrtc { namespace { +using test::ExplicitKeyValueConfig; + constexpr int kOverheadBytesPerPacket = 50; // The absolute difference between the input and output (the first channel) is @@ -384,8 +387,8 @@ class AudioDecoderOpusTest codec_input_rate_hz_ = opus_sample_rate_hz_; frame_size_ = rtc::CheckedDivExact(opus_sample_rate_hz_, 100); data_length_ = 10 * frame_size_; - decoder_ = - new AudioDecoderOpusImpl(opus_num_channels_, opus_sample_rate_hz_); + decoder_ = new AudioDecoderOpusImpl( + ExplicitKeyValueConfig(""), opus_num_channels_, opus_sample_rate_hz_); AudioEncoderOpusConfig config; config.frame_size_ms = 10; config.sample_rate_hz = opus_sample_rate_hz_; diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn index 708a4ebce9..1f0abe356a 100644 --- a/test/fuzzers/BUILD.gn +++ b/test/fuzzers/BUILD.gn @@ -330,6 +330,7 @@ webrtc_fuzzer_test("audio_decoder_opus_fuzzer") { sources = [ "audio_decoder_opus_fuzzer.cc" ] deps = [ ":audio_decoder_fuzzer", + "..:explicit_key_value_config", "../../modules/audio_coding:webrtc_opus", ] } @@ -338,6 +339,7 @@ webrtc_fuzzer_test("audio_decoder_opus_redundant_fuzzer") { sources = [ "audio_decoder_opus_redundant_fuzzer.cc" ] deps = [ ":audio_decoder_fuzzer", + "..:explicit_key_value_config", "../../modules/audio_coding:webrtc_opus", ] } diff --git a/test/fuzzers/audio_decoder_opus_fuzzer.cc b/test/fuzzers/audio_decoder_opus_fuzzer.cc index a015f98b5b..84ee57f6f8 100644 --- a/test/fuzzers/audio_decoder_opus_fuzzer.cc +++ b/test/fuzzers/audio_decoder_opus_fuzzer.cc @@ -9,13 +9,15 @@ */ #include "modules/audio_coding/codecs/opus/audio_decoder_opus.h" +#include "test/explicit_key_value_config.h" #include "test/fuzzers/audio_decoder_fuzzer.h" namespace webrtc { void FuzzOneInput(const uint8_t* data, size_t size) { const size_t channels = (size % 2) + 1; // 1 or 2 channels. - AudioDecoderOpusImpl dec(channels); - const int kSampleRateHz = 48000; + const int kSampleRateHz = 48'000; + AudioDecoderOpusImpl dec(test::ExplicitKeyValueConfig(""), channels, + kSampleRateHz); const size_t kAllocatedOuputSizeSamples = kSampleRateHz / 10; // 100 ms. int16_t output[kAllocatedOuputSizeSamples]; FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, data, size, &dec, diff --git a/test/fuzzers/audio_decoder_opus_redundant_fuzzer.cc b/test/fuzzers/audio_decoder_opus_redundant_fuzzer.cc index efcba0f35d..3fec41e581 100644 --- a/test/fuzzers/audio_decoder_opus_redundant_fuzzer.cc +++ b/test/fuzzers/audio_decoder_opus_redundant_fuzzer.cc @@ -9,13 +9,15 @@ */ #include "modules/audio_coding/codecs/opus/audio_decoder_opus.h" +#include "test/explicit_key_value_config.h" #include "test/fuzzers/audio_decoder_fuzzer.h" namespace webrtc { void FuzzOneInput(const uint8_t* data, size_t size) { const size_t channels = (size % 2) + 1; // 1 or 2 channels. - AudioDecoderOpusImpl dec(channels); - const int kSampleRateHz = 48000; + const int kSampleRateHz = 48'000; + AudioDecoderOpusImpl dec(test::ExplicitKeyValueConfig(""), channels, + kSampleRateHz); const size_t kAllocatedOuputSizeSamples = kSampleRateHz / 10; // 100 ms. int16_t output[kAllocatedOuputSizeSamples]; FuzzAudioDecoder(DecoderFunctionType::kRedundantDecode, data, size, &dec,