[PCLF] Add ability to provide audio processor and mixer

Bug: b/196034093
Change-Id: Ia444acfcf3f3c40e4a3affd61ed9c107470ef013
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/253880
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36148}
This commit is contained in:
Artem Titov
2022-03-08 01:26:03 +01:00
committed by WebRTC LUCI CQ
parent e9126c18bf
commit 7e04b49bb8
7 changed files with 46 additions and 10 deletions

View File

@ -445,8 +445,10 @@ rtc_source_set("peer_connection_quality_test_fixture_api") {
":track_id_stream_info_map",
":video_quality_analyzer_api",
"../media:rtc_media_base",
"../modules/audio_processing:api",
"../rtc_base:rtc_base",
"../rtc_base:threading",
"audio:audio_mixer_api",
"rtc_event_log",
"task_queue",
"transport:network_control",

View File

@ -27,6 +27,7 @@ specific_include_rules = {
"+rtc_base/ssl_certificate.h",
"+rtc_base/thread.h",
"+media/base/media_constants.h",
"+modules/audio_processing/include/audio_processing.h",
],
"time_controller\.h": [
"+modules/utility/include/process_thread.h",

View File

@ -20,6 +20,7 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/async_resolver_factory.h"
#include "api/audio/audio_mixer.h"
#include "api/call/call_factory_interface.h"
#include "api/fec_controller.h"
#include "api/function_view.h"
@ -41,6 +42,7 @@
#include "api/video_codecs/video_encoder.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "media/base/media_constants.h"
#include "modules/audio_processing/include/audio_processing.h"
#include "rtc_base/network.h"
#include "rtc_base/rtc_certificate_generator.h"
#include "rtc_base/ssl_certificate.h"
@ -357,6 +359,10 @@ class PeerConnectionE2EQualityTestFixture {
// Set a custom NetEqFactory to be used in the call.
virtual PeerConfigurer* SetNetEqFactory(
std::unique_ptr<NetEqFactory> neteq_factory) = 0;
virtual PeerConfigurer* SetAudioProcessing(
rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing) = 0;
virtual PeerConfigurer* SetAudioMixer(
rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer) = 0;
// The parameters of the following 4 methods will be passed to the
// PeerConnectionInterface implementation that will be created for this

View File

@ -55,11 +55,13 @@ if (!build_with_chromium) {
"../../../api:libjingle_peerconnection_api",
"../../../api:packet_socket_factory",
"../../../api:peer_connection_quality_test_fixture_api",
"../../../api/audio:audio_mixer_api",
"../../../api/rtc_event_log",
"../../../api/task_queue",
"../../../api/transport:network_control",
"../../../api/transport:webrtc_key_value_config",
"../../../api/video_codecs:video_codecs_api",
"../../../modules/audio_processing:api",
"../../../p2p:rtc_p2p",
"../../../rtc_base",
"../../../rtc_base:threading",
@ -313,10 +315,12 @@ if (!build_with_chromium) {
"../../../api:fec_controller_api",
"../../../api:packet_socket_factory",
"../../../api:peer_connection_quality_test_fixture_api",
"../../../api/audio:audio_mixer_api",
"../../../api/rtc_event_log",
"../../../api/task_queue",
"../../../api/transport:network_control",
"../../../api/video_codecs:video_codecs_api",
"../../../modules/audio_processing:api",
"../../../rtc_base",
"../../../rtc_base:threading",
]

View File

@ -17,6 +17,7 @@
#include "absl/strings/string_view.h"
#include "api/async_resolver_factory.h"
#include "api/audio/audio_mixer.h"
#include "api/call/call_factory_interface.h"
#include "api/fec_controller.h"
#include "api/rtc_event_log/rtc_event_log_factory_interface.h"
@ -26,6 +27,7 @@
#include "api/transport/network_control.h"
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "modules/audio_processing/include/audio_processing.h"
#include "rtc_base/network.h"
#include "rtc_base/rtc_certificate_generator.h"
#include "rtc_base/ssl_certificate.h"
@ -165,6 +167,16 @@ class PeerConfigurerImpl final
components_->pcf_dependencies->neteq_factory = std::move(neteq_factory);
return this;
}
PeerConfigurer* SetAudioProcessing(
rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing) override {
components_->pcf_dependencies->audio_processing = audio_processing;
return this;
}
PeerConfigurer* SetAudioMixer(
rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer) override {
components_->pcf_dependencies->audio_mixer = audio_mixer;
return this;
}
PeerConfigurer* SetRtcEventLogPath(std::string path) override {
params_->rtc_event_log_path = std::move(path);
return this;

View File

@ -15,6 +15,7 @@
#include <vector>
#include "api/async_resolver_factory.h"
#include "api/audio/audio_mixer.h"
#include "api/call/call_factory_interface.h"
#include "api/fec_controller.h"
#include "api/rtc_event_log/rtc_event_log_factory_interface.h"
@ -24,6 +25,7 @@
#include "api/transport/webrtc_key_value_config.h"
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "modules/audio_processing/include/audio_processing.h"
#include "p2p/base/port_allocator.h"
#include "rtc_base/network.h"
#include "rtc_base/rtc_certificate_generator.h"
@ -56,6 +58,9 @@ struct PeerConnectionFactoryComponents {
std::unique_ptr<VideoDecoderFactory> video_decoder_factory;
std::unique_ptr<WebRtcKeyValueConfig> trials;
rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing;
rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer;
};
// Contains most parts from PeerConnectionDependencies. Also all fields are

View File

@ -167,12 +167,12 @@ rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceModule(
std::unique_ptr<cricket::MediaEngineInterface> CreateMediaEngine(
PeerConnectionFactoryComponents* pcf_dependencies,
rtc::scoped_refptr<AudioDeviceModule> audio_device_module,
rtc::scoped_refptr<AudioProcessing> audio_processing) {
rtc::scoped_refptr<AudioDeviceModule> audio_device_module) {
cricket::MediaEngineDependencies media_deps;
media_deps.task_queue_factory = pcf_dependencies->task_queue_factory.get();
media_deps.adm = audio_device_module;
media_deps.audio_processing = audio_processing;
media_deps.audio_processing = pcf_dependencies->audio_processing;
media_deps.audio_mixer = pcf_dependencies->audio_mixer;
media_deps.video_encoder_factory =
std::move(pcf_dependencies->video_encoder_factory);
media_deps.video_decoder_factory =
@ -315,11 +315,13 @@ std::unique_ptr<TestPeer> TestPeerFactory::CreateTestPeer(
params->rtc_configuration.sdp_semantics = SdpSemantics::kUnifiedPlan;
// Create peer connection factory.
rtc::scoped_refptr<AudioProcessing> audio_processing =
webrtc::AudioProcessingBuilder().Create();
if (params->aec_dump_path && audio_processing) {
audio_processing->CreateAndAttachAecDump(*params->aec_dump_path, -1,
task_queue_);
if (components->pcf_dependencies->audio_processing == nullptr) {
components->pcf_dependencies->audio_processing =
webrtc::AudioProcessingBuilder().Create();
}
if (params->aec_dump_path) {
components->pcf_dependencies->audio_processing->CreateAndAttachAecDump(
*params->aec_dump_path, -1, task_queue_);
}
rtc::scoped_refptr<AudioDeviceModule> audio_device_module =
CreateAudioDeviceModule(
@ -333,11 +335,15 @@ std::unique_ptr<TestPeer> TestPeerFactory::CreateTestPeer(
components->pcf_dependencies.get(),
video_analyzer_helper_);
std::unique_ptr<cricket::MediaEngineInterface> media_engine =
CreateMediaEngine(components->pcf_dependencies.get(), audio_device_module,
audio_processing);
CreateMediaEngine(components->pcf_dependencies.get(),
audio_device_module);
std::unique_ptr<rtc::Thread> worker_thread =
time_controller_.CreateThread("worker_thread");
// Store `webrtc::AudioProcessing` into local variable before move of
// `components->pcf_dependencies`
rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing =
components->pcf_dependencies->audio_processing;
PeerConnectionFactoryDependencies pcf_deps = CreatePCFDependencies(
std::move(components->pcf_dependencies), std::move(media_engine),
signaling_thread_, worker_thread.get(), components->network_thread);