diff --git a/media/BUILD.gn b/media/BUILD.gn index 26a17a1bdf..d02ef89d18 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -260,6 +260,8 @@ rtc_static_library("rtc_audio_video") { libs = [] deps = [ "../api:scoped_refptr", + "../api/task_queue", + "../api/task_queue:global_task_queue_factory", "../api/video:video_bitrate_allocation", "../api/video:video_bitrate_allocator_factory", "../modules/audio_processing:api", @@ -493,6 +495,8 @@ if (rtc_include_tests) { "../:webrtc_common", "../api:fake_media_transport", "../api:scoped_refptr", + "../api/task_queue", + "../api/task_queue:default_task_queue_factory", "../api/test/video:function_video_factory", "../api/units:time_delta", "../api/video:video_frame_i420", diff --git a/media/engine/null_webrtc_video_engine_unittest.cc b/media/engine/null_webrtc_video_engine_unittest.cc index 85eaea3a92..343e167fcb 100644 --- a/media/engine/null_webrtc_video_engine_unittest.cc +++ b/media/engine/null_webrtc_video_engine_unittest.cc @@ -9,7 +9,13 @@ */ #include "media/engine/null_webrtc_video_engine.h" + +#include +#include + #include "absl/memory/memory.h" +#include "api/task_queue/default_task_queue_factory.h" +#include "api/task_queue/task_queue_factory.h" #include "media/engine/webrtc_voice_engine.h" #include "modules/audio_device/include/mock_audio_device.h" #include "modules/audio_processing/include/audio_processing.h" @@ -19,30 +25,21 @@ namespace cricket { -class WebRtcMediaEngineNullVideo : public CompositeMediaEngine { - public: - WebRtcMediaEngineNullVideo( - webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& - audio_encoder_factory, - const rtc::scoped_refptr& - audio_decoder_factory) - : CompositeMediaEngine(absl::make_unique( - adm, - audio_encoder_factory, - audio_decoder_factory, - nullptr, - webrtc::AudioProcessingBuilder().Create()), - absl::make_unique()) {} -}; - // Simple test to check if NullWebRtcVideoEngine implements the methods // required by CompositeMediaEngine. TEST(NullWebRtcVideoEngineTest, CheckInterface) { + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); testing::NiceMock adm; - WebRtcMediaEngineNullVideo engine( - &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), - webrtc::MockAudioDecoderFactory::CreateUnusedFactory()); + auto audio_engine = absl::make_unique( + task_queue_factory.get(), &adm, + webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), + webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, + webrtc::AudioProcessingBuilder().Create()); + + CompositeMediaEngine engine(std::move(audio_engine), + absl::make_unique()); + EXPECT_TRUE(engine.Init()); } diff --git a/media/engine/webrtc_media_engine.cc b/media/engine/webrtc_media_engine.cc index 5de0927a52..48269ee51b 100644 --- a/media/engine/webrtc_media_engine.cc +++ b/media/engine/webrtc_media_engine.cc @@ -14,6 +14,7 @@ #include "absl/algorithm/container.h" #include "absl/memory/memory.h" +#include "api/task_queue/global_task_queue_factory.h" #include "api/video/builtin_video_bitrate_allocator_factory.h" #include "api/video_codecs/video_decoder_factory.h" #include "api/video_codecs/video_encoder_factory.h" @@ -61,9 +62,9 @@ std::unique_ptr WebRtcMediaEngineFactory::Create( auto video_engine = absl::make_unique(); #endif return std::unique_ptr(new CompositeMediaEngine( - absl::make_unique(adm, audio_encoder_factory, - audio_decoder_factory, audio_mixer, - audio_processing), + absl::make_unique( + &webrtc::GlobalTaskQueueFactory(), adm, audio_encoder_factory, + audio_decoder_factory, audio_mixer, audio_processing), std::move(video_engine))); } diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc index cbf66ba466..ebc4334948 100644 --- a/media/engine/webrtc_voice_engine.cc +++ b/media/engine/webrtc_voice_engine.cc @@ -178,12 +178,14 @@ absl::optional ComputeSendBitrate(int max_send_bitrate_bps, } // namespace WebRtcVoiceEngine::WebRtcVoiceEngine( + webrtc::TaskQueueFactory* task_queue_factory, webrtc::AudioDeviceModule* adm, const rtc::scoped_refptr& encoder_factory, const rtc::scoped_refptr& decoder_factory, rtc::scoped_refptr audio_mixer, rtc::scoped_refptr audio_processing) - : adm_(adm), + : task_queue_factory_(task_queue_factory), + adm_(adm), encoder_factory_(encoder_factory), decoder_factory_(decoder_factory), audio_mixer_(audio_mixer), @@ -218,7 +220,8 @@ void WebRtcVoiceEngine::Init() { // TaskQueue expects to be created/destroyed on the same thread. low_priority_worker_queue_.reset( - new rtc::TaskQueue("rtc-low-prio", rtc::TaskQueue::Priority::LOW)); + new rtc::TaskQueue(task_queue_factory_->CreateTaskQueue( + "rtc-low-prio", webrtc::TaskQueueFactory::Priority::LOW))); // Load our audio codec lists. RTC_LOG(LS_INFO) << "Supported send codecs in order of preference:"; diff --git a/media/engine/webrtc_voice_engine.h b/media/engine/webrtc_voice_engine.h index 1cf1ccb07f..f03bdfb823 100644 --- a/media/engine/webrtc_voice_engine.h +++ b/media/engine/webrtc_voice_engine.h @@ -19,6 +19,7 @@ #include "api/audio_codecs/audio_encoder_factory.h" #include "api/rtp_receiver_interface.h" #include "api/scoped_refptr.h" +#include "api/task_queue/task_queue_factory.h" #include "call/audio_state.h" #include "call/call.h" #include "media/base/rtp_utils.h" @@ -46,6 +47,7 @@ class WebRtcVoiceEngine final : public VoiceEngineInterface { public: WebRtcVoiceEngine( + webrtc::TaskQueueFactory* task_queue_factory, webrtc::AudioDeviceModule* adm, const rtc::scoped_refptr& encoder_factory, const rtc::scoped_refptr& decoder_factory, @@ -91,6 +93,7 @@ class WebRtcVoiceEngine final : public VoiceEngineInterface { void StartAecDump(const std::string& filename); int CreateVoEChannel(); + webrtc::TaskQueueFactory* const task_queue_factory_; std::unique_ptr low_priority_worker_queue_; webrtc::AudioDeviceModule* adm(); diff --git a/media/engine/webrtc_voice_engine_unittest.cc b/media/engine/webrtc_voice_engine_unittest.cc index 8930b9940f..969c10ce97 100644 --- a/media/engine/webrtc_voice_engine_unittest.cc +++ b/media/engine/webrtc_voice_engine_unittest.cc @@ -16,6 +16,7 @@ #include "api/audio_codecs/builtin_audio_encoder_factory.h" #include "api/rtp_parameters.h" #include "api/scoped_refptr.h" +#include "api/task_queue/default_task_queue_factory.h" #include "call/call.h" #include "logging/rtc_event_log/rtc_event_log.h" #include "media/base/fake_media_engine.h" @@ -136,6 +137,8 @@ void AdmSetupExpectations(webrtc::test::MockAudioDeviceModule* adm) { // Tests that our stub library "works". TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); StrictMock adm; AdmSetupExpectations(&adm); rtc::scoped_refptr> apm = @@ -148,7 +151,8 @@ TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { EXPECT_CALL(*apm, DetachAecDump()); { cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), + task_queue_factory.get(), &adm, + webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); engine.Init(); } @@ -168,7 +172,8 @@ class WebRtcVoiceEngineTestFake : public testing::Test { WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {} explicit WebRtcVoiceEngineTestFake(const char* field_trials) - : apm_(new rtc::RefCountedObject< + : task_queue_factory_(webrtc::CreateDefaultTaskQueueFactory()), + apm_(new rtc::RefCountedObject< StrictMock>()), apm_ns_(*apm_->noise_suppression()), call_(), @@ -189,7 +194,8 @@ class WebRtcVoiceEngineTestFake : public testing::Test { auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory(); auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory(); engine_.reset(new cricket::WebRtcVoiceEngine( - &adm_, encoder_factory, decoder_factory, nullptr, apm_)); + task_queue_factory_.get(), &adm_, encoder_factory, decoder_factory, + nullptr, apm_)); engine_->Init(); send_parameters_.codecs.push_back(kPcmuCodec); recv_parameters_.codecs.push_back(kPcmuCodec); @@ -756,6 +762,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { } protected: + std::unique_ptr task_queue_factory_; StrictMock adm_; rtc::scoped_refptr> apm_; webrtc::test::MockNoiseSuppression& apm_ns_; @@ -3499,11 +3506,14 @@ TEST_F(WebRtcVoiceEngineTestFake, GetSourcesWithNonExistingSsrc) { TEST(WebRtcVoiceEngineTest, StartupShutdown) { // If the VoiceEngine wants to gather available codecs early, that's fine but // we never want it to create a decoder at this stage. + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); testing::NiceMock adm; rtc::scoped_refptr apm = webrtc::AudioProcessingBuilder().Create(); cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), + task_queue_factory.get(), &adm, + webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); engine.Init(); webrtc::RtcEventLogNullImpl event_log; @@ -3518,6 +3528,8 @@ TEST(WebRtcVoiceEngineTest, StartupShutdown) { // Tests that reference counting on the external ADM is correct. TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); testing::NiceMock adm; EXPECT_CALL(adm, AddRef()).Times(3); EXPECT_CALL(adm, Release()) @@ -3527,7 +3539,8 @@ TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { rtc::scoped_refptr apm = webrtc::AudioProcessingBuilder().Create(); cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), + task_queue_factory.get(), &adm, + webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); engine.Init(); webrtc::RtcEventLogNullImpl event_log; @@ -3543,13 +3556,16 @@ TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { // Verify the payload id of common audio codecs, including CN, ISAC, and G722. TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) { + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); // TODO(ossu): Why are the payload types of codecs with non-static payload // type assignments checked here? It shouldn't really matter. testing::NiceMock adm; rtc::scoped_refptr apm = webrtc::AudioProcessingBuilder().Create(); cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), + task_queue_factory.get(), &adm, + webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); engine.Init(); for (const cricket::AudioCodec& codec : engine.send_codecs()) { @@ -3590,11 +3606,14 @@ TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) { // Tests that VoE supports at least 32 channels TEST(WebRtcVoiceEngineTest, Has32Channels) { + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); testing::NiceMock adm; rtc::scoped_refptr apm = webrtc::AudioProcessingBuilder().Create(); cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), + task_queue_factory.get(), &adm, + webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); engine.Init(); webrtc::RtcEventLogNullImpl event_log; @@ -3622,6 +3641,8 @@ TEST(WebRtcVoiceEngineTest, Has32Channels) { // Test that we set our preferred codecs properly. TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); // TODO(ossu): I'm not sure of the intent of this test. It's either: // - Check that our builtin codecs are usable by Channel. // - The codecs provided by the engine is usable by Channel. @@ -3633,7 +3654,8 @@ TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { rtc::scoped_refptr apm = webrtc::AudioProcessingBuilder().Create(); cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), + task_queue_factory.get(), &adm, + webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, apm); engine.Init(); webrtc::RtcEventLogNullImpl event_log; @@ -3665,6 +3687,8 @@ TEST(WebRtcVoiceEngineTest, CollectRecvCodecs) { specs.push_back( webrtc::AudioCodecSpec{{"codec5", 8000, 2}, {8000, 1, 64000}}); + std::unique_ptr task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(); rtc::scoped_refptr unused_encoder_factory = webrtc::MockAudioEncoderFactory::CreateUnusedFactory(); rtc::scoped_refptr mock_decoder_factory = @@ -3675,7 +3699,8 @@ TEST(WebRtcVoiceEngineTest, CollectRecvCodecs) { rtc::scoped_refptr apm = webrtc::AudioProcessingBuilder().Create(); - cricket::WebRtcVoiceEngine engine(&adm, unused_encoder_factory, + cricket::WebRtcVoiceEngine engine(task_queue_factory.get(), &adm, + unused_encoder_factory, mock_decoder_factory, nullptr, apm); engine.Init(); auto codecs = engine.recv_codecs();