blob: acb8a306cae1e83f16e51e6c60ea0c8e583b45ef [file] [log] [blame]
sprang@webrtc.orgccd42842014-01-07 09:54:341/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
sprang@webrtc.orgccd42842014-01-07 09:54:3411#include "webrtc/video/send_statistics_proxy.h"
12
13#include <map>
kwiberg27f982b2016-03-01 19:52:3314#include <memory>
sprang@webrtc.orgccd42842014-01-07 09:54:3415#include <string>
16#include <vector>
17
sprang07fb9be2016-02-24 15:55:0018#include "webrtc/system_wrappers/include/metrics.h"
asapersson01d70a32016-05-20 13:29:4619#include "webrtc/system_wrappers/include/metrics_default.h"
kwibergac9f8762016-10-01 05:29:4320#include "webrtc/test/gtest.h"
sprang@webrtc.orgccd42842014-01-07 09:54:3421
22namespace webrtc {
asapersson5265fed2016-04-18 09:58:4723namespace {
24const uint32_t kFirstSsrc = 17;
25const uint32_t kSecondSsrc = 42;
26const uint32_t kFirstRtxSsrc = 18;
27const uint32_t kSecondRtxSsrc = 43;
asaperssona6a699a2016-11-25 11:52:4628const uint32_t kFlexFecSsrc = 55;
asapersson320e45a2016-11-29 09:40:3529const int kFpsPeriodicIntervalMs = 2000;
30const int kWidth = 640;
31const int kHeight = 480;
asapersson5265fed2016-04-18 09:58:4732const int kQpIdx0 = 21;
33const int kQpIdx1 = 39;
kthelgason0cd27ba2016-12-19 14:32:1634const CodecSpecificInfo kDefaultCodecInfo = []() {
35 CodecSpecificInfo codec_info;
36 codec_info.codecType = kVideoCodecVP8;
37 codec_info.codecSpecific.VP8.simulcastIdx = 0;
38 return codec_info;
39}();
asapersson5265fed2016-04-18 09:58:4740} // namespace
sprang07fb9be2016-02-24 15:55:0041
stefan@webrtc.org168f23f2014-07-11 13:44:0242class SendStatisticsProxyTest : public ::testing::Test {
sprang@webrtc.orgccd42842014-01-07 09:54:3443 public:
pbos@webrtc.org273a4142014-12-01 15:23:2144 SendStatisticsProxyTest()
solenberg4fbae2b2015-08-28 11:07:1045 : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0),
46 max_delay_ms_(0) {}
sprang@webrtc.orgccd42842014-01-07 09:54:3447 virtual ~SendStatisticsProxyTest() {}
48
49 protected:
50 virtual void SetUp() {
asapersson01d70a32016-05-20 13:29:4651 metrics::Reset();
sprangb4a1ae52015-12-03 16:10:0852 statistics_proxy_.reset(new SendStatisticsProxy(
53 &fake_clock_, GetTestConfig(),
54 VideoEncoderConfig::ContentType::kRealtimeVideo));
sprang@webrtc.orgccd42842014-01-07 09:54:3455 expected_ = VideoSendStream::Stats();
asapersson2e5cfcd2016-08-11 15:41:1856 for (const auto& ssrc : config_.rtp.ssrcs)
57 expected_.substreams[ssrc].is_rtx = false;
58 for (const auto& ssrc : config_.rtp.rtx.ssrcs)
59 expected_.substreams[ssrc].is_rtx = true;
sprang@webrtc.orgccd42842014-01-07 09:54:3460 }
61
62 VideoSendStream::Config GetTestConfig() {
solenberg4fbae2b2015-08-28 11:07:1063 VideoSendStream::Config config(nullptr);
sprang07fb9be2016-02-24 15:55:0064 config.rtp.ssrcs.push_back(kFirstSsrc);
65 config.rtp.ssrcs.push_back(kSecondSsrc);
66 config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc);
67 config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc);
brandtrb5f2c3f2016-10-05 06:28:3968 config.rtp.ulpfec.red_payload_type = 17;
sprang@webrtc.orgccd42842014-01-07 09:54:3469 return config;
70 }
71
asaperssona6a699a2016-11-25 11:52:4672 VideoSendStream::Config GetTestConfigWithFlexFec() {
73 VideoSendStream::Config config(nullptr);
74 config.rtp.ssrcs.push_back(kFirstSsrc);
75 config.rtp.ssrcs.push_back(kSecondSsrc);
76 config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc);
77 config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc);
78 config.rtp.flexfec.flexfec_payload_type = 50;
79 config.rtp.flexfec.flexfec_ssrc = kFlexFecSsrc;
80 return config;
81 }
82
83 VideoSendStream::StreamStats GetStreamStats(uint32_t ssrc) {
84 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
85 std::map<uint32_t, VideoSendStream::StreamStats>::iterator it =
86 stats.substreams.find(ssrc);
87 EXPECT_NE(it, stats.substreams.end());
88 return it->second;
89 }
90
sprang@webrtc.org09315702014-02-07 12:06:2991 void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) {
sprang@webrtc.org09315702014-02-07 12:06:2992 EXPECT_EQ(one.input_frame_rate, other.input_frame_rate);
93 EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate);
stefan@webrtc.org0bae1fa2014-11-05 14:05:2994 EXPECT_EQ(one.media_bitrate_bps, other.media_bitrate_bps);
Pera48ddb72016-09-29 09:48:5095 EXPECT_EQ(one.preferred_media_bitrate_bps,
96 other.preferred_media_bitrate_bps);
henrik.lundin@webrtc.orgb10363f32014-03-13 13:31:2197 EXPECT_EQ(one.suspended, other.suspended);
sprang@webrtc.org09315702014-02-07 12:06:2998
99 EXPECT_EQ(one.substreams.size(), other.substreams.size());
pbos@webrtc.org09c77b92015-02-25 10:42:16100 for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it =
sprang@webrtc.org09315702014-02-07 12:06:29101 one.substreams.begin();
pbos@webrtc.org09c77b92015-02-25 10:42:16102 it != one.substreams.end(); ++it) {
103 std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator
104 corresponding_it = other.substreams.find(it->first);
sprang@webrtc.org09315702014-02-07 12:06:29105 ASSERT_TRUE(corresponding_it != other.substreams.end());
pbos@webrtc.org09c77b92015-02-25 10:42:16106 const VideoSendStream::StreamStats& a = it->second;
107 const VideoSendStream::StreamStats& b = corresponding_it->second;
sprang@webrtc.org09315702014-02-07 12:06:29108
asapersson2e5cfcd2016-08-11 15:41:18109 EXPECT_EQ(a.is_rtx, b.is_rtx);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16110 EXPECT_EQ(a.frame_counts.key_frames, b.frame_counts.key_frames);
111 EXPECT_EQ(a.frame_counts.delta_frames, b.frame_counts.delta_frames);
stefan@webrtc.org0bae1fa2014-11-05 14:05:29112 EXPECT_EQ(a.total_bitrate_bps, b.total_bitrate_bps);
stefan@webrtc.org168f23f2014-07-11 13:44:02113 EXPECT_EQ(a.avg_delay_ms, b.avg_delay_ms);
114 EXPECT_EQ(a.max_delay_ms, b.max_delay_ms);
sprang@webrtc.org09315702014-02-07 12:06:29115
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59116 EXPECT_EQ(a.rtp_stats.transmitted.payload_bytes,
117 b.rtp_stats.transmitted.payload_bytes);
118 EXPECT_EQ(a.rtp_stats.transmitted.header_bytes,
119 b.rtp_stats.transmitted.header_bytes);
120 EXPECT_EQ(a.rtp_stats.transmitted.padding_bytes,
121 b.rtp_stats.transmitted.padding_bytes);
122 EXPECT_EQ(a.rtp_stats.transmitted.packets,
123 b.rtp_stats.transmitted.packets);
124 EXPECT_EQ(a.rtp_stats.retransmitted.packets,
125 b.rtp_stats.retransmitted.packets);
126 EXPECT_EQ(a.rtp_stats.fec.packets, b.rtp_stats.fec.packets);
sprang@webrtc.org09315702014-02-07 12:06:29127
128 EXPECT_EQ(a.rtcp_stats.fraction_lost, b.rtcp_stats.fraction_lost);
129 EXPECT_EQ(a.rtcp_stats.cumulative_lost, b.rtcp_stats.cumulative_lost);
130 EXPECT_EQ(a.rtcp_stats.extended_max_sequence_number,
131 b.rtcp_stats.extended_max_sequence_number);
132 EXPECT_EQ(a.rtcp_stats.jitter, b.rtcp_stats.jitter);
133 }
134 }
135
pbos@webrtc.org273a4142014-12-01 15:23:21136 SimulatedClock fake_clock_;
kwiberg27f982b2016-03-01 19:52:33137 std::unique_ptr<SendStatisticsProxy> statistics_proxy_;
sprang@webrtc.orgccd42842014-01-07 09:54:34138 VideoSendStream::Config config_;
139 int avg_delay_ms_;
140 int max_delay_ms_;
sprang@webrtc.orgccd42842014-01-07 09:54:34141 VideoSendStream::Stats expected_;
pbos@webrtc.org09c77b92015-02-25 10:42:16142 typedef std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator
143 StreamIterator;
sprang@webrtc.orgccd42842014-01-07 09:54:34144};
145
146TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
147 RtcpStatisticsCallback* callback = statistics_proxy_.get();
asapersson35151f32016-05-03 06:44:01148 for (const auto& ssrc : config_.rtp.ssrcs) {
pbos@webrtc.org09c77b92015-02-25 10:42:16149 VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
sprang@webrtc.orgccd42842014-01-07 09:54:34150
151 // Add statistics with some arbitrary, but unique, numbers.
152 uint32_t offset = ssrc * sizeof(RtcpStatistics);
153 ssrc_stats.rtcp_stats.cumulative_lost = offset;
154 ssrc_stats.rtcp_stats.extended_max_sequence_number = offset + 1;
155 ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
156 ssrc_stats.rtcp_stats.jitter = offset + 3;
157 callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
158 }
asapersson35151f32016-05-03 06:44:01159 for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
pbos@webrtc.org09c77b92015-02-25 10:42:16160 VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
sprang@webrtc.orgccd42842014-01-07 09:54:34161
stefan@webrtc.org58e2d262014-08-14 15:10:49162 // Add statistics with some arbitrary, but unique, numbers.
163 uint32_t offset = ssrc * sizeof(RtcpStatistics);
164 ssrc_stats.rtcp_stats.cumulative_lost = offset;
165 ssrc_stats.rtcp_stats.extended_max_sequence_number = offset + 1;
166 ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
167 ssrc_stats.rtcp_stats.jitter = offset + 3;
168 callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
169 }
sprang@webrtc.orgccd42842014-01-07 09:54:34170 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29171 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34172}
173
stefan@webrtc.org0bae1fa2014-11-05 14:05:29174TEST_F(SendStatisticsProxyTest, EncodedBitrateAndFramerate) {
Peter Boström7083e112015-09-22 14:28:51175 int media_bitrate_bps = 500;
176 int encode_fps = 29;
stefan@webrtc.org0bae1fa2014-11-05 14:05:29177
perkj275afc52016-09-01 07:21:16178 statistics_proxy_->OnEncoderStatsUpdate(encode_fps, media_bitrate_bps);
stefan@webrtc.org0bae1fa2014-11-05 14:05:29179
180 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
181 EXPECT_EQ(media_bitrate_bps, stats.media_bitrate_bps);
sprang@webrtc.orgccd42842014-01-07 09:54:34182 EXPECT_EQ(encode_fps, stats.encode_frame_rate);
183}
184
henrik.lundin@webrtc.orgb10363f32014-03-13 13:31:21185TEST_F(SendStatisticsProxyTest, Suspended) {
186 // Verify that the value is false by default.
187 EXPECT_FALSE(statistics_proxy_->GetStats().suspended);
188
189 // Verify that we can set it to true.
Peter Boström7083e112015-09-22 14:28:51190 statistics_proxy_->OnSuspendChange(true);
henrik.lundin@webrtc.orgb10363f32014-03-13 13:31:21191 EXPECT_TRUE(statistics_proxy_->GetStats().suspended);
192
193 // Verify that we can set it back to false again.
Peter Boström7083e112015-09-22 14:28:51194 statistics_proxy_->OnSuspendChange(false);
henrik.lundin@webrtc.orgb10363f32014-03-13 13:31:21195 EXPECT_FALSE(statistics_proxy_->GetStats().suspended);
196}
197
sprang@webrtc.orgccd42842014-01-07 09:54:34198TEST_F(SendStatisticsProxyTest, FrameCounts) {
199 FrameCountObserver* observer = statistics_proxy_.get();
asapersson35151f32016-05-03 06:44:01200 for (const auto& ssrc : config_.rtp.ssrcs) {
sprang@webrtc.orgccd42842014-01-07 09:54:34201 // Add statistics with some arbitrary, but unique, numbers.
pbos@webrtc.org09c77b92015-02-25 10:42:16202 VideoSendStream::StreamStats& stats = expected_.substreams[ssrc];
203 uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16204 FrameCounts frame_counts;
205 frame_counts.key_frames = offset;
206 frame_counts.delta_frames = offset + 1;
207 stats.frame_counts = frame_counts;
208 observer->FrameCountUpdated(frame_counts, ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34209 }
asapersson35151f32016-05-03 06:44:01210 for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
stefan@webrtc.org58e2d262014-08-14 15:10:49211 // Add statistics with some arbitrary, but unique, numbers.
pbos@webrtc.org09c77b92015-02-25 10:42:16212 VideoSendStream::StreamStats& stats = expected_.substreams[ssrc];
213 uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16214 FrameCounts frame_counts;
215 frame_counts.key_frames = offset;
216 frame_counts.delta_frames = offset + 1;
217 stats.frame_counts = frame_counts;
218 observer->FrameCountUpdated(frame_counts, ssrc);
stefan@webrtc.org58e2d262014-08-14 15:10:49219 }
sprang@webrtc.orgccd42842014-01-07 09:54:34220
221 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29222 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34223}
224
225TEST_F(SendStatisticsProxyTest, DataCounters) {
226 StreamDataCountersCallback* callback = statistics_proxy_.get();
asapersson35151f32016-05-03 06:44:01227 for (const auto& ssrc : config_.rtp.ssrcs) {
sprang@webrtc.orgccd42842014-01-07 09:54:34228 StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats;
229 // Add statistics with some arbitrary, but unique, numbers.
pkasting@chromium.org4591fbd2014-11-20 22:28:14230 size_t offset = ssrc * sizeof(StreamDataCounters);
231 uint32_t offset_uint32 = static_cast<uint32_t>(offset);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59232 counters.transmitted.payload_bytes = offset;
233 counters.transmitted.header_bytes = offset + 1;
234 counters.fec.packets = offset_uint32 + 2;
235 counters.transmitted.padding_bytes = offset + 3;
236 counters.retransmitted.packets = offset_uint32 + 4;
237 counters.transmitted.packets = offset_uint32 + 5;
sprang@webrtc.orgccd42842014-01-07 09:54:34238 callback->DataCountersUpdated(counters, ssrc);
239 }
asapersson35151f32016-05-03 06:44:01240 for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
stefan@webrtc.org58e2d262014-08-14 15:10:49241 StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats;
242 // Add statistics with some arbitrary, but unique, numbers.
pkasting@chromium.org4591fbd2014-11-20 22:28:14243 size_t offset = ssrc * sizeof(StreamDataCounters);
244 uint32_t offset_uint32 = static_cast<uint32_t>(offset);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59245 counters.transmitted.payload_bytes = offset;
246 counters.transmitted.header_bytes = offset + 1;
247 counters.fec.packets = offset_uint32 + 2;
248 counters.transmitted.padding_bytes = offset + 3;
249 counters.retransmitted.packets = offset_uint32 + 4;
250 counters.transmitted.packets = offset_uint32 + 5;
stefan@webrtc.org58e2d262014-08-14 15:10:49251 callback->DataCountersUpdated(counters, ssrc);
252 }
sprang@webrtc.orgccd42842014-01-07 09:54:34253
254 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29255 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34256}
257
258TEST_F(SendStatisticsProxyTest, Bitrate) {
259 BitrateStatisticsObserver* observer = statistics_proxy_.get();
asapersson35151f32016-05-03 06:44:01260 for (const auto& ssrc : config_.rtp.ssrcs) {
sprangcd349d92016-07-13 16:11:28261 uint32_t total;
262 uint32_t retransmit;
stefan@webrtc.org168f23f2014-07-11 13:44:02263 // Use ssrc as bitrate_bps to get a unique value for each stream.
sprangcd349d92016-07-13 16:11:28264 total = ssrc;
265 retransmit = ssrc + 1;
stefan@webrtc.org0bae1fa2014-11-05 14:05:29266 observer->Notify(total, retransmit, ssrc);
sprangcd349d92016-07-13 16:11:28267 expected_.substreams[ssrc].total_bitrate_bps = total;
268 expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit;
sprang@webrtc.orgccd42842014-01-07 09:54:34269 }
asapersson35151f32016-05-03 06:44:01270 for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
sprangcd349d92016-07-13 16:11:28271 uint32_t total;
272 uint32_t retransmit;
stefan@webrtc.org58e2d262014-08-14 15:10:49273 // Use ssrc as bitrate_bps to get a unique value for each stream.
sprangcd349d92016-07-13 16:11:28274 total = ssrc;
275 retransmit = ssrc + 1;
stefan@webrtc.org0bae1fa2014-11-05 14:05:29276 observer->Notify(total, retransmit, ssrc);
sprangcd349d92016-07-13 16:11:28277 expected_.substreams[ssrc].total_bitrate_bps = total;
278 expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit;
stefan@webrtc.org58e2d262014-08-14 15:10:49279 }
sprang@webrtc.orgccd42842014-01-07 09:54:34280
281 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29282 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34283}
284
stefan@webrtc.org168f23f2014-07-11 13:44:02285TEST_F(SendStatisticsProxyTest, SendSideDelay) {
286 SendSideDelayObserver* observer = statistics_proxy_.get();
asapersson35151f32016-05-03 06:44:01287 for (const auto& ssrc : config_.rtp.ssrcs) {
stefan@webrtc.org168f23f2014-07-11 13:44:02288 // Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each
289 // stream.
290 int avg_delay_ms = ssrc;
291 int max_delay_ms = ssrc + 1;
292 observer->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
293 expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms;
294 expected_.substreams[ssrc].max_delay_ms = max_delay_ms;
295 }
asapersson35151f32016-05-03 06:44:01296 for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
stefan@webrtc.org58e2d262014-08-14 15:10:49297 // Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each
298 // stream.
299 int avg_delay_ms = ssrc;
300 int max_delay_ms = ssrc + 1;
301 observer->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
302 expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms;
303 expected_.substreams[ssrc].max_delay_ms = max_delay_ms;
304 }
sprang@webrtc.orgccd42842014-01-07 09:54:34305 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
stefan@webrtc.org168f23f2014-07-11 13:44:02306 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34307}
308
Peter Boströme4499152016-02-05 10:13:28309TEST_F(SendStatisticsProxyTest, OnEncodedFrameTimeMeasured) {
asapersson1aa420b2015-12-07 11:12:22310 const int kEncodeTimeMs = 11;
Peter Boströme4499152016-02-05 10:13:28311 CpuOveruseMetrics metrics;
312 metrics.encode_usage_percent = 80;
313 statistics_proxy_->OnEncodedFrameTimeMeasured(kEncodeTimeMs, metrics);
asapersson1aa420b2015-12-07 11:12:22314
315 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
316 EXPECT_EQ(kEncodeTimeMs, stats.avg_encode_time_ms);
Peter Boströme4499152016-02-05 10:13:28317 EXPECT_EQ(metrics.encode_usage_percent, stats.encode_usage_percent);
asapersson1aa420b2015-12-07 11:12:22318}
319
Pera48ddb72016-09-29 09:48:50320TEST_F(SendStatisticsProxyTest, OnEncoderReconfiguredChangePreferredBitrate) {
321 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
322 EXPECT_EQ(0, stats.preferred_media_bitrate_bps);
323 const int kPreferredMediaBitrateBps = 50;
324
325 VideoEncoderConfig config;
326 statistics_proxy_->OnEncoderReconfigured(config, kPreferredMediaBitrateBps);
327 stats = statistics_proxy_->GetStats();
328 EXPECT_EQ(kPreferredMediaBitrateBps, stats.preferred_media_bitrate_bps);
329}
330
sakal43536c32016-10-24 08:46:43331TEST_F(SendStatisticsProxyTest, OnSendEncodedImageIncreasesFramesEncoded) {
332 EncodedImage encoded_image;
333 CodecSpecificInfo codec_info;
334 EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_encoded);
335 for (uint32_t i = 1; i <= 3; ++i) {
336 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
337 EXPECT_EQ(i, statistics_proxy_->GetStats().frames_encoded);
338 }
339}
340
sakal87da4042016-10-31 13:53:47341TEST_F(SendStatisticsProxyTest, OnSendEncodedImageIncreasesQpSum) {
342 EncodedImage encoded_image;
343 CodecSpecificInfo codec_info;
344 EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
345 encoded_image.qp_ = 3;
346 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
347 EXPECT_EQ(rtc::Optional<uint64_t>(3u), statistics_proxy_->GetStats().qp_sum);
348 encoded_image.qp_ = 127;
349 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
350 EXPECT_EQ(rtc::Optional<uint64_t>(130u),
351 statistics_proxy_->GetStats().qp_sum);
352}
353
354TEST_F(SendStatisticsProxyTest, OnSendEncodedImageWithoutQpQpSumWontExist) {
355 EncodedImage encoded_image;
356 CodecSpecificInfo codec_info;
357 encoded_image.qp_ = -1;
358 EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
359 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
360 EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
361}
362
asapersson59bac1a2016-01-08 07:36:00363TEST_F(SendStatisticsProxyTest, SwitchContentTypeUpdatesHistograms) {
perkj803d97f2016-11-01 18:45:46364 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
asapersson59bac1a2016-01-08 07:36:00365 statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
366
Pera48ddb72016-09-29 09:48:50367 // No switch, stats should not be updated.
368 VideoEncoderConfig config;
369 config.content_type = VideoEncoderConfig::ContentType::kRealtimeVideo;
370 statistics_proxy_->OnEncoderReconfigured(config, 50);
asapersson01d70a32016-05-20 13:29:46371 EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.InputWidthInPixels"));
asapersson59bac1a2016-01-08 07:36:00372
373 // Switch to screenshare, real-time stats should be updated.
Pera48ddb72016-09-29 09:48:50374 config.content_type = VideoEncoderConfig::ContentType::kScreen;
375 statistics_proxy_->OnEncoderReconfigured(config, 50);
asapersson01d70a32016-05-20 13:29:46376 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputWidthInPixels"));
asapersson59bac1a2016-01-08 07:36:00377}
378
asapersson320e45a2016-11-29 09:40:35379TEST_F(SendStatisticsProxyTest, InputResolutionHistogramsAreUpdated) {
380 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
381 statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
perkj803d97f2016-11-01 18:45:46382
asapersson320e45a2016-11-29 09:40:35383 statistics_proxy_.reset();
384 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputWidthInPixels"));
385 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputWidthInPixels", kWidth));
386 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputHeightInPixels"));
387 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputHeightInPixels", kHeight));
388}
389
390TEST_F(SendStatisticsProxyTest, SentResolutionHistogramsAreUpdated) {
391 EncodedImage encoded_image;
392 encoded_image._encodedWidth = kWidth;
393 encoded_image._encodedHeight = kHeight;
394 for (int i = 0; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
395 encoded_image._timeStamp = i + 1;
396 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
397 }
398 statistics_proxy_.reset();
399 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentWidthInPixels"));
400 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentWidthInPixels", kWidth));
401 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentHeightInPixels"));
402 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentHeightInPixels", kHeight));
403}
404
405TEST_F(SendStatisticsProxyTest, InputFpsHistogramIsUpdated) {
406 const int kFps = 20;
407 const int kMinPeriodicSamples = 6;
408 int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000;
409 for (int i = 0; i <= frames; ++i) {
410 fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
411 statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
412 }
413 statistics_proxy_.reset();
414 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputFramesPerSecond"));
415 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputFramesPerSecond", kFps));
416}
417
418TEST_F(SendStatisticsProxyTest, SentFpsHistogramIsUpdated) {
419 EncodedImage encoded_image;
420 const int kFps = 20;
421 const int kMinPeriodicSamples = 6;
422 int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000 + 1;
423 for (int i = 0; i <= frames; ++i) {
424 fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
425 encoded_image._timeStamp = i + 1;
426 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
427 }
428 statistics_proxy_.reset();
429 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentFramesPerSecond"));
430 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentFramesPerSecond", kFps));
431}
432
433TEST_F(SendStatisticsProxyTest, InputFpsHistogramExcludesSuspendedTime) {
434 const int kFps = 20;
435 const int kSuspendTimeMs = 10000;
436 const int kMinPeriodicSamples = 6;
437 int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000;
438 for (int i = 0; i < frames; ++i) {
439 fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
440 statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
441 }
442 // Suspend.
443 statistics_proxy_->OnSuspendChange(true);
444 fake_clock_.AdvanceTimeMilliseconds(kSuspendTimeMs);
445
446 for (int i = 0; i < frames; ++i) {
447 fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
448 statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
449 }
450 // Suspended time interval should not affect the framerate.
451 statistics_proxy_.reset();
452 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputFramesPerSecond"));
453 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputFramesPerSecond", kFps));
454}
455
456TEST_F(SendStatisticsProxyTest, SentFpsHistogramExcludesSuspendedTime) {
457 EncodedImage encoded_image;
458 const int kFps = 20;
459 const int kSuspendTimeMs = 10000;
460 const int kMinPeriodicSamples = 6;
461 int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000;
462 for (int i = 0; i <= frames; ++i) {
463 fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
464 encoded_image._timeStamp = i + 1;
465 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
466 }
467 // Suspend.
468 statistics_proxy_->OnSuspendChange(true);
469 fake_clock_.AdvanceTimeMilliseconds(kSuspendTimeMs);
470
471 for (int i = 0; i <= frames; ++i) {
472 fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
473 encoded_image._timeStamp = i + 1;
474 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
475 }
476 // Suspended time interval should not affect the framerate.
477 statistics_proxy_.reset();
478 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentFramesPerSecond"));
479 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentFramesPerSecond", kFps));
480}
481
482TEST_F(SendStatisticsProxyTest, CpuLimitedResolutionUpdated) {
perkj803d97f2016-11-01 18:45:46483 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
484 statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
485
486 statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
487
488 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
489 statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
490
491 statistics_proxy_.reset();
492 EXPECT_EQ(1,
493 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
494 EXPECT_EQ(
495 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50));
496}
497
asapersson4374a092016-07-27 07:39:09498TEST_F(SendStatisticsProxyTest, LifetimeHistogramIsUpdated) {
499 const int64_t kTimeSec = 3;
500 fake_clock_.AdvanceTimeMilliseconds(kTimeSec * 1000);
501 statistics_proxy_.reset();
502 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SendStreamLifetimeInSeconds"));
503 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SendStreamLifetimeInSeconds",
504 kTimeSec));
505}
506
507TEST_F(SendStatisticsProxyTest, CodecTypeHistogramIsUpdated) {
508 fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
509 statistics_proxy_.reset();
510 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoder.CodecType"));
511}
512
asapersson118ef002016-03-31 07:00:19513TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8) {
asapersson118ef002016-03-31 07:00:19514 EncodedImage encoded_image;
kjellander02b3d272016-04-20 12:05:54515 CodecSpecificInfo codec_info;
516 codec_info.codecType = kVideoCodecVP8;
asapersson118ef002016-03-31 07:00:19517
perkj803d97f2016-11-01 18:45:46518 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
kjellander02b3d272016-04-20 12:05:54519 codec_info.codecSpecific.VP8.simulcastIdx = 0;
asapersson118ef002016-03-31 07:00:19520 encoded_image.qp_ = kQpIdx0;
kjellander02b3d272016-04-20 12:05:54521 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
522 codec_info.codecSpecific.VP8.simulcastIdx = 1;
asapersson118ef002016-03-31 07:00:19523 encoded_image.qp_ = kQpIdx1;
kjellander02b3d272016-04-20 12:05:54524 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
asapersson118ef002016-03-31 07:00:19525 }
526 statistics_proxy_.reset();
asapersson01d70a32016-05-20 13:29:46527 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8.S0"));
528 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8.S0", kQpIdx0));
529 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8.S1"));
530 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8.S1", kQpIdx1));
asapersson118ef002016-03-31 07:00:19531}
532
533TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8OneSsrc) {
534 VideoSendStream::Config config(nullptr);
535 config.rtp.ssrcs.push_back(kFirstSsrc);
536 statistics_proxy_.reset(new SendStatisticsProxy(
537 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
538
asapersson118ef002016-03-31 07:00:19539 EncodedImage encoded_image;
kjellander02b3d272016-04-20 12:05:54540 CodecSpecificInfo codec_info;
541 codec_info.codecType = kVideoCodecVP8;
asapersson118ef002016-03-31 07:00:19542
perkj803d97f2016-11-01 18:45:46543 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
kjellander02b3d272016-04-20 12:05:54544 codec_info.codecSpecific.VP8.simulcastIdx = 0;
asapersson118ef002016-03-31 07:00:19545 encoded_image.qp_ = kQpIdx0;
kjellander02b3d272016-04-20 12:05:54546 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
asapersson118ef002016-03-31 07:00:19547 }
548 statistics_proxy_.reset();
asapersson01d70a32016-05-20 13:29:46549 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8"));
550 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8", kQpIdx0));
asapersson118ef002016-03-31 07:00:19551}
552
asapersson5265fed2016-04-18 09:58:47553TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9) {
asapersson5265fed2016-04-18 09:58:47554 EncodedImage encoded_image;
kjellander02b3d272016-04-20 12:05:54555 CodecSpecificInfo codec_info;
556 codec_info.codecType = kVideoCodecVP9;
557 codec_info.codecSpecific.VP9.num_spatial_layers = 2;
asapersson5265fed2016-04-18 09:58:47558
perkj803d97f2016-11-01 18:45:46559 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
asapersson5265fed2016-04-18 09:58:47560 encoded_image.qp_ = kQpIdx0;
kjellander02b3d272016-04-20 12:05:54561 codec_info.codecSpecific.VP9.spatial_idx = 0;
562 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
asapersson5265fed2016-04-18 09:58:47563 encoded_image.qp_ = kQpIdx1;
kjellander02b3d272016-04-20 12:05:54564 codec_info.codecSpecific.VP9.spatial_idx = 1;
565 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
asapersson5265fed2016-04-18 09:58:47566 }
567 statistics_proxy_.reset();
asapersson01d70a32016-05-20 13:29:46568 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9.S0"));
569 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9.S0", kQpIdx0));
570 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9.S1"));
571 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9.S1", kQpIdx1));
asapersson5265fed2016-04-18 09:58:47572}
573
574TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) {
575 VideoSendStream::Config config(nullptr);
576 config.rtp.ssrcs.push_back(kFirstSsrc);
577 statistics_proxy_.reset(new SendStatisticsProxy(
578 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
579
asapersson5265fed2016-04-18 09:58:47580 EncodedImage encoded_image;
kjellander02b3d272016-04-20 12:05:54581 CodecSpecificInfo codec_info;
582 codec_info.codecType = kVideoCodecVP9;
583 codec_info.codecSpecific.VP9.num_spatial_layers = 1;
asapersson5265fed2016-04-18 09:58:47584
perkj803d97f2016-11-01 18:45:46585 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
asapersson5265fed2016-04-18 09:58:47586 encoded_image.qp_ = kQpIdx0;
kjellander02b3d272016-04-20 12:05:54587 codec_info.codecSpecific.VP9.spatial_idx = 0;
588 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
asapersson5265fed2016-04-18 09:58:47589 }
590 statistics_proxy_.reset();
asapersson01d70a32016-05-20 13:29:46591 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9"));
592 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9", kQpIdx0));
asapersson5265fed2016-04-18 09:58:47593}
594
asapersson827cab32016-11-02 16:08:47595TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_H264) {
596 EncodedImage encoded_image;
597 CodecSpecificInfo codec_info;
598 codec_info.codecType = kVideoCodecH264;
599
600 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
601 encoded_image.qp_ = kQpIdx0;
602 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
603 }
604 statistics_proxy_.reset();
605 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.H264"));
606 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.H264", kQpIdx0));
607}
608
asapersson4ee70462016-10-31 11:05:12609TEST_F(SendStatisticsProxyTest,
610 BandwidthLimitedHistogramsNotUpdatedWhenDisabled) {
611 EncodedImage encoded_image;
612 // encoded_image.adapt_reason_.bw_resolutions_disabled by default: -1
perkj803d97f2016-11-01 18:45:46613 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
asapersson4ee70462016-10-31 11:05:12614 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
615
616 // Histograms are updated when the statistics_proxy_ is deleted.
617 statistics_proxy_.reset();
618 EXPECT_EQ(0, metrics::NumSamples(
619 "WebRTC.Video.BandwidthLimitedResolutionInPercent"));
620 EXPECT_EQ(0, metrics::NumSamples(
621 "WebRTC.Video.BandwidthLimitedResolutionsDisabled"));
622}
623
624TEST_F(SendStatisticsProxyTest,
625 BandwidthLimitedHistogramsUpdatedWhenEnabled_NoResolutionDisabled) {
626 const int kResolutionsDisabled = 0;
627 EncodedImage encoded_image;
628 encoded_image.adapt_reason_.bw_resolutions_disabled = kResolutionsDisabled;
perkj803d97f2016-11-01 18:45:46629 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
asapersson4ee70462016-10-31 11:05:12630 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
631
632 // Histograms are updated when the statistics_proxy_ is deleted.
633 statistics_proxy_.reset();
634 EXPECT_EQ(1, metrics::NumSamples(
635 "WebRTC.Video.BandwidthLimitedResolutionInPercent"));
636 EXPECT_EQ(1, metrics::NumEvents(
637 "WebRTC.Video.BandwidthLimitedResolutionInPercent", 0));
638 // No resolution disabled.
639 EXPECT_EQ(0, metrics::NumSamples(
640 "WebRTC.Video.BandwidthLimitedResolutionsDisabled"));
641}
642
643TEST_F(SendStatisticsProxyTest,
644 BandwidthLimitedHistogramsUpdatedWhenEnabled_OneResolutionDisabled) {
645 const int kResolutionsDisabled = 1;
646 EncodedImage encoded_image;
647 encoded_image.adapt_reason_.bw_resolutions_disabled = kResolutionsDisabled;
perkj803d97f2016-11-01 18:45:46648 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
asapersson4ee70462016-10-31 11:05:12649 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
650
651 // Histograms are updated when the statistics_proxy_ is deleted.
652 statistics_proxy_.reset();
653 EXPECT_EQ(1, metrics::NumSamples(
654 "WebRTC.Video.BandwidthLimitedResolutionInPercent"));
655 EXPECT_EQ(1, metrics::NumEvents(
656 "WebRTC.Video.BandwidthLimitedResolutionInPercent", 100));
657 // Resolutions disabled.
658 EXPECT_EQ(1, metrics::NumSamples(
659 "WebRTC.Video.BandwidthLimitedResolutionsDisabled"));
660 EXPECT_EQ(
661 1, metrics::NumEvents("WebRTC.Video.BandwidthLimitedResolutionsDisabled",
662 kResolutionsDisabled));
663}
664
665TEST_F(SendStatisticsProxyTest,
666 QualityLimitedHistogramsNotUpdatedWhenDisabled) {
667 EncodedImage encoded_image;
kthelgason0cd27ba2016-12-19 14:32:16668 statistics_proxy_->SetResolutionRestrictionStats(false /* scaling_enabled */,
669 0, 0);
perkj803d97f2016-11-01 18:45:46670 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
kthelgason0cd27ba2016-12-19 14:32:16671 statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
asapersson4ee70462016-10-31 11:05:12672
673 // Histograms are updated when the statistics_proxy_ is deleted.
674 statistics_proxy_.reset();
675 EXPECT_EQ(
676 0, metrics::NumSamples("WebRTC.Video.QualityLimitedResolutionInPercent"));
677 EXPECT_EQ(0, metrics::NumSamples(
678 "WebRTC.Video.QualityLimitedResolutionDownscales"));
679}
680
681TEST_F(SendStatisticsProxyTest,
682 QualityLimitedHistogramsUpdatedWhenEnabled_NoResolutionDownscale) {
asapersson4ee70462016-10-31 11:05:12683 EncodedImage encoded_image;
perkj803d97f2016-11-01 18:45:46684 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
kthelgason0cd27ba2016-12-19 14:32:16685 statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
asapersson4ee70462016-10-31 11:05:12686
687 // Histograms are updated when the statistics_proxy_ is deleted.
688 statistics_proxy_.reset();
689 EXPECT_EQ(
690 1, metrics::NumSamples("WebRTC.Video.QualityLimitedResolutionInPercent"));
691 EXPECT_EQ(1, metrics::NumEvents(
692 "WebRTC.Video.QualityLimitedResolutionInPercent", 0));
693 // No resolution downscale.
694 EXPECT_EQ(0, metrics::NumSamples(
695 "WebRTC.Video.QualityLimitedResolutionDownscales"));
696}
697
698TEST_F(SendStatisticsProxyTest,
699 QualityLimitedHistogramsUpdatedWhenEnabled_TwoResolutionDownscales) {
700 const int kDownscales = 2;
701 EncodedImage encoded_image;
kthelgason0cd27ba2016-12-19 14:32:16702 statistics_proxy_->OnQualityRestrictedResolutionChanged(kDownscales);
perkj803d97f2016-11-01 18:45:46703 for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
kthelgason0cd27ba2016-12-19 14:32:16704 statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
asapersson4ee70462016-10-31 11:05:12705 // Histograms are updated when the statistics_proxy_ is deleted.
706 statistics_proxy_.reset();
707 EXPECT_EQ(
708 1, metrics::NumSamples("WebRTC.Video.QualityLimitedResolutionInPercent"));
709 EXPECT_EQ(1, metrics::NumEvents(
710 "WebRTC.Video.QualityLimitedResolutionInPercent", 100));
711 // Resolution downscales.
712 EXPECT_EQ(1, metrics::NumSamples(
713 "WebRTC.Video.QualityLimitedResolutionDownscales"));
714 EXPECT_EQ(
715 1, metrics::NumEvents("WebRTC.Video.QualityLimitedResolutionDownscales",
716 kDownscales));
717}
718
719TEST_F(SendStatisticsProxyTest, GetStatsReportsBandwidthLimitedResolution) {
720 // Initially false.
721 EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
722 // No resolution scale by default.
723 EncodedImage encoded_image;
724 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
725 EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
kthelgason0cd27ba2016-12-19 14:32:16726
727 // Simulcast disabled resolutions
728 encoded_image.adapt_reason_.bw_resolutions_disabled = 1;
729 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
730 EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
731
asapersson4ee70462016-10-31 11:05:12732 encoded_image.adapt_reason_.bw_resolutions_disabled = 0;
asapersson4ee70462016-10-31 11:05:12733 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
734 EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
kthelgason0cd27ba2016-12-19 14:32:16735
736 // Resolution scaled due to quality.
737 statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
asapersson4ee70462016-10-31 11:05:12738 statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
739 EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
740}
741
sprang@webrtc.orgccd42842014-01-07 09:54:34742TEST_F(SendStatisticsProxyTest, NoSubstreams) {
pbos@webrtc.org49096de2015-02-24 22:37:52743 uint32_t excluded_ssrc =
stefan@webrtc.org58e2d262014-08-14 15:10:49744 std::max(
745 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()),
746 *std::max_element(config_.rtp.rtx.ssrcs.begin(),
747 config_.rtp.rtx.ssrcs.end())) +
748 1;
sprang@webrtc.orgccd42842014-01-07 09:54:34749 // From RtcpStatisticsCallback.
750 RtcpStatistics rtcp_stats;
751 RtcpStatisticsCallback* rtcp_callback = statistics_proxy_.get();
pbos@webrtc.org49096de2015-02-24 22:37:52752 rtcp_callback->StatisticsUpdated(rtcp_stats, excluded_ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34753
754 // From BitrateStatisticsObserver.
sprangcd349d92016-07-13 16:11:28755 uint32_t total = 0;
756 uint32_t retransmit = 0;
sprang@webrtc.orgccd42842014-01-07 09:54:34757 BitrateStatisticsObserver* bitrate_observer = statistics_proxy_.get();
pbos@webrtc.org49096de2015-02-24 22:37:52758 bitrate_observer->Notify(total, retransmit, excluded_ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34759
760 // From FrameCountObserver.
761 FrameCountObserver* fps_observer = statistics_proxy_.get();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16762 FrameCounts frame_counts;
763 frame_counts.key_frames = 1;
pbos@webrtc.org49096de2015-02-24 22:37:52764 fps_observer->FrameCountUpdated(frame_counts, excluded_ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34765
766 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
767 EXPECT_TRUE(stats.substreams.empty());
768}
769
pbos@webrtc.org273a4142014-12-01 15:23:21770TEST_F(SendStatisticsProxyTest, EncodedResolutionTimesOut) {
771 static const int kEncodedWidth = 123;
772 static const int kEncodedHeight = 81;
773 EncodedImage encoded_image;
774 encoded_image._encodedWidth = kEncodedWidth;
775 encoded_image._encodedHeight = kEncodedHeight;
776
kjellander02b3d272016-04-20 12:05:54777 CodecSpecificInfo codec_info;
778 codec_info.codecType = kVideoCodecVP8;
779 codec_info.codecSpecific.VP8.simulcastIdx = 0;
pbos@webrtc.org273a4142014-12-01 15:23:21780
kjellander02b3d272016-04-20 12:05:54781 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
782 codec_info.codecSpecific.VP8.simulcastIdx = 1;
783 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
pbos@webrtc.org273a4142014-12-01 15:23:21784
785 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
pbos@webrtc.org09c77b92015-02-25 10:42:16786 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
787 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
788 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width);
789 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height);
pbos@webrtc.org273a4142014-12-01 15:23:21790
791 // Forward almost to timeout, this should not have removed stats.
792 fake_clock_.AdvanceTimeMilliseconds(SendStatisticsProxy::kStatsTimeoutMs - 1);
793 stats = statistics_proxy_->GetStats();
pbos@webrtc.org09c77b92015-02-25 10:42:16794 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
795 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
pbos@webrtc.org273a4142014-12-01 15:23:21796
797 // Update the first SSRC with bogus RTCP stats to make sure that encoded
798 // resolution still times out (no global timeout for all stats).
799 RtcpStatistics rtcp_statistics;
800 RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get();
801 rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]);
802
803 // Report stats for second SSRC to make sure it's not outdated along with the
804 // first SSRC.
kjellander02b3d272016-04-20 12:05:54805 codec_info.codecSpecific.VP8.simulcastIdx = 1;
806 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
pbos@webrtc.org273a4142014-12-01 15:23:21807
808 // Forward 1 ms, reach timeout, substream 0 should have no resolution
809 // reported, but substream 1 should.
810 fake_clock_.AdvanceTimeMilliseconds(1);
811 stats = statistics_proxy_->GetStats();
pbos@webrtc.org09c77b92015-02-25 10:42:16812 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].width);
813 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].height);
814 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width);
815 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height);
pbos@webrtc.org273a4142014-12-01 15:23:21816}
817
Peter Boström20f3f942015-05-15 09:33:39818TEST_F(SendStatisticsProxyTest, ClearsResolutionFromInactiveSsrcs) {
819 static const int kEncodedWidth = 123;
820 static const int kEncodedHeight = 81;
821 EncodedImage encoded_image;
822 encoded_image._encodedWidth = kEncodedWidth;
823 encoded_image._encodedHeight = kEncodedHeight;
824
kjellander02b3d272016-04-20 12:05:54825 CodecSpecificInfo codec_info;
826 codec_info.codecType = kVideoCodecVP8;
827 codec_info.codecSpecific.VP8.simulcastIdx = 0;
Peter Boström20f3f942015-05-15 09:33:39828
kjellander02b3d272016-04-20 12:05:54829 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
830 codec_info.codecSpecific.VP8.simulcastIdx = 1;
831 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
Peter Boström20f3f942015-05-15 09:33:39832
833 statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]);
834 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
835 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
836 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
837 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].width);
838 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].height);
839}
840
841TEST_F(SendStatisticsProxyTest, ClearsBitratesFromInactiveSsrcs) {
sprangcd349d92016-07-13 16:11:28842 uint32_t bitrate = 42;
Peter Boström20f3f942015-05-15 09:33:39843 BitrateStatisticsObserver* observer = statistics_proxy_.get();
844 observer->Notify(bitrate, bitrate, config_.rtp.ssrcs[0]);
845 observer->Notify(bitrate, bitrate, config_.rtp.ssrcs[1]);
846
847 statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]);
848
849 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprangcd349d92016-07-13 16:11:28850 EXPECT_EQ(static_cast<int>(bitrate),
Peter Boström20f3f942015-05-15 09:33:39851 stats.substreams[config_.rtp.ssrcs[0]].total_bitrate_bps);
sprangcd349d92016-07-13 16:11:28852 EXPECT_EQ(static_cast<int>(bitrate),
Peter Boström20f3f942015-05-15 09:33:39853 stats.substreams[config_.rtp.ssrcs[0]].retransmit_bitrate_bps);
854 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].total_bitrate_bps);
855 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].retransmit_bitrate_bps);
856}
857
sprang07fb9be2016-02-24 15:55:00858TEST_F(SendStatisticsProxyTest, ResetsRtcpCountersOnContentChange) {
859 RtcpPacketTypeCounterObserver* proxy =
860 static_cast<RtcpPacketTypeCounterObserver*>(statistics_proxy_.get());
861 RtcpPacketTypeCounter counters;
862 counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds();
863 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
864 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
865
866 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
867
868 counters.nack_packets += 1 * metrics::kMinRunTimeInSeconds;
869 counters.fir_packets += 2 * metrics::kMinRunTimeInSeconds;
870 counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds;
871 counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds;
872 counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds;
873
874 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
875 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
876
877 // Changing content type causes histograms to be reported.
Pera48ddb72016-09-29 09:48:50878 VideoEncoderConfig config;
879 config.content_type = VideoEncoderConfig::ContentType::kScreen;
880 statistics_proxy_->OnEncoderReconfigured(config, 50);
sprang07fb9be2016-02-24 15:55:00881
asapersson01d70a32016-05-20 13:29:46882 EXPECT_EQ(1,
883 metrics::NumSamples("WebRTC.Video.NackPacketsReceivedPerMinute"));
884 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FirPacketsReceivedPerMinute"));
885 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PliPacketsReceivedPerMinute"));
886 EXPECT_EQ(1, metrics::NumSamples(
sprang07fb9be2016-02-24 15:55:00887 "WebRTC.Video.UniqueNackRequestsReceivedInPercent"));
888
889 const int kRate = 60 * 2; // Packets per minute with two streams.
890
asapersson01d70a32016-05-20 13:29:46891 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NackPacketsReceivedPerMinute",
892 1 * kRate));
893 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FirPacketsReceivedPerMinute",
894 2 * kRate));
895 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PliPacketsReceivedPerMinute",
896 3 * kRate));
897 EXPECT_EQ(
898 1, metrics::NumEvents("WebRTC.Video.UniqueNackRequestsReceivedInPercent",
899 4 * 100 / 5));
sprang07fb9be2016-02-24 15:55:00900
901 // New start time but same counter values.
902 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
903 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
904
905 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
906
907 counters.nack_packets += 1 * metrics::kMinRunTimeInSeconds;
908 counters.fir_packets += 2 * metrics::kMinRunTimeInSeconds;
909 counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds;
910 counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds;
911 counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds;
912
913 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
914 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
915
916 SetUp(); // Reset stats proxy also causes histograms to be reported.
917
asapersson01d70a32016-05-20 13:29:46918 EXPECT_EQ(1, metrics::NumSamples(
sprang07fb9be2016-02-24 15:55:00919 "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute"));
asapersson01d70a32016-05-20 13:29:46920 EXPECT_EQ(1, metrics::NumSamples(
sprang07fb9be2016-02-24 15:55:00921 "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute"));
asapersson01d70a32016-05-20 13:29:46922 EXPECT_EQ(1, metrics::NumSamples(
sprang07fb9be2016-02-24 15:55:00923 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute"));
924 EXPECT_EQ(
asapersson01d70a32016-05-20 13:29:46925 1, metrics::NumSamples(
sprang07fb9be2016-02-24 15:55:00926 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent"));
927
asapersson01d70a32016-05-20 13:29:46928 EXPECT_EQ(1, metrics::NumEvents(
929 "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute",
930 1 * kRate));
931 EXPECT_EQ(1, metrics::NumEvents(
932 "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute",
933 2 * kRate));
934 EXPECT_EQ(1, metrics::NumEvents(
935 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute",
936 3 * kRate));
937 EXPECT_EQ(1,
938 metrics::NumEvents(
939 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent",
940 4 * 100 / 5));
sprang07fb9be2016-02-24 15:55:00941}
942
asaperssona6a699a2016-11-25 11:52:46943TEST_F(SendStatisticsProxyTest, GetStatsReportsIsFlexFec) {
944 statistics_proxy_.reset(
945 new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(),
946 VideoEncoderConfig::ContentType::kRealtimeVideo));
947
948 StreamDataCountersCallback* proxy =
949 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
950 StreamDataCounters counters;
951 proxy->DataCountersUpdated(counters, kFirstSsrc);
952 proxy->DataCountersUpdated(counters, kFlexFecSsrc);
953
954 EXPECT_FALSE(GetStreamStats(kFirstSsrc).is_flexfec);
955 EXPECT_TRUE(GetStreamStats(kFlexFecSsrc).is_flexfec);
956}
957
958TEST_F(SendStatisticsProxyTest, SendBitratesAreReportedWithFlexFecEnabled) {
959 statistics_proxy_.reset(
960 new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(),
961 VideoEncoderConfig::ContentType::kRealtimeVideo));
962
963 StreamDataCountersCallback* proxy =
964 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
965
966 StreamDataCounters counters;
967 StreamDataCounters rtx_counters;
968 proxy->DataCountersUpdated(counters, kFirstSsrc);
969 proxy->DataCountersUpdated(counters, kSecondSsrc);
970 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
971 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
972 proxy->DataCountersUpdated(counters, kFlexFecSsrc);
973
974 counters.transmitted.header_bytes = 5000;
975 counters.transmitted.packets = 20;
976 counters.transmitted.padding_bytes = 10000;
977 counters.transmitted.payload_bytes = 20000;
978 counters.retransmitted.header_bytes = 400;
979 counters.retransmitted.packets = 2;
980 counters.retransmitted.padding_bytes = 1000;
981 counters.retransmitted.payload_bytes = 2000;
982 counters.fec = counters.retransmitted;
983 rtx_counters.transmitted = counters.transmitted;
984
985 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
986 proxy->DataCountersUpdated(counters, kFirstSsrc);
987 proxy->DataCountersUpdated(counters, kSecondSsrc);
988 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
989 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
990 proxy->DataCountersUpdated(counters, kFlexFecSsrc);
991
992 // Reset stats proxy causes histograms to be reported.
993 statistics_proxy_.reset();
994 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps"));
995 EXPECT_EQ(1,
996 metrics::NumEvents(
997 "WebRTC.Video.BitrateSentInKbps",
998 static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) /
999 metrics::kMinRunTimeInSeconds / 1000)));
1000
1001 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps"));
1002 EXPECT_EQ(1, metrics::NumEvents(
1003 "WebRTC.Video.MediaBitrateSentInKbps",
1004 static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) /
1005 metrics::kMinRunTimeInSeconds / 1000)));
1006
1007 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps"));
1008 EXPECT_EQ(1,
1009 metrics::NumEvents(
1010 "WebRTC.Video.PaddingBitrateSentInKbps",
1011 static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) /
1012 metrics::kMinRunTimeInSeconds / 1000)));
1013
1014 EXPECT_EQ(1,
1015 metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps"));
1016 EXPECT_EQ(1,
1017 metrics::NumEvents(
1018 "WebRTC.Video.RetransmittedBitrateSentInKbps",
1019 static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) /
1020 metrics::kMinRunTimeInSeconds / 1000)));
1021
1022 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
1023 EXPECT_EQ(
1024 1, metrics::NumEvents(
1025 "WebRTC.Video.RtxBitrateSentInKbps",
1026 static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) /
1027 metrics::kMinRunTimeInSeconds / 1000)));
1028
1029 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
1030 EXPECT_EQ(1, metrics::NumEvents(
1031 "WebRTC.Video.FecBitrateSentInKbps",
1032 static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
1033 metrics::kMinRunTimeInSeconds / 1000)));
1034}
1035
Erik Språng22c2b482016-03-01 08:40:421036TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
1037 StreamDataCountersCallback* proxy =
1038 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
1039 StreamDataCounters counters;
1040 StreamDataCounters rtx_counters;
1041 counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds();
1042 proxy->DataCountersUpdated(counters, kFirstSsrc);
1043 proxy->DataCountersUpdated(counters, kSecondSsrc);
1044 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
1045 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
1046
asaperssona6a699a2016-11-25 11:52:461047 counters.transmitted.header_bytes = 5000;
Erik Språng22c2b482016-03-01 08:40:421048 counters.transmitted.packets = 20;
asaperssona6a699a2016-11-25 11:52:461049 counters.transmitted.padding_bytes = 10000;
1050 counters.transmitted.payload_bytes = 20000;
Erik Språng22c2b482016-03-01 08:40:421051
asaperssona6a699a2016-11-25 11:52:461052 counters.retransmitted.header_bytes = 400;
Erik Språng22c2b482016-03-01 08:40:421053 counters.retransmitted.packets = 2;
asaperssona6a699a2016-11-25 11:52:461054 counters.retransmitted.padding_bytes = 1000;
1055 counters.retransmitted.payload_bytes = 2000;
Erik Språng22c2b482016-03-01 08:40:421056
1057 counters.fec = counters.retransmitted;
1058
1059 rtx_counters.transmitted = counters.transmitted;
1060
1061 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
1062 proxy->DataCountersUpdated(counters, kFirstSsrc);
1063 proxy->DataCountersUpdated(counters, kSecondSsrc);
1064 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
1065 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
1066
1067 // Changing content type causes histograms to be reported.
Pera48ddb72016-09-29 09:48:501068 VideoEncoderConfig config;
1069 config.content_type = VideoEncoderConfig::ContentType::kScreen;
1070 statistics_proxy_->OnEncoderReconfigured(config, 50);
Erik Språng22c2b482016-03-01 08:40:421071
asapersson01d70a32016-05-20 13:29:461072 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps"));
1073 EXPECT_EQ(1,
1074 metrics::NumEvents(
1075 "WebRTC.Video.BitrateSentInKbps",
1076 static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) /
1077 metrics::kMinRunTimeInSeconds / 1000)));
1078
1079 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps"));
1080 EXPECT_EQ(1, metrics::NumEvents(
1081 "WebRTC.Video.MediaBitrateSentInKbps",
1082 static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) /
1083 metrics::kMinRunTimeInSeconds / 1000)));
1084
1085 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps"));
1086 EXPECT_EQ(1,
1087 metrics::NumEvents(
1088 "WebRTC.Video.PaddingBitrateSentInKbps",
1089 static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) /
1090 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421091
1092 EXPECT_EQ(1,
asapersson01d70a32016-05-20 13:29:461093 metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps"));
Erik Språng22c2b482016-03-01 08:40:421094 EXPECT_EQ(1,
asapersson01d70a32016-05-20 13:29:461095 metrics::NumEvents(
1096 "WebRTC.Video.RetransmittedBitrateSentInKbps",
1097 static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) /
1098 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421099
asapersson01d70a32016-05-20 13:29:461100 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
Erik Språng22c2b482016-03-01 08:40:421101 EXPECT_EQ(
asapersson01d70a32016-05-20 13:29:461102 1, metrics::NumEvents(
1103 "WebRTC.Video.RtxBitrateSentInKbps",
1104 static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) /
1105 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421106
asapersson01d70a32016-05-20 13:29:461107 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
1108 EXPECT_EQ(1, metrics::NumEvents(
1109 "WebRTC.Video.FecBitrateSentInKbps",
asaperssona6a699a2016-11-25 11:52:461110 static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
asapersson01d70a32016-05-20 13:29:461111 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421112
1113 // New start time but same counter values.
1114 proxy->DataCountersUpdated(counters, kFirstSsrc);
1115 proxy->DataCountersUpdated(counters, kSecondSsrc);
1116 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
1117 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
1118
1119 // Double counter values, this should result in the same counts as before but
1120 // with new histogram names.
1121 StreamDataCounters new_counters = counters;
1122 new_counters.Add(counters);
1123 StreamDataCounters new_rtx_counters = rtx_counters;
1124 new_rtx_counters.Add(rtx_counters);
1125
1126 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
1127 proxy->DataCountersUpdated(new_counters, kFirstSsrc);
1128 proxy->DataCountersUpdated(new_counters, kSecondSsrc);
1129 proxy->DataCountersUpdated(new_rtx_counters, kFirstRtxSsrc);
1130 proxy->DataCountersUpdated(new_rtx_counters, kSecondRtxSsrc);
1131
1132 SetUp(); // Reset stats proxy also causes histograms to be reported.
1133
asapersson01d70a32016-05-20 13:29:461134 EXPECT_EQ(1,
1135 metrics::NumSamples("WebRTC.Video.Screenshare.BitrateSentInKbps"));
1136 EXPECT_EQ(1,
1137 metrics::NumEvents(
1138 "WebRTC.Video.Screenshare.BitrateSentInKbps",
1139 static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) /
1140 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421141
asapersson01d70a32016-05-20 13:29:461142 EXPECT_EQ(1, metrics::NumSamples(
Erik Språng22c2b482016-03-01 08:40:421143 "WebRTC.Video.Screenshare.MediaBitrateSentInKbps"));
asapersson01d70a32016-05-20 13:29:461144 EXPECT_EQ(1, metrics::NumEvents(
1145 "WebRTC.Video.Screenshare.MediaBitrateSentInKbps",
1146 static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) /
1147 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421148
asapersson01d70a32016-05-20 13:29:461149 EXPECT_EQ(1, metrics::NumSamples(
Erik Språng22c2b482016-03-01 08:40:421150 "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps"));
asapersson01d70a32016-05-20 13:29:461151 EXPECT_EQ(1,
1152 metrics::NumEvents(
1153 "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps",
1154 static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) /
1155 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421156
asapersson01d70a32016-05-20 13:29:461157 EXPECT_EQ(1, metrics::NumSamples(
Erik Språng22c2b482016-03-01 08:40:421158 "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps"));
asapersson01d70a32016-05-20 13:29:461159 EXPECT_EQ(1,
1160 metrics::NumEvents(
1161 "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps",
1162 static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) /
1163 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421164
asapersson01d70a32016-05-20 13:29:461165 EXPECT_EQ(
1166 1, metrics::NumSamples("WebRTC.Video.Screenshare.RtxBitrateSentInKbps"));
1167 EXPECT_EQ(
1168 1, metrics::NumEvents(
1169 "WebRTC.Video.Screenshare.RtxBitrateSentInKbps",
1170 static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) /
1171 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421172
asapersson01d70a32016-05-20 13:29:461173 EXPECT_EQ(
1174 1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps"));
1175 EXPECT_EQ(1, metrics::NumEvents(
1176 "WebRTC.Video.Screenshare.FecBitrateSentInKbps",
asaperssona6a699a2016-11-25 11:52:461177 static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
asapersson01d70a32016-05-20 13:29:461178 metrics::kMinRunTimeInSeconds / 1000)));
Erik Språng22c2b482016-03-01 08:40:421179}
1180
sprang@webrtc.orgccd42842014-01-07 09:54:341181} // namespace webrtc