OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/video/send_statistics_proxy.h" | 11 #include "webrtc/video/send_statistics_proxy.h" |
12 | 12 |
13 #include <map> | 13 #include <map> |
14 #include <memory> | 14 #include <memory> |
15 #include <string> | 15 #include <string> |
16 #include <vector> | 16 #include <vector> |
17 | 17 |
18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
19 #include "webrtc/system_wrappers/include/metrics.h" | 19 #include "webrtc/system_wrappers/include/metrics.h" |
20 #include "webrtc/test/histogram.h" | 20 #include "webrtc/system_wrappers/include/metrics_default.h" |
21 | 21 |
22 namespace webrtc { | 22 namespace webrtc { |
23 namespace { | 23 namespace { |
24 const uint32_t kFirstSsrc = 17; | 24 const uint32_t kFirstSsrc = 17; |
25 const uint32_t kSecondSsrc = 42; | 25 const uint32_t kSecondSsrc = 42; |
26 const uint32_t kFirstRtxSsrc = 18; | 26 const uint32_t kFirstRtxSsrc = 18; |
27 const uint32_t kSecondRtxSsrc = 43; | 27 const uint32_t kSecondRtxSsrc = 43; |
28 | 28 |
29 const int kMinRequiredSamples = 200; | 29 const int kMinRequiredSamples = 200; |
30 const int kQpIdx0 = 21; | 30 const int kQpIdx0 = 21; |
31 const int kQpIdx1 = 39; | 31 const int kQpIdx1 = 39; |
32 } // namespace | 32 } // namespace |
33 | 33 |
34 class SendStatisticsProxyTest : public ::testing::Test { | 34 class SendStatisticsProxyTest : public ::testing::Test { |
35 public: | 35 public: |
36 SendStatisticsProxyTest() | 36 SendStatisticsProxyTest() |
37 : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0), | 37 : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0), |
38 max_delay_ms_(0) {} | 38 max_delay_ms_(0) {} |
39 virtual ~SendStatisticsProxyTest() {} | 39 virtual ~SendStatisticsProxyTest() {} |
40 | 40 |
41 protected: | 41 protected: |
42 virtual void SetUp() { | 42 virtual void SetUp() { |
| 43 metrics::Reset(); |
43 statistics_proxy_.reset(new SendStatisticsProxy( | 44 statistics_proxy_.reset(new SendStatisticsProxy( |
44 &fake_clock_, GetTestConfig(), | 45 &fake_clock_, GetTestConfig(), |
45 VideoEncoderConfig::ContentType::kRealtimeVideo)); | 46 VideoEncoderConfig::ContentType::kRealtimeVideo)); |
46 expected_ = VideoSendStream::Stats(); | 47 expected_ = VideoSendStream::Stats(); |
47 } | 48 } |
48 | 49 |
49 VideoSendStream::Config GetTestConfig() { | 50 VideoSendStream::Config GetTestConfig() { |
50 VideoSendStream::Config config(nullptr); | 51 VideoSendStream::Config config(nullptr); |
51 config.rtp.ssrcs.push_back(kFirstSsrc); | 52 config.rtp.ssrcs.push_back(kFirstSsrc); |
52 config.rtp.ssrcs.push_back(kSecondSsrc); | 53 config.rtp.ssrcs.push_back(kSecondSsrc); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 CpuOveruseMetrics metrics; | 279 CpuOveruseMetrics metrics; |
279 metrics.encode_usage_percent = 80; | 280 metrics.encode_usage_percent = 80; |
280 statistics_proxy_->OnEncodedFrameTimeMeasured(kEncodeTimeMs, metrics); | 281 statistics_proxy_->OnEncodedFrameTimeMeasured(kEncodeTimeMs, metrics); |
281 | 282 |
282 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); | 283 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); |
283 EXPECT_EQ(kEncodeTimeMs, stats.avg_encode_time_ms); | 284 EXPECT_EQ(kEncodeTimeMs, stats.avg_encode_time_ms); |
284 EXPECT_EQ(metrics.encode_usage_percent, stats.encode_usage_percent); | 285 EXPECT_EQ(metrics.encode_usage_percent, stats.encode_usage_percent); |
285 } | 286 } |
286 | 287 |
287 TEST_F(SendStatisticsProxyTest, SwitchContentTypeUpdatesHistograms) { | 288 TEST_F(SendStatisticsProxyTest, SwitchContentTypeUpdatesHistograms) { |
288 test::ClearHistograms(); | |
289 const int kWidth = 640; | 289 const int kWidth = 640; |
290 const int kHeight = 480; | 290 const int kHeight = 480; |
291 | 291 |
292 for (int i = 0; i < kMinRequiredSamples; ++i) | 292 for (int i = 0; i < kMinRequiredSamples; ++i) |
293 statistics_proxy_->OnIncomingFrame(kWidth, kHeight); | 293 statistics_proxy_->OnIncomingFrame(kWidth, kHeight); |
294 | 294 |
295 // No switch, stats not should be updated. | 295 // No switch, stats not should be updated. |
296 statistics_proxy_->SetContentType( | 296 statistics_proxy_->SetContentType( |
297 VideoEncoderConfig::ContentType::kRealtimeVideo); | 297 VideoEncoderConfig::ContentType::kRealtimeVideo); |
298 EXPECT_EQ(0, test::NumHistogramSamples("WebRTC.Video.InputWidthInPixels")); | 298 EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.InputWidthInPixels")); |
299 | 299 |
300 // Switch to screenshare, real-time stats should be updated. | 300 // Switch to screenshare, real-time stats should be updated. |
301 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); | 301 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); |
302 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.InputWidthInPixels")); | 302 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputWidthInPixels")); |
303 } | 303 } |
304 | 304 |
305 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8) { | 305 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8) { |
306 test::ClearHistograms(); | |
307 EncodedImage encoded_image; | 306 EncodedImage encoded_image; |
308 CodecSpecificInfo codec_info; | 307 CodecSpecificInfo codec_info; |
309 codec_info.codecType = kVideoCodecVP8; | 308 codec_info.codecType = kVideoCodecVP8; |
310 | 309 |
311 for (int i = 0; i < kMinRequiredSamples; ++i) { | 310 for (int i = 0; i < kMinRequiredSamples; ++i) { |
312 codec_info.codecSpecific.VP8.simulcastIdx = 0; | 311 codec_info.codecSpecific.VP8.simulcastIdx = 0; |
313 encoded_image.qp_ = kQpIdx0; | 312 encoded_image.qp_ = kQpIdx0; |
314 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 313 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
315 codec_info.codecSpecific.VP8.simulcastIdx = 1; | 314 codec_info.codecSpecific.VP8.simulcastIdx = 1; |
316 encoded_image.qp_ = kQpIdx1; | 315 encoded_image.qp_ = kQpIdx1; |
317 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 316 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
318 } | 317 } |
319 statistics_proxy_.reset(); | 318 statistics_proxy_.reset(); |
320 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8.S0")); | 319 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8.S0")); |
321 EXPECT_EQ(kQpIdx0, | 320 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8.S0", kQpIdx0)); |
322 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8.S0")); | 321 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8.S1")); |
323 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8.S1")); | 322 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8.S1", kQpIdx1)); |
324 EXPECT_EQ(kQpIdx1, | |
325 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8.S1")); | |
326 } | 323 } |
327 | 324 |
328 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8OneSsrc) { | 325 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8OneSsrc) { |
329 VideoSendStream::Config config(nullptr); | 326 VideoSendStream::Config config(nullptr); |
330 config.rtp.ssrcs.push_back(kFirstSsrc); | 327 config.rtp.ssrcs.push_back(kFirstSsrc); |
331 statistics_proxy_.reset(new SendStatisticsProxy( | 328 statistics_proxy_.reset(new SendStatisticsProxy( |
332 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); | 329 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); |
333 | 330 |
334 test::ClearHistograms(); | |
335 EncodedImage encoded_image; | 331 EncodedImage encoded_image; |
336 CodecSpecificInfo codec_info; | 332 CodecSpecificInfo codec_info; |
337 codec_info.codecType = kVideoCodecVP8; | 333 codec_info.codecType = kVideoCodecVP8; |
338 | 334 |
339 for (int i = 0; i < kMinRequiredSamples; ++i) { | 335 for (int i = 0; i < kMinRequiredSamples; ++i) { |
340 codec_info.codecSpecific.VP8.simulcastIdx = 0; | 336 codec_info.codecSpecific.VP8.simulcastIdx = 0; |
341 encoded_image.qp_ = kQpIdx0; | 337 encoded_image.qp_ = kQpIdx0; |
342 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 338 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
343 } | 339 } |
344 statistics_proxy_.reset(); | 340 statistics_proxy_.reset(); |
345 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8")); | 341 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8")); |
346 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8")); | 342 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8", kQpIdx0)); |
347 } | 343 } |
348 | 344 |
349 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9) { | 345 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9) { |
350 test::ClearHistograms(); | |
351 EncodedImage encoded_image; | 346 EncodedImage encoded_image; |
352 CodecSpecificInfo codec_info; | 347 CodecSpecificInfo codec_info; |
353 codec_info.codecType = kVideoCodecVP9; | 348 codec_info.codecType = kVideoCodecVP9; |
354 codec_info.codecSpecific.VP9.num_spatial_layers = 2; | 349 codec_info.codecSpecific.VP9.num_spatial_layers = 2; |
355 | 350 |
356 for (int i = 0; i < kMinRequiredSamples; ++i) { | 351 for (int i = 0; i < kMinRequiredSamples; ++i) { |
357 encoded_image.qp_ = kQpIdx0; | 352 encoded_image.qp_ = kQpIdx0; |
358 codec_info.codecSpecific.VP9.spatial_idx = 0; | 353 codec_info.codecSpecific.VP9.spatial_idx = 0; |
359 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 354 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
360 encoded_image.qp_ = kQpIdx1; | 355 encoded_image.qp_ = kQpIdx1; |
361 codec_info.codecSpecific.VP9.spatial_idx = 1; | 356 codec_info.codecSpecific.VP9.spatial_idx = 1; |
362 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 357 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
363 } | 358 } |
364 statistics_proxy_.reset(); | 359 statistics_proxy_.reset(); |
365 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S0")); | 360 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9.S0")); |
366 EXPECT_EQ(kQpIdx0, | 361 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9.S0", kQpIdx0)); |
367 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S0")); | 362 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9.S1")); |
368 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S1")); | 363 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9.S1", kQpIdx1)); |
369 EXPECT_EQ(kQpIdx1, | |
370 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S1")); | |
371 } | 364 } |
372 | 365 |
373 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) { | 366 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) { |
374 VideoSendStream::Config config(nullptr); | 367 VideoSendStream::Config config(nullptr); |
375 config.rtp.ssrcs.push_back(kFirstSsrc); | 368 config.rtp.ssrcs.push_back(kFirstSsrc); |
376 statistics_proxy_.reset(new SendStatisticsProxy( | 369 statistics_proxy_.reset(new SendStatisticsProxy( |
377 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); | 370 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); |
378 | 371 |
379 test::ClearHistograms(); | |
380 EncodedImage encoded_image; | 372 EncodedImage encoded_image; |
381 CodecSpecificInfo codec_info; | 373 CodecSpecificInfo codec_info; |
382 codec_info.codecType = kVideoCodecVP9; | 374 codec_info.codecType = kVideoCodecVP9; |
383 codec_info.codecSpecific.VP9.num_spatial_layers = 1; | 375 codec_info.codecSpecific.VP9.num_spatial_layers = 1; |
384 | 376 |
385 for (int i = 0; i < kMinRequiredSamples; ++i) { | 377 for (int i = 0; i < kMinRequiredSamples; ++i) { |
386 encoded_image.qp_ = kQpIdx0; | 378 encoded_image.qp_ = kQpIdx0; |
387 codec_info.codecSpecific.VP9.spatial_idx = 0; | 379 codec_info.codecSpecific.VP9.spatial_idx = 0; |
388 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 380 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
389 } | 381 } |
390 statistics_proxy_.reset(); | 382 statistics_proxy_.reset(); |
391 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9")); | 383 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9")); |
392 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9")); | 384 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9", kQpIdx0)); |
393 } | 385 } |
394 | 386 |
395 TEST_F(SendStatisticsProxyTest, NoSubstreams) { | 387 TEST_F(SendStatisticsProxyTest, NoSubstreams) { |
396 uint32_t excluded_ssrc = | 388 uint32_t excluded_ssrc = |
397 std::max( | 389 std::max( |
398 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()), | 390 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()), |
399 *std::max_element(config_.rtp.rtx.ssrcs.begin(), | 391 *std::max_element(config_.rtp.rtx.ssrcs.begin(), |
400 config_.rtp.rtx.ssrcs.end())) + | 392 config_.rtp.rtx.ssrcs.end())) + |
401 1; | 393 1; |
402 // From RtcpStatisticsCallback. | 394 // From RtcpStatisticsCallback. |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds; | 516 counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds; |
525 counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds; | 517 counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds; |
526 counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds; | 518 counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds; |
527 | 519 |
528 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters); | 520 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters); |
529 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters); | 521 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters); |
530 | 522 |
531 // Changing content type causes histograms to be reported. | 523 // Changing content type causes histograms to be reported. |
532 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); | 524 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); |
533 | 525 |
534 EXPECT_EQ(1, test::NumHistogramSamples( | 526 EXPECT_EQ(1, |
535 "WebRTC.Video.NackPacketsReceivedPerMinute")); | 527 metrics::NumSamples("WebRTC.Video.NackPacketsReceivedPerMinute")); |
536 EXPECT_EQ( | 528 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FirPacketsReceivedPerMinute")); |
537 1, test::NumHistogramSamples("WebRTC.Video.FirPacketsReceivedPerMinute")); | 529 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PliPacketsReceivedPerMinute")); |
538 EXPECT_EQ( | 530 EXPECT_EQ(1, metrics::NumSamples( |
539 1, test::NumHistogramSamples("WebRTC.Video.PliPacketsReceivedPerMinute")); | |
540 EXPECT_EQ(1, test::NumHistogramSamples( | |
541 "WebRTC.Video.UniqueNackRequestsReceivedInPercent")); | 531 "WebRTC.Video.UniqueNackRequestsReceivedInPercent")); |
542 | 532 |
543 const int kRate = 60 * 2; // Packets per minute with two streams. | 533 const int kRate = 60 * 2; // Packets per minute with two streams. |
544 | 534 |
545 EXPECT_EQ(1 * kRate, test::LastHistogramSample( | 535 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NackPacketsReceivedPerMinute", |
546 "WebRTC.Video.NackPacketsReceivedPerMinute")); | 536 1 * kRate)); |
547 EXPECT_EQ(2 * kRate, test::LastHistogramSample( | 537 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FirPacketsReceivedPerMinute", |
548 "WebRTC.Video.FirPacketsReceivedPerMinute")); | 538 2 * kRate)); |
549 EXPECT_EQ(3 * kRate, test::LastHistogramSample( | 539 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PliPacketsReceivedPerMinute", |
550 "WebRTC.Video.PliPacketsReceivedPerMinute")); | 540 3 * kRate)); |
551 EXPECT_EQ(4 * 100 / 5, | 541 EXPECT_EQ( |
552 test::LastHistogramSample( | 542 1, metrics::NumEvents("WebRTC.Video.UniqueNackRequestsReceivedInPercent", |
553 "WebRTC.Video.UniqueNackRequestsReceivedInPercent")); | 543 4 * 100 / 5)); |
554 | 544 |
555 // New start time but same counter values. | 545 // New start time but same counter values. |
556 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters); | 546 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters); |
557 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters); | 547 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters); |
558 | 548 |
559 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds); | 549 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds); |
560 | 550 |
561 counters.nack_packets += 1 * metrics::kMinRunTimeInSeconds; | 551 counters.nack_packets += 1 * metrics::kMinRunTimeInSeconds; |
562 counters.fir_packets += 2 * metrics::kMinRunTimeInSeconds; | 552 counters.fir_packets += 2 * metrics::kMinRunTimeInSeconds; |
563 counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds; | 553 counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds; |
564 counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds; | 554 counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds; |
565 counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds; | 555 counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds; |
566 | 556 |
567 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters); | 557 proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters); |
568 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters); | 558 proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters); |
569 | 559 |
570 SetUp(); // Reset stats proxy also causes histograms to be reported. | 560 SetUp(); // Reset stats proxy also causes histograms to be reported. |
571 | 561 |
572 EXPECT_EQ(1, test::NumHistogramSamples( | 562 EXPECT_EQ(1, metrics::NumSamples( |
573 "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute")); | 563 "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute")); |
574 EXPECT_EQ(1, test::NumHistogramSamples( | 564 EXPECT_EQ(1, metrics::NumSamples( |
575 "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute")); | 565 "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute")); |
576 EXPECT_EQ(1, test::NumHistogramSamples( | 566 EXPECT_EQ(1, metrics::NumSamples( |
577 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute")); | 567 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute")); |
578 EXPECT_EQ( | 568 EXPECT_EQ( |
579 1, test::NumHistogramSamples( | 569 1, metrics::NumSamples( |
580 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent")); | 570 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent")); |
581 | 571 |
582 EXPECT_EQ(1 * kRate, | 572 EXPECT_EQ(1, metrics::NumEvents( |
583 test::LastHistogramSample( | 573 "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute", |
584 "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute")); | 574 1 * kRate)); |
585 EXPECT_EQ(2 * kRate, | 575 EXPECT_EQ(1, metrics::NumEvents( |
586 test::LastHistogramSample( | 576 "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute", |
587 "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute")); | 577 2 * kRate)); |
588 EXPECT_EQ(3 * kRate, | 578 EXPECT_EQ(1, metrics::NumEvents( |
589 test::LastHistogramSample( | 579 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute", |
590 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute")); | 580 3 * kRate)); |
591 EXPECT_EQ( | 581 EXPECT_EQ(1, |
592 4 * 100 / 5, | 582 metrics::NumEvents( |
593 test::LastHistogramSample( | 583 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent", |
594 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent")); | 584 4 * 100 / 5)); |
595 } | 585 } |
596 | 586 |
597 TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) { | 587 TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) { |
598 StreamDataCountersCallback* proxy = | 588 StreamDataCountersCallback* proxy = |
599 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); | 589 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); |
600 StreamDataCounters counters; | 590 StreamDataCounters counters; |
601 StreamDataCounters rtx_counters; | 591 StreamDataCounters rtx_counters; |
602 counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds(); | 592 counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds(); |
603 proxy->DataCountersUpdated(counters, kFirstSsrc); | 593 proxy->DataCountersUpdated(counters, kFirstSsrc); |
604 proxy->DataCountersUpdated(counters, kSecondSsrc); | 594 proxy->DataCountersUpdated(counters, kSecondSsrc); |
(...skipping 16 matching lines...) Expand all Loading... |
621 | 611 |
622 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds); | 612 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds); |
623 proxy->DataCountersUpdated(counters, kFirstSsrc); | 613 proxy->DataCountersUpdated(counters, kFirstSsrc); |
624 proxy->DataCountersUpdated(counters, kSecondSsrc); | 614 proxy->DataCountersUpdated(counters, kSecondSsrc); |
625 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); | 615 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); |
626 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); | 616 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); |
627 | 617 |
628 // Changing content type causes histograms to be reported. | 618 // Changing content type causes histograms to be reported. |
629 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); | 619 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); |
630 | 620 |
631 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.BitrateSentInKbps")); | 621 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps")); |
632 EXPECT_EQ(static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) / | 622 EXPECT_EQ(1, |
633 metrics::kMinRunTimeInSeconds / 1000), | 623 metrics::NumEvents( |
634 test::LastHistogramSample("WebRTC.Video.BitrateSentInKbps")); | 624 "WebRTC.Video.BitrateSentInKbps", |
| 625 static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) / |
| 626 metrics::kMinRunTimeInSeconds / 1000))); |
| 627 |
| 628 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps")); |
| 629 EXPECT_EQ(1, metrics::NumEvents( |
| 630 "WebRTC.Video.MediaBitrateSentInKbps", |
| 631 static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) / |
| 632 metrics::kMinRunTimeInSeconds / 1000))); |
| 633 |
| 634 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps")); |
| 635 EXPECT_EQ(1, |
| 636 metrics::NumEvents( |
| 637 "WebRTC.Video.PaddingBitrateSentInKbps", |
| 638 static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) / |
| 639 metrics::kMinRunTimeInSeconds / 1000))); |
635 | 640 |
636 EXPECT_EQ(1, | 641 EXPECT_EQ(1, |
637 test::NumHistogramSamples("WebRTC.Video.MediaBitrateSentInKbps")); | 642 metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps")); |
638 EXPECT_EQ(static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) / | 643 EXPECT_EQ(1, |
639 metrics::kMinRunTimeInSeconds / 1000), | 644 metrics::NumEvents( |
640 test::LastHistogramSample("WebRTC.Video.MediaBitrateSentInKbps")); | 645 "WebRTC.Video.RetransmittedBitrateSentInKbps", |
| 646 static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) / |
| 647 metrics::kMinRunTimeInSeconds / 1000))); |
641 | 648 |
642 EXPECT_EQ(1, | 649 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps")); |
643 test::NumHistogramSamples("WebRTC.Video.PaddingBitrateSentInKbps")); | 650 EXPECT_EQ( |
644 EXPECT_EQ(static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) / | 651 1, metrics::NumEvents( |
645 metrics::kMinRunTimeInSeconds / 1000), | 652 "WebRTC.Video.RtxBitrateSentInKbps", |
646 test::LastHistogramSample("WebRTC.Video.PaddingBitrateSentInKbps")); | 653 static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) / |
| 654 metrics::kMinRunTimeInSeconds / 1000))); |
647 | 655 |
648 EXPECT_EQ(1, test::NumHistogramSamples( | 656 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps")); |
649 "WebRTC.Video.RetransmittedBitrateSentInKbps")); | 657 EXPECT_EQ(1, metrics::NumEvents( |
650 EXPECT_EQ( | 658 "WebRTC.Video.FecBitrateSentInKbps", |
651 static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) / | 659 static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / |
652 metrics::kMinRunTimeInSeconds / 1000), | 660 metrics::kMinRunTimeInSeconds / 1000))); |
653 test::LastHistogramSample("WebRTC.Video.RetransmittedBitrateSentInKbps")); | |
654 | |
655 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.RtxBitrateSentInKbps")); | |
656 EXPECT_EQ(static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) / | |
657 metrics::kMinRunTimeInSeconds / 1000), | |
658 test::LastHistogramSample("WebRTC.Video.RtxBitrateSentInKbps")); | |
659 | |
660 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.FecBitrateSentInKbps")); | |
661 EXPECT_EQ(static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / | |
662 metrics::kMinRunTimeInSeconds / 1000), | |
663 test::LastHistogramSample("WebRTC.Video.FecBitrateSentInKbps")); | |
664 | 661 |
665 // New start time but same counter values. | 662 // New start time but same counter values. |
666 proxy->DataCountersUpdated(counters, kFirstSsrc); | 663 proxy->DataCountersUpdated(counters, kFirstSsrc); |
667 proxy->DataCountersUpdated(counters, kSecondSsrc); | 664 proxy->DataCountersUpdated(counters, kSecondSsrc); |
668 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); | 665 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); |
669 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); | 666 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); |
670 | 667 |
671 // Double counter values, this should result in the same counts as before but | 668 // Double counter values, this should result in the same counts as before but |
672 // with new histogram names. | 669 // with new histogram names. |
673 StreamDataCounters new_counters = counters; | 670 StreamDataCounters new_counters = counters; |
674 new_counters.Add(counters); | 671 new_counters.Add(counters); |
675 StreamDataCounters new_rtx_counters = rtx_counters; | 672 StreamDataCounters new_rtx_counters = rtx_counters; |
676 new_rtx_counters.Add(rtx_counters); | 673 new_rtx_counters.Add(rtx_counters); |
677 | 674 |
678 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds); | 675 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds); |
679 proxy->DataCountersUpdated(new_counters, kFirstSsrc); | 676 proxy->DataCountersUpdated(new_counters, kFirstSsrc); |
680 proxy->DataCountersUpdated(new_counters, kSecondSsrc); | 677 proxy->DataCountersUpdated(new_counters, kSecondSsrc); |
681 proxy->DataCountersUpdated(new_rtx_counters, kFirstRtxSsrc); | 678 proxy->DataCountersUpdated(new_rtx_counters, kFirstRtxSsrc); |
682 proxy->DataCountersUpdated(new_rtx_counters, kSecondRtxSsrc); | 679 proxy->DataCountersUpdated(new_rtx_counters, kSecondRtxSsrc); |
683 | 680 |
684 SetUp(); // Reset stats proxy also causes histograms to be reported. | 681 SetUp(); // Reset stats proxy also causes histograms to be reported. |
685 | 682 |
686 EXPECT_EQ(1, test::NumHistogramSamples( | 683 EXPECT_EQ(1, |
687 "WebRTC.Video.Screenshare.BitrateSentInKbps")); | 684 metrics::NumSamples("WebRTC.Video.Screenshare.BitrateSentInKbps")); |
| 685 EXPECT_EQ(1, |
| 686 metrics::NumEvents( |
| 687 "WebRTC.Video.Screenshare.BitrateSentInKbps", |
| 688 static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) / |
| 689 metrics::kMinRunTimeInSeconds / 1000))); |
| 690 |
| 691 EXPECT_EQ(1, metrics::NumSamples( |
| 692 "WebRTC.Video.Screenshare.MediaBitrateSentInKbps")); |
| 693 EXPECT_EQ(1, metrics::NumEvents( |
| 694 "WebRTC.Video.Screenshare.MediaBitrateSentInKbps", |
| 695 static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) / |
| 696 metrics::kMinRunTimeInSeconds / 1000))); |
| 697 |
| 698 EXPECT_EQ(1, metrics::NumSamples( |
| 699 "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps")); |
| 700 EXPECT_EQ(1, |
| 701 metrics::NumEvents( |
| 702 "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps", |
| 703 static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) / |
| 704 metrics::kMinRunTimeInSeconds / 1000))); |
| 705 |
| 706 EXPECT_EQ(1, metrics::NumSamples( |
| 707 "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps")); |
| 708 EXPECT_EQ(1, |
| 709 metrics::NumEvents( |
| 710 "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps", |
| 711 static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) / |
| 712 metrics::kMinRunTimeInSeconds / 1000))); |
| 713 |
688 EXPECT_EQ( | 714 EXPECT_EQ( |
689 static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) / | 715 1, metrics::NumSamples("WebRTC.Video.Screenshare.RtxBitrateSentInKbps")); |
690 metrics::kMinRunTimeInSeconds / 1000), | 716 EXPECT_EQ( |
691 test::LastHistogramSample("WebRTC.Video.Screenshare.BitrateSentInKbps")); | 717 1, metrics::NumEvents( |
| 718 "WebRTC.Video.Screenshare.RtxBitrateSentInKbps", |
| 719 static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) / |
| 720 metrics::kMinRunTimeInSeconds / 1000))); |
692 | 721 |
693 EXPECT_EQ(1, test::NumHistogramSamples( | 722 EXPECT_EQ( |
694 "WebRTC.Video.Screenshare.MediaBitrateSentInKbps")); | 723 1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps")); |
695 EXPECT_EQ(static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) / | 724 EXPECT_EQ(1, metrics::NumEvents( |
696 metrics::kMinRunTimeInSeconds / 1000), | 725 "WebRTC.Video.Screenshare.FecBitrateSentInKbps", |
697 test::LastHistogramSample( | 726 static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / |
698 "WebRTC.Video.Screenshare.MediaBitrateSentInKbps")); | 727 metrics::kMinRunTimeInSeconds / 1000))); |
699 | |
700 EXPECT_EQ(1, test::NumHistogramSamples( | |
701 "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps")); | |
702 EXPECT_EQ(static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) / | |
703 metrics::kMinRunTimeInSeconds / 1000), | |
704 test::LastHistogramSample( | |
705 "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps")); | |
706 | |
707 EXPECT_EQ(1, test::NumHistogramSamples( | |
708 "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps")); | |
709 EXPECT_EQ(static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) / | |
710 metrics::kMinRunTimeInSeconds / 1000), | |
711 test::LastHistogramSample( | |
712 "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps")); | |
713 | |
714 EXPECT_EQ(1, test::NumHistogramSamples( | |
715 "WebRTC.Video.Screenshare.RtxBitrateSentInKbps")); | |
716 EXPECT_EQ(static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) / | |
717 metrics::kMinRunTimeInSeconds / 1000), | |
718 test::LastHistogramSample( | |
719 "WebRTC.Video.Screenshare.RtxBitrateSentInKbps")); | |
720 | |
721 EXPECT_EQ(1, test::NumHistogramSamples( | |
722 "WebRTC.Video.Screenshare.FecBitrateSentInKbps")); | |
723 EXPECT_EQ(static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / | |
724 metrics::kMinRunTimeInSeconds / 1000), | |
725 test::LastHistogramSample( | |
726 "WebRTC.Video.Screenshare.FecBitrateSentInKbps")); | |
727 } | 728 } |
728 | 729 |
729 } // namespace webrtc | 730 } // namespace webrtc |
OLD | NEW |