Break apart AudioCodingModule and AcmReceiver
This change makes AudioCodingModule a pure sender and AcmReceiver a pure
receiver.
The Config struct is in practice no longer used by AudioCodingModule,
so a new definition is included in AcmReceiver. The old definition
remains in AudioCodingModule while downstream clients are being
updated.
Bug: webrtc:14867
Change-Id: If0d0b4214c5aa278cf6c85c5b62c6da644de20e0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/291533
Reviewed-by: Tomas Lundqvist <tomasl@google.com>
Commit-Queue: Henrik Lundin <henrik.lundin@webrtc.org>
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39244}
diff --git a/modules/audio_coding/test/TestAllCodecs.cc b/modules/audio_coding/test/TestAllCodecs.cc
index b44037d..dd51760 100644
--- a/modules/audio_coding/test/TestAllCodecs.cc
+++ b/modules/audio_coding/test/TestAllCodecs.cc
@@ -55,8 +55,8 @@
TestPack::~TestPack() {}
-void TestPack::RegisterReceiverACM(AudioCodingModule* acm) {
- receiver_acm_ = acm;
+void TestPack::RegisterReceiverACM(acm2::AcmReceiver* acm_receiver) {
+ receiver_acm_ = acm_receiver;
return;
}
@@ -83,8 +83,8 @@
// Only run mono for all test cases.
memcpy(payload_data_, payload_data, payload_size);
- status =
- receiver_acm_->IncomingPacket(payload_data_, payload_size, rtp_header);
+ status = receiver_acm_->InsertPacket(
+ rtp_header, rtc::ArrayView<const uint8_t>(payload_data_, payload_size));
payload_size_ = payload_size;
timestamp_diff_ = timestamp - last_in_timestamp_;
@@ -106,10 +106,9 @@
}
TestAllCodecs::TestAllCodecs()
- : acm_a_(AudioCodingModule::Create(
- AudioCodingModule::Config(CreateBuiltinAudioDecoderFactory()))),
- acm_b_(AudioCodingModule::Create(
- AudioCodingModule::Config(CreateBuiltinAudioDecoderFactory()))),
+ : acm_a_(AudioCodingModule::Create()),
+ acm_b_(std::make_unique<acm2::AcmReceiver>(
+ acm2::AcmReceiver::Config(CreateBuiltinAudioDecoderFactory()))),
channel_a_to_b_(NULL),
test_count_(0),
packet_size_samples_(0),
@@ -127,26 +126,23 @@
webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
infile_a_.Open(file_name, 32000, "rb");
- acm_a_->InitializeReceiver();
- acm_b_->InitializeReceiver();
-
- acm_b_->SetReceiveCodecs({{107, {"L16", 8000, 1}},
- {108, {"L16", 16000, 1}},
- {109, {"L16", 32000, 1}},
- {111, {"L16", 8000, 2}},
- {112, {"L16", 16000, 2}},
- {113, {"L16", 32000, 2}},
- {0, {"PCMU", 8000, 1}},
- {110, {"PCMU", 8000, 2}},
- {8, {"PCMA", 8000, 1}},
- {118, {"PCMA", 8000, 2}},
- {102, {"ILBC", 8000, 1}},
- {9, {"G722", 8000, 1}},
- {119, {"G722", 8000, 2}},
- {120, {"OPUS", 48000, 2, {{"stereo", "1"}}}},
- {13, {"CN", 8000, 1}},
- {98, {"CN", 16000, 1}},
- {99, {"CN", 32000, 1}}});
+ acm_b_->SetCodecs({{107, {"L16", 8000, 1}},
+ {108, {"L16", 16000, 1}},
+ {109, {"L16", 32000, 1}},
+ {111, {"L16", 8000, 2}},
+ {112, {"L16", 16000, 2}},
+ {113, {"L16", 32000, 2}},
+ {0, {"PCMU", 8000, 1}},
+ {110, {"PCMU", 8000, 2}},
+ {8, {"PCMA", 8000, 1}},
+ {118, {"PCMA", 8000, 2}},
+ {102, {"ILBC", 8000, 1}},
+ {9, {"G722", 8000, 1}},
+ {119, {"G722", 8000, 2}},
+ {120, {"OPUS", 48000, 2, {{"stereo", "1"}}}},
+ {13, {"CN", 8000, 1}},
+ {98, {"CN", 16000, 1}},
+ {99, {"CN", 32000, 1}}});
// Create and connect the channel
channel_a_to_b_ = new TestPack;
@@ -158,113 +154,113 @@
test_count_++;
OpenOutFile(test_count_);
char codec_g722[] = "G722";
- RegisterSendCodec('A', codec_g722, 16000, 64000, 160, 0);
+ RegisterSendCodec(codec_g722, 16000, 64000, 160, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_g722, 16000, 64000, 320, 0);
+ RegisterSendCodec(codec_g722, 16000, 64000, 320, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_g722, 16000, 64000, 480, 0);
+ RegisterSendCodec(codec_g722, 16000, 64000, 480, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_g722, 16000, 64000, 640, 0);
+ RegisterSendCodec(codec_g722, 16000, 64000, 640, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_g722, 16000, 64000, 800, 0);
+ RegisterSendCodec(codec_g722, 16000, 64000, 800, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_g722, 16000, 64000, 960, 0);
+ RegisterSendCodec(codec_g722, 16000, 64000, 960, 0);
Run(channel_a_to_b_);
outfile_b_.Close();
#ifdef WEBRTC_CODEC_ILBC
test_count_++;
OpenOutFile(test_count_);
char codec_ilbc[] = "ILBC";
- RegisterSendCodec('A', codec_ilbc, 8000, 13300, 240, 0);
+ RegisterSendCodec(codec_ilbc, 8000, 13300, 240, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_ilbc, 8000, 13300, 480, 0);
+ RegisterSendCodec(codec_ilbc, 8000, 13300, 480, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_ilbc, 8000, 15200, 160, 0);
+ RegisterSendCodec(codec_ilbc, 8000, 15200, 160, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_ilbc, 8000, 15200, 320, 0);
+ RegisterSendCodec(codec_ilbc, 8000, 15200, 320, 0);
Run(channel_a_to_b_);
outfile_b_.Close();
#endif
test_count_++;
OpenOutFile(test_count_);
char codec_l16[] = "L16";
- RegisterSendCodec('A', codec_l16, 8000, 128000, 80, 0);
+ RegisterSendCodec(codec_l16, 8000, 128000, 80, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_l16, 8000, 128000, 160, 0);
+ RegisterSendCodec(codec_l16, 8000, 128000, 160, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_l16, 8000, 128000, 240, 0);
+ RegisterSendCodec(codec_l16, 8000, 128000, 240, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_l16, 8000, 128000, 320, 0);
+ RegisterSendCodec(codec_l16, 8000, 128000, 320, 0);
Run(channel_a_to_b_);
outfile_b_.Close();
test_count_++;
OpenOutFile(test_count_);
- RegisterSendCodec('A', codec_l16, 16000, 256000, 160, 0);
+ RegisterSendCodec(codec_l16, 16000, 256000, 160, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_l16, 16000, 256000, 320, 0);
+ RegisterSendCodec(codec_l16, 16000, 256000, 320, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_l16, 16000, 256000, 480, 0);
+ RegisterSendCodec(codec_l16, 16000, 256000, 480, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_l16, 16000, 256000, 640, 0);
+ RegisterSendCodec(codec_l16, 16000, 256000, 640, 0);
Run(channel_a_to_b_);
outfile_b_.Close();
test_count_++;
OpenOutFile(test_count_);
- RegisterSendCodec('A', codec_l16, 32000, 512000, 320, 0);
+ RegisterSendCodec(codec_l16, 32000, 512000, 320, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_l16, 32000, 512000, 640, 0);
+ RegisterSendCodec(codec_l16, 32000, 512000, 640, 0);
Run(channel_a_to_b_);
outfile_b_.Close();
test_count_++;
OpenOutFile(test_count_);
char codec_pcma[] = "PCMA";
- RegisterSendCodec('A', codec_pcma, 8000, 64000, 80, 0);
+ RegisterSendCodec(codec_pcma, 8000, 64000, 80, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcma, 8000, 64000, 160, 0);
+ RegisterSendCodec(codec_pcma, 8000, 64000, 160, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcma, 8000, 64000, 240, 0);
+ RegisterSendCodec(codec_pcma, 8000, 64000, 240, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcma, 8000, 64000, 320, 0);
+ RegisterSendCodec(codec_pcma, 8000, 64000, 320, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcma, 8000, 64000, 400, 0);
+ RegisterSendCodec(codec_pcma, 8000, 64000, 400, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcma, 8000, 64000, 480, 0);
+ RegisterSendCodec(codec_pcma, 8000, 64000, 480, 0);
Run(channel_a_to_b_);
char codec_pcmu[] = "PCMU";
- RegisterSendCodec('A', codec_pcmu, 8000, 64000, 80, 0);
+ RegisterSendCodec(codec_pcmu, 8000, 64000, 80, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcmu, 8000, 64000, 160, 0);
+ RegisterSendCodec(codec_pcmu, 8000, 64000, 160, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcmu, 8000, 64000, 240, 0);
+ RegisterSendCodec(codec_pcmu, 8000, 64000, 240, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcmu, 8000, 64000, 320, 0);
+ RegisterSendCodec(codec_pcmu, 8000, 64000, 320, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcmu, 8000, 64000, 400, 0);
+ RegisterSendCodec(codec_pcmu, 8000, 64000, 400, 0);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_pcmu, 8000, 64000, 480, 0);
+ RegisterSendCodec(codec_pcmu, 8000, 64000, 480, 0);
Run(channel_a_to_b_);
outfile_b_.Close();
#ifdef WEBRTC_CODEC_OPUS
test_count_++;
OpenOutFile(test_count_);
char codec_opus[] = "OPUS";
- RegisterSendCodec('A', codec_opus, 48000, 6000, 480, kVariableSize);
+ RegisterSendCodec(codec_opus, 48000, 6000, 480, kVariableSize);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_opus, 48000, 20000, 480 * 2, kVariableSize);
+ RegisterSendCodec(codec_opus, 48000, 20000, 480 * 2, kVariableSize);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_opus, 48000, 32000, 480 * 4, kVariableSize);
+ RegisterSendCodec(codec_opus, 48000, 32000, 480 * 4, kVariableSize);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_opus, 48000, 48000, 480, kVariableSize);
+ RegisterSendCodec(codec_opus, 48000, 48000, 480, kVariableSize);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_opus, 48000, 64000, 480 * 4, kVariableSize);
+ RegisterSendCodec(codec_opus, 48000, 64000, 480 * 4, kVariableSize);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_opus, 48000, 96000, 480 * 6, kVariableSize);
+ RegisterSendCodec(codec_opus, 48000, 96000, 480 * 6, kVariableSize);
Run(channel_a_to_b_);
- RegisterSendCodec('A', codec_opus, 48000, 500000, 480 * 2, kVariableSize);
+ RegisterSendCodec(codec_opus, 48000, 500000, 480 * 2, kVariableSize);
Run(channel_a_to_b_);
outfile_b_.Close();
#endif
@@ -272,8 +268,7 @@
// Register Codec to use in the test
//
-// Input: side - which ACM to use, 'A' or 'B'
-// codec_name - name to use when register the codec
+// Input: codec_name - name to use when register the codec
// sampling_freq_hz - sampling frequency in Herz
// rate - bitrate in bytes
// packet_size - packet size in samples
@@ -281,8 +276,7 @@
// used when registering, can be an internal header
// set to kVariableSize if the codec is a variable
// rate codec
-void TestAllCodecs::RegisterSendCodec(char side,
- char* codec_name,
+void TestAllCodecs::RegisterSendCodec(char* codec_name,
int32_t sampling_freq_hz,
int rate,
int packet_size,
@@ -316,29 +310,12 @@
packet_size_bytes_ = kVariableSize;
}
- // Set pointer to the ACM where to register the codec.
- AudioCodingModule* my_acm = NULL;
- switch (side) {
- case 'A': {
- my_acm = acm_a_.get();
- break;
- }
- case 'B': {
- my_acm = acm_b_.get();
- break;
- }
- default: {
- break;
- }
- }
- ASSERT_TRUE(my_acm != NULL);
-
auto factory = CreateBuiltinAudioEncoderFactory();
constexpr int payload_type = 17;
SdpAudioFormat format = {codec_name, clockrate_hz, num_channels};
format.parameters["ptime"] = rtc::ToString(rtc::CheckedDivExact(
packet_size, rtc::CheckedDivExact(sampling_freq_hz, 1000)));
- my_acm->SetEncoder(
+ acm_a_->SetEncoder(
factory->MakeAudioEncoder(payload_type, format, absl::nullopt));
}
@@ -381,7 +358,7 @@
// Run received side of ACM.
bool muted;
- CHECK_ERROR(acm_b_->PlayoutData10Ms(out_freq_hz, &audio_frame, &muted));
+ CHECK_ERROR(acm_b_->GetAudio(out_freq_hz, &audio_frame, &muted));
ASSERT_FALSE(muted);
// Write output speech to file.