diff --git a/BUILD.gn b/BUILD.gn index 31e130a98e..936c89dda2 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -476,6 +476,7 @@ if (rtc_include_tests) { "api:rtc_api_unittests", "api/audio/test:audio_api_unittests", "api/audio_codecs/test:audio_codecs_api_unittests", + "api/task_queue:global_task_queue_factory", "api/video/test:rtc_api_video_unittests", "api/video_codecs/test:video_codecs_api_unittests", "call:fake_network_pipe_unittests", diff --git a/api/video/BUILD.gn b/api/video/BUILD.gn index 0b71df4488..b20b3a871d 100644 --- a/api/video/BUILD.gn +++ b/api/video/BUILD.gn @@ -209,6 +209,8 @@ rtc_source_set("video_stream_encoder_create") { ":video_stream_encoder", "../../api:scoped_refptr", "../../video:video_stream_encoder_impl", + "../task_queue", + "../task_queue:global_task_queue_factory", "../video_codecs:video_codecs_api", "//third_party/abseil-cpp/absl/memory", ] diff --git a/api/video/video_stream_encoder_create.cc b/api/video/video_stream_encoder_create.cc index b72d455400..3225c98a3c 100644 --- a/api/video/video_stream_encoder_create.cc +++ b/api/video/video_stream_encoder_create.cc @@ -11,6 +11,7 @@ #include "api/video/video_stream_encoder_create.h" #include "absl/memory/memory.h" +#include "api/task_queue/global_task_queue_factory.h" #include "video/overuse_frame_detector.h" #include "video/video_stream_encoder.h" @@ -19,8 +20,19 @@ std::unique_ptr CreateVideoStreamEncoder( uint32_t number_of_cores, VideoStreamEncoderObserver* encoder_stats_observer, const VideoStreamEncoderSettings& settings) { + return CreateVideoStreamEncoder(&GlobalTaskQueueFactory(), number_of_cores, + encoder_stats_observer, settings); +} + +std::unique_ptr CreateVideoStreamEncoder( + TaskQueueFactory* task_queue_factory, + uint32_t number_of_cores, + VideoStreamEncoderObserver* encoder_stats_observer, + const VideoStreamEncoderSettings& settings) { return absl::make_unique( number_of_cores, encoder_stats_observer, settings, - absl::make_unique(encoder_stats_observer)); + absl::make_unique(encoder_stats_observer), + task_queue_factory); } + } // namespace webrtc diff --git a/api/video/video_stream_encoder_create.h b/api/video/video_stream_encoder_create.h index 38749da950..3923190239 100644 --- a/api/video/video_stream_encoder_create.h +++ b/api/video/video_stream_encoder_create.h @@ -14,6 +14,7 @@ #include #include +#include "api/task_queue/task_queue_factory.h" #include "api/video/video_frame.h" #include "api/video/video_sink_interface.h" #include "api/video/video_stream_encoder_interface.h" @@ -27,6 +28,11 @@ std::unique_ptr CreateVideoStreamEncoder( VideoStreamEncoderObserver* encoder_stats_observer, const VideoStreamEncoderSettings& settings); +std::unique_ptr CreateVideoStreamEncoder( + TaskQueueFactory* task_queue_factory, + uint32_t number_of_cores, + VideoStreamEncoderObserver* encoder_stats_observer, + const VideoStreamEncoderSettings& settings); } // namespace webrtc #endif // API_VIDEO_VIDEO_STREAM_ENCODER_CREATE_H_ diff --git a/call/BUILD.gn b/call/BUILD.gn index cfaae1da49..5dec127e6b 100644 --- a/call/BUILD.gn +++ b/call/BUILD.gn @@ -219,6 +219,7 @@ rtc_static_library("call") { "../api:libjingle_peerconnection_api", "../api:simulated_network_api", "../api:transport_api", + "../api/task_queue:global_task_queue_factory", "../api/transport:network_control", "../api/units:time_delta", "../api/video_codecs:video_codecs_api", diff --git a/call/call.cc b/call/call.cc index 38fca35e75..5df97e9d81 100644 --- a/call/call.cc +++ b/call/call.cc @@ -18,6 +18,7 @@ #include "absl/memory/memory.h" #include "absl/types/optional.h" +#include "api/task_queue/global_task_queue_factory.h" #include "api/transport/network_control.h" #include "audio/audio_receive_stream.h" #include "audio/audio_send_stream.h" @@ -792,8 +793,8 @@ webrtc::VideoSendStream* Call::CreateVideoSendStream( // having it injected. VideoSendStream* send_stream = new VideoSendStream( num_cpu_cores_, module_process_thread_.get(), - transport_send_ptr_->GetWorkerQueue(), call_stats_.get(), - transport_send_ptr_, bitrate_allocator_.get(), + transport_send_ptr_->GetWorkerQueue(), &GlobalTaskQueueFactory(), + call_stats_.get(), transport_send_ptr_, bitrate_allocator_.get(), video_send_delay_stats_.get(), event_log_, std::move(config), std::move(encoder_config), suspended_video_send_ssrcs_, suspended_video_payload_states_, std::move(fec_controller)); @@ -874,7 +875,7 @@ webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( RegisterRateObserver(); VideoReceiveStream* receive_stream = new VideoReceiveStream( - &video_receiver_controller_, num_cpu_cores_, + &GlobalTaskQueueFactory(), &video_receiver_controller_, num_cpu_cores_, transport_send_ptr_->packet_router(), std::move(configuration), module_process_thread_.get(), call_stats_.get()); diff --git a/common_video/BUILD.gn b/common_video/BUILD.gn index fbbfd628d5..569ae6e7bc 100644 --- a/common_video/BUILD.gn +++ b/common_video/BUILD.gn @@ -41,6 +41,7 @@ rtc_static_library("common_video") { deps = [ "..:webrtc_common", "../api:scoped_refptr", + "../api/task_queue", "../api/video:encoded_image", "../api/video:video_bitrate_allocation", "../api/video:video_bitrate_allocator", diff --git a/common_video/include/incoming_video_stream.h b/common_video/include/incoming_video_stream.h index 2274e1d1a2..0dcd4efcbf 100644 --- a/common_video/include/incoming_video_stream.h +++ b/common_video/include/incoming_video_stream.h @@ -13,6 +13,7 @@ #include +#include "api/task_queue/task_queue_factory.h" #include "api/video/video_frame.h" #include "api/video/video_sink_interface.h" #include "common_video/video_render_frames.h" @@ -24,7 +25,8 @@ namespace webrtc { class IncomingVideoStream : public rtc::VideoSinkInterface { public: - IncomingVideoStream(int32_t delay_ms, + IncomingVideoStream(TaskQueueFactory* task_queue_factory, + int32_t delay_ms, rtc::VideoSinkInterface* callback); ~IncomingVideoStream() override; diff --git a/common_video/incoming_video_stream.cc b/common_video/incoming_video_stream.cc index 96e3fa097c..6cce4ecece 100644 --- a/common_video/incoming_video_stream.cc +++ b/common_video/incoming_video_stream.cc @@ -19,17 +19,16 @@ #include "rtc_base/trace_event.h" namespace webrtc { -namespace { -const char kIncomingQueueName[] = "IncomingVideoStream"; -} IncomingVideoStream::IncomingVideoStream( + TaskQueueFactory* task_queue_factory, int32_t delay_ms, rtc::VideoSinkInterface* callback) : render_buffers_(delay_ms), callback_(callback), - incoming_render_queue_(kIncomingQueueName, - rtc::TaskQueue::Priority::HIGH) {} + incoming_render_queue_(task_queue_factory->CreateTaskQueue( + "IncomingVideoStream", + TaskQueueFactory::Priority::HIGH)) {} IncomingVideoStream::~IncomingVideoStream() { RTC_DCHECK(main_thread_checker_.CalledOnValidThread()); diff --git a/video/BUILD.gn b/video/BUILD.gn index 6f79875fdd..268aeab640 100644 --- a/video/BUILD.gn +++ b/video/BUILD.gn @@ -56,6 +56,7 @@ rtc_static_library("video") { "../api:libjingle_peerconnection_api", "../api:scoped_refptr", "../api:transport_api", + "../api/task_queue", "../api/video:encoded_image", "../api/video:video_bitrate_allocation", "../api/video:video_bitrate_allocator", @@ -478,6 +479,7 @@ if (rtc_include_tests) { "../api:mock_frame_decryptor", "../api:scoped_refptr", "../api:simulated_network_api", + "../api/task_queue:global_task_queue_factory", "../api/test/video:function_video_factory", "../api/units:data_rate", "../api/video:builtin_video_bitrate_allocator_factory", diff --git a/video/video_receive_stream.cc b/video/video_receive_stream.cc index 3cf786f266..868ae05e8c 100644 --- a/video/video_receive_stream.cc +++ b/video/video_receive_stream.cc @@ -164,6 +164,7 @@ constexpr int kInactiveStreamThresholdMs = 600000; // 10 minutes. namespace internal { VideoReceiveStream::VideoReceiveStream( + TaskQueueFactory* task_queue_factory, RtpStreamReceiverControllerInterface* receiver_controller, int num_cpu_cores, PacketRouter* packet_router, @@ -172,7 +173,8 @@ VideoReceiveStream::VideoReceiveStream( CallStats* call_stats, Clock* clock, VCMTiming* timing) - : transport_adapter_(config.rtcp_send_transport), + : task_queue_factory_(task_queue_factory), + transport_adapter_(config.rtcp_send_transport), config_(std::move(config)), num_cpu_cores_(num_cpu_cores), process_thread_(process_thread), @@ -251,13 +253,15 @@ VideoReceiveStream::VideoReceiveStream( } VideoReceiveStream::VideoReceiveStream( + TaskQueueFactory* task_queue_factory, RtpStreamReceiverControllerInterface* receiver_controller, int num_cpu_cores, PacketRouter* packet_router, VideoReceiveStream::Config config, ProcessThread* process_thread, CallStats* call_stats) - : VideoReceiveStream(receiver_controller, + : VideoReceiveStream(task_queue_factory, + receiver_controller, num_cpu_cores, packet_router, std::move(config), @@ -311,8 +315,8 @@ void VideoReceiveStream::Start() { transport_adapter_.Enable(); rtc::VideoSinkInterface* renderer = nullptr; if (config_.enable_prerenderer_smoothing) { - incoming_video_stream_.reset( - new IncomingVideoStream(config_.render_delay_ms, this)); + incoming_video_stream_.reset(new IncomingVideoStream( + task_queue_factory_, config_.render_delay_ms, this)); renderer = incoming_video_stream_.get(); } else { renderer = this; diff --git a/video/video_receive_stream.h b/video/video_receive_stream.h index 978294db78..ada5b7bb5d 100644 --- a/video/video_receive_stream.h +++ b/video/video_receive_stream.h @@ -15,6 +15,7 @@ #include #include "api/media_transport_interface.h" +#include "api/task_queue/task_queue_factory.h" #include "call/rtp_packet_sink_interface.h" #include "call/syncable.h" #include "call/video_receive_stream.h" @@ -52,7 +53,8 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream, public MediaTransportVideoSinkInterface, public MediaTransportRttObserver { public: - VideoReceiveStream(RtpStreamReceiverControllerInterface* receiver_controller, + VideoReceiveStream(TaskQueueFactory* task_queue_factory, + RtpStreamReceiverControllerInterface* receiver_controller, int num_cpu_cores, PacketRouter* packet_router, VideoReceiveStream::Config config, @@ -60,7 +62,8 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream, CallStats* call_stats, Clock* clock, VCMTiming* timing); - VideoReceiveStream(RtpStreamReceiverControllerInterface* receiver_controller, + VideoReceiveStream(TaskQueueFactory* task_queue_factory, + RtpStreamReceiverControllerInterface* receiver_controller, int num_cpu_cores, PacketRouter* packet_router, VideoReceiveStream::Config config, @@ -134,6 +137,8 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream, rtc::SequencedTaskChecker module_process_sequence_checker_; rtc::SequencedTaskChecker network_sequence_checker_; + TaskQueueFactory* const task_queue_factory_; + TransportAdapter transport_adapter_; const VideoReceiveStream::Config config_; const int num_cpu_cores_; diff --git a/video/video_receive_stream_unittest.cc b/video/video_receive_stream_unittest.cc index 0c76c86214..642143a967 100644 --- a/video/video_receive_stream_unittest.cc +++ b/video/video_receive_stream_unittest.cc @@ -14,6 +14,7 @@ #include "test/gmock.h" #include "test/gtest.h" +#include "api/task_queue/global_task_queue_factory.h" #include "api/video_codecs/video_decoder.h" #include "call/rtp_stream_receiver_controller.h" #include "media/base/fake_video_renderer.h" @@ -100,8 +101,9 @@ class VideoReceiveStreamTest : public testing::Test { timing_ = new VCMTiming(clock); video_receive_stream_.reset(new webrtc::internal::VideoReceiveStream( - &rtp_stream_receiver_controller_, kDefaultNumCpuCores, &packet_router_, - config_.Copy(), process_thread_.get(), &call_stats_, clock, timing_)); + &GlobalTaskQueueFactory(), &rtp_stream_receiver_controller_, + kDefaultNumCpuCores, &packet_router_, config_.Copy(), + process_thread_.get(), &call_stats_, clock, timing_)); } protected: diff --git a/video/video_send_stream.cc b/video/video_send_stream.cc index db90e3fb3b..222e6e45b8 100644 --- a/video/video_send_stream.cc +++ b/video/video_send_stream.cc @@ -68,6 +68,7 @@ VideoSendStream::VideoSendStream( int num_cpu_cores, ProcessThread* module_process_thread, rtc::TaskQueue* worker_queue, + TaskQueueFactory* task_queue_factory, CallStats* call_stats, RtpTransportControllerSendInterface* transport, BitrateAllocatorInterface* bitrate_allocator, @@ -87,8 +88,9 @@ VideoSendStream::VideoSendStream( RTC_DCHECK(config_.encoder_settings.encoder_factory); RTC_DCHECK(config_.encoder_settings.bitrate_allocator_factory); - video_stream_encoder_ = CreateVideoStreamEncoder(num_cpu_cores, &stats_proxy_, - config_.encoder_settings); + video_stream_encoder_ = + CreateVideoStreamEncoder(task_queue_factory, num_cpu_cores, &stats_proxy_, + config_.encoder_settings); // TODO(srte): Initialization should not be done posted on a task queue. // Note that the posted task must not outlive this scope since the closure // references local variables. diff --git a/video/video_send_stream.h b/video/video_send_stream.h index f260304fed..92600ce020 100644 --- a/video/video_send_stream.h +++ b/video/video_send_stream.h @@ -56,6 +56,7 @@ class VideoSendStream : public webrtc::VideoSendStream { int num_cpu_cores, ProcessThread* module_process_thread, rtc::TaskQueue* worker_queue, + TaskQueueFactory* task_queue_factory, CallStats* call_stats, RtpTransportControllerSendInterface* transport, BitrateAllocatorInterface* bitrate_allocator, diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc index b9b875a9b4..d13eea333a 100644 --- a/video/video_stream_encoder.cc +++ b/video/video_stream_encoder.cc @@ -422,7 +422,8 @@ VideoStreamEncoder::VideoStreamEncoder( uint32_t number_of_cores, VideoStreamEncoderObserver* encoder_stats_observer, const VideoStreamEncoderSettings& settings, - std::unique_ptr overuse_detector) + std::unique_ptr overuse_detector, + TaskQueueFactory* task_queue_factory) : shutdown_event_(true /* manual_reset */, false), number_of_cores_(number_of_cores), initial_framedrop_(0), @@ -464,7 +465,9 @@ VideoStreamEncoder::VideoStreamEncoder( next_frame_types_(1, kVideoFrameDelta), frame_encoder_timer_(this), experiment_groups_(GetExperimentGroups()), - encoder_queue_("EncoderQueue") { + encoder_queue_(task_queue_factory->CreateTaskQueue( + "EncoderQueue", + TaskQueueFactory::Priority::NORMAL)) { RTC_DCHECK(encoder_stats_observer); RTC_DCHECK(overuse_detector_); RTC_DCHECK_GE(number_of_cores, 1); diff --git a/video/video_stream_encoder.h b/video/video_stream_encoder.h index ea9cfd60db..911627a409 100644 --- a/video/video_stream_encoder.h +++ b/video/video_stream_encoder.h @@ -56,7 +56,8 @@ class VideoStreamEncoder : public VideoStreamEncoderInterface, VideoStreamEncoder(uint32_t number_of_cores, VideoStreamEncoderObserver* encoder_stats_observer, const VideoStreamEncoderSettings& settings, - std::unique_ptr overuse_detector); + std::unique_ptr overuse_detector, + TaskQueueFactory* task_queue_factory); ~VideoStreamEncoder() override; void SetSource(rtc::VideoSourceInterface* source, diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc index b247004ec2..75b47f2803 100644 --- a/video/video_stream_encoder_unittest.cc +++ b/video/video_stream_encoder_unittest.cc @@ -14,6 +14,7 @@ #include #include +#include "api/task_queue/global_task_queue_factory.h" #include "api/video/builtin_video_bitrate_allocator_factory.h" #include "api/video/i420_buffer.h" #include "api/video/video_bitrate_allocation.h" @@ -104,7 +105,8 @@ class VideoStreamEncoderUnderTest : public VideoStreamEncoder { settings, std::unique_ptr( overuse_detector_proxy_ = - new CpuOveruseDetectorProxy(stats_proxy))) {} + new CpuOveruseDetectorProxy(stats_proxy)), + &GlobalTaskQueueFactory()) {} void PostTaskAndWait(bool down, AdaptReason reason) { rtc::Event event;