For test peer start/stop AEC dump using peer connection factory api

Instead of using AudioProcessing API directly
With AudioProcessing constructing move into the PeerConnectionFactory it is possible TestPeer doesn't have direct access to audio_processing, yet it is not null.

Bug: webrtc:369904700
Change-Id: I5a4a9453ea3a0c735da8953c9ae5d9046d4e3916
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/365585
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43240}
This commit is contained in:
Danil Chapovalov 2024-10-14 19:00:13 +02:00 committed by WebRTC LUCI CQ
parent 2ee43d6daa
commit 2a569a2fc9
6 changed files with 143 additions and 55 deletions

View File

@ -67,6 +67,11 @@ if (!build_with_chromium) {
"../../../api:frame_generator_api",
"../../../api:function_view",
"../../../api:libjingle_peerconnection_api",
"../../../api:make_ref_counted",
"../../../api:media_stream_interface",
"../../../api:rtc_error",
"../../../api:rtc_stats_api",
"../../../api:rtp_parameters",
"../../../api:scoped_refptr",
"../../../api:sequence_checker",
"../../../api/audio:audio_processing",
@ -74,9 +79,13 @@ if (!build_with_chromium) {
"../../../api/test/pclf:media_configuration",
"../../../api/test/pclf:media_quality_test_params",
"../../../api/test/pclf:peer_configurer",
"../../../pc:pc_test_utils",
"../../../pc:peerconnection_wrapper",
"../../../rtc_base:checks",
"../../../rtc_base:logging",
"../../../rtc_base:macromagic",
"../../../rtc_base:refcount",
"../../../rtc_base:threading",
"../../../rtc_base/synchronization:mutex",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings:string_view",
@ -95,7 +104,10 @@ if (!build_with_chromium) {
"../..:copy_to_file_audio_capturer",
"../../../api:create_time_controller",
"../../../api:enable_media_with_defaults",
"../../../api:libjingle_peerconnection_api",
"../../../api:scoped_refptr",
"../../../api:time_controller",
"../../../api/audio:audio_device",
"../../../api/rtc_event_log:rtc_event_log_factory",
"../../../api/task_queue",
"../../../api/task_queue:default_task_queue_factory",
@ -105,13 +117,18 @@ if (!build_with_chromium) {
"../../../api/transport:field_trial_based_config",
"../../../api/video_codecs:builtin_video_decoder_factory",
"../../../api/video_codecs:builtin_video_encoder_factory",
"../../../api/video_codecs:video_codecs_api",
"../../../modules/audio_device:test_audio_device_module",
"../../../modules/audio_processing/aec_dump",
"../../../p2p:basic_port_allocator",
"../../../p2p:rtc_p2p",
"../../../pc:pc_test_utils",
"../../../rtc_base:checks",
"../../../rtc_base:threading",
"../../../rtc_base/system:file_wrapper",
"analyzer/video:quality_analyzing_video_encoder",
"analyzer/video:video_quality_analyzer_injection_helper",
"//third_party/abseil-cpp/absl/base:core_headers",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings:string_view",
]
@ -218,19 +235,26 @@ if (!build_with_chromium) {
":peer_params_preprocessor",
":sdp_changer",
":stats_poller",
":stats_provider",
":test_activities_executor",
":test_peer",
":test_peer_factory",
":test_video_capturer_video_track_source",
"../..:field_trial",
"../..:fileutils",
"../..:perf_test",
"../..:test_flags",
"../..:test_support",
"../../../api:audio_quality_analyzer_api",
"../../../api:libjingle_peerconnection_api",
"../../../api:media_stream_interface",
"../../../api:peer_connection_quality_test_fixture_api",
"../../../api:rtc_error",
"../../../api:rtc_event_log_output_file",
"../../../api:rtp_parameters",
"../../../api:rtp_transceiver_direction",
"../../../api:scoped_refptr",
"../../../api:stats_observer_interface",
"../../../api:time_controller",
"../../../api:video_quality_analyzer_api",
"../../../api/rtc_event_log",
@ -242,15 +266,20 @@ if (!build_with_chromium) {
"../../../api/test/pclf:peer_configurer",
"../../../api/units:time_delta",
"../../../api/units:timestamp",
"../../../api/video:video_frame",
"../../../media:media_constants",
"../../../pc:pc_test_utils",
"../../../pc:sdp_utils",
"../../../rtc_base:checks",
"../../../rtc_base:gunit_helpers",
"../../../rtc_base:logging",
"../../../rtc_base:macromagic",
"../../../rtc_base:safe_conversions",
"../../../rtc_base:stringutils",
"../../../rtc_base:task_queue_for_test",
"../../../rtc_base:threading",
"../../../rtc_base/synchronization:mutex",
"../../../rtc_base/task_utils:repeating_task",
"../../../system_wrappers",
"../../../system_wrappers:field_trial",
"analyzer/video:default_video_quality_analyzer",

View File

@ -10,40 +10,72 @@
#include "test/pc/e2e/peer_connection_quality_test.h"
#include <algorithm>
#include <cstddef>
#include <cstdio>
#include <functional>
#include <map>
#include <memory>
#include <set>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "absl/flags/flag.h"
#include "absl/strings/string_view.h"
#include "api/jsep.h"
#include "api/media_stream_interface.h"
#include "api/media_types.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_error.h"
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/rtc_event_log_output_file.h"
#include "api/rtp_parameters.h"
#include "api/rtp_transceiver_direction.h"
#include "api/rtp_transceiver_interface.h"
#include "api/scoped_refptr.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/test/audio_quality_analyzer_interface.h"
#include "api/test/metrics/metric.h"
#include "api/test/metrics/metrics_logger.h"
#include "api/test/pclf/media_configuration.h"
#include "api/test/pclf/media_quality_test_params.h"
#include "api/test/pclf/peer_configurer.h"
#include "api/test/stats_observer_interface.h"
#include "api/test/time_controller.h"
#include "api/test/video_quality_analyzer_interface.h"
#include "pc/sdp_utils.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "api/video/video_frame.h"
#include "api/video/video_sink_interface.h"
#include "api/video/video_source_interface.h"
#include "media/base/media_constants.h"
#include "pc/test/mock_peer_connection_observers.h"
#include "rtc_base/gunit.h"
#include "rtc_base/numerics/safe_conversions.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/task_queue_for_test.h"
#include "rtc_base/task_utils/repeating_task.h"
#include "system_wrappers/include/cpu_info.h"
#include "system_wrappers/include/field_trial.h"
#include "test/field_trial.h"
#include "test/gtest.h"
#include "test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h"
#include "test/pc/e2e/analyzer/video/default_video_quality_analyzer.h"
#include "test/pc/e2e/analyzer/video/single_process_encoded_image_data_injector.h"
#include "test/pc/e2e/analyzer/video/video_frame_tracking_id_injector.h"
#include "test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.h"
#include "test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h"
#include "test/pc/e2e/cross_media_metrics_reporter.h"
#include "test/pc/e2e/media/media_helper.h"
#include "test/pc/e2e/media/test_video_capturer_video_track_source.h"
#include "test/pc/e2e/metric_metadata_keys.h"
#include "test/pc/e2e/peer_params_preprocessor.h"
#include "test/pc/e2e/sdp/sdp_changer.h"
#include "test/pc/e2e/stats_poller.h"
#include "test/pc/e2e/stats_provider.h"
#include "test/pc/e2e/test_activities_executor.h"
#include "test/pc/e2e/test_peer.h"
#include "test/pc/e2e/test_peer_factory.h"
#include "test/test_flags.h"
#include "test/testsupport/file_utils.h"
@ -275,7 +307,7 @@ void PeerConnectionE2EQualityTest::Run(RunParams run_params) {
TestPeerFactory test_peer_factory(
signaling_thread.get(), time_controller_,
video_quality_analyzer_injection_helper_.get(), task_queue_->Get());
video_quality_analyzer_injection_helper_.get());
alice_ = test_peer_factory.CreateTestPeer(
std::move(alice_configurer),
std::make_unique<FixturePeerConnectionObserver>(

View File

@ -9,15 +9,29 @@
*/
#include "test/pc/e2e/test_peer.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
#include "api/audio/audio_processing.h"
#include "api/jsep.h"
#include "api/make_ref_counted.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_error.h"
#include "api/scoped_refptr.h"
#include "api/set_remote_description_observer_interface.h"
#include "api/stats/rtc_stats_collector_callback.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "api/test/pclf/media_configuration.h"
#include "api/test/pclf/media_quality_test_params.h"
#include "api/test/pclf/peer_configurer.h"
#include "pc/peer_connection_wrapper.h"
#include "pc/test/mock_peer_connection_observers.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/thread.h"
namespace webrtc {
namespace webrtc_pc_e2e {
@ -121,7 +135,6 @@ void TestPeer::Close() {
signaling_thread_task_safety_->SetNotAlive();
wrapper_->pc()->Close();
remote_ice_candidates_.clear();
audio_processing_ = nullptr;
video_sources_.clear();
wrapper_ = nullptr;
worker_thread_ = nullptr;
@ -134,7 +147,6 @@ TestPeer::TestPeer(
Params params,
ConfigurableParams configurable_params,
std::vector<PeerConfigurer::VideoSource> video_sources,
rtc::scoped_refptr<AudioProcessing> audio_processing,
std::unique_ptr<rtc::Thread> worker_thread)
: params_(std::move(params)),
configurable_params_(std::move(configurable_params)),
@ -142,8 +154,7 @@ TestPeer::TestPeer(
wrapper_(std::make_unique<PeerConnectionWrapper>(std::move(pc_factory),
std::move(pc),
std::move(observer))),
video_sources_(std::move(video_sources)),
audio_processing_(audio_processing) {
video_sources_(std::move(video_sources)) {
signaling_thread_task_safety_ = PendingTaskSafetyFlag::CreateDetached();
}

View File

@ -11,24 +11,34 @@
#ifndef TEST_PC_E2E_TEST_PEER_H_
#define TEST_PC_E2E_TEST_PEER_H_
#include <cstddef>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
#include "api/function_view.h"
#include "api/data_channel_interface.h"
#include "api/jsep.h"
#include "api/media_stream_interface.h"
#include "api/media_types.h"
#include "api/peer_connection_interface.h"
#include "api/rtp_sender_interface.h"
#include "api/rtp_transceiver_interface.h"
#include "api/scoped_refptr.h"
#include "api/sequence_checker.h"
#include "api/set_remote_description_observer_interface.h"
#include "api/stats/rtc_stats_collector_callback.h"
#include "api/stats/rtc_stats_report.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "api/test/frame_generator_interface.h"
#include "api/test/pclf/media_configuration.h"
#include "api/test/pclf/media_quality_test_params.h"
#include "api/test/pclf/peer_configurer.h"
#include "pc/peer_connection_wrapper.h"
#include "rtc_base/logging.h"
#include "pc/test/mock_peer_connection_observers.h"
#include "rtc_base/checks.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
#include "test/pc/e2e/stats_provider.h"
namespace webrtc {
@ -138,9 +148,7 @@ class TestPeer final : public StatsProvider {
void DetachAecDump() {
RTC_CHECK(wrapper_) << "TestPeer is already closed";
if (audio_processing_) {
audio_processing_->DetachAecDump();
}
wrapper_->pc_factory()->StopAecDump();
}
// Adds provided `candidates` to the owned peer connection.
@ -159,7 +167,6 @@ class TestPeer final : public StatsProvider {
Params params,
ConfigurableParams configurable_params,
std::vector<PeerConfigurer::VideoSource> video_sources,
rtc::scoped_refptr<AudioProcessing> audio_processing,
std::unique_ptr<rtc::Thread> worker_thread);
private:
@ -179,7 +186,6 @@ class TestPeer final : public StatsProvider {
std::unique_ptr<rtc::Thread> worker_thread_;
std::unique_ptr<PeerConnectionWrapper> wrapper_;
std::vector<PeerConfigurer::VideoSource> video_sources_;
rtc::scoped_refptr<AudioProcessing> audio_processing_;
std::vector<std::unique_ptr<IceCandidateInterface>> remote_ice_candidates_;
};

View File

@ -9,24 +9,40 @@
*/
#include "test/pc/e2e/test_peer_factory.h"
#include <cstdint>
#include <memory>
#include <optional>
#include <utility>
#include <vector>
#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
#include "api/enable_media_with_defaults.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "api/audio/audio_device.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_event_log/rtc_event_log_factory.h"
#include "api/scoped_refptr.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/test/create_time_controller.h"
#include "api/test/pclf/media_configuration.h"
#include "api/test/pclf/media_quality_test_params.h"
#include "api/test/pclf/peer_configurer.h"
#include "api/test/time_controller.h"
#include "api/transport/field_trial_based_config.h"
#include "api/video_codecs/builtin_video_decoder_factory.h"
#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "modules/audio_processing/aec_dump/aec_dump_factory.h"
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "modules/audio_device/include/test_audio_device.h"
#include "p2p/base/port_allocator.h"
#include "p2p/client/basic_port_allocator.h"
#include "pc/test/mock_peer_connection_observers.h"
#include "rtc_base/checks.h"
#include "rtc_base/system/file_wrapper.h"
#include "rtc_base/thread.h"
#include "test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.h"
#include "test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.h"
#include "test/pc/e2e/echo/echo_emulation.h"
#include "test/pc/e2e/test_peer.h"
#include "test/testsupport/copy_to_file_audio_capturer.h"
namespace webrtc {
@ -288,14 +304,6 @@ std::unique_ptr<TestPeer> TestPeerFactory::CreateTestPeer(
params->rtc_configuration.sdp_semantics = SdpSemantics::kUnifiedPlan;
// Create peer connection factory.
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(params->audio_config, remote_audio_config,
echo_emulation_config,
@ -317,10 +325,6 @@ std::unique_ptr<TestPeer> TestPeerFactory::CreateTestPeer(
components->worker_thread = owned_worker_thread.get();
}
// 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), time_controller_,
std::move(audio_device_module), signaling_thread_,
@ -328,6 +332,10 @@ std::unique_ptr<TestPeer> TestPeerFactory::CreateTestPeer(
rtc::scoped_refptr<PeerConnectionFactoryInterface> peer_connection_factory =
CreateModularPeerConnectionFactory(std::move(pcf_deps));
peer_connection_factory->SetOptions(params->peer_connection_factory_options);
if (params->aec_dump_path) {
peer_connection_factory->StartAecDump(
FileWrapper::OpenWriteOnly(*params->aec_dump_path).Release(), -1);
}
// Create peer connection.
PeerConnectionDependencies pc_deps =
@ -340,11 +348,10 @@ std::unique_ptr<TestPeer> TestPeerFactory::CreateTestPeer(
.MoveValue();
peer_connection->SetBitrate(params->bitrate_settings);
return absl::WrapUnique(
new TestPeer(peer_connection_factory, peer_connection,
std::move(observer), std::move(*params),
std::move(*configurable_params), std::move(video_sources),
audio_processing, std::move(owned_worker_thread)));
return absl::WrapUnique(new TestPeer(
peer_connection_factory, peer_connection, std::move(observer),
std::move(*params), std::move(*configurable_params),
std::move(video_sources), std::move(owned_worker_thread)));
}
} // namespace webrtc_pc_e2e

View File

@ -11,19 +11,17 @@
#ifndef TEST_PC_E2E_TEST_PEER_FACTORY_H_
#define TEST_PC_E2E_TEST_PEER_FACTORY_H_
#include <map>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "absl/strings/string_view.h"
#include "api/rtc_event_log/rtc_event_log_factory.h"
#include "absl/base/macros.h"
#include "api/task_queue/task_queue_base.h"
#include "api/test/pclf/media_configuration.h"
#include "api/test/pclf/media_quality_test_params.h"
#include "api/test/pclf/peer_configurer.h"
#include "api/test/time_controller.h"
#include "modules/audio_device/include/test_audio_device.h"
#include "pc/test/mock_peer_connection_observers.h"
#include "rtc_base/thread.h"
#include "test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.h"
#include "test/pc/e2e/test_peer.h"
@ -51,15 +49,21 @@ class TestPeerFactory {
// factories and call factory.
// `video_analyzer_helper` will be used to setup video quality analysis for
// created peers.
// `task_queue` will be used for AEC dump if it is requested.
TestPeerFactory(rtc::Thread* signaling_thread,
TimeController& time_controller,
VideoQualityAnalyzerInjectionHelper* video_analyzer_helper)
: signaling_thread_(signaling_thread),
time_controller_(time_controller),
video_analyzer_helper_(video_analyzer_helper) {}
ABSL_DEPRECATE_AND_INLINE()
TestPeerFactory(rtc::Thread* signaling_thread,
TimeController& time_controller,
VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
TaskQueueBase* task_queue)
: signaling_thread_(signaling_thread),
time_controller_(time_controller),
video_analyzer_helper_(video_analyzer_helper),
task_queue_(task_queue) {}
TaskQueueBase* /*task_queue*/)
: TestPeerFactory(signaling_thread,
time_controller,
video_analyzer_helper) {}
// Setups all components, that should be provided to WebRTC
// PeerConnectionFactory and PeerConnection creation methods,
@ -75,7 +79,6 @@ class TestPeerFactory {
rtc::Thread* signaling_thread_;
TimeController& time_controller_;
VideoQualityAnalyzerInjectionHelper* video_analyzer_helper_;
TaskQueueBase* const task_queue_;
};
} // namespace webrtc_pc_e2e