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