diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn index 658337641b..7b50c1929e 100644 --- a/modules/audio_coding/BUILD.gn +++ b/modules/audio_coding/BUILD.gn @@ -1492,6 +1492,7 @@ if (rtc_include_tests) { "../..:webrtc_common", "../../api/audio_codecs:builtin_audio_decoder_factory", "../../rtc_base:rtc_base_approved", + "../../test:audio_codec_mocks", "../../test:test_support", "//third_party/abseil-cpp/absl/memory", ] diff --git a/modules/audio_coding/neteq/neteq_decoder_enum.cc b/modules/audio_coding/neteq/neteq_decoder_enum.cc index e3b633e85d..27806ef619 100644 --- a/modules/audio_coding/neteq/neteq_decoder_enum.cc +++ b/modules/audio_coding/neteq/neteq_decoder_enum.cc @@ -77,6 +77,8 @@ absl::optional NetEqDecoderToSdpAudioFormat(NetEqDecoder nd) { return SdpAudioFormat("cn", 32000, 1); case NetEqDecoder::kDecoderCNGswb48kHz: return SdpAudioFormat("cn", 48000, 1); + case NetEqDecoder::kDecoderReplacementForTest: + return SdpAudioFormat("replacement", 48000, 1); default: return absl::nullopt; } diff --git a/modules/audio_coding/neteq/neteq_decoder_enum.h b/modules/audio_coding/neteq/neteq_decoder_enum.h index 00629bc831..12c970a25a 100644 --- a/modules/audio_coding/neteq/neteq_decoder_enum.h +++ b/modules/audio_coding/neteq/neteq_decoder_enum.h @@ -16,6 +16,7 @@ namespace webrtc { +// TODO(bugs.webrtc.org/10080): Delete, together with RegisterExternalDecoder. enum class NetEqDecoder { kDecoderPCMu, kDecoderPCMa, @@ -47,6 +48,8 @@ enum class NetEqDecoder { kDecoderArbitrary, kDecoderOpus, kDecoderOpus_2ch, + // Used in NetEqTestFactory + kDecoderReplacementForTest, }; absl::optional NetEqDecoderToSdpAudioFormat(NetEqDecoder nd); diff --git a/modules/audio_coding/neteq/tools/neteq_test_factory.cc b/modules/audio_coding/neteq/tools/neteq_test_factory.cc index 47c3e47e9a..94e9bb1f12 100644 --- a/modules/audio_coding/neteq/tools/neteq_test_factory.cc +++ b/modules/audio_coding/neteq/tools/neteq_test_factory.cc @@ -38,6 +38,8 @@ #include "modules/audio_coding/neteq/tools/rtp_file_source.h" #include "rtc_base/checks.h" #include "rtc_base/flags.h" +#include "rtc_base/refcountedobject.h" +#include "test/function_audio_decoder_factory.h" #include "test/testsupport/fileutils.h" namespace webrtc { @@ -431,12 +433,14 @@ std::unique_ptr NetEqTestFactory::InitializeTest( std::make_pair(NetEqDecoder::kDecoderCNGswb48kHz, "cng-swb48")} }; + rtc::scoped_refptr decoder_factory = + CreateBuiltinAudioDecoderFactory(); + // Check if a replacement audio file was provided. if (strlen(FLAG_replacement_audio_file) > 0) { // Find largest unused payload type. int replacement_pt = 127; - while (!(codecs.find(replacement_pt) == codecs.end() && - ext_codecs_.find(replacement_pt) == ext_codecs_.end())) { + while (codecs.find(replacement_pt) != codecs.end()) { --replacement_pt; RTC_CHECK_GE(replacement_pt, 0); } @@ -456,14 +460,23 @@ std::unique_ptr NetEqTestFactory::InitializeTest( input.reset(new NetEqReplacementInput(std::move(input), replacement_pt, cn_types, forbidden_types)); - replacement_decoder_.reset(new FakeDecodeFromFile( - std::unique_ptr( - new InputAudioFile(FLAG_replacement_audio_file)), - 48000, false)); - NetEqTest::ExternalDecoderInfo ext_dec_info = { - replacement_decoder_.get(), NetEqDecoder::kDecoderArbitrary, - "replacement codec"}; - ext_codecs_[replacement_pt] = ext_dec_info; + // Note that capture-by-copy implies that the lambda captures the value of + // decoder_factory before it's reassigned on the left-hand side. + decoder_factory = new rtc::RefCountedObject( + [decoder_factory](const SdpAudioFormat& format, + absl::optional codec_pair_id) { + std::unique_ptr decoder = + decoder_factory->MakeAudioDecoder(format, codec_pair_id); + if (!decoder && format.name == "replacement") { + decoder = absl::make_unique( + absl::make_unique(FLAG_replacement_audio_file), + format.clockrate_hz, format.num_channels > 1); + } + return decoder; + }); + + codecs[replacement_pt] = {NetEqDecoder::kDecoderReplacementForTest, + "replacement codec"}; } // Create a text log file if needed. @@ -487,9 +500,10 @@ std::unique_ptr NetEqTestFactory::InitializeTest( config.sample_rate_hz = *sample_rate_hz; config.max_packets_in_buffer = FLAG_max_nr_packets_in_buffer; config.enable_fast_accelerate = FLAG_enable_fast_accelerate; + NetEqTest::ExtDecoderMap ext_codecs; return absl::make_unique( - config, CreateBuiltinAudioDecoderFactory(), codecs, ext_codecs_, - std::move(text_log), std::move(input), std::move(output), callbacks); + config, decoder_factory, codecs, ext_codecs, std::move(text_log), + std::move(input), std::move(output), callbacks); } } // namespace test diff --git a/modules/audio_coding/neteq/tools/neteq_test_factory.h b/modules/audio_coding/neteq/tools/neteq_test_factory.h index a249186bd9..f853c1dedd 100644 --- a/modules/audio_coding/neteq/tools/neteq_test_factory.h +++ b/modules/audio_coding/neteq/tools/neteq_test_factory.h @@ -34,8 +34,6 @@ class NetEqTestFactory { std::string output_filename); private: - std::unique_ptr replacement_decoder_; - NetEqTest::ExtDecoderMap ext_codecs_; std::unique_ptr ssrc_switch_detector_; std::unique_ptr stats_plotter_; };