Fix frame counters for peers added in the middle of the call
Bug: b/196035476 Change-Id: Ie49ab247a2ff8bda680e4586f7316af8eaa8fe56 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/228429 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Artem Titov <titovartem@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34724}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
6e2458d888
commit
897bf9bff1
@ -510,20 +510,34 @@ void DefaultVideoQualityAnalyzer::RegisterParticipantInCall(
|
|||||||
MutexLock lock1(&lock_);
|
MutexLock lock1(&lock_);
|
||||||
MutexLock lock2(&comparison_lock_);
|
MutexLock lock2(&comparison_lock_);
|
||||||
RTC_CHECK(!peers_->HasName(peer_name));
|
RTC_CHECK(!peers_->HasName(peer_name));
|
||||||
peers_->AddIfAbsent(peer_name);
|
size_t new_peer_index = peers_->AddIfAbsent(peer_name);
|
||||||
|
|
||||||
// Ensure stats for receiving (for frames from other peers to this one)
|
// Ensure stats for receiving (for frames from other peers to this one)
|
||||||
// streams exists. Since in flight frames will be sent to the new peer
|
// streams exists. Since in flight frames will be sent to the new peer
|
||||||
// as well. Sending stats (from this peer to others) will be added by
|
// as well. Sending stats (from this peer to others) will be added by
|
||||||
// DefaultVideoQualityAnalyzer::OnFrameCaptured.
|
// DefaultVideoQualityAnalyzer::OnFrameCaptured.
|
||||||
for (auto& key_val : stream_to_sender_) {
|
for (auto& key_val : stream_to_sender_) {
|
||||||
InternalStatsKey key(key_val.first, key_val.second,
|
size_t stream_index = key_val.first;
|
||||||
peers_->index(peer_name));
|
size_t sender_peer_index = key_val.second;
|
||||||
const int64_t frames_count = captured_frames_in_flight_.size();
|
InternalStatsKey key(stream_index, sender_peer_index, new_peer_index);
|
||||||
|
|
||||||
|
// To initiate `FrameCounters` for the stream we should pick frame
|
||||||
|
// counters with the same stream index and the same sender's peer index
|
||||||
|
// and any receiver's peer index and copy from its sender side
|
||||||
|
// counters.
|
||||||
FrameCounters counters;
|
FrameCounters counters;
|
||||||
counters.captured = frames_count;
|
for (size_t i = 0; i < peers_->size(); ++i) {
|
||||||
counters.pre_encoded = frames_count;
|
InternalStatsKey prototype_key(stream_index, sender_peer_index, i);
|
||||||
counters.encoded = frames_count;
|
auto it = stream_frame_counters_.find(prototype_key);
|
||||||
|
if (it != stream_frame_counters_.end()) {
|
||||||
|
counters.captured = it->second.captured;
|
||||||
|
counters.pre_encoded = it->second.pre_encoded;
|
||||||
|
counters.encoded = it->second.encoded;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// It may happen if we had only one peer before this method was invoked,
|
||||||
|
// then `counters` will be empty. In such case empty `counters` are ok.
|
||||||
stream_frame_counters_.insert({key, std::move(counters)});
|
stream_frame_counters_.insert({key, std::move(counters)});
|
||||||
|
|
||||||
stream_stats_.insert({key, StreamStats()});
|
stream_stats_.insert({key, StreamStats()});
|
||||||
|
@ -883,9 +883,9 @@ TEST(DefaultVideoQualityAnalyzerTest, RuntimeParticipantsAdding) {
|
|||||||
{
|
{
|
||||||
FrameCounters stream_conters =
|
FrameCounters stream_conters =
|
||||||
analyzer.GetPerStreamCounters().at(kAliceCharlieStats);
|
analyzer.GetPerStreamCounters().at(kAliceCharlieStats);
|
||||||
EXPECT_EQ(stream_conters.captured, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.captured, kFramesCount);
|
||||||
EXPECT_EQ(stream_conters.pre_encoded, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.pre_encoded, kFramesCount);
|
||||||
EXPECT_EQ(stream_conters.encoded, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.encoded, kFramesCount);
|
||||||
EXPECT_EQ(stream_conters.received, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.received, kTwoThirdFrames);
|
||||||
EXPECT_EQ(stream_conters.decoded, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.decoded, kTwoThirdFrames);
|
||||||
EXPECT_EQ(stream_conters.rendered, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.rendered, kTwoThirdFrames);
|
||||||
@ -893,9 +893,9 @@ TEST(DefaultVideoQualityAnalyzerTest, RuntimeParticipantsAdding) {
|
|||||||
{
|
{
|
||||||
FrameCounters stream_conters =
|
FrameCounters stream_conters =
|
||||||
analyzer.GetPerStreamCounters().at(kAliceKatieStats);
|
analyzer.GetPerStreamCounters().at(kAliceKatieStats);
|
||||||
EXPECT_EQ(stream_conters.captured, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.captured, kFramesCount);
|
||||||
EXPECT_EQ(stream_conters.pre_encoded, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.pre_encoded, kFramesCount);
|
||||||
EXPECT_EQ(stream_conters.encoded, kTwoThirdFrames);
|
EXPECT_EQ(stream_conters.encoded, kFramesCount);
|
||||||
EXPECT_EQ(stream_conters.received, kOneThirdFrames);
|
EXPECT_EQ(stream_conters.received, kOneThirdFrames);
|
||||||
EXPECT_EQ(stream_conters.decoded, kOneThirdFrames);
|
EXPECT_EQ(stream_conters.decoded, kOneThirdFrames);
|
||||||
EXPECT_EQ(stream_conters.rendered, kOneThirdFrames);
|
EXPECT_EQ(stream_conters.rendered, kOneThirdFrames);
|
||||||
|
Reference in New Issue
Block a user