Fix for encoded framerate stats per layer.

Update framerate for top spatial layer instead of per timestamp (to ensure all simulcast layers are updated).

Bug: webrtc:13037
Change-Id: I4fa423dee40d74aee22a87855207b885f0536e25
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/227344
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34634}
This commit is contained in:
Åsa Persson 2021-08-03 14:43:01 +02:00 committed by WebRTC LUCI CQ
parent df7156965b
commit 8d564722d7
2 changed files with 56 additions and 1 deletions

View File

@ -1019,9 +1019,13 @@ void SendStatisticsProxy::OnSendEncodedImage(
media_byte_rate_tracker_.AddSamples(encoded_image.size());
if (uma_container_->InsertEncodedFrame(encoded_image, simulcast_idx)) {
encoded_frame_rate_trackers_[simulcast_idx]->AddSamples(1);
// First frame seen with this timestamp, track overall fps.
encoded_frame_rate_tracker_.AddSamples(1);
}
// is_top_spatial_layer pertains only to SVC, will always be true for
// simulcast.
if (is_top_spatial_layer)
encoded_frame_rate_trackers_[simulcast_idx]->AddSamples(1);
absl::optional<int> downscales =
adaptation_limitations_.MaskedQualityCounts().resolution_adaptations;

View File

@ -477,6 +477,57 @@ TEST_F(SendStatisticsProxyTest, EncodeFrameRateInSubStream) {
EXPECT_EQ(stats.substreams[ssrc].encode_frame_rate, 10);
}
TEST_F(SendStatisticsProxyTest, EncodeFrameRateInSubStreamsVp8Simulcast) {
const int kInterframeDelayMs = 100;
rtc::ScopedFakeClock fake_global_clock;
EncodedImage encoded_image;
CodecSpecificInfo codec_info;
codec_info.codecType = kVideoCodecVP8;
for (int i = 0; i < 10; ++i) {
fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs);
fake_global_clock.SetTime(
Timestamp::Millis(fake_clock_.TimeInMilliseconds()));
encoded_image.SetTimestamp(encoded_image.Timestamp() +
90 * kInterframeDelayMs);
encoded_image.SetSpatialIndex(0);
statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
encoded_image.SetSpatialIndex(1);
statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
}
VideoSendStream::Stats stats = statistics_proxy_->GetStats();
EXPECT_EQ(2u, stats.substreams.size());
EXPECT_EQ(stats.substreams[config_.rtp.ssrcs[0]].encode_frame_rate, 10);
EXPECT_EQ(stats.substreams[config_.rtp.ssrcs[1]].encode_frame_rate, 10);
}
TEST_F(SendStatisticsProxyTest, EncodeFrameRateInSubStreamsVp9Svc) {
const int kInterframeDelayMs = 100;
rtc::ScopedFakeClock fake_global_clock;
EncodedImage encoded_image;
CodecSpecificInfo codec_info;
codec_info.codecType = kVideoCodecVP9;
for (int i = 0; i < 10; ++i) {
fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs);
fake_global_clock.SetTime(
Timestamp::Millis(fake_clock_.TimeInMilliseconds()));
encoded_image.SetTimestamp(encoded_image.Timestamp() +
90 * kInterframeDelayMs);
encoded_image.SetSpatialIndex(0);
codec_info.end_of_picture = false;
statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
encoded_image.SetSpatialIndex(1);
codec_info.end_of_picture = true;
statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
}
VideoSendStream::Stats stats = statistics_proxy_->GetStats();
EXPECT_EQ(1u, stats.substreams.size());
EXPECT_EQ(stats.substreams[config_.rtp.ssrcs[0]].encode_frame_rate, 10);
}
TEST_F(SendStatisticsProxyTest, GetCpuAdaptationStats) {
VideoAdaptationCounters cpu_counts;
VideoAdaptationCounters quality_counts;