Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(684)

Unified Diff: webrtc/call/call.cc

Issue 2060403002: Add task queue to Call. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@move_getpadding
Patch Set: Fix audio thread check when adding audio to bitrateallocator. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/call/call.cc
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc
index f6354ade28e89e17037e9b03a3750058efc4b3fc..65b1d561135da35143efef77fcf85ae2d1ee169f 100644
--- a/webrtc/call/call.cc
+++ b/webrtc/call/call.cc
@@ -9,7 +9,6 @@
*/
#include <string.h>
-
#include <algorithm>
#include <map>
#include <memory>
@@ -22,6 +21,7 @@
#include "webrtc/base/checks.h"
#include "webrtc/base/constructormagic.h"
#include "webrtc/base/logging.h"
+#include "webrtc/base/task_queue.h"
#include "webrtc/base/thread_annotations.h"
#include "webrtc/base/thread_checker.h"
#include "webrtc/base/trace_event.h"
@@ -74,8 +74,8 @@ class Call : public webrtc::Call,
webrtc::AudioReceiveStream* receive_stream) override;
webrtc::VideoSendStream* CreateVideoSendStream(
- const webrtc::VideoSendStream::Config& config,
- const VideoEncoderConfig& encoder_config) override;
+ webrtc::VideoSendStream::Config config,
+ VideoEncoderConfig encoder_config) override;
void DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) override;
webrtc::VideoReceiveStream* CreateVideoReceiveStream(
@@ -198,6 +198,11 @@ class Call : public webrtc::Call,
const std::unique_ptr<CongestionController> congestion_controller_;
const std::unique_ptr<SendDelayStats> video_send_delay_stats_;
const int64_t start_ms_;
+ // TODO(perkj): |worker_queue_| is supposed to replace
+ // |module_process_thread_|.
+ // |worker_queue| is defined last to ensure all pending tasks are cancelled
+ // and deleted before any other members.
+ rtc::TaskQueue worker_queue_;
RTC_DISALLOW_COPY_AND_ASSIGN(Call);
};
@@ -249,7 +254,8 @@ Call::Call(const Call::Config& config)
congestion_controller_(
new CongestionController(clock_, this, &remb_, event_log_.get())),
video_send_delay_stats_(new SendDelayStats(clock_)),
- start_ms_(clock_->TimeInMilliseconds()) {
+ start_ms_(clock_->TimeInMilliseconds()),
+ worker_queue_("call_worker_queue") {
RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0);
RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps,
@@ -279,6 +285,7 @@ Call::Call(const Call::Config& config)
Call::~Call() {
RTC_DCHECK(!remb_.InUse());
RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
+
RTC_CHECK(audio_send_ssrcs_.empty());
RTC_CHECK(video_send_ssrcs_.empty());
RTC_CHECK(video_send_streams_.empty());
@@ -297,7 +304,10 @@ Call::~Call() {
// Only update histograms after process threads have been shut down, so that
// they won't try to concurrently update stats.
- UpdateSendHistograms();
+ {
+ rtc::CritScope lock(&bitrate_crit_);
+ UpdateSendHistograms();
+ }
UpdateReceiveHistograms();
UpdateHistograms();
@@ -369,7 +379,7 @@ webrtc::AudioSendStream* Call::CreateAudioSendStream(
TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream");
RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
AudioSendStream* send_stream = new AudioSendStream(
- config, config_.audio_state, congestion_controller_.get(),
+ config, config_.audio_state, &worker_queue_, congestion_controller_.get(),
bitrate_allocator_.get());
{
WriteLockScoped write_lock(*send_crit_);
@@ -445,22 +455,28 @@ void Call::DestroyAudioReceiveStream(
}
webrtc::VideoSendStream* Call::CreateVideoSendStream(
- const webrtc::VideoSendStream::Config& config,
- const VideoEncoderConfig& encoder_config) {
+ webrtc::VideoSendStream::Config config,
+ VideoEncoderConfig encoder_config) {
TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream");
RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
video_send_delay_stats_->AddSsrcs(config);
+ event_log_->LogVideoSendStreamConfig(config);
+
// TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if
// the call has already started.
+ // Copy ssrcs from |config| since |config| is moved.
+ std::vector<uint32_t> ssrcs = config.rtp.ssrcs;
VideoSendStream* send_stream = new VideoSendStream(
- num_cpu_cores_, module_process_thread_.get(), call_stats_.get(),
- congestion_controller_.get(), bitrate_allocator_.get(),
- video_send_delay_stats_.get(), &remb_, event_log_.get(), config,
- encoder_config, suspended_video_send_ssrcs_);
+ num_cpu_cores_, module_process_thread_.get(), &worker_queue_,
+ call_stats_.get(), congestion_controller_.get(), bitrate_allocator_.get(),
+ video_send_delay_stats_.get(), &remb_, event_log_.get(),
+ std::move(config), std::move(encoder_config),
+ suspended_video_send_ssrcs_);
+
{
WriteLockScoped write_lock(*send_crit_);
- for (uint32_t ssrc : config.rtp.ssrcs) {
+ for (uint32_t ssrc : ssrcs) {
RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end());
video_send_ssrcs_[ssrc] = send_stream;
}
@@ -468,7 +484,7 @@ webrtc::VideoSendStream* Call::CreateVideoSendStream(
}
send_stream->SignalNetworkState(video_network_state_);
UpdateAggregateNetworkState();
- event_log_->LogVideoSendStreamConfig(config);
+
return send_stream;
}
@@ -495,11 +511,11 @@ void Call::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
}
RTC_CHECK(send_stream_impl != nullptr);
- VideoSendStream::RtpStateMap rtp_state = send_stream_impl->GetRtpStates();
+ VideoSendStream::RtpStateMap rtp_state =
+ send_stream_impl->StopPermanentlyAndGetRtpStates();
for (VideoSendStream::RtpStateMap::iterator it = rtp_state.begin();
- it != rtp_state.end();
- ++it) {
+ it != rtp_state.end(); ++it) {
suspended_video_send_ssrcs_[it->first] = it->second;
}
@@ -729,6 +745,15 @@ void Call::OnSentPacket(const rtc::SentPacket& sent_packet) {
void Call::OnNetworkChanged(uint32_t target_bitrate_bps, uint8_t fraction_loss,
int64_t rtt_ms) {
+ // TODO(perkj): Consider making sure CongestionController operates on
+ // |worker_queue_|.
+ if (!worker_queue_.IsCurrent()) {
+ worker_queue_.PostTask([this, target_bitrate_bps, fraction_loss, rtt_ms] {
+ OnNetworkChanged(target_bitrate_bps, fraction_loss, rtt_ms);
+ });
+ return;
+ }
+ RTC_DCHECK_RUN_ON(&worker_queue_);
bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss,
rtt_ms);

Powered by Google App Engine
This is Rietveld 408576698