Call Call::GetStats() from the correct thread in our bandwidth tests.
Bug: webrtc:10847 Change-Id: Ief8cdd72f9d5b600d5306c00c1d249c29fb20396 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/148063 Reviewed-by: Magnus Flodman <mflodman@webrtc.org> Commit-Queue: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28765}
This commit is contained in:
@ -79,12 +79,14 @@ TEST_F(BandwidthEndToEndTest, ReceiveStreamSendsRemb) {
|
|||||||
|
|
||||||
class BandwidthStatsTest : public test::EndToEndTest {
|
class BandwidthStatsTest : public test::EndToEndTest {
|
||||||
public:
|
public:
|
||||||
explicit BandwidthStatsTest(bool send_side_bwe)
|
BandwidthStatsTest(bool send_side_bwe,
|
||||||
|
test::SingleThreadedTaskQueueForTesting* task_queue)
|
||||||
: EndToEndTest(test::CallTest::kDefaultTimeoutMs),
|
: EndToEndTest(test::CallTest::kDefaultTimeoutMs),
|
||||||
sender_call_(nullptr),
|
sender_call_(nullptr),
|
||||||
receiver_call_(nullptr),
|
receiver_call_(nullptr),
|
||||||
has_seen_pacer_delay_(false),
|
has_seen_pacer_delay_(false),
|
||||||
send_side_bwe_(send_side_bwe) {}
|
send_side_bwe_(send_side_bwe),
|
||||||
|
task_queue_(task_queue) {}
|
||||||
|
|
||||||
void ModifyVideoConfigs(
|
void ModifyVideoConfigs(
|
||||||
VideoSendStream::Config* send_config,
|
VideoSendStream::Config* send_config,
|
||||||
@ -99,15 +101,22 @@ class BandwidthStatsTest : public test::EndToEndTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Called on the pacer thread.
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
Call::Stats sender_stats = sender_call_->GetStats();
|
// Stats need to be fetched on the thread where the caller objects were
|
||||||
Call::Stats receiver_stats = receiver_call_->GetStats();
|
// constructed.
|
||||||
if (!has_seen_pacer_delay_)
|
task_queue_->PostTask([this]() {
|
||||||
has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0;
|
Call::Stats sender_stats = sender_call_->GetStats();
|
||||||
if (sender_stats.send_bandwidth_bps > 0 && has_seen_pacer_delay_) {
|
if (!has_seen_pacer_delay_)
|
||||||
if (send_side_bwe_ || receiver_stats.recv_bandwidth_bps > 0)
|
has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0;
|
||||||
observation_complete_.Set();
|
|
||||||
}
|
if (sender_stats.send_bandwidth_bps > 0 && has_seen_pacer_delay_) {
|
||||||
|
Call::Stats receiver_stats = receiver_call_->GetStats();
|
||||||
|
if (send_side_bwe_ || receiver_stats.recv_bandwidth_bps > 0)
|
||||||
|
observation_complete_.Set();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return SEND_PACKET;
|
return SEND_PACKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,15 +135,16 @@ class BandwidthStatsTest : public test::EndToEndTest {
|
|||||||
Call* receiver_call_;
|
Call* receiver_call_;
|
||||||
bool has_seen_pacer_delay_;
|
bool has_seen_pacer_delay_;
|
||||||
const bool send_side_bwe_;
|
const bool send_side_bwe_;
|
||||||
|
test::SingleThreadedTaskQueueForTesting* const task_queue_;
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(BandwidthEndToEndTest, VerifySendSideBweStats) {
|
TEST_F(BandwidthEndToEndTest, VerifySendSideBweStats) {
|
||||||
BandwidthStatsTest test(true);
|
BandwidthStatsTest test(true, &task_queue_);
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BandwidthEndToEndTest, VerifyRecvSideBweStats) {
|
TEST_F(BandwidthEndToEndTest, VerifyRecvSideBweStats) {
|
||||||
BandwidthStatsTest test(false);
|
BandwidthStatsTest test(false, &task_queue_);
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,18 +156,16 @@ TEST_F(BandwidthEndToEndTest, VerifyRecvSideBweStats) {
|
|||||||
TEST_F(BandwidthEndToEndTest, RembWithSendSideBwe) {
|
TEST_F(BandwidthEndToEndTest, RembWithSendSideBwe) {
|
||||||
class BweObserver : public test::EndToEndTest {
|
class BweObserver : public test::EndToEndTest {
|
||||||
public:
|
public:
|
||||||
BweObserver()
|
explicit BweObserver(test::SingleThreadedTaskQueueForTesting* task_queue)
|
||||||
: EndToEndTest(kDefaultTimeoutMs),
|
: EndToEndTest(kDefaultTimeoutMs),
|
||||||
sender_call_(nullptr),
|
sender_call_(nullptr),
|
||||||
clock_(Clock::GetRealTimeClock()),
|
clock_(Clock::GetRealTimeClock()),
|
||||||
sender_ssrc_(0),
|
sender_ssrc_(0),
|
||||||
remb_bitrate_bps_(1000000),
|
remb_bitrate_bps_(1000000),
|
||||||
receive_transport_(nullptr),
|
receive_transport_(nullptr),
|
||||||
poller_thread_(&BitrateStatsPollingThread,
|
|
||||||
this,
|
|
||||||
"BitrateStatsPollingThread"),
|
|
||||||
state_(kWaitForFirstRampUp),
|
state_(kWaitForFirstRampUp),
|
||||||
retransmission_rate_limiter_(clock_, 1000) {}
|
retransmission_rate_limiter_(clock_, 1000),
|
||||||
|
task_queue_(task_queue) {}
|
||||||
|
|
||||||
~BweObserver() {}
|
~BweObserver() {}
|
||||||
|
|
||||||
@ -200,56 +208,52 @@ TEST_F(BandwidthEndToEndTest, RembWithSendSideBwe) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
|
void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
|
||||||
|
RTC_DCHECK(sender_call);
|
||||||
sender_call_ = sender_call;
|
sender_call_ = sender_call;
|
||||||
}
|
pending_task_ = task_queue_->PostTask([this]() { PollStats(); });
|
||||||
|
|
||||||
static void BitrateStatsPollingThread(void* obj) {
|
|
||||||
static_cast<BweObserver*>(obj)->PollStats();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PollStats() {
|
void PollStats() {
|
||||||
do {
|
pending_task_ = ~0; // for debugging purposes indicate no pending task.
|
||||||
if (sender_call_) {
|
Call::Stats stats = sender_call_->GetStats();
|
||||||
Call::Stats stats = sender_call_->GetStats();
|
switch (state_) {
|
||||||
switch (state_) {
|
case kWaitForFirstRampUp:
|
||||||
case kWaitForFirstRampUp:
|
if (stats.send_bandwidth_bps >= remb_bitrate_bps_) {
|
||||||
if (stats.send_bandwidth_bps >= remb_bitrate_bps_) {
|
state_ = kWaitForRemb;
|
||||||
state_ = kWaitForRemb;
|
remb_bitrate_bps_ /= 2;
|
||||||
remb_bitrate_bps_ /= 2;
|
rtp_rtcp_->SetRemb(
|
||||||
rtp_rtcp_->SetRemb(
|
remb_bitrate_bps_,
|
||||||
remb_bitrate_bps_,
|
std::vector<uint32_t>(&sender_ssrc_, &sender_ssrc_ + 1));
|
||||||
std::vector<uint32_t>(&sender_ssrc_, &sender_ssrc_ + 1));
|
rtp_rtcp_->SendRTCP(kRtcpRr);
|
||||||
rtp_rtcp_->SendRTCP(kRtcpRr);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kWaitForRemb:
|
|
||||||
if (stats.send_bandwidth_bps == remb_bitrate_bps_) {
|
|
||||||
state_ = kWaitForSecondRampUp;
|
|
||||||
remb_bitrate_bps_ *= 2;
|
|
||||||
rtp_rtcp_->SetRemb(
|
|
||||||
remb_bitrate_bps_,
|
|
||||||
std::vector<uint32_t>(&sender_ssrc_, &sender_ssrc_ + 1));
|
|
||||||
rtp_rtcp_->SendRTCP(kRtcpRr);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kWaitForSecondRampUp:
|
|
||||||
if (stats.send_bandwidth_bps == remb_bitrate_bps_) {
|
|
||||||
observation_complete_.Set();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
} while (!stop_event_.Wait(1000));
|
|
||||||
|
case kWaitForRemb:
|
||||||
|
if (stats.send_bandwidth_bps == remb_bitrate_bps_) {
|
||||||
|
state_ = kWaitForSecondRampUp;
|
||||||
|
remb_bitrate_bps_ *= 2;
|
||||||
|
rtp_rtcp_->SetRemb(
|
||||||
|
remb_bitrate_bps_,
|
||||||
|
std::vector<uint32_t>(&sender_ssrc_, &sender_ssrc_ + 1));
|
||||||
|
rtp_rtcp_->SendRTCP(kRtcpRr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kWaitForSecondRampUp:
|
||||||
|
if (stats.send_bandwidth_bps == remb_bitrate_bps_) {
|
||||||
|
observation_complete_.Set();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pending_task_ =
|
||||||
|
task_queue_->PostDelayedTask([this]() { PollStats(); }, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PerformTest() override {
|
void PerformTest() override {
|
||||||
poller_thread_.Start();
|
|
||||||
EXPECT_TRUE(Wait())
|
EXPECT_TRUE(Wait())
|
||||||
<< "Timed out while waiting for bitrate to change according to REMB.";
|
<< "Timed out while waiting for bitrate to change according to REMB.";
|
||||||
stop_event_.Set();
|
|
||||||
poller_thread_.Stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -261,11 +265,11 @@ TEST_F(BandwidthEndToEndTest, RembWithSendSideBwe) {
|
|||||||
int remb_bitrate_bps_;
|
int remb_bitrate_bps_;
|
||||||
std::unique_ptr<RtpRtcp> rtp_rtcp_;
|
std::unique_ptr<RtpRtcp> rtp_rtcp_;
|
||||||
test::PacketTransport* receive_transport_;
|
test::PacketTransport* receive_transport_;
|
||||||
rtc::Event stop_event_;
|
|
||||||
rtc::PlatformThread poller_thread_;
|
|
||||||
TestState state_;
|
TestState state_;
|
||||||
RateLimiter retransmission_rate_limiter_;
|
RateLimiter retransmission_rate_limiter_;
|
||||||
} test;
|
test::SingleThreadedTaskQueueForTesting* const task_queue_;
|
||||||
|
test::SingleThreadedTaskQueueForTesting::TaskId pending_task_ = ~0;
|
||||||
|
} test(&task_queue_);
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user